我可以在执行时安全地更改着色器可见的 DescriptorHeap 内容吗
Can I safely change shader visible DescriptorHeap's content while executing
根据 Descriptor Heaps Overview - Synchronization,更改执行中引用的描述符(通过 ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable)可能会引发竞争条件。
但是我可以安全地更改当前执行中未引用的描述符吗?引用描述符和非引用描述符都在同一个 DescriptorHeap 中,并且通过调用 ID3D12GraphicsCommandList::SetDescriptorHeaps 将堆设置为 CommandList。
如果您可以保证在命令列表执行期间不会使用描述符堆中的位置,是的,完全可以覆盖该位置。
因此,例如可以跟踪资源是否不再需要,然后将使用该资源的描述符位置标记为空闲(一旦 commandList 已被处理,使用栅栏),然后使用那些先前的位置来分配新资源(您可以在 运行 一个不再使用该资源的较新 commandList 时这样做)。
根据 Descriptor Heaps Overview - Synchronization,更改执行中引用的描述符(通过 ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable)可能会引发竞争条件。
但是我可以安全地更改当前执行中未引用的描述符吗?引用描述符和非引用描述符都在同一个 DescriptorHeap 中,并且通过调用 ID3D12GraphicsCommandList::SetDescriptorHeaps 将堆设置为 CommandList。
如果您可以保证在命令列表执行期间不会使用描述符堆中的位置,是的,完全可以覆盖该位置。
因此,例如可以跟踪资源是否不再需要,然后将使用该资源的描述符位置标记为空闲(一旦 commandList 已被处理,使用栅栏),然后使用那些先前的位置来分配新资源(您可以在 运行 一个不再使用该资源的较新 commandList 时这样做)。