我遇到了OpenCL-GL共享内存的麻烦。
我有一个适用于linux和windows的应用程序。 CL-GL共享适用于linux,但不适用于Windows。
Windows驱动程序说它支持共享,AMD工作的例子应该可行。我在Windows中创建上下文的代码是:
cl_context_properties properties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)platform_(),
CL_WGL_HDC_KHR, (intptr_t) wglGetCurrentDC(),
CL_GL_CONTEXT_KHR, (intptr_t) wglGetCurrentContext(),
0
};
platform_.getDevices(CL_DEVICE_TYPE_GPU, &devices_);
context_ = cl::Context(devices_, properties, &CL::cl_error_callback, nullptr, &err);
err = clGetGLContextInfoKHR(properties, CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR, sizeof(device_id), &device_id, NULL);
context_device_ = cl::Device(device_id);
queue_ = cl::CommandQueue(context_, context_device_, 0, &err);
我的问题是共享缓冲区中的CL和GL内存不一样。我打印出来(通过内存映射),我注意到它们不同。更改内存中的数据同时适用于CL和GL,但只更改内存,而不是两者(这两个缓冲区看起来都是完整的,但不是共享的。)
此外,cl-buffer上的clGetGLObjectInfo返回正确的gl缓冲区。
更新:我发现如果我在cpu上创建opencl-context就行了。这看起来很奇怪,因为我没有使用集成显卡,我不相信cpu正在处理opengl。我正在使用SDL创建窗口,这可能与此有关吗?
我现在已经确认opengl上下文在gpu上运行,所以问题出在其他地方。
更新2:好的,所以这很奇怪。我今天又试了一次,突然间它起了作用。据我所知,我昨天关闭计算机之前没有安装任何新的驱动程序,所以我不知道是什么原因造成的。
更新3:是的,我注意到更改粒子数会导致这种情况发生。当我分配了这么多粒子,共享缓冲区略高于1 MB时,它突然开始工作。
答案 0 :(得分:2)
我解决了这个问题。 必须在“创建OpenCL上下文”之后创建OpenGL缓冲区对象。 如果“之前”,我们无法共享OpenGL数据。 我使用RadeonHD5670 ATI Catalyst 12.10 也许,ATI驱动程序的问题是因为Nvidia-Computing-SDK示例不依赖于订单。