From 7a53f76d386acd91bd48a2d8ae30a9ebce7f5baf Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Wed, 20 Jan 2016 11:19:27 -0700 Subject: [PATCH] SPV: Add unary-matrix operations, operating at vector level. --- SPIRV/GlslangToSpv.cpp | 40 ++++- Test/baseResults/spv.branch-return.vert.out | 2 +- Test/baseResults/spv.matrix2.frag.out | 266 ++++++++++++++-------------- 3 files changed, 176 insertions(+), 132 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 9d42e3c..c174375 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -110,6 +110,7 @@ protected: spv::Id createBinaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, spv::Id left, spv::Id right, glslang::TBasicType typeProxy, bool reduceComparison = true); spv::Id createBinaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Id typeId, spv::Id left, spv::Id right); spv::Id createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy); + spv::Id createUnaryMatrixOperation(spv::Op, spv::Decoration precision, 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 makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); @@ -2601,9 +2602,11 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv: switch (op) { case glslang::EOpNegative: - if (isFloat) + if (isFloat) { unaryOp = spv::OpFNegate; - else + if (builder.isMatrixType(typeId)) + return createUnaryMatrixOperation(unaryOp, precision, typeId, operand, typeProxy); + } else unaryOp = spv::OpSNegate; break; @@ -2862,6 +2865,39 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv: return id; } +// Create a unary operation on a matrix +spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Id typeId, spv::Id operand, glslang::TBasicType /* typeProxy */) +{ + // Handle unary operations vector by vector. + // The result type is the same type as the original type. + // The algorithm is to: + // - break the matrix into vectors + // - apply the operation to each vector + // - make a matrix out the vector results + + // get the types sorted out + int numCols = builder.getNumColumns(operand); + int numRows = builder.getNumRows(operand); + spv::Id scalarType = builder.getScalarTypeId(typeId); + spv::Id vecType = builder.makeVectorType(scalarType, numRows); + std::vector results; + + // do each vector op + for (int c = 0; c < numCols; ++c) { + std::vector indexes; + indexes.push_back(c); + spv::Id vec = builder.createCompositeExtract(operand, vecType, indexes); + results.push_back(builder.createUnaryOp(op, vecType, vec)); + builder.setPrecision(results.back(), precision); + } + + // put the pieces together + spv::Id id = builder.createCompositeConstruct(typeId, results); + builder.setPrecision(id, precision); + + return id; +} + spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destType, spv::Id operand) { spv::Op convOp = spv::OpNop; diff --git a/Test/baseResults/spv.branch-return.vert.out b/Test/baseResults/spv.branch-return.vert.out index 75ebefe..8588d74 100644 --- a/Test/baseResults/spv.branch-return.vert.out +++ b/Test/baseResults/spv.branch-return.vert.out @@ -60,4 +60,4 @@ Linked vertex stage: 33: 29(ptr) AccessChain 19(gl_Position) 28 Store 33 32 Return - FunctionEnd + FunctionEnd diff --git a/Test/baseResults/spv.matrix2.frag.out b/Test/baseResults/spv.matrix2.frag.out index 5deb539..b1cd71b 100644 --- a/Test/baseResults/spv.matrix2.frag.out +++ b/Test/baseResults/spv.matrix2.frag.out @@ -5,12 +5,12 @@ Linked fragment stage: // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 213 +// Id's are bound by 221 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 12 16 37 38 65 87 139 150 173 210 211 212 + EntryPoint Fragment 4 "main" 12 16 37 38 65 87 147 158 181 218 219 220 ExecutionMode 4 OriginLowerLeft Source GLSL 150 Name 4 "main" @@ -22,15 +22,15 @@ Linked fragment stage: Name 63 "m44" Name 65 "un34" Name 87 "um43" - Name 139 "um4" - Name 148 "inv" - Name 150 "um2" - Name 171 "inv3" - Name 173 "um3" - Name 182 "inv4" - Name 210 "colorTransform" - Name 211 "m" - Name 212 "n" + Name 147 "um4" + Name 156 "inv" + Name 158 "um2" + Name 179 "inv3" + Name 181 "um3" + Name 190 "inv4" + Name 218 "colorTransform" + Name 219 "m" + Name 220 "n" 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -62,35 +62,35 @@ Linked fragment stage: 85: TypeMatrix 14(fvec3) 4 86: TypePointer Input 85 87(um43): 86(ptr) Variable Input - 138: TypePointer Input 61 - 139(um4): 138(ptr) Variable Input - 145: TypeVector 6(float) 2 - 146: TypeMatrix 145(fvec2) 2 - 147: TypePointer Function 146 - 149: TypePointer Input 146 - 150(um2): 149(ptr) Variable Input - 153: TypeInt 32 1 - 154: 153(int) Constant 0 - 155: TypePointer Function 6(float) - 158: 153(int) Constant 1 - 161: 54(int) Constant 1 - 169: TypeMatrix 14(fvec3) 3 - 170: TypePointer Function 169 - 172: TypePointer Input 169 - 173(um3): 172(ptr) Variable Input - 176: 153(int) Constant 2 - 202: 54(int) Constant 3 - 203: TypePointer Output 6(float) -210(colorTransform): 172(ptr) Variable Input - 211(m): 138(ptr) Variable Input - 212(n): 138(ptr) Variable Input + 146: TypePointer Input 61 + 147(um4): 146(ptr) Variable Input + 153: TypeVector 6(float) 2 + 154: TypeMatrix 153(fvec2) 2 + 155: TypePointer Function 154 + 157: TypePointer Input 154 + 158(um2): 157(ptr) Variable Input + 161: TypeInt 32 1 + 162: 161(int) Constant 0 + 163: TypePointer Function 6(float) + 166: 161(int) Constant 1 + 169: 54(int) Constant 1 + 177: TypeMatrix 14(fvec3) 3 + 178: TypePointer Function 177 + 180: TypePointer Input 177 + 181(um3): 180(ptr) Variable Input + 184: 161(int) Constant 2 + 210: 54(int) Constant 3 + 211: TypePointer Output 6(float) +218(colorTransform): 180(ptr) Variable Input + 219(m): 146(ptr) Variable Input + 220(n): 146(ptr) Variable Input 4(main): 2 Function None 3 5: Label 10(m34): 9(ptr) Variable Function 63(m44): 62(ptr) Variable Function - 148(inv): 147(ptr) Variable Function - 171(inv3): 170(ptr) Variable Function - 182(inv4): 62(ptr) Variable Function + 156(inv): 155(ptr) Variable Function + 179(inv3): 178(ptr) Variable Function + 190(inv4): 62(ptr) Variable Function 13: 7(fvec4) Load 12(v) 17: 14(fvec3) Load 16(u) 18: 8 OuterProduct 13 17 @@ -166,100 +166,108 @@ Linked fragment stage: 103: 61 CompositeConstruct 93 96 99 102 Store 63(m44) 103 104: 61 Load 63(m44) - 105: 61 FNegate 104 - 106: 7(fvec4) Load 12(v) - 107: 7(fvec4) MatrixTimesVector 105 106 - 108: 7(fvec4) Load 37(FragColor) - 109: 7(fvec4) FAdd 108 107 - Store 37(FragColor) 109 - 110: 61 Load 63(m44) - 111: 61 Load 63(m44) - 112: 7(fvec4) CompositeExtract 110 0 - 113: 7(fvec4) CompositeExtract 111 0 - 114: 7(fvec4) FMul 112 113 - 115: 7(fvec4) CompositeExtract 110 1 - 116: 7(fvec4) CompositeExtract 111 1 - 117: 7(fvec4) FMul 115 116 - 118: 7(fvec4) CompositeExtract 110 2 - 119: 7(fvec4) CompositeExtract 111 2 - 120: 7(fvec4) FMul 118 119 - 121: 7(fvec4) CompositeExtract 110 3 - 122: 7(fvec4) CompositeExtract 111 3 - 123: 7(fvec4) FMul 121 122 - 124: 61 CompositeConstruct 114 117 120 123 - 125: 7(fvec4) Load 37(FragColor) - 126: 7(fvec4) VectorTimesMatrix 125 124 - Store 37(FragColor) 126 - 127: 85 Load 87(um43) - 128: 8 Transpose 127 - Store 10(m34) 128 - 129: 7(fvec4) Load 37(FragColor) - 130: 8 Load 10(m34) - 131: 14(fvec3) VectorTimesMatrix 129 130 - 132: 6(float) CompositeExtract 131 0 - 133: 6(float) CompositeExtract 131 1 - 134: 6(float) CompositeExtract 131 2 - 135: 7(fvec4) CompositeConstruct 132 133 134 40 - 136: 7(fvec4) Load 37(FragColor) - 137: 7(fvec4) FMul 136 135 - Store 37(FragColor) 137 - 140: 61 Load 139(um4) - 141: 6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 140 - 142: 7(fvec4) CompositeConstruct 141 141 141 141 - 143: 7(fvec4) Load 37(FragColor) - 144: 7(fvec4) FMul 143 142 - Store 37(FragColor) 144 - 151: 146 Load 150(um2) - 152: 146 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 151 - Store 148(inv) 152 - 156: 155(ptr) AccessChain 148(inv) 154 55 - 157: 6(float) Load 156 - 159: 155(ptr) AccessChain 148(inv) 158 55 - 160: 6(float) Load 159 - 162: 155(ptr) AccessChain 148(inv) 154 161 - 163: 6(float) Load 162 - 164: 155(ptr) AccessChain 148(inv) 158 161 + 105: 7(fvec4) CompositeExtract 104 0 + 106: 7(fvec4) FNegate 105 + 107: 7(fvec4) CompositeExtract 104 1 + 108: 7(fvec4) FNegate 107 + 109: 7(fvec4) CompositeExtract 104 2 + 110: 7(fvec4) FNegate 109 + 111: 7(fvec4) CompositeExtract 104 3 + 112: 7(fvec4) FNegate 111 + 113: 61 CompositeConstruct 106 108 110 112 + 114: 7(fvec4) Load 12(v) + 115: 7(fvec4) MatrixTimesVector 113 114 + 116: 7(fvec4) Load 37(FragColor) + 117: 7(fvec4) FAdd 116 115 + Store 37(FragColor) 117 + 118: 61 Load 63(m44) + 119: 61 Load 63(m44) + 120: 7(fvec4) CompositeExtract 118 0 + 121: 7(fvec4) CompositeExtract 119 0 + 122: 7(fvec4) FMul 120 121 + 123: 7(fvec4) CompositeExtract 118 1 + 124: 7(fvec4) CompositeExtract 119 1 + 125: 7(fvec4) FMul 123 124 + 126: 7(fvec4) CompositeExtract 118 2 + 127: 7(fvec4) CompositeExtract 119 2 + 128: 7(fvec4) FMul 126 127 + 129: 7(fvec4) CompositeExtract 118 3 + 130: 7(fvec4) CompositeExtract 119 3 + 131: 7(fvec4) FMul 129 130 + 132: 61 CompositeConstruct 122 125 128 131 + 133: 7(fvec4) Load 37(FragColor) + 134: 7(fvec4) VectorTimesMatrix 133 132 + Store 37(FragColor) 134 + 135: 85 Load 87(um43) + 136: 8 Transpose 135 + Store 10(m34) 136 + 137: 7(fvec4) Load 37(FragColor) + 138: 8 Load 10(m34) + 139: 14(fvec3) VectorTimesMatrix 137 138 + 140: 6(float) CompositeExtract 139 0 + 141: 6(float) CompositeExtract 139 1 + 142: 6(float) CompositeExtract 139 2 + 143: 7(fvec4) CompositeConstruct 140 141 142 40 + 144: 7(fvec4) Load 37(FragColor) + 145: 7(fvec4) FMul 144 143 + Store 37(FragColor) 145 + 148: 61 Load 147(um4) + 149: 6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 148 + 150: 7(fvec4) CompositeConstruct 149 149 149 149 + 151: 7(fvec4) Load 37(FragColor) + 152: 7(fvec4) FMul 151 150 + Store 37(FragColor) 152 + 159: 154 Load 158(um2) + 160: 154 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 159 + Store 156(inv) 160 + 164: 163(ptr) AccessChain 156(inv) 162 55 165: 6(float) Load 164 - 166: 7(fvec4) CompositeConstruct 157 160 163 165 - 167: 7(fvec4) Load 37(FragColor) - 168: 7(fvec4) FMul 167 166 - Store 37(FragColor) 168 - 174: 169 Load 173(um3) - 175: 169 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 174 - Store 171(inv3) 175 - 177: 155(ptr) AccessChain 171(inv3) 176 161 - 178: 6(float) Load 177 - 179: 7(fvec4) CompositeConstruct 178 178 178 178 - 180: 7(fvec4) Load 37(FragColor) - 181: 7(fvec4) FMul 180 179 - Store 37(FragColor) 181 - 183: 61 Load 139(um4) - 184: 61 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 183 - Store 182(inv4) 184 - 185: 61 Load 182(inv4) - 186: 7(fvec4) Load 37(FragColor) - 187: 7(fvec4) VectorTimesMatrix 186 185 - Store 37(FragColor) 187 + 167: 163(ptr) AccessChain 156(inv) 166 55 + 168: 6(float) Load 167 + 170: 163(ptr) AccessChain 156(inv) 162 169 + 171: 6(float) Load 170 + 172: 163(ptr) AccessChain 156(inv) 166 169 + 173: 6(float) Load 172 + 174: 7(fvec4) CompositeConstruct 165 168 171 173 + 175: 7(fvec4) Load 37(FragColor) + 176: 7(fvec4) FMul 175 174 + Store 37(FragColor) 176 + 182: 177 Load 181(um3) + 183: 177 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 182 + Store 179(inv3) 183 + 185: 163(ptr) AccessChain 179(inv3) 184 169 + 186: 6(float) Load 185 + 187: 7(fvec4) CompositeConstruct 186 186 186 186 188: 7(fvec4) Load 37(FragColor) - 189: 8 Load 65(un34) - 190: 8 Load 65(un34) - 191: 7(fvec4) CompositeExtract 189 0 - 192: 7(fvec4) CompositeExtract 190 0 - 193: 7(fvec4) FMul 191 192 - 194: 7(fvec4) CompositeExtract 189 1 - 195: 7(fvec4) CompositeExtract 190 1 - 196: 7(fvec4) FMul 194 195 - 197: 7(fvec4) CompositeExtract 189 2 - 198: 7(fvec4) CompositeExtract 190 2 - 199: 7(fvec4) FMul 197 198 - 200: 8 CompositeConstruct 193 196 199 - 201: 14(fvec3) VectorTimesMatrix 188 200 - 204: 203(ptr) AccessChain 37(FragColor) 202 - 205: 6(float) Load 204 - 206: 6(float) CompositeExtract 201 0 - 207: 6(float) CompositeExtract 201 1 - 208: 6(float) CompositeExtract 201 2 - 209: 7(fvec4) CompositeConstruct 206 207 208 205 - Store 37(FragColor) 209 + 189: 7(fvec4) FMul 188 187 + Store 37(FragColor) 189 + 191: 61 Load 147(um4) + 192: 61 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 191 + Store 190(inv4) 192 + 193: 61 Load 190(inv4) + 194: 7(fvec4) Load 37(FragColor) + 195: 7(fvec4) VectorTimesMatrix 194 193 + Store 37(FragColor) 195 + 196: 7(fvec4) Load 37(FragColor) + 197: 8 Load 65(un34) + 198: 8 Load 65(un34) + 199: 7(fvec4) CompositeExtract 197 0 + 200: 7(fvec4) CompositeExtract 198 0 + 201: 7(fvec4) FMul 199 200 + 202: 7(fvec4) CompositeExtract 197 1 + 203: 7(fvec4) CompositeExtract 198 1 + 204: 7(fvec4) FMul 202 203 + 205: 7(fvec4) CompositeExtract 197 2 + 206: 7(fvec4) CompositeExtract 198 2 + 207: 7(fvec4) FMul 205 206 + 208: 8 CompositeConstruct 201 204 207 + 209: 14(fvec3) VectorTimesMatrix 196 208 + 212: 211(ptr) AccessChain 37(FragColor) 210 + 213: 6(float) Load 212 + 214: 6(float) CompositeExtract 209 0 + 215: 6(float) CompositeExtract 209 1 + 216: 6(float) CompositeExtract 209 2 + 217: 7(fvec4) CompositeConstruct 214 215 216 213 + Store 37(FragColor) 217 Return FunctionEnd -- 2.7.4