mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
[Feat] (MG_Util/SpvcSession): reflect member types from SPIR-V binary
This commit is contained in:
@@ -92,6 +92,21 @@ namespace MobileGL {
|
|||||||
unsigned memberOffset = 0;
|
unsigned memberOffset = 0;
|
||||||
SPVC_CHK_RESULT(spvc_compiler_type_struct_member_offset(compiler, type, j, &memberOffset);)
|
SPVC_CHK_RESULT(spvc_compiler_type_struct_member_offset(compiler, type, j, &memberOffset);)
|
||||||
metadata.plainUniformOffsetsInUBO[memberName] = 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,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,8 +15,43 @@
|
|||||||
namespace MobileGL {
|
namespace MobileGL {
|
||||||
namespace MG_Util {
|
namespace MG_Util {
|
||||||
namespace ShaderTranspiler {
|
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 {
|
struct SpvcMetadata {
|
||||||
UnorderedMap<String, unsigned> plainUniformOffsetsInUBO;
|
UnorderedMap<String, unsigned> plainUniformOffsetsInUBO;
|
||||||
|
UnorderedMap<String, SizeT> plainUniformMemberSizesInBytes;
|
||||||
|
UnorderedMap<String, SpvcType> plainUniformMemberTypes;
|
||||||
SizeT uboSize = 0;
|
SizeT uboSize = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user