2011-01-18 35 views
9

Tôi đang sử dụng lõi i5 với bộ tăng tốc đồ họa tích hợp GMA-HD chạy trên Hệ điều hành RHEL 6.0. Tôi cần kiểm tra khả năng tăng tốc đồ họa của trình điều khiển đồ họa (mà tôi phát hiện ra là i915 trong PC của mình). Tôi đã sử dụng đoạn mã sau (mà tôi nhận được từ internet với một số sửa đổi) để soạn thảo bằng framebuffer.Ghi vào bộ đệm khung

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

Sau khi chạy mã trên, không có thay đổi nào được hiển thị trên màn hình nhưng 'cat/dev/fb0' hiển thị một số dữ liệu. Ai đó có thể giải thích tại sao không có gì được nhìn thấy trên màn hình? (Tôi cũng thấy rằng fb0 tương ứng với khung đệm 'inteldrmfb'.)

Cảm ơn trước,

Neeraj N.T

+0

Bạn có thấy đèn flash màn hình một lần không? (Chụp trong bóng tối) – drahnr

+0

Tôi sẽ thực hiện một dự đoán hoang dã và nói rằng bạn chỉ cần viết một pixel với 255/65535 cường độ màu đỏ. Đầu ra của bản in đó của Vinfo.bpp là gì? – ninjalj

Trả lời

9

You are not tăng vị trí! Vì vậy, 255 chỉ trên điểm ảnh đầu tiên, và tất cả những người khác 0. Hãy thử này để thay thế:

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

Tuy nhiên, có thể là điều phải làm để thử nghiệm được sử dụng directfb Nó đi kèm với một số kiểm tra hiệu suất bộ đệm khung

+1

Tại sao -1? Tôi đã phạm một số sai lầm xấu xí? – shodanex

+2

Tôi đã phải thêm một số opaqueness trong các yếu tố aplha (4 byte). Ngoài ra vị trí cần thiết để được incremented.By làm các đầu ra từ '/ dev/fb0' đã được nhìn thấy bằng cách sử dụng 'fbdump' (fbdump-fb/dev/fb0> image.ppm) .Để xem đầu ra framebufer trên screnn của tôi, tôi phải gọi FBIO_PAN_DISPLAY ioctl. – NRJ

+2

Tôi nghĩ rằng liên kết chính xác cho directfb bây giờ là http://directfb.net/ Liên kết trong câu trả lời hiện đang chuyển hướng đến một trang web khác. –

Các vấn đề liên quan