I'm using an i5 core with builtin graphics accelerator GMA-HD running on an RHEL 6.0 OS. I needed to test the graphics acceleration capabilities of the graphics driver(which I found out was i915 in my PC). I used the following code(which I got from the internet with some modifications) for writing to framebuffer.
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
int main()
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
char *fbp = 0;
int x = 0, y = 0;
long int location = 0;
int count ;
/* Open the file for reading and writing */
fbfd = open("/dev/fb0", O_RDWR);
if (!fbfd) {
printf("Error: cannot open framebuffer device.\n");
exit(1);
}
printf("The framebuffer device was opened successfully.\n");
/* Get fixed screen information */
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {
printf("Error reading fixed information.\n");
exit(2);
}
/* Get variable screen information */
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
printf("Error reading variable information.\n");
exit(3);
}
/* Figure out the size of the screen in bytes */
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
printf("\nScreen size is %d",screensize);
printf("\nVinfo.bpp = %d",vinfo.bits_per_pixel);
/* Map the device to memory */
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,fbfd, 0);
if ((int)fbp == -1) {
printf("Error: failed to map framebuffer device to memory.\n");
exit(4);
}
printf("The framebuffer device was mapped to memory successfully.\n");
x = 100; y = 100; /* Where we are going to put the pixel */
/* Figure out where in memory to put the pixel */
location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length;
for(count = 1 ;count < 100 ;count++)
{
*(fbp + location) = 255; /* Some blue */
*(fbp + location + count) = 0; /* A little green */
*(fbp + location + count + 1) = 0; /* A lot of red */
*(fbp + location + count + 2) = 0; /* No transparency */
}
munmap(fbp, screensize);
close(fbfd);
return 0;
}
After running the above code no change was found on display but ' cat /dev/fb0 ' showed some data. Could someone explain why nothing was seen on screen? (I also found that fb0 correspond to the frame buffer 'inteldrmfb' .)
Thanks in advance,
Neeraj N.T
A framebuffer (frame buffer, or sometimes framestore) is a portion of random-access memory (RAM) containing a bitmap that drives a video display. It is a memory buffer containing data representing all the pixels in a complete video frame. Modern video cards contain framebuffer circuitry in their cores.
The framebuffer console can be enabled by using your favorite kernel configuration tool. It is under Device Drivers->Graphics Support-> Console display driver support->Framebuffer Console Support. Select 'y' to compile support statically or 'm' for module support. The module will be fbcon.
Frame buffers in raster displays hold individual pixels of the scene, whereas frame buffers in random scan displays store commands for rendering the scene. Resolution in computer graphics refers to number of pixels, where as frame buffer refers to memory to hold the information for those pixels.
Most modern graphic systems are raster-based: screen display is array (raster) of pixels (picture elements). Each pixel corresponds to a location on the screen. Pixels are stored in part of memory called the frame buffer. depth, precision of the frame buffer = # bits used for each pixel.
You are not increasing location ! So 255 is only on the first pixel, and all the others are 0. Try this instead :
location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length;
for(count = 1 ;count < 100 ;count++)
{
*(fbp + location) = 255; /* Some blue */
*(fbp + location + 1) = 0; /* A little green */
*(fbp + location + 2) = 0; /* A lot of red */
*(fbp + location + 3) = 0; /* No transparency */
location += 4;
}
However, may be the right thing to do for testing is to use directfb It comes with some framebuffer performance test
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With