2011-01-18 2 views
9

Я использую ядро ​​i5 с встроенным графическим ускорителем GMA-HD, работающим на ОС RHEL 6.0. Мне нужно было проверить возможности графического ускорения графического драйвера (который, как я узнал, был i915 на моем ПК). Я использовал следующий код (который я получил из Интернета с некоторыми изменениями) для записи в фреймбуфер.Запись в буфер кадров

#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; 
} 

После выполнения вышеуказанного кода никаких изменений не было обнаружено, но «cat/dev/fb0» показал некоторые данные. Может ли кто-нибудь объяснить, почему на экране ничего не было видно? (я также обнаружил, что fb0 соответствуют буфера кадра 'inteldrmfb.)

Спасибо заранее,

Neeraj N.T

+0

Вы когда-нибудь видели вспышку? (Стреляй в темноте) – drahnr

+0

Я сделаю дикое предположение и скажу, что вы просто написали пиксель с интенсивностью красного цвета 255/65535. Каков вывод этого Vinfo.bpp printf? – ninjalj

ответ

9

Вы не увеличивая местоположение! Таким образом, 255 только на первый пиксель, а все остальные равны 0. Попробуйте вместо этого:

 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; 
     } 

Однако, может быть правильное, что нужно сделать для тестирования использовать directfb Он поставляется с некоторым тестом производительности фреймбуфера

+1

Почему -1? Я сделал какую-то уродливую ошибку? – shodanex

+2

Мне пришлось добавить некоторую непрозрачность в факторе aplha (4-й байт). Также необходимо было увеличить инкремент. Для этого вывод из '/ dev/fb0' был замечен путем захвата с помощью 'fbdump' (fbdump -fb/dev/fb0> image.ppm). Чтобы увидеть вывод framebufer на моем screnn, мне пришлось вызвать вызов FBIO_PAN_DISPLAY ioctl. – NRJ

+2

Я думаю, что правильная ссылка для directfb теперь http://directfb.net/ Ссылка в ответе в настоящее время перенаправляется на другой сайт. –