WPF应用程序中的CUDA和Direct3D互操作性



我尝试使用CUDA计算和direct3d9图形来实现WPF应用。所以我使用以下方法:

    我使用MSDN"攻略:托管Direct3D9"创建WPF应用程序WPF 中的内容
  1. 然后我使用MSDN"演练:创建Direct3D9"创建DLL
  2. 中托管的内容
  3. 成功了,我看到一个旋转的三角形。
  4. 然后根据3.2.11.2部分的要求尝试实现Direct3D 9的互操作《NVIDIA CUDA C编程指南》但cudaGraphicsD3D9RegisterResource函数返回错误。

我在类中声明CUDA图形资源变量:

#pragma once
class CTriangleRenderer : public CRenderer
{
public:
    static HRESULT Create(IDirect3D9 *pD3D, IDirect3D9Ex *pD3DEx, HWND hwnd, UINT uAdapter, CRenderer **ppRenderer);
    ~CTriangleRenderer();
    HRESULT Render();
protected:
    HRESULT Init(IDirect3D9 *pD3D, IDirect3D9Ex *pD3DEx, HWND hwnd, UINT uAdapter);
private:
    CTriangleRenderer();
    IDirect3DVertexBuffer9 *m_pd3dVB;
    struct cudaGraphicsResource* positionsVB_CUDA;
};

cudaGraphicsD3D9RegisterResource函数调用是这个类成员:

HRESULT 
CTriangleRenderer::Init(IDirect3D9 *pD3D, IDirect3D9Ex *pD3DEx, HWND hwnd, UINT uAdapter)
{
    HRESULT hr = S_OK;
    D3DXMATRIXA16 matView, matProj;
    D3DXVECTOR3 vEyePt(0.0f, 0.0f,-5.0f);
    D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
    // Call base to create the device and render target
    IFC(CRenderer::Init(pD3D, pD3DEx, hwnd, uAdapter));
    // Set up the VB
    CUSTOMVERTEX vertices[] =
    {
        { -1.0f, -1.0f, 0.0f, 0xffff0000, }, // x, y, z, color
        {  1.0f, -1.0f, 0.0f, 0xff00ff00, },
        {  0.0f,  1.0f, 0.0f, 0xff00ffff, },
    };
    IFC(m_pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pd3dVB, NULL));
    cudaGraphicsD3D9RegisterResource(&positionsVB_CUDA, m_pd3dVB, cudaGraphicsRegisterFlagsNone);
    cutilCheckMsg("cudaGraphicsD3D9RegisterResource failed");
    cudaGraphicsResourceSetMapFlags(positionsVB_CUDA, cudaGraphicsMapFlagsWriteDiscard);
    void *pVertices;
    IFC(m_pd3dVB->Lock(0, sizeof(vertices), &pVertices, 0));
    memcpy(pVertices, vertices, sizeof(vertices));
    m_pd3dVB->Unlock();
    // Set up the camera
    D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
    IFC(m_pd3dDevice->SetTransform(D3DTS_VIEW, &matView));
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
    IFC(m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj));
    // Set up the global state
    IFC(m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE));
    IFC(m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE));
    IFC(m_pd3dDevice->SetStreamSource(0, m_pd3dVB, 0, sizeof(CUSTOMVERTEX)));
    IFC(m_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX));
Cleanup:
    return hr;
}

positionsVB_CUDA变量在cudaGraphicsD3D9RegisterResource调用前值为0xcdcdcdcd,调用后值相同。

我的错误在哪里?来自CUDA SDK的Direct3D 9互操作示例工作良好。我的配置:

  • nvidia GTX 260 800 mb
  • nvidia GTX 460 2 gb
  • CUDA 4.0
  • Windows 7 64位
  • 8 gb RAM
  • Visual Studio 2010

CUDA对可以绑定的VB类型有特定的要求(我不认为你可以CPU锁定/解锁绑定到CUDA的VB)。如果你想修复锁定/解锁:打开DirectX错误日志记录,并通过DirectX控制面板使用DirectX调试dll(在启动菜单中的DirectX文件夹中找到它(你必须安装DirectX SDK))。这将启用DirectX的调试登录,这在调查DirectX错误(它记录到Visual Studio的输出窗口)时非常有用和有用。您可能正在尝试锁定一个可解锁的VB(如果您希望从CPU读取VB,则对初始化VB有特定的要求)。

最新更新