0

我之前在 ioctl 中问过类似的问题来阻止操作
更笼统地说,我想知道如何阻止覆盖帧缓冲区。
我的帧缓冲区由 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无关。我尝试了其他方法,到目前为止,它仍然以相同的方式工作。它基本上将帧缓冲区返回为整个蓝色,但我希望它是红色的。这是否意味着我应该在调用 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);
4

0 回答 0