gpt4 book ai didi

c - 在 fb_var_screeninfo 中设置 yres_virtual 时出现无效参数错误

转载 作者:IT王子 更新时间:2023-10-29 00:45:28 25 4
gpt4 key购买 nike

我正在尝试制作一个直接写入帧缓冲区/dev/fb0 的 linux 应用程序。为了使它双缓冲我尝试使虚拟屏幕是屏幕大小的两倍。这是我写的程序:

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; 它运行正常(但没有双缓冲)。

有人看到我在这里做错了吗?

最佳答案

为了避免将来有人头疼,有一种方法可以在 Linux 上使用低级图形(例如/dev/fb0)正确地加倍缓冲。但是根据这个线程:https://forum.odroid.com/viewtopic.php?f=55&t=8741不可能通过创建一个两倍于原始帧缓冲区大小的虚拟帧缓冲区来真正双重缓冲帧缓冲区(我读过树莓派可能是这个规则的一个异常(exception),因为它由不同的驱动程序支持)。

在 Linux 上使用低级图形进行双缓冲的正确方法是通过 libdrm(或/dev/dri/card0)。我在这里遵循了一个非常好的例子:https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset-vsync.c .将我的/dev/fb0 代码转换为/dev/dri/card0 代码并不难。

无论如何,我希望我已经帮助了 future 可能遇到此问题的人。

关于c - 在 fb_var_screeninfo 中设置 yres_virtual 时出现无效参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15071583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com