fix(rhi): make opengl descriptor binding set-aware

This commit is contained in:
2026-03-26 15:10:03 +08:00
parent 9218ea20b5
commit 733b573963
8 changed files with 379 additions and 21 deletions

View File

@@ -10,6 +10,7 @@ namespace XCEngine {
namespace RHI {
class OpenGLTextureUnitAllocator;
class OpenGLPipelineLayout;
struct DescriptorBinding {
uint32_t binding;
@@ -30,6 +31,7 @@ public:
void Bind() override;
void Unbind() override;
void BindWithPipelineLayout(const OpenGLPipelineLayout* pipelineLayout, uint32_t setIndex);
void Update(uint32_t offset, RHIResourceView* view) override;
void UpdateSampler(uint32_t offset, RHISampler* sampler) override;
@@ -48,6 +50,7 @@ public:
private:
DescriptorBinding* FindBinding(uint32_t binding);
const DescriptorBinding* FindBinding(uint32_t binding) const;
void EnsureConstantBufferUploaded();
OpenGLTextureUnitAllocator* m_allocator;
std::vector<DescriptorBinding> m_bindings;

View File

@@ -1,5 +1,6 @@
#pragma once
#include <unordered_map>
#include <vector>
#include "../RHIPipelineLayout.h"
@@ -9,6 +10,13 @@ namespace RHI {
class OpenGLPipelineLayout : public RHIPipelineLayout {
public:
struct SetBindingPointMapping {
std::unordered_map<uint32_t, uint32_t> constantBufferBindingPoints;
std::unordered_map<uint32_t, uint32_t> shaderResourceBindingPoints;
std::unordered_map<uint32_t, uint32_t> unorderedAccessBindingPoints;
std::unordered_map<uint32_t, uint32_t> samplerBindingPoints;
};
OpenGLPipelineLayout() = default;
~OpenGLPipelineLayout() override = default;
@@ -16,10 +24,21 @@ public:
void Shutdown() override;
void* GetNativeHandle() override { return m_initialized ? this : nullptr; }
bool UsesSetLayouts() const { return m_desc.setLayoutCount > 0 && m_desc.setLayouts != nullptr; }
uint32_t GetSetLayoutCount() const { return m_desc.setLayoutCount; }
bool HasConstantBufferBinding(uint32_t setIndex, uint32_t binding) const;
uint32_t GetConstantBufferBindingPoint(uint32_t setIndex, uint32_t binding) const;
bool HasShaderResourceBinding(uint32_t setIndex, uint32_t binding) const;
uint32_t GetShaderResourceBindingPoint(uint32_t setIndex, uint32_t binding) const;
bool HasUnorderedAccessBinding(uint32_t setIndex, uint32_t binding) const;
uint32_t GetUnorderedAccessBindingPoint(uint32_t setIndex, uint32_t binding) const;
bool HasSamplerBinding(uint32_t setIndex, uint32_t binding) const;
uint32_t GetSamplerBindingPoint(uint32_t setIndex, uint32_t binding) const;
const RHIPipelineLayoutDesc& GetDesc() const { return m_desc; }
private:
RHIPipelineLayoutDesc m_desc = {};
std::vector<SetBindingPointMapping> m_setBindingPointMappings;
std::vector<DescriptorSetLayoutDesc> m_setLayouts;
std::vector<std::vector<DescriptorSetLayoutBinding>> m_setLayoutBindings;
bool m_initialized = false;