mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 20:10:06 +00:00
SPV: Protect getStorageClass() with a test that the thing is pointer.
This commit is contained in:
parent
33661450c7
commit
e00e72ded1
@ -599,10 +599,12 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
|
|||||||
builder.setAccessChainLValue(id);
|
builder.setAccessChainLValue(id);
|
||||||
} else {
|
} else {
|
||||||
// finish off the entry-point SPV instruction by adding the Input/Output <id>
|
// finish off the entry-point SPV instruction by adding the Input/Output <id>
|
||||||
|
if (builder.isPointer(id)) {
|
||||||
spv::StorageClass sc = builder.getStorageClass(id);
|
spv::StorageClass sc = builder.getStorageClass(id);
|
||||||
if (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)
|
if (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)
|
||||||
entryPoint->addIdOperand(id);
|
entryPoint->addIdOperand(id);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
|
bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
|
||||||
|
@ -293,7 +293,12 @@ public:
|
|||||||
|
|
||||||
Instruction* getInstruction(Id id) const { return idToInstruction[id]; }
|
Instruction* getInstruction(Id id) const { return idToInstruction[id]; }
|
||||||
spv::Id getTypeId(Id resultId) const { return idToInstruction[resultId]->getTypeId(); }
|
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
|
void dump(std::vector<unsigned int>& out) const
|
||||||
{
|
{
|
||||||
for (int f = 0; f < (int)functions.size(); ++f)
|
for (int f = 0; f < (int)functions.size(); ++f)
|
||||||
|
98
Test/baseResults/spv.bool.vert.out
Normal file
98
Test/baseResults/spv.bool.vert.out
Normal file
@ -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
|
17
Test/spv.bool.vert
Normal file
17
Test/spv.bool.vert
Normal file
@ -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);
|
||||||
|
}
|
@ -30,6 +30,7 @@ spv.accessChain.frag
|
|||||||
spv.aggOps.frag
|
spv.aggOps.frag
|
||||||
spv.always-discard.frag
|
spv.always-discard.frag
|
||||||
spv.always-discard2.frag
|
spv.always-discard2.frag
|
||||||
|
spv.bool.vert
|
||||||
spv.conditionalDiscard.frag
|
spv.conditionalDiscard.frag
|
||||||
spv.conversion.frag
|
spv.conversion.frag
|
||||||
spv.dataOut.frag
|
spv.dataOut.frag
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
// For the version, it uses the latest git tag followed by the number of commits.
|
// 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).
|
// 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"
|
#define GLSLANG_DATE "08-Dec-2015"
|
||||||
|
Loading…
Reference in New Issue
Block a user