6.40. Direct3D 9 互操作性
本节介绍低级别 CUDA 驱动程序应用程序编程接口的 Direct3D 9 互操作性功能。请注意,Direct3D 9 资源的映射是使用 图形互操作性 中描述的图形 API 不可知、资源映射接口执行的。
模块
枚举
- enum CUd3d9DeviceList
函数
- CUresult cuD3D9CtxCreate ( CUcontext* pCtx, CUdevice* pCudaDevice, unsigned int Flags, IDirect3DDevice9* pD3DDevice )
- 为与 Direct3D 9 互操作创建 CUDA 上下文。
- CUresult cuD3D9CtxCreateOnDevice ( CUcontext* pCtx, unsigned int flags, IDirect3DDevice9* pD3DDevice, CUdevice cudaDevice )
- 为与 Direct3D 9 互操作创建 CUDA 上下文。
- CUresult cuD3D9GetDevice ( CUdevice* pCudaDevice, const char* pszAdapterName )
- 获取与显示适配器对应的 CUDA 设备。
- CUresult cuD3D9GetDevices ( unsigned int* pCudaDeviceCount, CUdevice* pCudaDevices, unsigned int cudaDeviceCount, IDirect3DDevice9* pD3D9Device, CUd3d9DeviceList deviceList )
- 获取与 Direct3D 9 设备对应的 CUDA 设备。
- CUresult cuD3D9GetDirect3DDevice ( IDirect3DDevice9** ppD3DDevice )
- 获取创建当前 CUDA 上下文所针对的 Direct3D 9 设备。
- CUresult cuGraphicsD3D9RegisterResource ( CUgraphicsResource* pCudaResource, IDirect3DResource9* pD3DResource, unsigned int Flags )
- 注册 Direct3D 9 资源以供 CUDA 访问。
枚举
函数
- CUresult cuD3D9CtxCreate ( CUcontext* pCtx, CUdevice* pCudaDevice, unsigned int Flags, IDirect3DDevice9* pD3DDevice )
-
为与 Direct3D 9 互操作创建 CUDA 上下文。
参数
- pCtx
- - 返回新创建的 CUDA 上下文
- pCudaDevice
- - 返回指向在其上创建上下文的设备的指针
- Flags
- - 上下文创建标志(有关详细信息,请参阅 cuCtxCreate())
- pD3DDevice
- - 要创建互操作性上下文的 Direct3D 设备
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_OUT_OF_MEMORY, CUDA_ERROR_UNKNOWN
描述
创建一个新的 CUDA 上下文,为该上下文启用与 Direct3D 设备的互操作性pD3DDevice,并将创建的 CUDA 上下文与调用线程关联。创建的 CUcontext 将在*pCtx中返回。来自此设备的 Direct3D 资源可以在此 CUDA 上下文的生命周期内注册和映射。如果pCudaDevice为非 NULL,则在其上创建此 CUDA 上下文的 CUdevice 将在*pCudaDevice.
中返回。成功后,此调用将增加pD3DDevice上的内部引用计数。此引用计数将在通过 cuCtxDestroy() 销毁此上下文时递减。如果pD3DDevice被销毁或遇到错误,则此上下文将停止工作。
请注意,对于正确的功能,永远不需要此函数。仅当操作系统为 Windows Vista 或 Windows 7,并且设备pD3DDdevice不是 IDirect3DDevice9Ex 时,使用此函数才会导致加速互操作性。在所有其他情况下,此函数都不是必需的。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
- CUresult cuD3D9CtxCreateOnDevice ( CUcontext* pCtx, unsigned int flags, IDirect3DDevice9* pD3DDevice, CUdevice cudaDevice )
-
为与 Direct3D 9 互操作创建 CUDA 上下文。
参数
- pCtx
- - 返回新创建的 CUDA 上下文
- flags
- - 上下文创建标志(有关详细信息,请参阅 cuCtxCreate())
- pD3DDevice
- - 要创建互操作性上下文的 Direct3D 设备
- cudaDevice
- - 要在其上创建上下文的 CUDA 设备。此设备必须是查询 cuD3D9GetDevices 中的 CU_D3D9_DEVICES_ALL 时返回的设备之一。
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_OUT_OF_MEMORY, CUDA_ERROR_UNKNOWN
描述
创建一个新的 CUDA 上下文,为该上下文启用与 Direct3D 设备的互操作性pD3DDevice,并将创建的 CUDA 上下文与调用线程关联。创建的 CUcontext 将在*pCtx。来自此设备的 Direct3D 资源可以在此 CUDA 上下文的生命周期内注册和映射。
中返回。成功后,此调用将增加pD3DDevice上的内部引用计数。此引用计数将在通过 cuCtxDestroy() 销毁此上下文时递减。如果pD3DDevice被销毁或遇到错误,则此上下文将停止工作。
请注意,对于正确的功能,永远不需要此函数。仅当操作系统为 Windows Vista 或 Windows 7,并且设备pD3DDdevice不是 IDirect3DDevice9Ex 时,使用此函数才会导致加速互操作性。在所有其他情况下,此函数都不是必需的。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
- CUresult cuD3D9GetDevice ( CUdevice* pCudaDevice, const char* pszAdapterName )
-
获取与显示适配器对应的 CUDA 设备。
参数
- pCudaDevice
- - 返回与 pszAdapterName 对应的 CUDA 设备
- pszAdapterName
- - 要查询设备的适配器名称
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_NOT_FOUND, CUDA_ERROR_UNKNOWN
描述
在*pCudaDevice中返回与从 EnumDisplayDevices() 或 IDirect3D9::GetAdapterIdentifier() 获取的适配器名称对应的 CUDA 兼容设备。pszAdapterName从 EnumDisplayDevices() 或 IDirect3D9::GetAdapterIdentifier() 获取的适配器名称对应的 CUDA 兼容设备。
如果名称为pszAdapterName的适配器上没有 CUDA 兼容设备,则调用将失败。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
- CUresult cuD3D9GetDevices ( unsigned int* pCudaDeviceCount, CUdevice* pCudaDevices, unsigned int cudaDeviceCount, IDirect3DDevice9* pD3D9Device, CUd3d9DeviceList deviceList )
-
获取与 Direct3D 9 设备对应的 CUDA 设备。
参数
- pCudaDeviceCount
- - 返回与pD3D9Device
- 对应的 CUDA 设备数
- - 返回与pD3D9Device
- cudaDeviceCount
- - 输出设备数组的大小对应的 CUDA 设备数
- pD3D9Device
- - 要查询 CUDA 设备的 Direct3D 9 设备
- deviceList
- - 要返回的设备集。此集合可以是 CU_D3D9_DEVICE_LIST_ALL,表示所有设备;CU_D3D9_DEVICE_LIST_CURRENT_FRAME,表示用于渲染当前帧的设备(在 SLI 中);或者 CU_D3D9_DEVICE_LIST_NEXT_FRAME,表示用于渲染下一帧的设备(在 SLI 中)。
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_NO_DEVICE, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_NOT_FOUND, CUDA_ERROR_UNKNOWN
描述
在*pCudaDeviceCount返回与 Direct3D 9 设备对应的 CUDA 兼容设备数pD3D9Device。还在*pCudaDevices中最多返回cudaDeviceCount个与 Direct3D 9 设备对应的 CUDA 兼容设备pD3D9Device.
。如果用于渲染pDevice的任何 GPU 不支持 CUDA,则调用将返回 CUDA_ERROR_NO_DEVICE。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
- CUresult cuD3D9GetDirect3DDevice ( IDirect3DDevice9** ppD3DDevice )
-
获取创建当前 CUDA 上下文所针对的 Direct3D 9 设备。
参数
- ppD3DDevice
- - 返回与 CUDA 上下文对应的 Direct3D 设备
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXTCUDA_ERROR_INVALID_GRAPHICS_CONTEXT
描述
在*ppD3DDevice在 cuD3D9CtxCreate() 中创建此 CUDA 上下文所针对的 Direct3D 设备。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
- CUresult cuGraphicsD3D9RegisterResource ( CUgraphicsResource* pCudaResource, IDirect3DResource9* pD3DResource, unsigned int Flags )
-
注册 Direct3D 9 资源以供 CUDA 访问。
参数
- pCudaResource
- - 返回的图形资源句柄
- pD3DResource
- - 要注册的 Direct3D 资源
- Flags
- - 资源注册参数
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_INVALID_HANDLE, CUDA_ERROR_OUT_OF_MEMORY, CUDA_ERROR_UNKNOWN
描述
注册 Direct3D 9 资源pD3DResource以供 CUDA 访问,并在pD3Dresource中返回pCudaResource的 CUDA 句柄。在取消注册之前,可以使用在pCudaResource中返回的句柄来映射和取消映射此资源。成功后,此调用将增加pD3DResource上的内部引用计数。当通过 cuGraphicsUnregisterResource() 取消注册此资源时,此引用计数将递减。
此调用可能开销很高,不应在交互式应用程序中每帧调用。
的类型pD3DResource必须是以下类型之一。
-
IDirect3DVertexBuffer9:可以通过设备指针访问
-
IDirect3DIndexBuffer9:可以通过设备指针访问
-
IDirect3DSurface9:可以通过数组访问。只有 IDirect3DSurface9 类型的独立对象才能显式共享。特别是,mipmap 级别和立方体贴图的面不能直接注册。要访问与纹理关联的各个表面,必须注册基本纹理对象。
-
IDirect3DBaseTexture9:可以访问此纹理上的各个表面(通过数组)。
参数Flags可用于在注册时指定其他参数。此参数的有效值是
-
CU_GRAPHICS_REGISTER_FLAGS_NONE:指定关于如何使用此资源的无提示。
-
CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST:指定 CUDA 会将此资源绑定到表面引用。
-
CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER:指定 CUDA 将对此资源执行纹理采集操作。
并非所有上述类型的 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
如果未使用 cuD3D9CtxCreate 为此上下文初始化 Direct3D 互操作性,则返回 CUDA_ERROR_INVALID_CONTEXT。如果pD3DResource类型不正确或已注册,则返回 CUDA_ERROR_INVALID_HANDLE。如果pD3DResource无法注册,则返回 CUDA_ERROR_UNKNOWN。如果Flags不是上述指定值之一,则返回 CUDA_ERROR_INVALID_VALUE。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
cuD3D9CtxCreate, cuGraphicsUnregisterResource, cuGraphicsMapResources, cuGraphicsSubResourceGetMappedArray, cuGraphicsResourceGetMappedPointer, cudaGraphicsD3D9RegisterResource