opencl openGL互操作内核参数用于读取 写入

OpenCL OpenGL interop kernel argument for read+write

本文关键字:用于 读取 写入 参数 内核 openGL 互操作 opencl      更新时间:2023-10-16

我正在尝试使用本英特尔教程中所述的OpenGL纹理进行操作/OpenGL Interop。我想保持主机代码尽可能简单,因此我想使用"方法1",从而从使用clCreateFromGLTexture的OpenGL纹理创建OpenCL映像。该教程还指出以下内容:

请注意允许快速丢弃数据的Cl_mem_write_only标志。如果您的内核需要读取当前纹理上下文,请使用CL_MEM_READ_WRITE。另外,在这种情况下删除_write_only限定符,以供内核中的图像访问。

但是,这似乎不起作用。一旦我从内核中删除__write_only,我会使用平台NVIDIA OPENCL 1.2 CUDA 10.0.132(驱动程序417.71)出现编译错误:

错误:无效的图像类型

无论意味着什么。使用平台Intel Opencl 2.1 UHD图形620(驱动程序24.20.100.6286)我得到以下内容:

ctheader.h:1333:38:注意:候选函数不可行:' read_only Image2d_t'to'__write_only image1d_array_t'for'write_only image1d_array_t image_array,int2 coord,float4颜色);

看起来像image2d_t默认为 __read_only

无论如何,我发现规范清楚地指出,教程中提出的内容不支持,至少不使用图像对象:

read_image和write_image呼叫对内核中同一图像内存对象的调用不支持

所以我想知道,由于本教程没有详细介绍如何设置内核参数,因此可能首先使用image2d_t是错误的。由于该参数是主机侧类型的cu_mem,因此我尝试使用float*,但到目前为止没有成功。

我意识到我可以进行双重缓冲或使用其他方法(例如使用PBO进行Interop),但是正如我所说,我想尽可能简单,而且我只是想知道为什么这样做。有什么想法吗?

内核映像参数必须必须使用__write_only__read_only,直到OpenCL 2.0,允许图像为__read_write,但必须遵循特殊规则(例如,例如障碍)以获得正确的结果。请注意,图像还具有预选程序,该预选赛表明主机可以访问它(仅读,仅写或读/写)。给定的图像可以是一个内核中的__write_only,然后在下一个内核中为__read_only,这允许一个内核的结果输入下一个内核。