[Feat] (MG_Util/ShaderCompiler, MG_State/Program): reflect uniform location

This commit is contained in:
2025-08-13 15:18:34 +08:00
parent 5e1407ec95
commit 7f0e65f8c7
9 changed files with 158 additions and 1 deletions
@@ -63,6 +63,7 @@ namespace MobileGL {
Vector<SharedPtr<ShaderObject>>& ProgramObject::GetAttachedShaders() {
return m_shaders;
}
} // namespace GLState
} // namespace MG_State
} // namespace MobileGL
@@ -1,6 +1,8 @@
#include "ShaderObject.h"
#include <MG_Util/ShaderTranspiler/ShaderCompiler.h>
#include "MG_Util/ShaderTranspiler/glslang/UniformTraverser.h"
namespace MobileGL {
namespace MG_State {
namespace GLState {
@@ -13,6 +15,10 @@ namespace MobileGL {
}
void ShaderObject::Compile() {
if (!DoReflection()) {
return;
}
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib attrib{
.shaderType = GetGLShaderTypeByMGLShaderStage(m_stage),
@@ -36,6 +42,36 @@ namespace MobileGL {
void ShaderObject::MarkAsDeleted() {
m_deleteStatus = true;
}
bool ShaderObject::DoReflection() {
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib attrib{
.shaderType = GetGLShaderTypeByMGLShaderStage(m_stage),
.sourceStr = m_source,
.flags = ShaderCompileBits::CompileForOpenGL
};
auto result = ShaderCompiler::CompileShader(attrib);
if (!result) {
m_compileStatus = false;
m_infoLog = result.error().log;
const std::string e = std::format("Shader compilation failed: \nerrc: {}\nmsg: {}\n",
result.error().errc, result.error().log);
return false;
}
auto pShader = result.value();
auto root = pShader->getIntermediate()->getTreeRoot();
UniformTraverser traverser;
root->traverse(&traverser);
auto& symbols = traverser.GetCollectedSymbols();
for (const auto& symbol : symbols) {
m_uniforms[symbol->getName().c_str()] = symbol->getQualifier().layoutLocation;
}
return true;
}
} // namespace GLState
} // namespace MG_State
} // namespace MobileGL
@@ -68,12 +68,14 @@ namespace MobileGL {
SharedPtr<glslang::TShader> GetCompiledShader() const { return m_shader; }
const String& GetInfoLog() const { return m_infoLog; }
private:
bool DoReflection();
const Uint m_id = 0;
const ShaderStage m_stage;
String m_source;
SharedPtr<glslang::TShader> m_shader;
String m_infoLog;
UnorderedMap<String, Int> m_uniforms;
String m_infoLog;
Bool m_deleteStatus = false;
Bool m_compileStatus = false;
};