首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >directx-12 -如何使用带有多个描述符堆的命令列表?

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

Stack Overflow用户
提问于 2015-08-20 09:12:58
回答 1查看 4.1K关注 0票数 7

目前正在研究microsofts示例,值得注意的是,每个命令列表只使用一个cbv_srv_uav堆(+可能在其他示例堆上使用)。

每个CommandList可以使用多个堆吗?

所以我设置了堆和范围

代码语言:javascript
运行
复制
this->mRSVHeap = new urd::DescriptorHeap(
    *this->mDevice,
    urd::DescriptorHeapType::CBV_SRV_UAV,
    1, // shader visible
    2); // space for 2 descriptors (2 textures)

this->mConstHeap = new urd::DescriptorHeap(
    *this->mDevice,
    urd::DescriptorHeapType::CBV_SRV_UAV,
    1, // shader visible
    1); // space for 1 descriptor

urd::DescriptorRange ranges[3];
ranges[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 0); // first and second descriptor in rsv heap (t0, t1)
ranges[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0); // first descriptor in cbv heap (b0)
ranges[2].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 2); // same texture used as first range (again first descriptor in rsv, accessable by t2)

之后,我定义描述符表。

代码语言:javascript
运行
复制
rootParam[0].InitDescTable(1, &ranges[0], D3D12_SHADER_VISIBILITY_PIXEL);
rootParam[1].InitDescTable(1, &ranges[1], D3D12_SHADER_VISIBILITY_ALL);
rootParam[2].InitDescTable(1, &ranges[2], D3D12_SHADER_VISIBILITY_PIXEL);

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

就像这样:

代码语言:javascript
运行
复制
D3D12_CPU_DESCRIPTOR_HANDLE handle = this->ConstHeap->GetCPUDescriptorHandleForHeapStart();
handle.ptr += index * SIZE_OF_ONE_DESCRIPTOR_CBV_SRV_UAV_TYPE;
CreateConstantBufferView(&desc, handle)

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

代码语言:javascript
运行
复制
ID3D12DescriptorHeap* ppHeaps[] = { this->mRSVHeap.Get(), this->mConstHeap.Get() };
this->mCommandList->GetRef()->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);

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

代码语言:javascript
运行
复制
ThrowIfFailed(this->mCommandList->Close());

下面是我如何告诉命令列表哪个堆是哪个表的:

代码语言:javascript
运行
复制
this->mCommandList->GetRef()->SetGraphicsRootDescriptorTable(0, this->mRSVHeap->GetGPUHeapAddressAtOffset(0));
this->mCommandList->GetRef()->SetGraphicsRootDescriptorTable(1, this->mConstHeap->GetGPUHeapAddressAtOffset(0));
this->mCommandList->GetRef()->SetGraphicsRootDescriptorTable(2, this->mRSVHeap->GetGPUHeapAddressAtOffset(0));

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

调试输出:

D3D12错误: ID3D12CommandList::SetDescriptorHeaps: pDescriptorHeaps1设置在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

EN

Stack Overflow用户

回答已采纳

发布于 2015-08-21 16:38:39

限制是每种类型的堆(CBV/SRV/UAV和采样器)在任何时候都只能设置一个堆。因此,一次只能设置两个描述符堆。

但是,需要注意的是,描述符堆集在命令列表中可能会有所不同。

票数 11
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32114174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档