Ссылка в ответе в настоящее время перенаправляет на другой сайт.

ользую ядро ​​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

 ninjalj18 янв. 2011 г., 21:06
Я сделаю дикое предположение и скажу, что вы только что написали пиксель с интенсивностью красного 255/65535. Каков вывод этого Vinfo.bpp printf?
 drahnr18 янв. 2011 г., 10:50
Вы видели вспышку экрана один раз? (Стрелять в темноте)

Ответы на вопрос(1)

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 Это идет с некоторым тестом производительности кадрового буфера

 shodanex18 янв. 2011 г., 14:51
Почему -1? Я сделал некрасивую ошибку?
 a sandwhich08 февр. 2017 г., 19:24
Я думаю, что правильная ссылка для DirectFB сейчасdirectfb.net Ссылка в ответе в настоящее время перенаправляет на другой сайт.
 NRJ21 янв. 2011 г., 10:45
Мне пришлось добавить некоторую непрозрачность в коэффициент aplha (4-й байт). Также необходимо увеличить местоположение. При этом вывод из '/ dev / fb0' был получен путем захвата с использованием 'fbdump' (fbdump -fb / dev / fb0> image.ppm). Чтобы увидеть вывод кадрового буфера на моем экране, мне нужно было вызвать FBIO_PAN_DISPLAY ioctl call.

Ваш ответ на вопрос