【问题标题】:DirectX 12 Ultimate graphics sample generates a D3D12 "CBV Invalid Resource" errorDirectX 12 Ultimate 图形示例生成 D3D12“CBV 无效资源”错误
【发布时间】:2022-06-10 18:10:44
【问题描述】:

目前我正在更新 Windows 11 DX12 桌面应用程序,以利用 DX12 Ultimate 引入的技术(即网格着色器、VRS 和 DXR)。

Ultimate 的所有官方示例都在我的机器(Core i9/RTX3070 笔记本电脑)上编译和运行,因此作为第一步,我希望开始从传统(IA 顶点着色器)迁移尽可能多的静态(即未蒙皮)几何体) 渲染管道到 Amplification->Mesh 着色器管道。

我很自然地使用官方示例中的代码来实现这一点,在这个过程中我遇到了一个非常奇怪的问题,它只在我的应用程序中触发,而不是在编译的源项目中。

具体问题与设置网格集实例剔除和动态 LOD 选择有关。在网格着色器 SRV 堆中设置描述符时,我的应用无法创建 CBV:

// Mesh Info Buffers
D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc{};
cbvDesc.BufferLocation = m.MeshInfoResource->GetGPUVirtualAddress();
cbvDesc.SizeInBytes = MeshletUtils::GetAlignedSize<UINT>(sizeof(MeshInfo)); // 256 bytes which is correct
device->CreateConstantBufferView(&cbvDesc, OffsetHandle(i)); // generates error

无法生成描述符范围内的 CBV,因为资源的 GPU 地址范围仅使用 16 个字节创建:

D3D12 错误:ID3D12Device::CreateConstantBufferView: pDesc->BufferLocation + SizeInBytes - 1 (0x0000000008c1f0ff) 超过 Resource 的虚拟地址范围的末尾 (0x000001BD88FE1BF0:'MeshInfoResource', GPU VA 范围: 0x0000000008c1f000 - 0x0000000008c1f00f)。 [状态创建错误 #649:CREATE_CONSTANT_BUFFER_VIEW_INVALID_RESOURCE]

令人沮丧的是代码与官方示例相同,但示例编译时没有问题。但是经过几个小时的愚蠢尝试,我最终决定检查 MeshInfo 结构的大小,并在其中制定解决方案。

MeshInfo 结构在示例的 Model 类中定义为:

struct MeshInfo
{
    uint32_t IndexSize;
    uint32_t MeshletCount;

    uint32_t LastMeshletVertCount;
    uint32_t LastMeshletPrimCount;
};

大小为 16 字节,并在创建之前传递给资源的描述:

auto meshInfoDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(MeshInfo));
ThrowIfFailed(device->CreateCommittedResource(&defaultHeap, D3D12_HEAP_FLAG_NONE, &meshInfoDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&m.MeshInfoResource)));
SetDebugObjectName(m.MeshInfoResource.Get(), L"MeshInfoResource");

但显然我需要一个 256 字节的范围,所以我将 meshInfoDesc 更改为:

auto meshInfoDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(MeshInfo) * 16u);

,我的项目编译成功,我可以看到我的网格了!

所以我的问题是,为什么示例中没有出现这个 GPU 虚拟地址溢出???

PS:为了在我的项目中使用,需要将 Model.h/Model.cpp 重命名为 MeshletModel.h/MeshletModel.cpp,这是基于DirectX Tool Kit 框架,其中 Model.h/Model.cpp 文件已经存在,用于 DXTK 刚体动画效果。

【问题讨论】:

标签: visual-c++ windows-11 directx-12 directxtk direct3d12


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多