From 73e3ce78f4bdd9a172b0d812fc2163cf4b018e6f Mon Sep 17 00:00:00 2001 From: Rex Xu Date: Wed, 27 Apr 2016 18:48:17 +0800 Subject: [PATCH] SPV: Handle matrix's OpFConvert vector by vector. --- SPIRV/GlslangToSpv.cpp | 8 +- Test/baseResults/spv.matrix.frag.out | 277 +++++++++++++++------------ Test/spv.matrix.frag | 11 +- 3 files changed, 163 insertions(+), 133 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 22575b5a..2b76c049 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -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 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 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 createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); 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 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 (! result) @@ -3331,7 +3331,7 @@ spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, spv::Deco 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::Id zero = 0; @@ -3400,6 +3400,8 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Dec case glslang::EOpConvDoubleToFloat: case glslang::EOpConvFloatToDouble: convOp = spv::OpFConvert; + if (builder.isMatrixType(destType)) + return createUnaryMatrixOperation(convOp, precision, noContraction, destType, operand, typeProxy); break; case glslang::EOpConvFloatToInt: diff --git a/Test/baseResults/spv.matrix.frag.out b/Test/baseResults/spv.matrix.frag.out index 8f0d6463..6a6b672b 100644 --- a/Test/baseResults/spv.matrix.frag.out +++ b/Test/baseResults/spv.matrix.frag.out @@ -1,30 +1,34 @@ spv.matrix.frag +Warning, version 420 is not yet complete; most version-specific features are present, but some are missing. + Linked fragment stage: // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 240 +// Id's are bound by 261 Capability Shader + Capability Float64 1: ExtInstImport "GLSL.std.450" 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 - Source GLSL 140 + Source GLSL 420 Name 4 "main" Name 10 "sum34" Name 12 "m1" Name 14 "m2" Name 28 "f" - Name 138 "sum3" - Name 140 "v4" - Name 145 "sum4" - Name 148 "v3" - Name 153 "m43" - Name 158 "m4" - Name 166 "color" + Name 140 "dm" + Name 159 "sum3" + Name 161 "v4" + Name 166 "sum4" + Name 169 "v3" + Name 174 "m43" + Name 179 "m4" + Name 187 "color" 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -37,27 +41,32 @@ Linked fragment stage: 27: TypePointer Input 6(float) 28(f): 27(ptr) Variable Input 81: 6(float) Constant 1065353216 - 136: TypeVector 6(float) 3 - 137: TypePointer Function 136(fvec3) - 139: TypePointer Input 7(fvec4) - 140(v4): 139(ptr) Variable Input - 144: TypePointer Function 7(fvec4) - 147: TypePointer Input 136(fvec3) - 148(v3): 147(ptr) Variable Input - 151: TypeMatrix 136(fvec3) 4 - 152: TypePointer Function 151 - 156: TypeMatrix 7(fvec4) 4 - 157: TypePointer Function 156 - 165: TypePointer Output 7(fvec4) - 166(color): 165(ptr) Variable Output - 187: 6(float) Constant 0 + 136: TypeFloat 64 + 137: TypeVector 136(float) 4 + 138: TypeMatrix 137(fvec4) 3 + 139: TypePointer Function 138 + 157: TypeVector 6(float) 3 + 158: TypePointer Function 157(fvec3) + 160: TypePointer Input 7(fvec4) + 161(v4): 160(ptr) Variable Input + 165: TypePointer Function 7(fvec4) + 168: TypePointer Input 157(fvec3) + 169(v3): 168(ptr) Variable Input + 172: TypeMatrix 157(fvec3) 4 + 173: TypePointer Function 172 + 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 5: Label 10(sum34): 9(ptr) Variable Function - 138(sum3): 137(ptr) Variable Function - 145(sum4): 144(ptr) Variable Function - 153(m43): 152(ptr) Variable Function - 158(m4): 157(ptr) Variable Function + 140(dm): 139(ptr) Variable Function + 159(sum3): 158(ptr) Variable Function + 166(sum4): 165(ptr) Variable Function + 174(m43): 173(ptr) Variable Function + 179(m4): 178(ptr) Variable Function 13: 8 Load 12(m1) 15: 8 Load 14(m2) 16: 7(fvec4) CompositeExtract 13 0 @@ -185,102 +194,120 @@ Linked fragment stage: 134: 7(fvec4) FSub 133 128 135: 8 CompositeConstruct 130 132 134 Store 10(sum34) 135 - 141: 7(fvec4) Load 140(v4) - 142: 8 Load 14(m2) - 143: 136(fvec3) VectorTimesMatrix 141 142 - Store 138(sum3) 143 - 146: 8 Load 14(m2) - 149: 136(fvec3) Load 148(v3) - 150: 7(fvec4) MatrixTimesVector 146 149 - Store 145(sum4) 150 - 154: 8 Load 10(sum34) - 155: 151 Transpose 154 - Store 153(m43) 155 - 159: 8 Load 12(m1) - 160: 151 Load 153(m43) - 161: 156 MatrixTimesMatrix 159 160 - Store 158(m4) 161 - 162: 7(fvec4) Load 140(v4) - 163: 156 Load 158(m4) - 164: 7(fvec4) VectorTimesMatrix 162 163 - Store 145(sum4) 164 - 167: 7(fvec4) Load 145(sum4) - Store 166(color) 167 - 168: 8 Load 10(sum34) - 169: 7(fvec4) CompositeConstruct 81 81 81 81 - 170: 7(fvec4) CompositeExtract 168 0 - 171: 7(fvec4) FAdd 170 169 - 172: 7(fvec4) CompositeExtract 168 1 - 173: 7(fvec4) FAdd 172 169 - 174: 7(fvec4) CompositeExtract 168 2 - 175: 7(fvec4) FAdd 174 169 - 176: 8 CompositeConstruct 171 173 175 - Store 10(sum34) 176 - 177: 8 Load 10(sum34) - 178: 7(fvec4) CompositeConstruct 81 81 81 81 - 179: 7(fvec4) CompositeExtract 177 0 - 180: 7(fvec4) FSub 179 178 - 181: 7(fvec4) CompositeExtract 177 1 - 182: 7(fvec4) FSub 181 178 - 183: 7(fvec4) CompositeExtract 177 2 - 184: 7(fvec4) FSub 183 178 - 185: 8 CompositeConstruct 180 182 184 - Store 10(sum34) 185 - 186: 6(float) Load 28(f) - 188: 7(fvec4) CompositeConstruct 186 187 187 187 - 189: 7(fvec4) CompositeConstruct 187 186 187 187 - 190: 7(fvec4) CompositeConstruct 187 187 186 187 - 191: 8 CompositeConstruct 188 189 190 - 192: 8 Load 10(sum34) - 193: 7(fvec4) CompositeExtract 192 0 - 194: 7(fvec4) CompositeExtract 191 0 - 195: 7(fvec4) FAdd 193 194 - 196: 7(fvec4) CompositeExtract 192 1 - 197: 7(fvec4) CompositeExtract 191 1 - 198: 7(fvec4) FAdd 196 197 - 199: 7(fvec4) CompositeExtract 192 2 - 200: 7(fvec4) CompositeExtract 191 2 - 201: 7(fvec4) FAdd 199 200 - 202: 8 CompositeConstruct 195 198 201 - Store 10(sum34) 202 - 203: 136(fvec3) Load 148(v3) - 204: 6(float) Load 28(f) - 205: 136(fvec3) Load 148(v3) - 206: 6(float) Load 28(f) - 207: 136(fvec3) Load 148(v3) - 208: 6(float) Load 28(f) - 209: 6(float) CompositeExtract 203 0 - 210: 6(float) CompositeExtract 203 1 - 211: 6(float) CompositeExtract 203 2 - 212: 6(float) CompositeExtract 205 0 - 213: 6(float) CompositeExtract 205 1 - 214: 6(float) CompositeExtract 205 2 - 215: 6(float) CompositeExtract 207 0 - 216: 6(float) CompositeExtract 207 1 - 217: 6(float) CompositeExtract 207 2 - 218: 7(fvec4) CompositeConstruct 209 210 211 204 - 219: 7(fvec4) CompositeConstruct 212 213 214 206 - 220: 7(fvec4) CompositeConstruct 215 216 217 208 - 221: 8 CompositeConstruct 218 219 220 - 222: 8 Load 10(sum34) - 223: 7(fvec4) CompositeExtract 222 0 - 224: 7(fvec4) CompositeExtract 221 0 - 225: 7(fvec4) FAdd 223 224 - 226: 7(fvec4) CompositeExtract 222 1 - 227: 7(fvec4) CompositeExtract 221 1 - 228: 7(fvec4) FAdd 226 227 - 229: 7(fvec4) CompositeExtract 222 2 - 230: 7(fvec4) CompositeExtract 221 2 - 231: 7(fvec4) FAdd 229 230 - 232: 8 CompositeConstruct 225 228 231 - Store 10(sum34) 232 - 233: 136(fvec3) Load 138(sum3) - 234: 151 Load 153(m43) - 235: 7(fvec4) VectorTimesMatrix 233 234 - 236: 7(fvec4) Load 145(sum4) - 237: 7(fvec4) FAdd 235 236 - 238: 7(fvec4) Load 166(color) - 239: 7(fvec4) FAdd 238 237 - Store 166(color) 239 + 141: 8 Load 10(sum34) + 142: 137(fvec4) CompositeExtract 141 0 + 143: 137(fvec4) FConvert 142 + 144: 137(fvec4) CompositeExtract 141 1 + 145: 137(fvec4) FConvert 144 + 146: 137(fvec4) CompositeExtract 141 2 + 147: 137(fvec4) FConvert 146 + 148: 138 CompositeConstruct 143 145 147 + Store 140(dm) 148 + 149: 138 Load 140(dm) + 150: 7(fvec4) CompositeExtract 149 0 + 151: 7(fvec4) FConvert 150 + 152: 7(fvec4) CompositeExtract 149 1 + 153: 7(fvec4) FConvert 152 + 154: 7(fvec4) CompositeExtract 149 2 + 155: 7(fvec4) FConvert 154 + 156: 8 CompositeConstruct 151 153 155 + Store 10(sum34) 156 + 162: 7(fvec4) Load 161(v4) + 163: 8 Load 14(m2) + 164: 157(fvec3) VectorTimesMatrix 162 163 + Store 159(sum3) 164 + 167: 8 Load 14(m2) + 170: 157(fvec3) Load 169(v3) + 171: 7(fvec4) MatrixTimesVector 167 170 + Store 166(sum4) 171 + 175: 8 Load 10(sum34) + 176: 172 Transpose 175 + Store 174(m43) 176 + 180: 8 Load 12(m1) + 181: 172 Load 174(m43) + 182: 177 MatrixTimesMatrix 180 181 + Store 179(m4) 182 + 183: 7(fvec4) Load 161(v4) + 184: 177 Load 179(m4) + 185: 7(fvec4) VectorTimesMatrix 183 184 + Store 166(sum4) 185 + 188: 7(fvec4) Load 166(sum4) + Store 187(color) 188 + 189: 8 Load 10(sum34) + 190: 7(fvec4) CompositeConstruct 81 81 81 81 + 191: 7(fvec4) CompositeExtract 189 0 + 192: 7(fvec4) FAdd 191 190 + 193: 7(fvec4) CompositeExtract 189 1 + 194: 7(fvec4) FAdd 193 190 + 195: 7(fvec4) CompositeExtract 189 2 + 196: 7(fvec4) FAdd 195 190 + 197: 8 CompositeConstruct 192 194 196 + Store 10(sum34) 197 + 198: 8 Load 10(sum34) + 199: 7(fvec4) CompositeConstruct 81 81 81 81 + 200: 7(fvec4) CompositeExtract 198 0 + 201: 7(fvec4) FSub 200 199 + 202: 7(fvec4) CompositeExtract 198 1 + 203: 7(fvec4) FSub 202 199 + 204: 7(fvec4) CompositeExtract 198 2 + 205: 7(fvec4) FSub 204 199 + 206: 8 CompositeConstruct 201 203 205 + Store 10(sum34) 206 + 207: 6(float) Load 28(f) + 209: 7(fvec4) CompositeConstruct 207 208 208 208 + 210: 7(fvec4) CompositeConstruct 208 207 208 208 + 211: 7(fvec4) CompositeConstruct 208 208 207 208 + 212: 8 CompositeConstruct 209 210 211 + 213: 8 Load 10(sum34) + 214: 7(fvec4) CompositeExtract 213 0 + 215: 7(fvec4) CompositeExtract 212 0 + 216: 7(fvec4) FAdd 214 215 + 217: 7(fvec4) CompositeExtract 213 1 + 218: 7(fvec4) CompositeExtract 212 1 + 219: 7(fvec4) FAdd 217 218 + 220: 7(fvec4) CompositeExtract 213 2 + 221: 7(fvec4) CompositeExtract 212 2 + 222: 7(fvec4) FAdd 220 221 + 223: 8 CompositeConstruct 216 219 222 + Store 10(sum34) 223 + 224: 157(fvec3) Load 169(v3) + 225: 6(float) Load 28(f) + 226: 157(fvec3) Load 169(v3) + 227: 6(float) Load 28(f) + 228: 157(fvec3) Load 169(v3) + 229: 6(float) Load 28(f) + 230: 6(float) CompositeExtract 224 0 + 231: 6(float) CompositeExtract 224 1 + 232: 6(float) CompositeExtract 224 2 + 233: 6(float) CompositeExtract 226 0 + 234: 6(float) CompositeExtract 226 1 + 235: 6(float) CompositeExtract 226 2 + 236: 6(float) CompositeExtract 228 0 + 237: 6(float) CompositeExtract 228 1 + 238: 6(float) CompositeExtract 228 2 + 239: 7(fvec4) CompositeConstruct 230 231 232 225 + 240: 7(fvec4) CompositeConstruct 233 234 235 227 + 241: 7(fvec4) CompositeConstruct 236 237 238 229 + 242: 8 CompositeConstruct 239 240 241 + 243: 8 Load 10(sum34) + 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 FunctionEnd diff --git a/Test/spv.matrix.frag b/Test/spv.matrix.frag index c62e9669..10a52566 100644 --- a/Test/spv.matrix.frag +++ b/Test/spv.matrix.frag @@ -1,4 +1,4 @@ -#version 140 +#version 420 in mat3x4 m1; in mat3x4 m2; @@ -11,6 +11,7 @@ out vec4 color; void main() { mat3x4 sum34; + dmat3x4 dm; vec3 sum3; vec4 sum4; @@ -22,6 +23,8 @@ void main() sum34 += f / m1; sum34 += f; sum34 -= f; + dm = dmat3x4(sum34); + sum34 = mat3x4(dm); sum3 = v4 * m2; sum4 = m2 * v3; @@ -33,10 +36,8 @@ void main() color = sum4; -//spv if (m1 != sum34) - ++sum34; -// else - --sum34; + ++sum34; + --sum34; sum34 += mat3x4(f); sum34 += mat3x4(v3, f, v3, f, v3, f);