因此,在观看dx12绑定视频并阅读某些文档后,如果我正确理解如何管理堆,我不能100%确定。DX12描述符堆管理
让我解释一下我在我的应用程序中无法达到的效果: 初始化期间,我将填充两个堆,一个拿着取样器,另一个拿着SRV,CBV和UAV。 这些堆将包含应用程序在其生命周期中将使用的所有资源。
现在开始有趣的部分。为了构建根签名,我将主要使用根描述符表。我们知道,表格将保存范围,范围是基础着色器槽,描述符的数量和其他设置。 让我告诉你,例如:
Root Parameters
0 - root_table
1 - root_table
0 root_table
CBV b1
CBV b6
SRV t0
SRV t2
1 root_table
Sampler s1
Sampler s4
如示例所示,还可以有一个是不连续的(例如B0,B1,B2和B3),但是,命令列表录制过程中,我们只能范围这样做:
ID3D12DescriptorHeaps* heaps[2] = {mCbvSrvUavHeap,mSamplerHeap};
mCmdList->SetDescriptorHeaps(2,heaps);
mCmdList->SetGraphicsRootDescriptorTable(0, mCbvSrvUavHeapGpuHanleStart);
mCmdList->SetGraphicsRootDescriptorTable(1, mSamplerHandleHanleStart);
这意味着,我们必须mCbvSrvUavHeap和mSamplerHeap正确下令描述。
例如:
mCbvSrvUavHeap
CBV
CBV
SRV
SRV
这里是哪里出了问题对我来说。正如我最初所说,我将为应用程序创建两大堆,但是,我不能将这些堆设置到命令列表中,因为它们将具有其他不会使用的描述符!
我该如何处理?我是否需要创建一个仅包含我将使用的描述符的新Heap?
希望我解释清楚!
如果您愿意使用额外的rootig插槽,则它们不需要连续。 [Here's](https://github.com/Microsoft/DirectXTK12/blob/master/Src/Shaders/RootSig.fxh)我在[DirectX Tool Kit for DirectX 12]中使用的根目录(https://github.com/)微软/ DirectXTK12)。我不是说他们是最优的,但他们完成了工作。 –