具有不同D3D11_USAGE的ID3D11DeviceContext :: CopyResource

时间:2017-12-11 23:13:47

标签: nvidia direct3d nvidia-flex

我正在考虑 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 的缓冲区之间的复制?或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

D3D11_USAGE_DYNAMIC表示GPU(只读)和CPU(只写)都可以访问的资源。这就是为什么它不能在CopyResource中使用。