更新顶点缓冲区会导致调试层错误

时间:2016-08-11 05:56:17

标签: c++ directx-12

我将Windows 10更新到版本1607,其中包括额外的D3D调试层检查。我的顶点缓冲区更新代码在更新之前没有警告/错误,但现在我在调用Montior.Exit()时收到错误:

  

资源的资源状态(0xAC3:D3D12_RESOURCE_STATE_GENERIC_READ)   (0x000001DB301B9750:'')(子资源:0)是   无效用作目标缓冲区。预期的状态位:0x400:   D3D12_RESOURCE_STATE_COPY_DEST,实际状态:0xAC3:   D3D12_RESOURCE_STATE_GENERIC_READ

如果我将CopyBufferRegion转换为想要的状态(vb),我会收到如下错误:

  

D3D12错误:ID3D12CommandList :: ResourceBarrier:某些堆是   限制在某些D3D12_RESOURCE_STATES状态,并且不能   改变。 D3D12_HEAP_TYPE_UPLOAD要求   D3D12_RESOURCE_STATE_GENERIC_READ。 D3D12_HEAP_TYPE_READBACK需要   D3D12_RESOURCE_STATE_COPY_DEST。 [RESOURCE_MANIPULATION ERROR#741:   RESOURCE_BARRIER_INVALID_HEAP]

这是我的代码。它创建一个顶点缓冲区并上传顶点数据,必要时调整缓冲区的大小:

D3D12_RESOURCE_STATE_COPY_DEST

如何解决这些调试层错误?

1 个答案:

答案 0 :(得分:1)

上传缓冲区只能处于D3D12_RESOURCE_STATE_GENERIC_READ状态(link)。您需要创建一个D3D12_RESOURCE_STATE_COPY_DEST状态的默认缓冲区。然后在cpu上映射上传堆后,您可以使用ID3D12GraphicsCommandList::CopyBufferRegion()方法将上传缓冲区的内容复制到gpu上的默认缓冲区。不要忘记将默认缓冲区转换为可用状态,并确保在gpu执行复制时上传堆仍然存在。