Title: CS 686: Programming SuperVGA Graphics Devices
1CS 686 Programming SuperVGA Graphics Devices
- Introduction An exercise in working with
graphics file formats
2Raster Display Technology
The graphics screen is a two-dimensional array of
picture elements (pixels)
These pixels are redrawn sequentially,
left-to-right, by rows from top to bottom
Each pixels color is an individually
programmable mix of red, green, and blue
3Special dual-ported memory
CRT
CPU
VRAM
RAM
32-MB of VRAM
1024-MB of RAM
4Graphics programs
- What a graphics program must do is put
appropriate bit-patterns into the correct
locations in the VRAM, so that the CRT will show
an array of colored dots which in some way is
meaningful to the human eye - So the programmer must understand what the CRT
will do with the contents of VRAM
5How much VRAM is needed?
- This depends on (1) the total number of pixels,
and on (2) the number of bits-per-pixel - The total number of pixels is determined by the
screens width and height (measured in pixels) - Example when our screen-resolution is set to
1280-by-960, we are seeing 1,228,800 pixels - The number of bits-per-pixel (color depth) is a
programmable parameter (varies from 1 to 32) - Some types of applications also need to use extra
VRAM (for multiple displays, or for special
effects like computer game animations)
6How truecolor works
0
8
16
24
alpha
red
green
blue
longword
R
G
B
pixel
The intensity of each color-component within a
pixel is an 8-bit value
7Intel uses little-endian order
0 1 2 3
4 5 6 7
8 9 10
B
G
R
B
G
R
B
G
R
VRAM
Video Screen
8Some operating system issues
- Linux is a protected-mode operating system
- I/O devices normally are not directly accessible
- On Pentiums Linux uses virtual memory
- Privileged software must map the VRAM
- A device-driver module is needed vram.c
- We can compile it using make vram.o
- Device-node mknod /dev/vram c 99 0
- Make it writable chmod aw /dev/vram
9VGA ROM-BIOS
- Our graphics hardware manufacturer has supplied
accompanying code (firmware) that programs
VGA device components to operate in various
standard modes - But these firmware routines were not written with
Linux in mind theyre for interfacing with
real-mode MS-DOS - Some special software is needed (lrmi)
10Class demo pcxphoto.cpp
- First several system-setup requirements
- Some steps need root privileges (sudo)
- Obtain demo sources from class website
- Install the mode3 program (from svgalib)
- Compile character device-driver vram.c
- Create dev/vram device-node (read/write)
- Start Linux in text mode (need to reboot)
11Typical program-structure
- Usual steps within a graphics application
- Initialize video system hardware
- Display some graphical imagery
- Wait for a termination condition
- Restore original hardware state
12Hardware Initialization
- The VGA system has over 300 registers
- They must be individually reprogrammed
- Eventually we will study those registers
- For now, we just reuse vendor routines
- Such routines are built into VGA firmware
- However, invoking them isnt trivial (since they
werent designed for Linux systems)
13Obtaining our image-data
- Eventually we want to compute images
- For now, we reuse pre-computed data
- Data was generated using an HP scanner
- Its stored in a standard graphic file-format
- Lots of different graphic file-formats exist
- Some are proprietary (details are secret)
- Other formats are public (can search web)
14Microsofts .pcx file-format
FILE HEADER (128 bytes)
IMAGE DATA (compressed)
COLOR PALETTE (768 bytes)
15Run-Length Encoding (RLE)
- A simple technique for data-compression
- Well-suited for compressing images, when adjacent
pixels often have the same colors - Without compression, a computer graphics
image-file (for SuperVGA) would be BIG! - Exact size depends on screen-resolution
- Also depends on the displays color-depth
- (Those parameters are programmable)
16How RLE-compression works
- If multiple consecutive bytes are identical
- example 0x29 0x29 0x29 0x29 0x29
- (This is called a run of five identical bytes)
- We compress five bytes into two bytes
- the example compressed 0xC5 0x29
- Byte-pairs are used to describe runs
- Initial byte encodes a repetition-count
- (The following byte is the actual data)
17Decompression Algorithm
- int i 0
- do
- read( fd, dat, 1 )
- if ( dat lt 0xC0 ) reps 1
- else reps (dat 0x3F) read( fd, dat, 1
) - do image i dat while ( --reps )
-
- while ( i lt npixels )
18Standard I/O Library
- We call standard functions from the C/C runtime
library to perform i/o operations on a
device-file (e.g., vram) open(), read(),
write(), lseek(), mmap() - The most useful operation is mmap()
- It lets us map a portion of VRAM into the
address-space of our graphics application - So we can draw directly onto the screen!
19Where will VRAM go?
- We decided to use graphics mode 0x013A
- Its a truecolor mode (32bpp)
- It uses a screen-resolution of 640x480
- Size of VRAM needed 6404804 bytes
- So we map 2-MB of VRAM to user-space
- We can map it to this address-range
0xB0000000-0xB2000000
20Virtual Memory Layout
Linux kernel
kernel space (1GB)
0xC0000000
stack
VRAM
0xB0000000
user space (3GB)
runtime library
0x40000000
code and data
0x08048000
21Color-to-Grayscale
- Sometimes a color image needs to be converted
into a grayscale format - Example print a newspaper photograph (the
printing press only uses black ink) - How can we transform color photos into
black-and-white format (shades of gray)? - gray colors use a mix of redgreenblue, these
components have EQUAL intensity
22Color-conversion Algorithm
- struct unsigned char r, g, b color
- int avg ( 30r 49g 11b )/100
- color.r avg color.g avg color.b avg
- long pixel 0
- pixel ( avg ltlt 16 ) // r-component
- pixel ( avg ltlt 8 ) // g-component
- pixel ( avg ltlt 0) // b-component
- vram address pixel // write to screen
23In-class exercise
- Revise the pcxphoto.cpp program so that it will
display (1) the color-table, and then (2) the
scanned photograph, as grayscale images (i.e.,
different intensities of gray)