问题标签 [directx-descriptor-heap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3720 浏览

c++ - directx-12 - 如何使用具有多个描述符堆的命令列表?

目前通过微软的例子,值得注意的是,每个命令列表只使用一个 cbv_srv_uav 堆(+ 可能在额外的采样器堆上)。

每个 CommandList 是否可以使用多个堆?

所以我设置了堆和范围

之后我定义描述符表

因此,我在 rsv 堆中的 cpu 偏移量 0 和 1 处为纹理 1 和 2 创建 shaderResourceViews,并为 cbv 堆中 cpu 偏移量 0 处的常量缓冲区创建一个 constantbufferview

像这样:

现在是时候告诉命令列表引用这些堆了

在此之后,关闭命令列表总是抛出。

这是我如何告诉命令列表哪个表对应哪个堆:

如果我将所有对象描述为一个单一的描述符堆(如示例中)并且只使用该堆的不同偏移量,它就可以正常工作。

调试输出:

D3D12 错误:ID3D12CommandList::SetDescriptorHeaps:pDescriptorHeaps[1] 设置了在 pDescriptorHeaps 数组中较早出现的描述符堆类型。一次只能设置任何给定的描述符堆类型之一。[执行错误#554:SET_DESCRIPTOR_HEAP_INVALID] D3D12 错误:CCommandList::SetGraphicsRootDescriptorTable:当前在命令列表中未设置 CBV_SRV_UAV 描述符堆,因此设置 CBV_SRV_UAV 句柄的根描述符表无效。[执行错误#708:SET_DESCRIPTOR_TABLE_INVALID] D3D12 错误:CCommandList::SetGraphicsRootDescriptorTable:当前在命令列表上未设置 CBV_SRV_UAV 描述符堆,因此设置 CBV_SRV_UAV 句柄的根描述符表无效。[执行错误 #708:SET_DESCRIPTOR_TABLE_INVALID] D3D12 错误:CCommandList::SetGraphicsRootDescriptorTable: 当前在命令列表上没有设置 CBV_SRV_UAV 描述符堆,因此设置 CBV_SRV_UAV 句柄的根描述符表是无效的。[执行错误#708:SET_DESCRIPTOR_TABLE_INVALID]