Is it possible to share OpenGL objects with OpenCL and use OpenCL CPU device if the GPU is not supported by OpenCL ?
I don’t think so, mainly because if I create a OpenCL context that shares the CPU isn’t given as a compute device. That’s on a Snow Leopard Mac with a NV8600.
I assume you’d be unable to create a shared OpenCL context on a machine that had an unsupported GPU, but I’ve yet to try it as I haven’t updated my older ATI based machine yet to try anything.
This will depend entirely on the system you’re using as the CL/GL interop is up to the vendor.
On SnowLeopard I believe you can do this if you create your context in a special manner. (You need to specify the Apple CL/GL sharing extension property and then pass in the CPU device explicitly, or something, but I don’t remember the details.) Take a look at Apple’s documentation and see if they have an example. It might even be documented in the header file.
I have found the solution under Snow Leopard
CGLContextObj kCGLContext = [openglContext CGLContextObj];
CGLShareGroupObj kCGLShareGroup = CGLGetShareGroup(kCGLContext);
// Create a context from a CGL share group
cl_context_properties properties[] = { CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup, 0 };
context = clCreateContext(properties, 0, 0, 0, 0, 0);
if (!context)
{
NSLog(@"Error: Failed to create a compute context!
");
return NO;
}
size_t returned_size;
unsigned int device_count;
cl_device_id device_ids[16];
err = clGetContextInfo(context, CL_CONTEXT_DEVICES, sizeof(device_ids), device_ids, &returned_size);
if (err)
{
NSLog(@"Error: Failed to retrieve compute devices for context!
");
return NO;
}
One other information.
It seem’s that when you try to share an OpenGL context with an OpenCL context, only GPU are returned.
I don’t have found any solution to use CPU device in this case.
Try getting the CPU device and passing it in when you call clCreateContext with the properties. I believe this will add the CPU device to your context along with the appropriate GPU device, but it’s been a while since I tried this.