diff --git a/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp b/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp index 831d9879..b0c2cc2a 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp @@ -92,6 +92,21 @@ namespace MobileGL { unsigned memberOffset = 0; SPVC_CHK_RESULT(spvc_compiler_type_struct_member_offset(compiler, type, j, &memberOffset);) metadata.plainUniformOffsetsInUBO[memberName] = memberOffset; + SizeT memberSize = 0; + SPVC_CHK_RESULT(spvc_compiler_get_declared_struct_member_size(compiler, type, j, &memberSize);) + metadata.plainUniformMemberSizesInBytes[memberName] = memberSize; + + auto memberTypeId = spvc_type_get_member_type(type, j); + spvc_type memberType = spvc_compiler_get_type_handle(compiler, memberTypeId); + spvc_basetype basetype = spvc_type_get_basetype(memberType); + auto vectorSize = spvc_type_get_vector_size(memberType); + auto matCol = spvc_type_get_columns(memberType); + // auto dim = spvc_type_get_num_array_dimensions(type); + metadata.plainUniformMemberTypes[memberName] = { + .basetype = basetype, + .vectorSize = vectorSize, + .matCol = matCol, + }; } } } diff --git a/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.h b/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.h index 39f786c6..62a20da7 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.h +++ b/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.h @@ -15,8 +15,43 @@ namespace MobileGL { namespace MG_Util { namespace ShaderTranspiler { + struct SpvcType { + spvc_basetype basetype = SPVC_BASETYPE_UNKNOWN; + Uint32 vectorSize = 0; + Uint32 matCol = 0; + + Bool isScalar() const { return vectorSize == 1 && matCol == 1; } + Bool isVector() const { return vectorSize > 1 && matCol == 1; } + Bool isMatrix() const { return vectorSize > 1 && matCol > 1; } + + static Uint32 getByteSizeOfBaseType(const spvc_basetype type) { + switch (type) { + case SPVC_BASETYPE_INT8: + case SPVC_BASETYPE_UINT8: + return 1; + case SPVC_BASETYPE_INT16: + case SPVC_BASETYPE_UINT16: + case SPVC_BASETYPE_FP16: + return 2; + case SPVC_BASETYPE_INT32: + case SPVC_BASETYPE_UINT32: + case SPVC_BASETYPE_FP32: + return 4; + case SPVC_BASETYPE_INT64: + case SPVC_BASETYPE_UINT64: + case SPVC_BASETYPE_FP64: + return 8; + default: + return 0; + } + } + + }; + struct SpvcMetadata { UnorderedMap plainUniformOffsetsInUBO; + UnorderedMap plainUniformMemberSizesInBytes; + UnorderedMap plainUniformMemberTypes; SizeT uboSize = 0; };