2017-04-25 76 views
3

我正在使用OpenCL来做一些图像处理,并且想用它将RGBA图像直接写入framebuffer。工作流程如下所示:如何使用OpenCL直接写入到零拷贝的linux framebuffer?

1)将framebuffer映射到用户空间。

2)创建使用clCreateBuffer用 “CL_MEM_ALLOC_HOST_PTR”

3)的标志的OpenCL缓冲器使用clEnqueueMapBuffer映射结果的帧缓冲器。

但是,它不起作用。屏幕上没有任何东西。然后我发现来自帧缓冲区的映射虚拟地址与虚拟地址映射OpenCL不同。是否有任何机构将数据从GPU复制到帧缓冲区?我应该使用什么方法来实现这个目标?

一些关键代码:

if ((fd_fb = open("/dev/fb0", O_RDWR, 0)) < 0) { 
    printf("Unable to open /dev/fb0\n"); 
    return -1; 
} 
fb0 = (unsigned char *)mmap(0, fb0_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0); 
... 
cmDevSrc4 = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(cl_uchar) * imagesize * 4, NULL, &status); 
... 
fb0 = (unsigned char*)clEnqueueMapBuffer(cqCommandQueue, cmDevSrc4, CL_TRUE, CL_MAP_READ, 0, sizeof(cl_uchar) * imagesize * 4, 0, NULL, NULL, &ciErr); 

回答

1

对于零拷贝你需要使用CL_MEM_USE_HOST_PTR国旗在clCreateBuffer()函数调用已有的缓冲区。另外,您需要将指向现有缓冲区的指针作为倒数第二个参数。

我不知道linux framebuffer如何在内部工作,但即使从设备到宿主的零拷贝也可能导致额外的数据复制到GPU进行渲染。所以你可能想用OpenGL直接渲染OpenCL缓冲区。查看OpenCL的cl_khr_gl_sharing扩展。