2011-01-18 20 views
9

RHEL 6.0 OSで動作する内蔵グラフィックスアクセラレータGMA-HDを搭載したi5コアを使用しています。 私はグラフィックスドライバのグラフィックスアクセラレーション機能をテストする必要がありました(これは私のPCで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は第1の画素のみであり、その他はすべて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)。私のscrennのframebuferの出力を見るために、私はFBIO_PAN_DISPLAY ioctlコールを呼び出さなければなりませんでした。 – NRJ

+2

私はdirectfbのための正しいリンクが今http://directfb.net/だと思う。 答えのリンクは、現在かなり別のサイトにリダイレクトされています。 –

関連する問題