SPV: Protect getStorageClass() with a test that the thing is pointer.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 7d0d3ab..5e43286 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -599,9 +599,11 @@
builder.setAccessChainLValue(id);
} else {
// finish off the entry-point SPV instruction by adding the Input/Output <id>
- spv::StorageClass sc = builder.getStorageClass(id);
- if (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)
- entryPoint->addIdOperand(id);
+ if (builder.isPointer(id)) {
+ spv::StorageClass sc = builder.getStorageClass(id);
+ if (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)
+ entryPoint->addIdOperand(id);
+ }
}
}
diff --git a/SPIRV/spvIR.h b/SPIRV/spvIR.h
index 6736a13..9291185 100755
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -293,7 +293,12 @@
Instruction* getInstruction(Id id) const { return idToInstruction[id]; }
spv::Id getTypeId(Id resultId) const { return idToInstruction[resultId]->getTypeId(); }
- StorageClass getStorageClass(Id typeId) const { return (StorageClass)idToInstruction[typeId]->getImmediateOperand(0); }
+ StorageClass getStorageClass(Id typeId) const
+ {
+ assert(idToInstruction[typeId]->getOpCode() == spv::OpTypePointer);
+ return (StorageClass)idToInstruction[typeId]->getImmediateOperand(0);
+ }
+
void dump(std::vector<unsigned int>& out) const
{
for (int f = 0; f < (int)functions.size(); ++f)
diff --git a/Test/baseResults/spv.bool.vert.out b/Test/baseResults/spv.bool.vert.out
new file mode 100644
index 0000000..04aff36
--- /dev/null
+++ b/Test/baseResults/spv.bool.vert.out
@@ -0,0 +1,98 @@
+spv.bool.vert
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked vertex stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 49
+
+ Capability Shader
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Vertex 4 "main" 23 47 48
+ Source GLSL 450
+ Name 4 "main"
+ Name 10 "foo(b1;"
+ Name 9 "b"
+ Name 21 "gl_PerVertex"
+ MemberName 21(gl_PerVertex) 0 "gl_Position"
+ MemberName 21(gl_PerVertex) 1 "gl_PointSize"
+ MemberName 21(gl_PerVertex) 2 "gl_ClipDistance"
+ MemberName 21(gl_PerVertex) 3 "gl_CullDistance"
+ Name 23 ""
+ Name 28 "ubname"
+ MemberName 28(ubname) 0 "b"
+ Name 30 "ubinst"
+ Name 31 "param"
+ Name 47 "gl_VertexID"
+ Name 48 "gl_InstanceID"
+ MemberDecorate 21(gl_PerVertex) 0 BuiltIn Position
+ MemberDecorate 21(gl_PerVertex) 1 BuiltIn PointSize
+ MemberDecorate 21(gl_PerVertex) 2 BuiltIn ClipDistance
+ MemberDecorate 21(gl_PerVertex) 3 BuiltIn CullDistance
+ Decorate 21(gl_PerVertex) Block
+ Decorate 28(ubname) GLSLShared
+ Decorate 28(ubname) Block
+ Decorate 47(gl_VertexID) BuiltIn VertexId
+ Decorate 48(gl_InstanceID) BuiltIn InstanceId
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeBool
+ 7: TypePointer Function 6(bool)
+ 8: TypeFunction 6(bool) 7(ptr)
+ 13: 6(bool) ConstantFalse
+ 16: TypeFloat 32
+ 17: TypeVector 16(float) 4
+ 18: TypeInt 32 0
+ 19: 18(int) Constant 1
+ 20: TypeArray 16(float) 19
+21(gl_PerVertex): TypeStruct 17(fvec4) 16(float) 20 20
+ 22: TypePointer Output 21(gl_PerVertex)
+ 23: 22(ptr) Variable Output
+ 24: TypeInt 32 1
+ 25: 24(int) Constant 0
+ 26: TypePointer Function 17(fvec4)
+ 28(ubname): TypeStruct 6(bool)
+ 29: TypePointer Uniform 28(ubname)
+ 30(ubinst): 29(ptr) Variable Uniform
+ 32: TypePointer Uniform 6(bool)
+ 38: 16(float) Constant 0
+ 39: 17(fvec4) ConstantComposite 38 38 38 38
+ 41: 16(float) Constant 1065353216
+ 42: 17(fvec4) ConstantComposite 41 41 41 41
+ 44: TypePointer Output 17(fvec4)
+ 46: TypePointer Input 24(int)
+ 47(gl_VertexID): 46(ptr) Variable Input
+48(gl_InstanceID): 46(ptr) Variable Input
+ 4(main): 2 Function None 3
+ 5: Label
+ 27: 26(ptr) Variable Function
+ 31(param): 7(ptr) Variable Function
+ 33: 32(ptr) AccessChain 30(ubinst) 25
+ 34: 6(bool) Load 33
+ Store 31(param) 34
+ 35: 6(bool) FunctionCall 10(foo(b1;) 31(param)
+ SelectionMerge 37 None
+ BranchConditional 35 36 40
+ 36: Label
+ Store 27 39
+ Branch 37
+ 40: Label
+ Store 27 42
+ Branch 37
+ 37: Label
+ 43: 17(fvec4) Load 27
+ 45: 44(ptr) AccessChain 23 25
+ Store 45 43
+ Return
+ FunctionEnd
+ 10(foo(b1;): 6(bool) Function None 8
+ 9(b): 7(ptr) FunctionParameter
+ 11: Label
+ 12: 6(bool) Load 9(b)
+ 14: 6(bool) INotEqual 12 13
+ ReturnValue 14
+ FunctionEnd
diff --git a/Test/spv.bool.vert b/Test/spv.bool.vert
new file mode 100644
index 0000000..f58bc55
--- /dev/null
+++ b/Test/spv.bool.vert
@@ -0,0 +1,17 @@
+#version 450
+
+const bool condition = false;
+
+uniform ubname {
+ bool b;
+} ubinst;
+
+bool foo(bool b)
+{
+ return b != condition;
+}
+
+void main()
+{
+ gl_Position = foo(ubinst.b) ? vec4(0.0) : vec4(1.0);
+}
diff --git a/Test/test-spirv-list b/Test/test-spirv-list
index 136a9a6..ea3094b 100644
--- a/Test/test-spirv-list
+++ b/Test/test-spirv-list
@@ -30,6 +30,7 @@
spv.aggOps.frag
spv.always-discard.frag
spv.always-discard2.frag
+spv.bool.vert
spv.conditionalDiscard.frag
spv.conversion.frag
spv.dataOut.frag
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index a21eb50..b14834f 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run).
-#define GLSLANG_REVISION "SPIRV99.830"
+#define GLSLANG_REVISION "SPIRV99.831"
#define GLSLANG_DATE "08-Dec-2015"