D3D学习笔记整理(五)

本文介绍了如何在CUDA中实现与Direct3D的互操作,包括初始化D3D设备、创建并注册顶点缓冲区、CUDA写入顶点数据、渲染过程以及资源释放。通过示例代码详细阐述了CUDA与D3D设备的绑定、资源映射和解映射等关键步骤。
摘要由CSDN通过智能技术生成

六、D3DCUDA的互操作

CUDAD3D可以进行互操作,也就是说可以将D3D的资源映射到CUDA地址空间,使在CUDA中可以对D3D读取和写入数据。CUDA实现这个功能的API有两组,这里以运行时API为例。

实现D3DCUDA的互操作,从总体上看,主要多了D3D设备指定和资源注册及相应释放操作,以及在创建D3D设备时使用D3DCREATE_HARDWARE_VERTEXPROCESSING标识,见下例。

1、 初始化D3D设备

这个过程与一般的D3D设备创建过程并没有太多变化,注意用颜色表示的部分。另外,用于指定D3D设备的函数cudaD3D9SetDirect3DDevice必须在调用其它CUDA运行时API之前调用。

 HRESULT Cdig_D3DDlg::InitD3D9( UINT hWnd )

{

    m_hwndRender =GetDlgItem(hWnd)->GetSafeHwnd();//当前显示窗口

    LPDIRECT3D9 g_pD3D = NULL;     //Direct3D对象指针(不是设备指针)LPDIRECT3D9 g_pD3D = NULL;     //Direct3D对象指针(不是设备指针)

    // Create the D3D object.

    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )

        return E_FAIL;

 

    // Find the first CUDA capable device

    for(g_iAdapter = 0; g_iAdapter < g_pD3D->GetAdapterCount(); g_iAdapter++)

    {

        D3DCAPS9 caps;

        if (FAILED(g_pD3D->GetDeviceCaps(g_iAdapter, D3DDEVTYPE_HAL, &caps)))

            // Adapter doesn't support Direct3D

            continue;

        D3DADAPTER_IDENTIFIER9 ident;

        int device;

        g_pD3D->GetAdapterIdentifier(g_iAdapter, 0, &ident);

        cudaD3D9GetDevice(&device, ident.DeviceName);

        if (cudaSuccess == cudaGetLastError() )

            break;

    }

 

    // we check to make sure we have found a cuda-compatible D3D device to work on

    if(g_iAdapter == g_pD3D->GetAdapterCount() ) {

        printf("No CUDA-compatible Direct3D9 device available/n");

        printf("Test PASSED/n");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值