如何使用OpenCL零拷贝直接写入Linux帧缓冲区?

问题描述 投票:3回答:2

我正在使用OpenCL进行图像处理,并希望使用它将RGBA图像直接写入帧缓冲区。工作流程如下所示:

1)将帧缓冲区映射到用户空间。

2)使用带有“ CL_MEM_ALLOC_HOST_PTR”标志的clCreateBuffer创建OpenCL缓冲区]

3)使用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);

我正在使用OpenCL进行图像处理,并希望使用它将RGBA图像直接写入帧缓冲区。工作流程如下所示:1)将帧缓冲区映射到用户空间。 2)使用...

opencl framebuffer memory-mapping zero-copy
2个回答
1
投票

对于使用现有缓冲区的零复制,您需要在CL_MEM_USE_HOST_PTR函数调用中使用clCreateBuffer()标志。另外,您需要将指向现有缓冲区的指针作为倒数第二个参数。


0
投票

我还不了解OpenCL,我只是在做一个搜索,以了解有关从中写入帧缓冲区并点击您的帖子的信息。像在代码中一样打开并映射它看起来不错。

© www.soinside.com 2019 - 2024. All rights reserved.