我试图建立一个共享的GL纹理和CL图像,以便绘制光线跟踪内核的结果。我的共享设置代码是
// Check if supported
CLManager& manager = CLManager::instance();
if (!manager.supportsGLInterop())
{
std::cout << "Error: OpenCL-OpenGL interop not supported on this platform\n";
exit(-1);
}
// Create shared context
CGLContextObj cglContext = CGLGetCurrentContext();
CGLShareGroupObj cglShareGroup = CGLGetShareGroup(cglContext);
cl_context_properties props[] =
{
CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE,
(cl_context_properties)cglShareGroup, 0
};
cl_int err;
cl_context sharedContext = clCreateContext(props, 0, 0, nullptr, nullptr, &err);
if (!sharedContext)
{
std::cout << "Failed to create shared context\n";
exit(-1);
}
// Create OpenGL texture
GLuint texture_handle;
glGenTextures(1, &texture_handle);
glBindTexture(GL_TEXTURE_2D, texture_handle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_CLAMP_TO_EDGE );
glBindTexture(GL_TEXTURE_2D, 0);
cl_mem cl_image = clCreateFromGLTexture(sharedContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texture_handle, &err);
if (!cl_image || err != CL_SUCCESS)
{
std::cout << "Failed to create shared texture!\n";
exit(-1);
}
manager.setKernelArg(7, sizeof(cl_mem), (void *)&cl_image);
其中manager只是一个用于保存当前CL上下文和内核等的实用程序类.setKernelArg的代码是
void CLManager::setKernelArg(int n, size_t size, void* data)
{
status = clSetKernelArg(kernel, n, size, data);
if (status != CL_SUCCESS)
{
std::cout << "Set kernel arg failed with error code " << status << "\n";
exit(1);
}
std::cout << "Successfully set kernel argument " << n << "\n";
}
当我尝试运行它时,在尝试实际设置内核参数之前,我没有收到任何错误消息,然后失败并显示错误-38,无效的mem对象。据我所知,我的设置顺序正确(首先启动OpenGL,然后是OpenCL,然后创建GL纹理,然后创建CL图像)。我现在对由此产生的图像可能出现的问题感到茫然,因为在创建过程中可能发生的任何错误实际上都没有。
答案 0 :(得分:1)
不是100%肯定,但看着这个:
https://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/cl_khr_gl_sharing.html
GL和CL都需要支持的唯一像素格式是RGBA。当然也允许驱动程序支持其他像素格式......但规范并不要求。
我不是说这是问题所在,但我从个人经验中知道在CL和GL之间共享图像有点棘手,像素格式,频道顺序,内部排序,驱动程序版本和许多其他东西可能是影像是否可以共享的因素。