9

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

2
  • Did you see the screen flash once? (Shoot in the dark) Commented Jan 18, 2011 at 9:50
  • I'll make a wild guess and say that you just wrote a pixel with 255/65535 red intensity. What is the output of that Vinfo.bpp printf? Commented Jan 18, 2011 at 20:06

1 Answer 1

9

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

Sign up to request clarification or add additional context in comments.

3 Comments

Why -1 ? Did I make some ugly mistake ?
I had to add some opaqueness in the aplha factor(4th byte).Also the location needed to be incremented.By doing these the output from '/dev/fb0' was seen by capturing using 'fbdump'(fbdump -fb /dev/fb0 > image.ppm).To see the framebufer output on my screnn I had to call FBIO_PAN_DISPLAY ioctl call.
I think the correct link for directfb is now directfb.net The link in the answer currently redirects to a rather different site.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.