6.18. Direct3D 9 互操作性
本节介绍 CUDA 运行时应用程序编程接口的 Direct3D 9 互操作性功能。请注意,Direct3D 9 资源的映射是通过 图形互操作性 中描述的图形 API 不可知、资源映射接口执行的。
枚举
- enum cudaD3D9DeviceList
函数
- __host__ cudaError_t cudaD3D9GetDevice ( int* device, const char* pszAdapterName )
- 获取适配器的设备编号。
- __host__ cudaError_t cudaD3D9GetDevices ( unsigned int* pCudaDeviceCount, int* pCudaDevices, unsigned int cudaDeviceCount, IDirect3DDevice9* pD3D9Device, cudaD3D9DeviceList deviceList )
- 获取与 Direct3D 9 设备对应的 CUDA 设备。
- __host__ cudaError_t cudaD3D9GetDirect3DDevice ( IDirect3DDevice9** ppD3D9Device )
- 获取创建当前 CUDA 上下文所针对的 Direct3D 设备。
- __host__ cudaError_t cudaD3D9SetDirect3DDevice ( IDirect3DDevice9* pD3D9Device, int device = -1 )
- 设置用于与 CUDA 设备进行互操作的 Direct3D 9 设备。
- __host__ cudaError_t cudaGraphicsD3D9RegisterResource ( cudaGraphicsResource** resource, IDirect3DResource9* pD3DResource, unsigned int flags )
- 注册 Direct3D 9 资源以供 CUDA 访问。
枚举
函数
- __host__ cudaError_t cudaD3D9GetDevice ( int* device, const char* pszAdapterName )
-
获取适配器的设备编号。
参数
- device
- - 返回与 pszAdapterName 对应的设备
- pszAdapterName
- - 要获取设备的 D3D9 适配器
描述
在*device中返回与适配器名称对应的 CUDA 兼容设备pszAdapterName从 EnumDisplayDevices 或 IDirect3D9::GetAdapterIdentifier() 获取。如果名称为pszAdapterName的适配器上没有 CUDA 兼容设备,则调用将失败。
注意请注意,此函数也可能返回先前异步启动的错误代码。
另请参阅
cudaD3D9SetDirect3DDevice, cudaGraphicsD3D9RegisterResource, cuD3D9GetDevice
- __host__ cudaError_t cudaD3D9GetDevices ( unsigned int* pCudaDeviceCount, int* pCudaDevices, unsigned int cudaDeviceCount, IDirect3DDevice9* pD3D9Device, cudaD3D9DeviceList deviceList )
-
获取与 Direct3D 9 设备对应的 CUDA 设备。
参数
- pCudaDeviceCount
- - 返回的与pD3D9Device
- 对应的 CUDA 设备数量
- pCudaDevicespD3D9Device
- - 返回的与
- cudaDeviceCount对应的 CUDA 设备数量
- pD3D9Device
- - 输出设备数组的大小
- - 要查询 CUDA 设备的 Direct3D 9 设备
- deviceList
返回值
- 要返回的设备集。此集合可以是 cudaD3D9DeviceListAll(用于所有设备)、cudaD3D9DeviceListCurrentFrame(用于渲染当前帧的设备,在 SLI 中)或 cudaD3D9DeviceListNextFrame(用于渲染下一帧的设备,在 SLI 中)。
描述
在cudaSuccess, cudaErrorNoDevice, cudaErrorUnknown*pCudaDeviceCountpD3D9Device与 Direct3D 9 设备对应的 CUDA 兼容设备的数量。还在*pCudaDevices- 返回的与中返回最多pD3D9Device.
与 Direct3D 9 设备对应的 CUDA 兼容设备。如果用于渲染pDevice
注意请注意,此函数也可能返回先前异步启动的错误代码。
另请参阅
的任何 GPU 不支持 CUDA,则调用将返回 cudaErrorNoDevice。
- cudaGraphicsUnregisterResource, cudaGraphicsMapResources, cudaGraphicsSubResourceGetMappedArray, cudaGraphicsResourceGetMappedPointer, cuD3D9GetDevices
-
__host__ cudaError_t cudaD3D9GetDirect3DDevice ( IDirect3DDevice9** ppD3D9Device )
参数
- 获取创建当前 CUDA 上下文所针对的 Direct3D 设备。
- ppD3D9Device
返回值
- 返回此线程的 Direct3D 设备
描述
在cudaSuccess, cudaErrorInvalidGraphicsContext, cudaErrorUnknown*ppD3D9Device
注意请注意,此函数也可能返回先前异步启动的错误代码。
另请参阅
在 cudaD3D9SetDirect3DDevice() 中创建此 CUDA 上下文所针对的 Direct3D 设备。
- cudaD3D9SetDirect3DDevice, cuD3D9GetDirect3DDevice
-
__host__ cudaError_t cudaD3D9SetDirect3DDevice ( IDirect3DDevice9* pD3D9Device, int device = -1 )
参数
- pD3D9Device
- 设置用于与 CUDA 设备进行互操作的 Direct3D 9 设备。
- device
- - 用于此线程的 Direct3D 设备
返回值
- 要使用的 CUDA 设备。此设备必须是查询 cudaD3D9DeviceListAll(来自 cudaD3D9GetDevices)时返回的设备之一,可以设置为 -1 以自动选择合适的 CUDA 设备。
描述
cudaSuccess, cudaErrorInitializationError, cudaErrorInvalidValue, cudaErrorSetOnActiveProcesspD3D9Device记录device为用于与 CUDA 设备进行 Direct3D 9 互操作的 Direct3D 9 设备device并设置
为调用主机线程的当前设备。device如果需要,此函数将立即初始化
上的主上下文。device如果device已初始化,则此调用将失败,并显示错误 cudaErrorSetOnActiveProcess。在这种情况下,必须在device上启用 Direct3D 9 互操作之前,使用 cudaDeviceReset() 重置
成功初始化与pD3D9Device的 CUDA 互操作性将增加pD3D9Device上的内部引用计数。当使用 cudaDeviceReset() 重置device时,此引用计数将递减。
请注意,对于正确的功能,永远不需要此函数。仅当操作系统为 Windows Vista 或 Windows 7 且设备pD3DDdevice不是 IDirect3DDevice9Ex 时,使用此函数才会导致加速互操作。在所有其他情况下,此函数都不是必需的。
注意请注意,此函数也可能返回先前异步启动的错误代码。
另请参阅
cudaD3D9GetDevice, cudaGraphicsD3D9RegisterResource, cudaDeviceReset
- __host__ cudaError_t cudaGraphicsD3D9RegisterResource ( cudaGraphicsResource** resource, IDirect3DResource9* pD3DResource, unsigned int flags )
-
注册 Direct3D 9 资源以供 CUDA 访问。
参数
- resource
- - 指向返回的资源句柄的指针
- pD3DResource
- - 要注册的 Direct3D 资源
- flags
- - 资源注册的参数
返回值
cudaSuccess, cudaErrorInvalidDevice, cudaErrorInvalidValue, cudaErrorInvalidResourceHandle, cudaErrorUnknown
描述
注册 Direct3D 9 资源pD3DResource以供 CUDA 访问。
如果此调用成功,则应用程序将能够映射和取消映射此资源,直到通过 cudaGraphicsUnregisterResource() 取消注册为止。同样,如果成功,此调用将增加pD3DResource上的内部引用计数。当通过 cudaGraphicsUnregisterResource() 取消注册此资源时,此引用计数将递减。
此调用可能具有很高的开销,不应在交互式应用程序中每帧调用。
的类型pD3DResource必须是以下类型之一。
-
IDirect3DVertexBuffer9:可以通过设备指针访问
-
IDirect3DIndexBuffer9:可以通过设备指针访问
-
IDirect3DSurface9:可以通过数组访问。只有 IDirect3DSurface9 类型的独立对象才能显式共享。特别是,mipmap 级别和立方体贴图的面不能直接注册。要访问与纹理关联的各个表面,必须注册基本纹理对象。
-
IDirect3DBaseTexture9:可以**通过数组访问此纹理上的各个表面。**
参数flags可用于在注册时指定其他参数。此参数的有效值是
-
cudaGraphicsRegisterFlagsNone:指定有关如何使用此资源的任何提示。
-
cudaGraphicsRegisterFlagsSurfaceLoadStore:指定 CUDA 会将此资源绑定到表面引用。
-
cudaGraphicsRegisterFlagsTextureGather:指定 CUDA 将对此资源执行纹理 Gather 操作。
并非上述类型的所有 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。
注意请注意,此函数也可能返回先前异步启动的错误代码。
另请参阅
cudaD3D9SetDirect3DDevice, cudaGraphicsUnregisterResource, cudaGraphicsMapResources, cudaGraphicsSubResourceGetMappedArray, cudaGraphicsResourceGetMappedPointer, cuGraphicsD3D9RegisterResource