6.18. Direct3D 9 互操作性

本节介绍CUDA运行时应用程序编程接口中与Direct3D 9互操作相关的函数。需要注意的是,Direct3D 9资源的映射是通过图形API无关的资源映射接口实现的,具体描述见图形互操作性章节。

枚举

enum cudaD3D9DeviceList

Functions

__host__cudaError_t cudaD3D9GetDevice ( int* device, const char* pszAdapterName )
Gets the device number for an adapter.
__host__cudaError_t cudaD3D9GetDevices ( unsigned int* pCudaDeviceCount, int* pCudaDevices, unsigned int  cudaDeviceCount, IDirect3DDevice9* pD3D9Device, cudaD3D9DeviceList deviceList )
Gets the CUDA devices corresponding to a Direct3D 9 device.
__host__cudaError_t cudaD3D9GetDirect3DDevice ( IDirect3DDevice9** ppD3D9Device )
Gets the Direct3D device against which the current CUDA context was created.
__host__cudaError_t cudaD3D9SetDirect3DDevice ( IDirect3DDevice9* pD3D9Device, int  device = -1 )
Sets the Direct3D 9 device to use for interoperability with a CUDA device.
__host__cudaError_t cudaGraphicsD3D9RegisterResource ( cudaGraphicsResource** resource, IDirect3DResource9* pD3DResource, unsigned int  flags )
Register a Direct3D 9 resource for access by CUDA.

枚举

enum cudaD3D9DeviceList

与D3D9设备对应的CUDA设备

数值
cudaD3D9DeviceListAll = 1
The CUDA devices for all GPUs used by a D3D9 device
cudaD3D9DeviceListCurrentFrame = 2
The CUDA devices for the GPUs used by a D3D9 device in its currently rendering frame
cudaD3D9DeviceListNextFrame = 3
The CUDA devices for the GPUs to be used by a D3D9 device in the next frame

Functions

__host__cudaError_t cudaD3D9GetDevice ( int* device, const char* pszAdapterName )
获取适配器的设备编号。
参数
device
- Returns the device corresponding to pszAdapterName
pszAdapterName
- D3D9 adapter to get device for
描述

*device中返回与从EnumDisplayDevices或IDirect3D9::GetAdapterIdentifier()获取的适配器名称pszAdapterName对应的CUDA兼容设备。如果名称pszAdapterName的适配器上没有CUDA兼容设备,则该调用将失败。

Note:

请注意,此函数也可能返回之前异步启动的错误代码。

另请参阅:

cudaD3D9SetDirect3DDevice, cudaGraphicsD3D9RegisterResource, cuD3D9GetDevice

__host__cudaError_t cudaD3D9GetDevices ( unsigned int* pCudaDeviceCount, int* pCudaDevices, unsigned int  cudaDeviceCount, IDirect3DDevice9* pD3D9Device, cudaD3D9DeviceList deviceList )
获取与Direct3D 9设备对应的CUDA设备。
参数
pCudaDeviceCount
- Returned number of CUDA devices corresponding to pD3D9Device
pCudaDevices
- Returned CUDA devices corresponding to pD3D9Device
cudaDeviceCount
- The size of the output device array pCudaDevices
pD3D9Device
- Direct3D 9 device to query for CUDA devices
deviceList
- The set of devices to return. This set may be cudaD3D9DeviceListAll for all devices, cudaD3D9DeviceListCurrentFrame for the devices used to render the current frame (in SLI), or cudaD3D9DeviceListNextFrame for the devices used to render the next frame (in SLI).
描述

*pCudaDeviceCount中返回与Direct3D 9设备pD3D9Device对应的CUDA兼容设备数量。同时在*pCudaDevices中最多返回cudaDeviceCount个与Direct3D 9设备pD3D9Device对应的CUDA兼容设备。

如果用于渲染pDevice的GPU中有不支持CUDA的,则该调用将返回cudaErrorNoDevice

Note:

请注意,此函数也可能返回之前异步启动的错误代码。

另请参阅:

cudaGraphicsUnregisterResource, cudaGraphicsMapResources, cudaGraphicsSubResourceGetMappedArray, cudaGraphicsResourceGetMappedPointer, cuD3D9GetDevices

__host__cudaError_t cudaD3D9GetDirect3DDevice ( IDirect3DDevice9** ppD3D9Device )
获取当前CUDA上下文所关联的Direct3D设备。
参数
ppD3D9Device
- Returns the Direct3D device for this thread
描述

*ppD3D9Device中返回创建此CUDA上下文时使用的Direct3D设备,该设备是在cudaD3D9SetDirect3DDevice()中设置的。

Note:

请注意,此函数也可能返回之前异步启动的错误代码。

另请参阅:

cudaD3D9SetDirect3DDevice, cuD3D9GetDirect3DDevice

__host__cudaError_t cudaD3D9SetDirect3DDevice ( IDirect3DDevice9* pD3D9Device, int  device = -1 )
设置用于与CUDA设备互操作的Direct3D 9设备。
参数
pD3D9Device
- Direct3D device to use for this thread
device
- The CUDA device to use. This device must be among the devices returned when querying cudaD3D9DeviceListAll from cudaD3D9GetDevices, may be set to -1 to automatically select an appropriate CUDA device.
描述

pD3D9Device记录为用于与CUDA设备device进行Direct3D 9互操作的Direct3D 9设备,并将device设置为调用主机线程的当前设备。

如果需要,此函数将立即在device上初始化主上下文。

如果device已经初始化,此调用将失败并返回错误cudaErrorSetOnActiveProcess。在这种情况下,必须先使用cudaDeviceReset()重置device,然后才能在device上启用Direct3D 9互操作性。

成功初始化CUDA与pD3D9Device的互操作性将增加pD3D9Device的内部引用计数。当使用cudaDeviceReset()重置device时,该引用计数将被递减。

请注意,此功能并非正确运行所必需。仅当操作系统为Windows Vista或Windows 7,且设备pD3DDdevice不是IDirect3DDevice9Ex时,使用此功能才会加速互操作性。在所有其他情况下,此功能并非必要。

Note:

请注意,此函数也可能返回之前异步启动的错误代码。

另请参阅:

cudaD3D9GetDevice, cudaGraphicsD3D9RegisterResource, cudaDeviceReset

__host__cudaError_t cudaGraphicsD3D9RegisterResource ( cudaGraphicsResource** resource, IDirect3DResource9* pD3DResource, unsigned int  flags )
注册一个Direct3D 9资源以便通过CUDA访问。
参数
resource
- Pointer to returned resource handle
pD3DResource
- Direct3D resource to register
flags
- Parameters for resource registration
描述

注册Direct3D 9资源pD3DResource以便CUDA访问。

如果此调用成功,应用程序将能够映射和取消映射该资源,直到通过cudaGraphicsUnregisterResource()取消注册为止。此外,在成功时,此调用将增加pD3DResource的内部引用计数。当通过cudaGraphicsUnregisterResource()取消注册该资源时,此引用计数将递减。

此调用可能具有较高的开销,在交互式应用中不应每帧都调用。

pD3DResource的类型必须是以下之一。

  • IDirect3DVertexBuffer9: 可以通过设备指针访问

  • IDirect3DIndexBuffer9: 可以通过设备指针访问

  • IDirect3DSurface9: 可以通过数组访问。只有独立类型的IDirect3DSurface9对象可以被显式共享。特别是,单独的mipmap级别和立方体贴图的各个面不能直接注册。要访问与纹理关联的各个表面,必须注册基础纹理对象。

  • IDirect3DBaseTexture9: 可以通过数组访问此纹理上的各个表面。

flags参数可用于在注册时指定额外参数。该参数的有效值为

并非所有上述类型的Direct3D资源都能用于与CUDA的互操作性。以下是一些限制。

  • 主渲染目标可能未在CUDA中注册。

  • 分配为共享的资源可能无法在CUDA中注册。

  • 无法共享那些格式不是1、2或4通道的8位、16位或32位整数或浮点数据的纹理。

  • 深度或模板格式的表面无法共享。

支持的完整格式列表如下:

  • D3DFMT_L8

  • D3DFMT_L16

  • D3DFMT_A8R8G8B8

  • D3DFMT_X8R8G8B8

  • D3DFMT_G16R16

  • D3DFMT_A8B8G8R8

  • D3DFMT_A8

  • D3DFMT_A8L8

  • D3DFMT_Q8W8V8U8

  • D3DFMT_V16U16

  • D3DFMT_A16B16G16R16F

  • D3DFMT_A16B16G16R16

  • D3DFMT_R32F

  • D3DFMT_G16R16F

  • D3DFMT_A32B32G32R32F

  • D3DFMT_G32R32F

  • D3DFMT_R16F

如果pD3DResource类型不正确或已被注册,则返回cudaErrorInvalidResourceHandle。如果pD3DResource无法注册,则返回cudaErrorUnknown

Note:

请注意,此函数也可能返回之前异步启动的错误代码。

另请参阅:

cudaD3D9SetDirect3DDevice, cudaGraphicsUnregisterResource, cudaGraphicsMapResources, cudaGraphicsSubResourceGetMappedArray, cudaGraphicsResourceGetMappedPointer, cuGraphicsD3D9RegisterResource