OpenCL-GL Interop内存不同步

时间:2012-08-31 19:07:47

标签: windows opengl opencl ati

我遇到了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时,它突然开始工作。

1 个答案:

答案 0 :(得分:2)

我解决了这个问题。 必须在“创建OpenCL上下文”之后创建OpenGL缓冲区对象。 如果“之前”,我们无法共享OpenGL数据。 我使用RadeonHD5670 ATI Catalyst 12.10 也许,ATI驱动程序的问题是因为Nvidia-Computing-SDK示例不依赖于订单。