我之前在ioctl to block operation问了类似的问题。
更一般地说,我想知道如何阻止覆盖帧缓冲
我的帧缓冲包含3层,我想访问最底层的帧缓冲区
我使用系统/硬件调用ioctl函数直接从硬件中获取帧缓冲。
while(1){ // for each frame
glUseProgram(redShader); //write red color into framebuffer
drawRed(); //draw red color with shape...
getFrameBuffer();//<--------Access framebuffer here
glUseProgram(0);
glUseProgram(greenShader); //Then write green to framebuffer
drawGreen();
glUseProgram(0);
glUseProgram(blueShader); // Then write blue to framebuffer
drawBlue(); // This will be displayed
glUseProgram(0);
}
这与opencv无关。我尝试过其他方法,到目前为止,它的工作方式仍然相同。它基本上将framebuffer作为整个蓝色返回,但我希望它是红色的。 这是否意味着我应该在调用Red()之前锁定并在getFrameBuffer()之后解锁?无论如何,我阻止写帧缓冲,直到我得到数据?
编辑: 在ioctl方法之前,在getFrameBuffer()中,我使用 glReadPixels ,它工作正常。它返回红色。但它太慢了,我希望使用ioctl调用来提高速度。在我的getFrameBuffer中,我有类似的东西:
int fd = open("/dev/fb0",O_RDWR);
if (fd == -1)
printf("Could not open framebuffer\n");
struct fb_var_screeninfo screen_info;
struct fb_fix_screeninfo fixed_info;
if (ioctl(fd, FBIOGET_FSCREENINFO, &fixed_info))
printf("Error reading fixed information.\n");
if (ioctl(fd, FBIOGET_VSCREENINFO, &screen_info))
printf("Could not read variable screen info.\n");
size_t screensize = fixed_info.line_length*screen_info.yres;
unsigned char *fbp = (unsigned char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if ((int)fbp == -1)
printf("Cannot mapped\n");
//Here, write image...to check before munmap and it gives me whole Blue
munmap(fbp,screensize);