技术开发 频道

CUDA 3.0 编程接口

  Direct3D 10版本:

ID3D10Device* device;
struct CUSTOMVERTEX {
FLOAT x, y, z;
DWORD color;
};
ID3D10Buffer
* positionsVB;
struct cudaGraphicsResource* positionsVB_CUDA;
int main() {
// Get a CUDA-enabled adapter
IDXGIFactory* factory;
CreateDXGIFactory(__uuidof(IDXGIFactory), (
void**)&factory);
IDXGIAdapter
* adapter = 0;
for (unsigned int i = 0; !adapter; ++i) {
if (FAILED(factory->EnumAdapters(i, &adapter))
break;
factory->Release();
// Create swap chain and device
D3D10CreateDeviceAndSwapChain(adapter, D3D10_DRIVER_TYPE_HARDWARE, 0, D3D10_CREATE_DEVICE_DEBUG, D3D10_SDK_VERSION, &swapChainDesc, &swapChain, &device);
adapter
->Release();
// Register device with CUDA
cudaD3D10SetDirect3DDevice(device);
// Create vertex buffer and register it with CUDA
unsigned int size = width * height * sizeof(CUSTOMVERTEX);
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage
= D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth
= size;
bufferDesc.BindFlags
= D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags
= 0;
bufferDesc.MiscFlags
= 0;
device
->CreateBuffer(&bufferDesc, 0, &positionsVB);
cudaGraphicsD3D10RegisterResource(
&positionsVB_CUDA, positionsVB, cudaGraphicsRegisterFlagsNone);
cudaGraphicsResourceSetMapFlags(positionsVB_CUDA, cudaGraphicsMapFlagsWriteDiscard);
/ Launch rendering loop
while (...) {
Render();
}
}
void Render() {
// Map vertex buffer for writing from CUDA
float4* positions;
cudaGraphicsMapResources(
1, &positionsVB_CUDA, 0);
size_t num_bytes;
cudaGraphicsResourceGetMappedPointer((
void**)&positions, &num_bytes, positionsVB_CUDA));
// Execute kernel
dim3 dimBlock(16, 16, 1);
dim3 dimGrid(width
/ dimBlock.x, height / dimBlock.y, 1);
createVertices
<<<dimGrid, dimBlock>>>(positions, time, width, height);
// Unmap vertex buffer
cudaGraphicsUnmapResources(1, &positionsVB_CUDA, 0);
// Draw and present
}
void releaseVB() {
cudaGraphicsUnregisterResource(positionsVB_CUDA);
positionsVB
->Release();
}
__global__
void createVertices(float4* positions, float time, unsigned int width, unsigned int height) {
unsigned
int x =
0
相关文章