SPV: Handle matrix's OpFConvert vector by vector.

This commit is contained in:
Rex Xu 2016-04-27 18:48:17 +08:00
parent 9db3117e38
commit 73e3ce78f4
3 changed files with 163 additions and 133 deletions

View File

@ -137,7 +137,7 @@ protected:
spv::Id createBinaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right); spv::Id createBinaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right);
spv::Id createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy); spv::Id createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy);
spv::Id createUnaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy); spv::Id createUnaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy);
spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destTypeId, spv::Id operand); spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy);
spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);
spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
spv::Id createInvocationsOperation(glslang::TOperator, spv::Id typeId, spv::Id operand); spv::Id createInvocationsOperation(glslang::TOperator, spv::Id typeId, spv::Id operand);
@ -1071,7 +1071,7 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
// it could be a conversion // it could be a conversion
if (! result) if (! result)
result = createConversion(node->getOp(), precision, convertGlslangToSpvType(node->getType()), operand); result = createConversion(node->getOp(), precision, noContraction, convertGlslangToSpvType(node->getType()), operand, node->getOperand()->getBasicType());
// if not, then possibly an operation // if not, then possibly an operation
if (! result) if (! result)
@ -3331,7 +3331,7 @@ spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, spv::Deco
return builder.setPrecision(builder.createCompositeConstruct(typeId, results), precision); return builder.setPrecision(builder.createCompositeConstruct(typeId, results), precision);
} }
spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destType, spv::Id operand) spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destType, spv::Id operand, glslang::TBasicType typeProxy)
{ {
spv::Op convOp = spv::OpNop; spv::Op convOp = spv::OpNop;
spv::Id zero = 0; spv::Id zero = 0;
@ -3400,6 +3400,8 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Dec
case glslang::EOpConvDoubleToFloat: case glslang::EOpConvDoubleToFloat:
case glslang::EOpConvFloatToDouble: case glslang::EOpConvFloatToDouble:
convOp = spv::OpFConvert; convOp = spv::OpFConvert;
if (builder.isMatrixType(destType))
return createUnaryMatrixOperation(convOp, precision, noContraction, destType, operand, typeProxy);
break; break;
case glslang::EOpConvFloatToInt: case glslang::EOpConvFloatToInt:

View File

@ -1,30 +1,34 @@
spv.matrix.frag spv.matrix.frag
Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
Linked fragment stage: Linked fragment stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 240 // Id's are bound by 261
Capability Shader Capability Shader
Capability Float64
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 12 14 28 140 148 166 EntryPoint Fragment 4 "main" 12 14 28 161 169 187
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
Source GLSL 140 Source GLSL 420
Name 4 "main" Name 4 "main"
Name 10 "sum34" Name 10 "sum34"
Name 12 "m1" Name 12 "m1"
Name 14 "m2" Name 14 "m2"
Name 28 "f" Name 28 "f"
Name 138 "sum3" Name 140 "dm"
Name 140 "v4" Name 159 "sum3"
Name 145 "sum4" Name 161 "v4"
Name 148 "v3" Name 166 "sum4"
Name 153 "m43" Name 169 "v3"
Name 158 "m4" Name 174 "m43"
Name 166 "color" Name 179 "m4"
Name 187 "color"
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -37,27 +41,32 @@ Linked fragment stage:
27: TypePointer Input 6(float) 27: TypePointer Input 6(float)
28(f): 27(ptr) Variable Input 28(f): 27(ptr) Variable Input
81: 6(float) Constant 1065353216 81: 6(float) Constant 1065353216
136: TypeVector 6(float) 3 136: TypeFloat 64
137: TypePointer Function 136(fvec3) 137: TypeVector 136(float) 4
139: TypePointer Input 7(fvec4) 138: TypeMatrix 137(fvec4) 3
140(v4): 139(ptr) Variable Input 139: TypePointer Function 138
144: TypePointer Function 7(fvec4) 157: TypeVector 6(float) 3
147: TypePointer Input 136(fvec3) 158: TypePointer Function 157(fvec3)
148(v3): 147(ptr) Variable Input 160: TypePointer Input 7(fvec4)
151: TypeMatrix 136(fvec3) 4 161(v4): 160(ptr) Variable Input
152: TypePointer Function 151 165: TypePointer Function 7(fvec4)
156: TypeMatrix 7(fvec4) 4 168: TypePointer Input 157(fvec3)
157: TypePointer Function 156 169(v3): 168(ptr) Variable Input
165: TypePointer Output 7(fvec4) 172: TypeMatrix 157(fvec3) 4
166(color): 165(ptr) Variable Output 173: TypePointer Function 172
187: 6(float) Constant 0 177: TypeMatrix 7(fvec4) 4
178: TypePointer Function 177
186: TypePointer Output 7(fvec4)
187(color): 186(ptr) Variable Output
208: 6(float) Constant 0
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
10(sum34): 9(ptr) Variable Function 10(sum34): 9(ptr) Variable Function
138(sum3): 137(ptr) Variable Function 140(dm): 139(ptr) Variable Function
145(sum4): 144(ptr) Variable Function 159(sum3): 158(ptr) Variable Function
153(m43): 152(ptr) Variable Function 166(sum4): 165(ptr) Variable Function
158(m4): 157(ptr) Variable Function 174(m43): 173(ptr) Variable Function
179(m4): 178(ptr) Variable Function
13: 8 Load 12(m1) 13: 8 Load 12(m1)
15: 8 Load 14(m2) 15: 8 Load 14(m2)
16: 7(fvec4) CompositeExtract 13 0 16: 7(fvec4) CompositeExtract 13 0
@ -185,102 +194,120 @@ Linked fragment stage:
134: 7(fvec4) FSub 133 128 134: 7(fvec4) FSub 133 128
135: 8 CompositeConstruct 130 132 134 135: 8 CompositeConstruct 130 132 134
Store 10(sum34) 135 Store 10(sum34) 135
141: 7(fvec4) Load 140(v4) 141: 8 Load 10(sum34)
142: 8 Load 14(m2) 142: 137(fvec4) CompositeExtract 141 0
143: 136(fvec3) VectorTimesMatrix 141 142 143: 137(fvec4) FConvert 142
Store 138(sum3) 143 144: 137(fvec4) CompositeExtract 141 1
146: 8 Load 14(m2) 145: 137(fvec4) FConvert 144
149: 136(fvec3) Load 148(v3) 146: 137(fvec4) CompositeExtract 141 2
150: 7(fvec4) MatrixTimesVector 146 149 147: 137(fvec4) FConvert 146
Store 145(sum4) 150 148: 138 CompositeConstruct 143 145 147
154: 8 Load 10(sum34) Store 140(dm) 148
155: 151 Transpose 154 149: 138 Load 140(dm)
Store 153(m43) 155 150: 7(fvec4) CompositeExtract 149 0
159: 8 Load 12(m1) 151: 7(fvec4) FConvert 150
160: 151 Load 153(m43) 152: 7(fvec4) CompositeExtract 149 1
161: 156 MatrixTimesMatrix 159 160 153: 7(fvec4) FConvert 152
Store 158(m4) 161 154: 7(fvec4) CompositeExtract 149 2
162: 7(fvec4) Load 140(v4) 155: 7(fvec4) FConvert 154
163: 156 Load 158(m4) 156: 8 CompositeConstruct 151 153 155
164: 7(fvec4) VectorTimesMatrix 162 163 Store 10(sum34) 156
Store 145(sum4) 164 162: 7(fvec4) Load 161(v4)
167: 7(fvec4) Load 145(sum4) 163: 8 Load 14(m2)
Store 166(color) 167 164: 157(fvec3) VectorTimesMatrix 162 163
168: 8 Load 10(sum34) Store 159(sum3) 164
169: 7(fvec4) CompositeConstruct 81 81 81 81 167: 8 Load 14(m2)
170: 7(fvec4) CompositeExtract 168 0 170: 157(fvec3) Load 169(v3)
171: 7(fvec4) FAdd 170 169 171: 7(fvec4) MatrixTimesVector 167 170
172: 7(fvec4) CompositeExtract 168 1 Store 166(sum4) 171
173: 7(fvec4) FAdd 172 169 175: 8 Load 10(sum34)
174: 7(fvec4) CompositeExtract 168 2 176: 172 Transpose 175
175: 7(fvec4) FAdd 174 169 Store 174(m43) 176
176: 8 CompositeConstruct 171 173 175 180: 8 Load 12(m1)
Store 10(sum34) 176 181: 172 Load 174(m43)
177: 8 Load 10(sum34) 182: 177 MatrixTimesMatrix 180 181
178: 7(fvec4) CompositeConstruct 81 81 81 81 Store 179(m4) 182
179: 7(fvec4) CompositeExtract 177 0 183: 7(fvec4) Load 161(v4)
180: 7(fvec4) FSub 179 178 184: 177 Load 179(m4)
181: 7(fvec4) CompositeExtract 177 1 185: 7(fvec4) VectorTimesMatrix 183 184
182: 7(fvec4) FSub 181 178 Store 166(sum4) 185
183: 7(fvec4) CompositeExtract 177 2 188: 7(fvec4) Load 166(sum4)
184: 7(fvec4) FSub 183 178 Store 187(color) 188
185: 8 CompositeConstruct 180 182 184 189: 8 Load 10(sum34)
Store 10(sum34) 185 190: 7(fvec4) CompositeConstruct 81 81 81 81
186: 6(float) Load 28(f) 191: 7(fvec4) CompositeExtract 189 0
188: 7(fvec4) CompositeConstruct 186 187 187 187 192: 7(fvec4) FAdd 191 190
189: 7(fvec4) CompositeConstruct 187 186 187 187 193: 7(fvec4) CompositeExtract 189 1
190: 7(fvec4) CompositeConstruct 187 187 186 187 194: 7(fvec4) FAdd 193 190
191: 8 CompositeConstruct 188 189 190 195: 7(fvec4) CompositeExtract 189 2
192: 8 Load 10(sum34) 196: 7(fvec4) FAdd 195 190
193: 7(fvec4) CompositeExtract 192 0 197: 8 CompositeConstruct 192 194 196
194: 7(fvec4) CompositeExtract 191 0 Store 10(sum34) 197
195: 7(fvec4) FAdd 193 194 198: 8 Load 10(sum34)
196: 7(fvec4) CompositeExtract 192 1 199: 7(fvec4) CompositeConstruct 81 81 81 81
197: 7(fvec4) CompositeExtract 191 1 200: 7(fvec4) CompositeExtract 198 0
198: 7(fvec4) FAdd 196 197 201: 7(fvec4) FSub 200 199
199: 7(fvec4) CompositeExtract 192 2 202: 7(fvec4) CompositeExtract 198 1
200: 7(fvec4) CompositeExtract 191 2 203: 7(fvec4) FSub 202 199
201: 7(fvec4) FAdd 199 200 204: 7(fvec4) CompositeExtract 198 2
202: 8 CompositeConstruct 195 198 201 205: 7(fvec4) FSub 204 199
Store 10(sum34) 202 206: 8 CompositeConstruct 201 203 205
203: 136(fvec3) Load 148(v3) Store 10(sum34) 206
204: 6(float) Load 28(f) 207: 6(float) Load 28(f)
205: 136(fvec3) Load 148(v3) 209: 7(fvec4) CompositeConstruct 207 208 208 208
206: 6(float) Load 28(f) 210: 7(fvec4) CompositeConstruct 208 207 208 208
207: 136(fvec3) Load 148(v3) 211: 7(fvec4) CompositeConstruct 208 208 207 208
208: 6(float) Load 28(f) 212: 8 CompositeConstruct 209 210 211
209: 6(float) CompositeExtract 203 0 213: 8 Load 10(sum34)
210: 6(float) CompositeExtract 203 1 214: 7(fvec4) CompositeExtract 213 0
211: 6(float) CompositeExtract 203 2 215: 7(fvec4) CompositeExtract 212 0
212: 6(float) CompositeExtract 205 0 216: 7(fvec4) FAdd 214 215
213: 6(float) CompositeExtract 205 1 217: 7(fvec4) CompositeExtract 213 1
214: 6(float) CompositeExtract 205 2 218: 7(fvec4) CompositeExtract 212 1
215: 6(float) CompositeExtract 207 0 219: 7(fvec4) FAdd 217 218
216: 6(float) CompositeExtract 207 1 220: 7(fvec4) CompositeExtract 213 2
217: 6(float) CompositeExtract 207 2 221: 7(fvec4) CompositeExtract 212 2
218: 7(fvec4) CompositeConstruct 209 210 211 204 222: 7(fvec4) FAdd 220 221
219: 7(fvec4) CompositeConstruct 212 213 214 206 223: 8 CompositeConstruct 216 219 222
220: 7(fvec4) CompositeConstruct 215 216 217 208 Store 10(sum34) 223
221: 8 CompositeConstruct 218 219 220 224: 157(fvec3) Load 169(v3)
222: 8 Load 10(sum34) 225: 6(float) Load 28(f)
223: 7(fvec4) CompositeExtract 222 0 226: 157(fvec3) Load 169(v3)
224: 7(fvec4) CompositeExtract 221 0 227: 6(float) Load 28(f)
225: 7(fvec4) FAdd 223 224 228: 157(fvec3) Load 169(v3)
226: 7(fvec4) CompositeExtract 222 1 229: 6(float) Load 28(f)
227: 7(fvec4) CompositeExtract 221 1 230: 6(float) CompositeExtract 224 0
228: 7(fvec4) FAdd 226 227 231: 6(float) CompositeExtract 224 1
229: 7(fvec4) CompositeExtract 222 2 232: 6(float) CompositeExtract 224 2
230: 7(fvec4) CompositeExtract 221 2 233: 6(float) CompositeExtract 226 0
231: 7(fvec4) FAdd 229 230 234: 6(float) CompositeExtract 226 1
232: 8 CompositeConstruct 225 228 231 235: 6(float) CompositeExtract 226 2
Store 10(sum34) 232 236: 6(float) CompositeExtract 228 0
233: 136(fvec3) Load 138(sum3) 237: 6(float) CompositeExtract 228 1
234: 151 Load 153(m43) 238: 6(float) CompositeExtract 228 2
235: 7(fvec4) VectorTimesMatrix 233 234 239: 7(fvec4) CompositeConstruct 230 231 232 225
236: 7(fvec4) Load 145(sum4) 240: 7(fvec4) CompositeConstruct 233 234 235 227
237: 7(fvec4) FAdd 235 236 241: 7(fvec4) CompositeConstruct 236 237 238 229
238: 7(fvec4) Load 166(color) 242: 8 CompositeConstruct 239 240 241
239: 7(fvec4) FAdd 238 237 243: 8 Load 10(sum34)
Store 166(color) 239 244: 7(fvec4) CompositeExtract 243 0
245: 7(fvec4) CompositeExtract 242 0
246: 7(fvec4) FAdd 244 245
247: 7(fvec4) CompositeExtract 243 1
248: 7(fvec4) CompositeExtract 242 1
249: 7(fvec4) FAdd 247 248
250: 7(fvec4) CompositeExtract 243 2
251: 7(fvec4) CompositeExtract 242 2
252: 7(fvec4) FAdd 250 251
253: 8 CompositeConstruct 246 249 252
Store 10(sum34) 253
254: 157(fvec3) Load 159(sum3)
255: 172 Load 174(m43)
256: 7(fvec4) VectorTimesMatrix 254 255
257: 7(fvec4) Load 166(sum4)
258: 7(fvec4) FAdd 256 257
259: 7(fvec4) Load 187(color)
260: 7(fvec4) FAdd 259 258
Store 187(color) 260
Return Return
FunctionEnd FunctionEnd

View File

@ -1,4 +1,4 @@
#version 140 #version 420
in mat3x4 m1; in mat3x4 m1;
in mat3x4 m2; in mat3x4 m2;
@ -11,6 +11,7 @@ out vec4 color;
void main() void main()
{ {
mat3x4 sum34; mat3x4 sum34;
dmat3x4 dm;
vec3 sum3; vec3 sum3;
vec4 sum4; vec4 sum4;
@ -22,6 +23,8 @@ void main()
sum34 += f / m1; sum34 += f / m1;
sum34 += f; sum34 += f;
sum34 -= f; sum34 -= f;
dm = dmat3x4(sum34);
sum34 = mat3x4(dm);
sum3 = v4 * m2; sum3 = v4 * m2;
sum4 = m2 * v3; sum4 = m2 * v3;
@ -33,10 +36,8 @@ void main()
color = sum4; color = sum4;
//spv if (m1 != sum34) ++sum34;
++sum34; --sum34;
// else
--sum34;
sum34 += mat3x4(f); sum34 += mat3x4(f);
sum34 += mat3x4(v3, f, v3, f, v3, f); sum34 += mat3x4(v3, f, v3, f, v3, f);