我有一个问题,当我使用GL_RED,GL_RED_INTEGER作为OpenGL纹理格式而GL_R32F / GL_R16UI作为内部格式时,命令“ clCreateFromGLTexture ”为OpenCL创建纹理返回 CL_INVALID_IMAGE_FORMAT_DESCRIPTOR 即可。格式是否真的支持OpenCL?或者在使用它之前缺少某些东西?
初始化OpenCL的代码简述如下:
void initMemoryOpenCL(bool CL_info, const size_t select_device_number, const int device_type)
{
cl_uint num;
err = clGetPlatformIDs(0, 0, &num);
std::vector<cl_platform_id> platforms(num);
err = clGetPlatformIDs(num, &platforms[0], &num);
cl_device_id *device_id = NULL;
cl_uint num_devices = -1;
clGetDeviceIDs(platforms[select_device_number], CL_DEVICE_TYPE_GPU, 0, device_id, &num);
device_id = (cl_device_id *)malloc(sizeof(cl_device_id)*num_devices);
clGetDeviceIDs(platforms[select_device_number], CL_DEVICE_TYPE_GPU, num_devices, device_id, 0);
cl_context_properties prop_cl[] = {
CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(platforms[select_device_number]),
CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(),
CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(),
0 };
context_CL = clCreateContextFromType(prop_cl, CL_DEVICE_TYPE_GPU, NULL, NULL, &err);
clGetGLContextInfoKHR_fn pclGetGLContextInfoKHR = (clGetGLContextInfoKHR_fn)
clGetExtensionFunctionAddressForPlatform(platforms[select_device_number], "clGetGLContextInfoKHR");
size_t bytes = 0;
pclGetGLContextInfoKHR(prop_cl, CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR, 0, NULL, &bytes);
unsigned int numDevs = bytes / sizeof(cl_device_id);
cl_device_id *devID = NULL;
device_id = (cl_device_id*)malloc(sizeof(cl_device_id)* numDevs);
pclGetGLContextInfoKHR(prop_cl, CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR, bytes, device_id, NULL);
cl_bool sup;
size_t rsize;
clGetDeviceInfo(device_id[0], CL_DEVICE_IMAGE_SUPPORT, sizeof(sup), &sup, &rsize);
if (sup != CL_TRUE){ std::cout << "Image not Supported" << std::endl; }
cl_uint work_item_dimens;
size_t cb, work_group_size;
if (checkForExtension(device_id[0],"cl_khr_gl_sharing"))
{
printf("Found GL Sharing Support!\n");
}
else
{
printf("Can NOT Found GL Sharing Support!\n");
}
this->queue_CL = clCreateCommandQueue(this->context_CL, device_id[0], 0, &err);
this->program = load_program(context_CL, "openclfuncs.cl", device_id[0]);
}
答案 0 :(得分:0)
部分 9.7.3.1 ,OpenCL 1.2扩展规范的表 9.4 列出了与OpenGL内部格式对应的OpenCL图像格式。请注意,实现可能不支持相应的扩展名cl_khr_gl_sharing
。
在cl_khr_gl_sharing
中,对于OpenCL 1.2,单通道或双通道内部格式之间没有对应关系。该规范还指出
使用其他OpenGL内部格式创建的纹理对象可能(但是 不保证)有一个映射到CL图像格式;
我不能说当前为什么会出现这种情况(具有讽刺意味的是D3D扩展提供了更丰富的格式) - 它有点超出我为什么需要下一个CL版本来完成它。
如果您需要支持所请求的功能,则必须升级到OpenCL 2.0或更高版本 - 其扩展规范定义了您要求的映射。
另外,您可以尝试将值包装在GL_RGBA[32|16][F|UI]
纹理中。
要检查您的设备是否支持必要的扩展,您可以使用这样的功能查询您正在操作的设备(需要C ++ 14):
auto checkForExtension(cl_device_id device, std::string const& extensionName)
{
std::size_t extensionSize = 0;
clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, 0, nullptr, &extensionSize);
std::vector<char> extensions(extensionSize);
clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, extensionSize, extensions.data(), nullptr);
auto iter = std::search(
extensions.cbegin(),
extensions.cend(),
extensionName.cbegin(),
extensionName.cend()
);
return iter != extensions.end();
}
如果在true
之类的时候调用时没有返回checkForExtension(device, "cl_khr_gl_sharing");
,那么该特定设备的实现并不支持它。