Совместимость CUDA и Direct3D в приложениях WPF - PullRequest
3 голосов
/ 02 сентября 2011

Я пытаюсь реализовать приложение WPF, используя вычисления CUDA и графику Direct3D 9.Поэтому я использую следующий подход:

  1. Я создаю приложение WPF с использованием MSDN «Пошаговое руководство. Размещение содержимого Direct3D9 в WPF»
  2. Затем я создаю DLL с использованием MSDN «Пошаговое руководство. Создание контента Direct3D9 для хостинга в WPF»
  3. Работает, вижу вращающийся треугольник.
  4. Затем я пытаюсь реализовать взаимодействие Direct3D 9 в соответствии с частью 3.2.11.2.«Руководство по программированию 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;
}

позицииVB_CUDA равно 0xcdcdcdcd до вызова cudaGraphicsD3D9RegisterResource и то же значение после.

Где моя ошибка?Пример взаимодействия Direct3D 9 из CUDA SDK работает нормально.Моя конфигурация:

  • NVIDIA GTX 260 800 МБ
  • NVIDIA GTX 460 2 ГБ
  • CUDA 4.0
  • Windows 7 64-битная
  • 8 ГБ ОЗУ
  • Visual Studio 2010

1 Ответ

2 голосов
/ 17 октября 2011

CUDA предъявляет особые требования к типам VB, которые могут быть связаны (я не думаю, что вы можете заблокировать / разблокировать процессор VB, который привязан к CUDA). Если вы хотите исправить блокировку / разблокировку: включите ведение журнала ошибок DirectX и используйте отладочные Dll DirectX через панель управления DirectX (найдите ее в папке DirectX в меню запуска (у вас должен быть установлен DirectX SDK)). Это активирует журнал отладки для DirectX, который очень полезен и информативен при расследовании ошибок DirectX (он регистрируется в окне вывода в Visual Studio). Вероятно, вы пытаетесь заблокировать разблокируемый VB (существуют определенные требования для инициализации VB, если вы хотите, чтобы он был читаемым из ЦП).

...