我正在探索Nvidia 的 Flex,但我对 D3D 很陌生。我正在尝试在使用不同D3D11_BUFFER_DESC创建的两个ID3D11Buffer之间进行复制。我想使用ID3D11DeviceContext::CopyResource()因为它是 GPU-GPU 副本,但代码抛出异常。
两个缓冲区创建如下:
//First Buffer:
D3D11_BUFFER_DESC bufDesc;
bufDesc.ByteWidth = numParticles*sizeof(Vec4);
bufDesc.Usage = D3D11_USAGE_DYNAMIC;
bufDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bufDesc.MiscFlags = 0;
bufDesc.StructureByteStride = 0;
m_device->CreateBuffer(&bufDesc, NULL, buff0);
//Second Buffer
D3D11_BUFFER_DESC bufDescTemp;
bufDescTemp.ByteWidth = numParticles * sizeof(Vec4);
bufDescTemp.Usage = D3D11_USAGE_DEFAULT;
bufDescTemp.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufDescTemp.CPUAccessFlags =
D3D11_CPU_ACCESS_READ;//D3D11_CPU_ACCESS_READ;//
bufDescTemp.MiscFlags = 0;
bufDescTemp.StructureByteStride = 0;
m_device->CreateBuffer(&bufDescTemp, NULL, buff1);
然后在每一帧我从Flex 的 NvFlexGet 得到一个更新的 buff0。然后我尝试将 buff0 复制到 buff1:
context->CopyResource(buff1,buff0);
但是这条线抛出异常。如果两个缓冲区都是使用D3D11_USAGE_DYNAMIC创建的,它工作正常。但不是当 buff1 是D3D11_USAGE_DEFAULT时。
ID3D11DeviceContext::CopyResource 是否支持具有不同D3D11_USAGE的缓冲区之间的复制?还是我错过了什么?