我将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
如何解决这些调试层错误?
答案 0 :(得分:1)
上传缓冲区只能处于D3D12_RESOURCE_STATE_GENERIC_READ
状态(link)。您需要创建一个D3D12_RESOURCE_STATE_COPY_DEST
状态的默认缓冲区。然后在cpu上映射上传堆后,您可以使用ID3D12GraphicsCommandList::CopyBufferRegion()方法将上传缓冲区的内容复制到gpu上的默认缓冲区。不要忘记将默认缓冲区转换为可用状态,并确保在gpu执行复制时上传堆仍然存在。