fix(rhi): make opengl descriptor binding set-aware
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user