From e00e72ded10c78f41a09d13c6b194de5264241ab Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Tue, 8 Dec 2015 20:48:49 -0700 Subject: [PATCH] SPV: Protect getStorageClass() with a test that the thing is pointer. --- SPIRV/GlslangToSpv.cpp | 8 ++-- SPIRV/spvIR.h | 7 ++- Test/baseResults/spv.bool.vert.out | 98 ++++++++++++++++++++++++++++++++++++++ Test/spv.bool.vert | 17 +++++++ Test/test-spirv-list | 1 + glslang/Include/revision.h | 2 +- 6 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 Test/baseResults/spv.bool.vert.out create mode 100644 Test/spv.bool.vert 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 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) builder.setAccessChainLValue(id); } else { // finish off the entry-point SPV instruction by adding the Input/Output - 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 @@ public: 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& 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.accessChain.frag 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" -- 2.7.4