From 62798ce1b899c1bbbef8720040b8af791e64fc60 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Wed, 5 Nov 2025 13:51:05 +0800 Subject: [PATCH] [Feat] (MG_State/Program): refractor UBO handling --- .../GLState/ProgramState/ProgramObject.cpp | 6 ++--- .../GLState/ProgramState/ProgramObject.h | 22 ++++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp index cdfe94ff..0d5737dc 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp @@ -203,13 +203,11 @@ namespace MobileGL { // ---------- UBO ---------- int uboCount = m_program->getNumUniformBlocks(); - m_uniformBlockIndexInTProgram.resize(uboCount, -1); - m_uniformBlockBinding.resize(uboCount, 0); + m_uniformBlockBinding.resize(uboCount, -1); for (int i = 0; i < uboCount; i++) { auto& ubo = m_program->getUniformBlock(i); m_uniformBlockNameMaxLength = std::max(m_uniformBlockNameMaxLength, (Int)ubo.name.length()); - m_uniformBlockIndex[ubo.name] = ubo.getBinding(); - m_uniformBlockIndexInTProgram[ubo.getBinding()] = i; + m_uniformBlockIndexByName[ubo.name] = i; } } diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h index 96de9d96..f609eadb 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h @@ -76,30 +76,29 @@ namespace MobileGL { Int GetActiveAttributesMaxLength() const { return m_attribInNameMaxLength; } Int GetActiveUniformBlocksMaxNameLength() const { return m_uniformBlockNameMaxLength; } Uint GetUniformBlockIndex(const char* name) const { - auto it = m_uniformBlockIndex.find(name); - if (it != m_uniformBlockIndex.end()) + auto it = m_uniformBlockIndexByName.find(name); + if (it != m_uniformBlockIndexByName.end()) return it->second; return 0xFFFFFFFFu; // GL_INVALID_INDEX } Bool IsActiveUniformBlock(Uint index) const { if (index >= GetActiveUniformBlocksCount()) return false; - if (m_uniformBlockIndexInTProgram[index] == -1) - return false; return true; } Uint GetUBOSizeAt(Uint index) const { if (!IsActiveUniformBlock(index)) return 0; - return m_program->getUniformBlock(m_uniformBlockIndexInTProgram[index]).size; + return m_program->getUniformBlock(index).size; } const String& GetUniformBlockName(Uint index) const { - auto& ubo = m_program->getUniform(m_uniformBlockIndexInTProgram[index]); + auto& ubo = m_program->getUniform(index); return ubo.name; } + // Set by glUniformBlockBinding void SetUniformBlockBinding(Uint index, Uint binding) { m_uniformBlockBinding[index] = binding; } @@ -137,10 +136,13 @@ namespace MobileGL { // ditto. Will be set at glUniform1i Vector m_uniformSamplerOrImageUnitIndex; - UnorderedMap m_uniformBlockIndex; - - // Ordered by block index - Vector m_uniformBlockIndexInTProgram; + // Ordered by uniform block index + // index is DIFFERENT from binding!!! + // + // Let's define UniformBlockIndex == the order at glslang getUniformBlock() + // aka `i = glGetUniformBlockIndex(prog, "BlockName")` implies: + // `prog->getUniformBlock(i) == "BlockName"` + UnorderedMap m_uniformBlockIndexByName; Vector m_uniformBlockBinding; // Need to be reflected after linking of SPIR-V binary