当GLtexture GL_RED用于clCreateFromGLTexture时获取“CL​​_INVALID_IMAGE_FORMAT_DESCRIPTOR”

时间:2016-09-13 06:33:10

标签: opengl opencl

我有一个问题,当我使用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]);
}

1 个答案:

答案 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");,那么该特定设备的实现并不支持它。

相关问题