diff --git a/common/output_stream.cpp b/common/output_stream.cpp index 1a81b2c..ab6b531 100644 --- a/common/output_stream.cpp +++ b/common/output_stream.cpp @@ -204,7 +204,7 @@ std::string ToStringShaderStage(SpvReflectShaderStageFlagBits stage) { return "???"; } -std::string ToStringSpvStorageClass(SpvStorageClass storage_class) { +std::string ToStringSpvStorageClass(int storage_class) { switch (storage_class) { case SpvStorageClassUniformConstant: return "UniformConstant"; @@ -343,7 +343,7 @@ std::string ToStringDescriptorType(SpvReflectDescriptorType value) { return "VK_DESCRIPTOR_TYPE_???"; } -static std::string ToStringSpvBuiltIn(SpvBuiltIn built_in) { +static std::string ToStringSpvBuiltIn(int built_in) { switch (built_in) { case SpvBuiltInPosition: return "Position"; diff --git a/common/output_stream.h b/common/output_stream.h index d29014a..32d9b73 100644 --- a/common/output_stream.h +++ b/common/output_stream.h @@ -9,7 +9,7 @@ std::string ToStringSpvSourceLanguage(SpvSourceLanguage lang); std::string ToStringSpvExecutionModel(SpvExecutionModel model); -std::string ToStringSpvStorageClass(SpvStorageClass storage_class); +std::string ToStringSpvStorageClass(int storage_class); std::string ToStringSpvDim(SpvDim dim); std::string ToStringSpvBuiltIn(const SpvReflectInterfaceVariable& variable, bool preface); std::string ToStringSpvImageFormat(SpvImageFormat fmt); @@ -66,4 +66,4 @@ class SpvReflectToYaml { std::map interface_variable_to_index_; }; -#endif \ No newline at end of file +#endif diff --git a/spirv_reflect.c b/spirv_reflect.c index efb1149..98f8db0 100644 --- a/spirv_reflect.c +++ b/spirv_reflect.c @@ -2188,7 +2188,8 @@ static SpvReflectResult ParseDescriptorBindings(SpvReflectPrvParser* p_parser, S // from the pointer so that we can use it to deduce deescriptor types. SpvStorageClass pointer_storage_class = SpvStorageClassMax; if (p_type->op == SpvOpTypePointer) { - pointer_storage_class = p_type->storage_class; + assert(p_type->storage_class != -1 && "Pointer types must have a valid storage class."); + pointer_storage_class = (SpvStorageClass)p_type->storage_class; // Find the type's node SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id); if (IsNull(p_type_node)) { diff --git a/spirv_reflect.h b/spirv_reflect.h index 7a92c34..09ebc1f 100644 --- a/spirv_reflect.h +++ b/spirv_reflect.h @@ -393,7 +393,9 @@ typedef struct SpvReflectTypeDescription { const char* type_name; // Non-NULL if type is member of a struct const char* struct_member_name; - SpvStorageClass storage_class; + + // The storage class (SpvStorageClass) if the type, and -1 if it does not have a storage class. + int storage_class; SpvReflectTypeFlags type_flags; SpvReflectDecorationFlags decoration_flags; @@ -429,7 +431,9 @@ typedef struct SpvReflectInterfaceVariable { SpvStorageClass storage_class; const char* semantic; SpvReflectDecorationFlags decoration_flags; - SpvBuiltIn built_in; + + // The builtin id (SpvBuiltIn) if the variable is a builtin, and -1 otherwise. + int built_in; SpvReflectNumericTraits numeric; SpvReflectArrayTraits array;