fix(rhi): honor firstSet in set-aware d3d12 bindings

This commit is contained in:
2026-03-26 14:43:51 +08:00
parent 476a56724f
commit 9218ea20b5
6 changed files with 529 additions and 103 deletions

View File

@@ -17,6 +17,13 @@ class D3D12Device;
class D3D12PipelineLayout : public RHIPipelineLayout {
public:
struct SetRootParameterMapping {
std::unordered_map<uint32_t, uint32_t> constantBufferRootIndices;
uint32_t shaderResourceTableRootIndex = UINT32_MAX;
uint32_t unorderedAccessTableRootIndex = UINT32_MAX;
uint32_t samplerTableRootIndex = UINT32_MAX;
};
D3D12PipelineLayout();
~D3D12PipelineLayout() override;
@@ -27,6 +34,9 @@ public:
void* GetNativeHandle() override { return m_rootSignature.Get(); }
ID3D12RootSignature* GetRootSignature() const { return m_rootSignature.Get(); }
bool UsesSetLayouts() const { return m_desc.setLayoutCount > 0 && m_desc.setLayouts != nullptr; }
uint32_t GetSetLayoutCount() const { return m_desc.setLayoutCount; }
bool HasConstantBufferBinding(uint32_t binding) const;
uint32_t GetConstantBufferRootParameterIndex(uint32_t binding) const;
bool HasShaderResourceTable() const;
@@ -35,10 +45,21 @@ public:
uint32_t GetUnorderedAccessTableRootParameterIndex() const;
bool HasSamplerTable() const;
uint32_t GetSamplerTableRootParameterIndex() const;
bool HasConstantBufferBinding(uint32_t setIndex, uint32_t binding) const;
uint32_t GetConstantBufferRootParameterIndex(uint32_t setIndex, uint32_t binding) const;
bool HasShaderResourceTable(uint32_t setIndex) const;
uint32_t GetShaderResourceTableRootParameterIndex(uint32_t setIndex) const;
bool HasUnorderedAccessTable(uint32_t setIndex) const;
uint32_t GetUnorderedAccessTableRootParameterIndex(uint32_t setIndex) const;
bool HasSamplerTable(uint32_t setIndex) const;
uint32_t GetSamplerTableRootParameterIndex(uint32_t setIndex) const;
const RHIPipelineLayoutDesc& GetDesc() const { return m_desc; }
private:
bool InitializeInternal(D3D12Device* device, const RHIPipelineLayoutDesc& desc);
bool InitializeSetAwareRootSignature();
bool InitializeFlatRootSignature();
ComPtr<ID3D12RootSignature> m_rootSignature;
D3D12Device* m_device;
@@ -47,6 +68,7 @@ private:
uint32_t m_shaderResourceTableRootIndex = UINT32_MAX;
uint32_t m_unorderedAccessTableRootIndex = UINT32_MAX;
uint32_t m_samplerTableRootIndex = UINT32_MAX;
std::vector<SetRootParameterMapping> m_setRootParameterMappings;
std::vector<DescriptorSetLayoutDesc> m_setLayouts;
std::vector<std::vector<DescriptorSetLayoutBinding>> m_setLayoutBindings;
std::vector<D3D12_ROOT_PARAMETER> m_rootParameters;