使用DirectX 9设置OpenCL

时间:2012-02-14 21:10:21

标签: directx opencl

我对OpenCL和GPU编程一般都是新手。现在我正在开发一个项目,我试图看到在游戏中使用GPU的性能节省。然而,有了这个,我遇到了一个障碍;如何设置我的Directx项目以与OpenCL代码库对话?

我一直在谷歌上搜索一个星期而且找不到任何东西。如果有人能指出我正确的方向,我会很高兴。

3 个答案:

答案 0 :(得分:1)

OpenCL与DirectX没有任何关系,它只是另一个库。

对于OpenCL,您需要一个实现('SDK'),因为Khronos不提供这些(他们只提供规范)。 英特尔,AMD和Nvidia都提供一个,但它们有不同的要求和限制。 See here for some of the existing implementations

安装其中一个之后,您将拥有必要的标头和库来对OpenCL API进行编码并与OpenCL.dll链接

SDK或在线有很多样本源,你必须编写内核,其余的主要是用于初始化和内核编译的样板代码。

答案 1 :(得分:1)

允许将OpenCL缓冲区共享为纹理的特定OpenCL扩展(反之亦然)是cl_khr_d3d10_sharing.txt。 http://www.khronos.org/registry/cl/extensions/khr/cl_khr_d3d10_sharing.txt

答案 2 :(得分:0)

OpenCL具有在DirectX和OpenCL之间(以及OpenGL和OpenCL之间)共享内存的扩展。这允许您读取或写入DirectX缓冲区,包括OpenCL中的纹理。 Ani的回答提到了DirectX 10的扩展,但由于问题是关于DirectX 9,你实际使用的扩展名是cl_khr_dx9_media_sharing

此扩展程序只有4个功能:

clGetDeviceIDsFromDX9MediaAdapterKHR

此功能允许您获取可与给定Direct3D 9设备共享内存的OpenCL设备的OpenCL设备ID。

clCreateFromDX9MediaSurfaceKHR

此函数为给定的Direct3D 9内存对象获取OpenCL cl_mem内存对象。

clEnqueueAcquireDX9MediaSurfacesKHR

此函数锁定指定的共享内存对象,以便您可以从OpenCL读取和/或写入它。

clEnqueueReleaseDX9MediaSurfacesKHR

此函数从OpenCL解锁指定的内存对象,以便Direct3D可以再次读/写它。

一旦您使用上述函数来共享和同步对内存缓冲区的访问,Direct3D 9和OpenCL端的其他所有内容都会像使用这些特定API一样工作。

请注意,您的GPU需要支持cl_khr_dx9_media_sharing扩展才能使其正常工作。您可以检查OpenCL平台和设备的extensions属性,以确认是否支持此扩展。

有些NVidia GPU支持不同的扩展名,称为cl_nv_d3d9_sharing。它的工作原理与cl_khr_dx9_media_sharing扩展相同,但具体细节略有不同。最大的区别在于它具有不同的功能,可以为不同类型的Direct3D 9缓冲区获取cl_mem个对象,而不仅仅是一个涵盖所有这些对象的函数。

相关问题