SPV: Add unary-matrix operations, operating at vector level.

This commit is contained in:
John Kessenich 2016-01-20 11:19:27 -07:00
parent dd1c223561
commit 7a53f76d38
3 changed files with 176 additions and 132 deletions

View File

@ -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<spv::Id>& 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<spv::Id> results;
// do each vector op
for (int c = 0; c < numCols; ++c) {
std::vector<unsigned int> 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;

View File

@ -60,4 +60,4 @@ Linked vertex stage:
33: 29(ptr) AccessChain 19(gl_Position) 28
Store 33 32
Return
FunctionEnd
FunctionEnd

View File

@ -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