Блокировка кадрового буфера временная - PullRequest
0 голосов
/ 02 января 2012

Я задавал подобный вопрос раньше в 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);
...