Fix #809: smear scalar condition in OpSelect for selecting vector operands.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 4fc8b56..d2a9085 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1823,7 +1823,15 @@
node->getFalseBlock()->traverse(this);
spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());
- spv::Id select = builder.createTriOp(spv::OpSelect, convertGlslangToSpvType(node->getType()), condition, trueValue, falseValue);
+ // smear condition to vector, if necessary (AST is always scalar)
+ if (builder.isVector(trueValue))
+ condition = builder.smearScalar(spv::NoPrecision, condition,
+ builder.makeVectorType(builder.makeBoolType(),
+ builder.getNumComponents(trueValue)));
+
+ spv::Id select = builder.createTriOp(spv::OpSelect,
+ convertGlslangToSpvType(node->getType()), condition,
+ trueValue, falseValue);
builder.clearAccessChain();
builder.setAccessChainRValue(select);
};
diff --git a/Test/baseResults/spv.bool.vert.out b/Test/baseResults/spv.bool.vert.out
index 2810ff1..1e87c42 100644
--- a/Test/baseResults/spv.bool.vert.out
+++ b/Test/baseResults/spv.bool.vert.out
@@ -3,7 +3,7 @@
// Module Version 10000
// Generated by (magic number): 80001
-// Id's are bound by 44
+// Id's are bound by 46
Capability Shader
1: ExtInstImport "GLSL.std.450"
@@ -56,7 +56,8 @@
38: 18(fvec4) ConstantComposite 37 37 37 37
39: 17(float) Constant 1065353216
40: 18(fvec4) ConstantComposite 39 39 39 39
- 42: TypePointer Output 18(fvec4)
+ 41: TypeVector 6(bool) 4
+ 44: TypePointer Output 18(fvec4)
4(main): 2 Function None 3
5: Label
30(param): 7(ptr) Variable Function
@@ -65,9 +66,10 @@
35: 6(bool) INotEqual 33 34
Store 30(param) 35
36: 6(bool) FunctionCall 10(foo(b1;) 30(param)
- 41: 18(fvec4) Select 36 38 40
- 43: 42(ptr) AccessChain 24 26
- Store 43 41
+ 42: 41(bvec4) CompositeConstruct 36 36 36 36
+ 43: 18(fvec4) Select 42 38 40
+ 45: 44(ptr) AccessChain 24 26
+ Store 45 43
Return
FunctionEnd
10(foo(b1;): 6(bool) Function None 8
diff --git a/Test/baseResults/spv.deepRvalue.frag.out b/Test/baseResults/spv.deepRvalue.frag.out
index b6613ef..b8f4d06 100644
--- a/Test/baseResults/spv.deepRvalue.frag.out
+++ b/Test/baseResults/spv.deepRvalue.frag.out
@@ -1,12 +1,12 @@
spv.deepRvalue.frag
// Module Version 10000
// Generated by (magic number): 80001
-// Id's are bound by 150
+// Id's are bound by 152
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
- EntryPoint Fragment 4 "main" 144
+ EntryPoint Fragment 4 "main" 146
ExecutionMode 4 OriginUpperLeft
Source GLSL 330
Name 4 "main"
@@ -21,12 +21,12 @@
Name 106 "h"
Name 107 "i"
Name 111 "samp2D"
- Name 129 "str"
- MemberName 129(str) 0 "a"
- MemberName 129(str) 1 "b"
- MemberName 129(str) 2 "c"
- Name 131 "t"
- Name 144 "gl_FragColor"
+ Name 131 "str"
+ MemberName 131(str) 0 "a"
+ MemberName 131(str) 1 "b"
+ MemberName 131(str) 2 "c"
+ Name 133 "t"
+ Name 146 "gl_FragColor"
Decorate 111(samp2D) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
@@ -77,19 +77,20 @@
115: 113(fvec2) ConstantComposite 114 114
119: 6(float) Constant 1036831949
120: TypeBool
- 128: TypeArray 113(fvec2) 84
- 129(str): TypeStruct 81(int) 128 120(bool)
- 130: TypePointer Function 129(str)
- 132: 113(fvec2) ConstantComposite 10 11
- 133: 6(float) Constant 1082130432
- 134: 113(fvec2) ConstantComposite 133 12
- 135: 6(float) Constant 1086324736
- 136: 113(fvec2) ConstantComposite 135 13
- 137: 128 ConstantComposite 132 134 136
- 138: 120(bool) ConstantTrue
- 139: 129(str) ConstantComposite 82 137 138
- 143: TypePointer Output 7(fvec4)
-144(gl_FragColor): 143(ptr) Variable Output
+ 124: TypeVector 120(bool) 4
+ 130: TypeArray 113(fvec2) 84
+ 131(str): TypeStruct 81(int) 130 120(bool)
+ 132: TypePointer Function 131(str)
+ 134: 113(fvec2) ConstantComposite 10 11
+ 135: 6(float) Constant 1082130432
+ 136: 113(fvec2) ConstantComposite 135 12
+ 137: 6(float) Constant 1086324736
+ 138: 113(fvec2) ConstantComposite 137 13
+ 139: 130 ConstantComposite 134 136 138
+ 140: 120(bool) ConstantTrue
+ 141: 131(str) ConstantComposite 82 139 140
+ 145: TypePointer Output 7(fvec4)
+146(gl_FragColor): 145(ptr) Variable Output
4(main): 2 Function None 3
5: Label
35(m): 34(ptr) Variable Function
@@ -98,7 +99,7 @@
87(g): 79(ptr) Variable Function
106(h): 79(ptr) Variable Function
107(i): 79(ptr) Variable Function
- 131(t): 130(ptr) Variable Function
+ 133(t): 132(ptr) Variable Function
Store 9(v1) 14
Store 15(v2) 20
Store 21(v3) 26
@@ -174,21 +175,22 @@
121: 120(bool) FOrdGreaterThan 118 119
122: 7(fvec4) Load 9(v1)
123: 7(fvec4) Load 15(v2)
- 124: 7(fvec4) Select 121 122 123
- 125: 6(float) CompositeExtract 124 3
- 126: 6(float) Load 107(i)
- 127: 6(float) FAdd 126 125
- Store 107(i) 127
- Store 131(t) 139
- 140: 6(float) CompositeExtract 139 1 2 1
- 141: 6(float) Load 107(i)
- 142: 6(float) FAdd 141 140
- Store 107(i) 142
- 145: 6(float) Load 80(f)
- 146: 6(float) Load 87(g)
- 147: 6(float) Load 106(h)
- 148: 6(float) Load 107(i)
- 149: 7(fvec4) CompositeConstruct 145 146 147 148
- Store 144(gl_FragColor) 149
+ 125: 124(bvec4) CompositeConstruct 121 121 121 121
+ 126: 7(fvec4) Select 125 122 123
+ 127: 6(float) CompositeExtract 126 3
+ 128: 6(float) Load 107(i)
+ 129: 6(float) FAdd 128 127
+ Store 107(i) 129
+ Store 133(t) 141
+ 142: 6(float) CompositeExtract 141 1 2 1
+ 143: 6(float) Load 107(i)
+ 144: 6(float) FAdd 143 142
+ Store 107(i) 144
+ 147: 6(float) Load 80(f)
+ 148: 6(float) Load 87(g)
+ 149: 6(float) Load 106(h)
+ 150: 6(float) Load 107(i)
+ 151: 7(fvec4) CompositeConstruct 147 148 149 150
+ Store 146(gl_FragColor) 151
Return
FunctionEnd
diff --git a/Test/baseResults/spv.image.frag.out b/Test/baseResults/spv.image.frag.out
index ee29baf..b4f673b 100644
--- a/Test/baseResults/spv.image.frag.out
+++ b/Test/baseResults/spv.image.frag.out
@@ -3,7 +3,7 @@
// Module Version 10000
// Generated by (magic number): 80001
-// Id's are bound by 374
+// Id's are bound by 376
Capability Shader
Capability SampledRect
@@ -16,7 +16,7 @@
Capability StorageImageWriteWithoutFormat
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
- EntryPoint Fragment 4 "main" 132 142 152 248 362 373
+ EntryPoint Fragment 4 "main" 132 142 152 248 362 375
ExecutionMode 4 OriginUpperLeft
Source GLSL 450
Name 4 "main"
@@ -42,7 +42,7 @@
Name 248 "value"
Name 357 "wo2D"
Name 362 "fragData"
- Name 373 "ic4D"
+ Name 375 "ic4D"
Decorate 15(i1D) DescriptorSet 0
Decorate 15(i1D) Binding 0
Decorate 27(i2D) DescriptorSet 0
@@ -76,7 +76,7 @@
Decorate 357(wo2D) DescriptorSet 0
Decorate 357(wo2D) Binding 1
Decorate 357(wo2D) NonReadable
- Decorate 373(ic4D) Flat
+ Decorate 375(ic4D) Flat
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
@@ -164,9 +164,10 @@
361: TypePointer Output 125(fvec4)
362(fragData): 361(ptr) Variable Output
367: TypeBool
- 371: TypeVector 6(int) 4
- 372: TypePointer Input 371(ivec4)
- 373(ic4D): 372(ptr) Variable Input
+ 370: TypeVector 367(bool) 4
+ 373: TypeVector 6(int) 4
+ 374: TypePointer Input 373(ivec4)
+ 375(ic4D): 374(ptr) Variable Input
4(main): 2 Function None 3
5: Label
9(iv): 8(ptr) Variable Function
@@ -503,7 +504,8 @@
366: 18(int) Bitcast 365
368: 367(bool) INotEqual 363 366
369: 125(fvec4) Load 127(v)
- 370: 125(fvec4) Select 368 369 129
- Store 362(fragData) 370
+ 371: 370(bvec4) CompositeConstruct 368 368 368 368
+ 372: 125(fvec4) Select 371 369 129
+ Store 362(fragData) 372
Return
FunctionEnd
diff --git a/Test/baseResults/spv.specConstantOperations.vert.out b/Test/baseResults/spv.specConstantOperations.vert.out
index 597820b..ab83e61 100644
--- a/Test/baseResults/spv.specConstantOperations.vert.out
+++ b/Test/baseResults/spv.specConstantOperations.vert.out
@@ -3,7 +3,7 @@
// Module Version 10000
// Generated by (magic number): 80001
-// Id's are bound by 160
+// Id's are bound by 162
Capability Shader
Capability Float64
@@ -168,7 +168,9 @@
156: 154(fvec2) ConstantComposite 155 155
157: 39(float) Constant 1073741824
158: 154(fvec2) ConstantComposite 157 157
- 159: 154(fvec2) SpecConstantOp 169 153 156 158
+ 159: TypeVector 22(bool) 2
+ 160: 159(bvec2) SpecConstantComposite 153 153
+ 161: 154(fvec2) SpecConstantOp 169 160 156 158
4(main): 2 Function None 3
5: Label
Return
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 6dd31fc..f638909 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -3,4 +3,4 @@
// For the date, it uses the current date (when then script is run).
#define GLSLANG_REVISION "Overload400-PrecQual.1939"
-#define GLSLANG_DATE "28-Mar-2017"
+#define GLSLANG_DATE "30-Mar-2017"