5

フレームバッファ /dev/fb0 に直接書き込む Linux 用のアプリケーションを作成しようとしています。ダブルバッファリングするために、仮想画面を画面の2倍のサイズにしようとしました。これは私が書いたプログラムです:

struct fb_var_screeninfo screeninfo_var;
struct fb_fix_screeninfo screeninfo_fixed;
unsigned int* screenbuffer;

void gfx_init()
{
    fb0 = open("/dev/fb0", O_RDWR);
    if(fb0 == 0)
        error("Could not open framebuffer located in /dev/fb0!");

    if (ioctl(fb0, FBIOGET_FSCREENINFO, &screeninfo_fixed) == -1)
        error("Could not retrive fixed screen info!");

    if (ioctl(fb0, FBIOGET_VSCREENINFO, &screeninfo_var) == -1)
        error("Could not retrive variable screen info!");

    screeninfo_var.xres_virtual = screeninfo_var.xres;
    screeninfo_var.yres_virtual = screeninfo_var.yres * 2;
    screeninfo_var.width = screeninfo_var.xres;
    screeninfo_var.height = screeninfo_var.yres;
    screeninfo_var.xoffset = 0;
    screeninfo_var.yoffset = 0;

    if (ioctl(fb0, FBIOPUT_VSCREENINFO, &screeninfo_var) == -1)
        error("Could not set variable screen info!");

    info("Detected monitor of %ix%i pixels using %i bit colors.",screeninfo_var.xres, screeninfo_var.yres, screeninfo_var.bits_per_pixel);

    screenbuffersize = screeninfo_var.xres_virtual * screeninfo_var.yres_virtual * screeninfo_var.bits_per_pixel/8;
    screenbuffer = (unsigned int *)mmap(0, screenbuffersize, PROT_READ | PROT_WRITE, MAP_SHARED, fb0, 0);
    if( (long)screenbuffer == 0 || (long)screenbuffer == -1 )
        error("Failed to map framebuffer to device memory!");
}

プログラムioctl(fb0, FBIOPUT_VSCREENINFO, &screeninfo_var)は無効な引数のエラーを報告して失敗します。行を削除すると、screeninfo_var.yres_virtual = screeninfo_var.yres * 2;正常に実行されます(ただし、ダブルバッファリングはありません)。

誰かが私がここで間違っていることを見ていますか?

4

2 に答える 2

0

これはよくある質問で、ビデオ ドライバーの制限が原因です。たとえば、Intel の 810 チップセットは 640x480 の解像度しか許可せず、Broadcom は幅を 1200 以下に制限しています ( http://www.raspberrypi.org/phpBB3/viewtopic.php?f=66&t=29968 )。

ドライバーまたはビデオカード自体を (可能であれば) 変更しない限り、ここでできることはあまりありません。

編集: PC を使用しているvesafb場合は、Intel のドライバーではなく、を使用してみてください。

ここにヒントがあります: http://www.mail-archive.com/debian-russian@lists.debian.org/msg27725.html

于 2013-02-25T17:15:32.300 に答える