Closed tlf30 closed 1 year ago
Hey @tlf30,
https://github.com/KhronosGroup/SPIRV-Cross/issues/1190 should help. Looks like you need to use spvc_type_get_base_type_id
.
Thank you for the help @Spasi and sorry for the long delay. I have been diving deep into this, and finally have an understanding of what is going on in the decompiler.
Here is a working function:
private void getLayoutOfMembers(MemoryStack stack, long compiler, long baseTypeHandle, int baseTypeId, String uniform, int currentOffset, String currentPath) {
//Get uniform members
int memberTypeCount = Spvc.spvc_type_get_num_member_types(baseTypeHandle);
System.err.println("Member types: " + memberTypeCount);
for (int m = 0; m < memberTypeCount; m++) {
int memberTypeId = Spvc.spvc_type_get_member_type(baseTypeHandle, m);
long memberTypeHandle = Spvc.spvc_compiler_get_type_handle(compiler, memberTypeId);
int memberBaseTypeId = Spvc.spvc_type_get_base_type_id(memberTypeHandle);
long memberBaseTypeHandle = Spvc.spvc_compiler_get_type_handle(compiler, memberBaseTypeId);
System.err.println("ParentBaseTypeId = " + baseTypeId + "; ParentBaseTypeHande = " + baseTypeHandle + "; TypeId = " + memberTypeId + "; TypeHandle = " + memberTypeHandle + " BaseTypeId = " + memberBaseTypeId + "; BaseTypeHandle = " + memberBaseTypeHandle);
String memberName = Spvc.spvc_compiler_get_member_name(compiler, baseTypeId, m);
System.err.println("Member Base Type ID name: " + memberName);
if (memberName.isEmpty()) {
memberName = String.valueOf(m);
}
PointerBuffer memberSize = stack.mallocPointer(1);
Spvc.spvc_compiler_get_declared_struct_member_size(compiler, baseTypeHandle, m, memberSize);
System.err.println("Member size: " + memberSize.get(0));
IntBuffer memberOffset = stack.mallocInt(1);
Spvc.spvc_compiler_type_struct_member_offset(compiler, baseTypeHandle, m, memberOffset);
//System.err.println("Member offset: " + memberOffset.get(0));
int arrayDimensions = Spvc.spvc_type_get_num_array_dimensions(memberBaseTypeHandle);
if (arrayDimensions > 0) {
System.err.println("Member array dimensions: " + arrayDimensions);
}
int memberTypeColumns = Spvc.spvc_type_get_columns(memberBaseTypeHandle);
if (memberTypeColumns > 1) {
IntBuffer memberStride = stack.mallocInt(1);
Spvc.spvc_compiler_type_struct_member_matrix_stride(compiler, baseTypeHandle, m, memberStride);
System.err.println("Member stride: " + memberStride.get(0));
}
String fullMemberPath = currentPath + "." + memberName;
System.err.println("Added binding offset: " + fullMemberPath);
uniformBindings.add(new ShaderUniformBinding(uniform, fullMemberPath, memberSize.get(0), memberOffset.get(0), getVkShaderStage()));
getLayoutOfMembers(stack, compiler, memberTypeHandle, memberBaseTypeId, uniform, memberOffset.get(0), currentPath + "." + memberName);
}
}
Thank you so much for the help, it made all the difference in getting me in the correct direction.
Version
3.3.2 (nightly)
Platform
Windows x64
JDK
Adoptium 19
Module
SPIRV-Cross
Bug description
Hello @Spasi, I don't necessary think this is a LWJGL bug (probably something I am doing wrong...) but I figured I would post here before the SPIRV-Cross repo just in case.
I am trying to get the names of struct members from a uniform binding. Example Shader Code (simplified for example):
And I am using the following code to get the member names:
Take note, I am using
getLayoutOfMembers
reclusively. It seems thatString memberName = Spvc.spvc_compiler_get_member_name(compiler, baseTypeId, m);
is returning an empty string for the struct member names. All other getter return expected values.Output:
As stated, I think this is either something I am doing wrong, or an issue in SPIRV-Cross, but I wanted to check here first.
Thank you, Trevor
Stacktrace or crash log output
No response