From 548263279e9c98f73f906f0dd23635c0717c954e Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Wed, 6 Aug 2025 17:14:01 +0800 Subject: [PATCH] [Feat] (MG_Util/ShaderTranspiler): POC to query member offsets from UBO --- MobileGL/MG_Test/Program/ProgramTest.cpp | 3 +++ MobileGL/MG_Util/ShaderTranspiler/Types.h | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index 21d87417..cf663ec3 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -223,4 +223,7 @@ TEST_F(ProgramTest, DecompProgram) { EXPECT_EQ(it->second, uniform.location); } } + + auto ubo0 = sessions[0].GetShaderInterface(SPVC_RESOURCE_TYPE_UNIFORM_BUFFER); + auto ubo1 = sessions[1].GetShaderInterface(SPVC_RESOURCE_TYPE_UNIFORM_BUFFER); } diff --git a/MobileGL/MG_Util/ShaderTranspiler/Types.h b/MobileGL/MG_Util/ShaderTranspiler/Types.h index a16019bf..066c82cf 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/Types.h +++ b/MobileGL/MG_Util/ShaderTranspiler/Types.h @@ -1,4 +1,5 @@ #pragma once +#include "MG_Util/Debug/Log.h" namespace MobileGL { namespace MG_Util { @@ -95,6 +96,22 @@ namespace MobileGL { var.name = list[i].name; var.location = spvc_compiler_get_decoration(compiler, list[i].id, SpvDecorationLocation); variables.push_back(var); + + if (resource_type == SPVC_RESOURCE_TYPE_UNIFORM_BUFFER) { + spvc_type type = spvc_compiler_get_type_handle(compiler, list[i].base_type_id); + size_t num_members = spvc_type_get_num_member_types(type); + printf("uniform %s {\n", var.name.c_str()); + for (size_t j = 0; j < num_members; ++j) { + const char *memberName = spvc_compiler_get_member_name(compiler, list[i].base_type_id, j); + // auto memberTypeId = spvc_type_get_member_type(type, j); + // auto memberType = spvc_compiler_get_type_handle(compiler, memberTypeId); + + unsigned memberOffset = 0; + spvc_compiler_type_struct_member_offset(compiler, type, j, &memberOffset); + printf("\b%s; // %u\n", memberName, memberOffset); + } + printf("}\n"); + } } std::sort(variables.begin(), variables.end()); return variables;