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