mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-08 19:40:06 +00:00
Merge pull request #508 from amdrexu/bugfix
SPV: Support simultaneous l-value swizzle and dynamic component selection.
This commit is contained in:
commit
315b6b9f68
@ -1328,15 +1328,20 @@ Id Builder::createRvalueSwizzle(Decoration precision, Id typeId, Id source, std:
|
||||
// Comments in header
|
||||
Id Builder::createLvalueSwizzle(Id typeId, Id target, Id source, std::vector<unsigned>& channels)
|
||||
{
|
||||
assert(getNumComponents(source) == (int)channels.size());
|
||||
if (channels.size() == 1 && getNumComponents(source) == 1)
|
||||
return createCompositeInsert(source, target, typeId, channels.front());
|
||||
|
||||
Instruction* swizzle = new Instruction(getUniqueId(), typeId, OpVectorShuffle);
|
||||
assert(isVector(source));
|
||||
assert(isVector(target));
|
||||
swizzle->addIdOperand(target);
|
||||
swizzle->addIdOperand(source);
|
||||
if (accessChain.component != NoResult)
|
||||
// For dynamic component selection, source does not involve in l-value swizzle
|
||||
swizzle->addIdOperand(target);
|
||||
else {
|
||||
assert(getNumComponents(source) == (int)channels.size());
|
||||
assert(isVector(source));
|
||||
swizzle->addIdOperand(source);
|
||||
}
|
||||
|
||||
// Set up an identity shuffle from the base value to the result value
|
||||
unsigned int components[4];
|
||||
@ -1345,8 +1350,12 @@ Id Builder::createLvalueSwizzle(Id typeId, Id target, Id source, std::vector<uns
|
||||
components[i] = i;
|
||||
|
||||
// Punch in the l-value swizzle
|
||||
for (int i = 0; i < (int)channels.size(); ++i)
|
||||
components[channels[i]] = numTargetComponents + i;
|
||||
for (int i = 0; i < (int)channels.size(); ++i) {
|
||||
if (accessChain.component != NoResult)
|
||||
components[i] = channels[i]; // Only shuffle the base value
|
||||
else
|
||||
components[channels[i]] = numTargetComponents + i;
|
||||
}
|
||||
|
||||
// finish the instruction with these components selectors
|
||||
for (int i = 0; i < numTargetComponents; ++i)
|
||||
@ -2118,9 +2127,6 @@ void Builder::accessChainStore(Id rvalue)
|
||||
transferAccessChainSwizzle(true);
|
||||
Id base = collapseAccessChain();
|
||||
|
||||
if (accessChain.swizzle.size() && accessChain.component != NoResult)
|
||||
logger->missingFunctionality("simultaneous l-value swizzle and dynamic component selection");
|
||||
|
||||
// If swizzle still exists, it is out-of-order or not full, we must load the target vector,
|
||||
// extract and insert elements to perform writeMask and/or swizzle.
|
||||
Id source = NoResult;
|
||||
|
@ -7,12 +7,12 @@ Linked fragment stage:
|
||||
|
||||
// Module Version 10000
|
||||
// Generated by (magic number): 80001
|
||||
// Id's are bound by 197
|
||||
// Id's are bound by 206
|
||||
|
||||
Capability Shader
|
||||
1: ExtInstImport "GLSL.std.450"
|
||||
MemoryModel Logical GLSL450
|
||||
EntryPoint Fragment 4 "main" 65 149
|
||||
EntryPoint Fragment 4 "main" 65 158
|
||||
ExecutionMode 4 OriginUpperLeft
|
||||
Source GLSL 420
|
||||
Name 4 "main"
|
||||
@ -57,22 +57,22 @@ Linked fragment stage:
|
||||
Name 60 "i"
|
||||
Name 61 "comp"
|
||||
Name 65 "OutColor"
|
||||
Name 144 "s"
|
||||
Name 149 "u"
|
||||
Name 150 "param"
|
||||
Name 154 "param"
|
||||
Name 158 "param"
|
||||
Name 162 "param"
|
||||
Name 166 "param"
|
||||
Name 170 "param"
|
||||
Name 174 "param"
|
||||
Name 178 "param"
|
||||
Name 182 "param"
|
||||
Name 186 "param"
|
||||
Name 190 "param"
|
||||
Name 194 "param"
|
||||
Name 153 "s"
|
||||
Name 158 "u"
|
||||
Name 159 "param"
|
||||
Name 163 "param"
|
||||
Name 167 "param"
|
||||
Name 171 "param"
|
||||
Name 175 "param"
|
||||
Name 179 "param"
|
||||
Name 183 "param"
|
||||
Name 187 "param"
|
||||
Name 191 "param"
|
||||
Name 195 "param"
|
||||
Name 199 "param"
|
||||
Name 203 "param"
|
||||
Decorate 65(OutColor) Location 0
|
||||
Decorate 149(u) Flat
|
||||
Decorate 158(u) Flat
|
||||
2: TypeVoid
|
||||
3: TypeFunction 2
|
||||
6: TypeFloat 32
|
||||
@ -90,77 +90,77 @@ Linked fragment stage:
|
||||
95: TypeVector 6(float) 2
|
||||
109: 67(int) Constant 2
|
||||
136: TypePointer Output 6(float)
|
||||
141: 6(float) Constant 0
|
||||
142: 7(fvec3) ConstantComposite 141 141 141
|
||||
143: TypePointer Function 8(S)
|
||||
148: TypePointer Input 13(int)
|
||||
149(u): 148(ptr) Variable Input
|
||||
150: 6(float) Constant 0
|
||||
151: 7(fvec3) ConstantComposite 150 150 150
|
||||
152: TypePointer Function 8(S)
|
||||
157: TypePointer Input 13(int)
|
||||
158(u): 157(ptr) Variable Input
|
||||
4(main): 2 Function None 3
|
||||
5: Label
|
||||
144(s): 143(ptr) Variable Function
|
||||
150(param): 14(ptr) Variable Function
|
||||
154(param): 14(ptr) Variable Function
|
||||
158(param): 14(ptr) Variable Function
|
||||
162(param): 14(ptr) Variable Function
|
||||
166(param): 14(ptr) Variable Function
|
||||
170(param): 14(ptr) Variable Function
|
||||
174(param): 14(ptr) Variable Function
|
||||
178(param): 14(ptr) Variable Function
|
||||
182(param): 14(ptr) Variable Function
|
||||
186(param): 14(ptr) Variable Function
|
||||
190(param): 14(ptr) Variable Function
|
||||
194(param): 14(ptr) Variable Function
|
||||
Store 65(OutColor) 142
|
||||
145: 8(S) Load 144(s)
|
||||
146: 2 FunctionCall 11(GetColor1(struct-S-vf31;) 145
|
||||
147: 8(S) Load 144(s)
|
||||
151: 13(int) Load 149(u)
|
||||
Store 150(param) 151
|
||||
152: 2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 147 150(param)
|
||||
153: 8(S) Load 144(s)
|
||||
155: 13(int) Load 149(u)
|
||||
Store 154(param) 155
|
||||
156: 2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 153 154(param)
|
||||
157: 8(S) Load 144(s)
|
||||
159: 13(int) Load 149(u)
|
||||
Store 158(param) 159
|
||||
160: 2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 157 158(param)
|
||||
161: 8(S) Load 144(s)
|
||||
163: 13(int) Load 149(u)
|
||||
Store 162(param) 163
|
||||
164: 2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 161 162(param)
|
||||
165: 8(S) Load 144(s)
|
||||
167: 13(int) Load 149(u)
|
||||
Store 166(param) 167
|
||||
168: 2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 165 166(param)
|
||||
169: 8(S) Load 144(s)
|
||||
171: 13(int) Load 149(u)
|
||||
Store 170(param) 171
|
||||
172: 2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 169 170(param)
|
||||
173: 8(S) Load 144(s)
|
||||
175: 13(int) Load 149(u)
|
||||
Store 174(param) 175
|
||||
176: 2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 173 174(param)
|
||||
177: 8(S) Load 144(s)
|
||||
179: 13(int) Load 149(u)
|
||||
Store 178(param) 179
|
||||
180: 2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 177 178(param)
|
||||
181: 8(S) Load 144(s)
|
||||
183: 13(int) Load 149(u)
|
||||
Store 182(param) 183
|
||||
184: 2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 181 182(param)
|
||||
185: 8(S) Load 144(s)
|
||||
187: 13(int) Load 149(u)
|
||||
Store 186(param) 187
|
||||
188: 2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 185 186(param)
|
||||
189: 8(S) Load 144(s)
|
||||
191: 13(int) Load 149(u)
|
||||
Store 190(param) 191
|
||||
192: 2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 189 190(param)
|
||||
193: 8(S) Load 144(s)
|
||||
195: 13(int) Load 149(u)
|
||||
Store 194(param) 195
|
||||
196: 2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 193 194(param)
|
||||
153(s): 152(ptr) Variable Function
|
||||
159(param): 14(ptr) Variable Function
|
||||
163(param): 14(ptr) Variable Function
|
||||
167(param): 14(ptr) Variable Function
|
||||
171(param): 14(ptr) Variable Function
|
||||
175(param): 14(ptr) Variable Function
|
||||
179(param): 14(ptr) Variable Function
|
||||
183(param): 14(ptr) Variable Function
|
||||
187(param): 14(ptr) Variable Function
|
||||
191(param): 14(ptr) Variable Function
|
||||
195(param): 14(ptr) Variable Function
|
||||
199(param): 14(ptr) Variable Function
|
||||
203(param): 14(ptr) Variable Function
|
||||
Store 65(OutColor) 151
|
||||
154: 8(S) Load 153(s)
|
||||
155: 2 FunctionCall 11(GetColor1(struct-S-vf31;) 154
|
||||
156: 8(S) Load 153(s)
|
||||
160: 13(int) Load 158(u)
|
||||
Store 159(param) 160
|
||||
161: 2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 156 159(param)
|
||||
162: 8(S) Load 153(s)
|
||||
164: 13(int) Load 158(u)
|
||||
Store 163(param) 164
|
||||
165: 2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 162 163(param)
|
||||
166: 8(S) Load 153(s)
|
||||
168: 13(int) Load 158(u)
|
||||
Store 167(param) 168
|
||||
169: 2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 166 167(param)
|
||||
170: 8(S) Load 153(s)
|
||||
172: 13(int) Load 158(u)
|
||||
Store 171(param) 172
|
||||
173: 2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 170 171(param)
|
||||
174: 8(S) Load 153(s)
|
||||
176: 13(int) Load 158(u)
|
||||
Store 175(param) 176
|
||||
177: 2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 174 175(param)
|
||||
178: 8(S) Load 153(s)
|
||||
180: 13(int) Load 158(u)
|
||||
Store 179(param) 180
|
||||
181: 2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 178 179(param)
|
||||
182: 8(S) Load 153(s)
|
||||
184: 13(int) Load 158(u)
|
||||
Store 183(param) 184
|
||||
185: 2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 182 183(param)
|
||||
186: 8(S) Load 153(s)
|
||||
188: 13(int) Load 158(u)
|
||||
Store 187(param) 188
|
||||
189: 2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 186 187(param)
|
||||
190: 8(S) Load 153(s)
|
||||
192: 13(int) Load 158(u)
|
||||
Store 191(param) 192
|
||||
193: 2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 190 191(param)
|
||||
194: 8(S) Load 153(s)
|
||||
196: 13(int) Load 158(u)
|
||||
Store 195(param) 196
|
||||
197: 2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 194 195(param)
|
||||
198: 8(S) Load 153(s)
|
||||
200: 13(int) Load 158(u)
|
||||
Store 199(param) 200
|
||||
201: 2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 198 199(param)
|
||||
202: 8(S) Load 153(s)
|
||||
204: 13(int) Load 158(u)
|
||||
Store 203(param) 204
|
||||
205: 2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 202 203(param)
|
||||
Return
|
||||
FunctionEnd
|
||||
11(GetColor1(struct-S-vf31;): 2 Function None 9
|
||||
@ -319,5 +319,15 @@ Linked fragment stage:
|
||||
60(i): 8(S) FunctionParameter
|
||||
61(comp): 14(ptr) FunctionParameter
|
||||
63: Label
|
||||
141: 13(int) Load 61(comp)
|
||||
142: 6(float) CompositeExtract 60(i) 0 0
|
||||
143: 7(fvec3) Load 65(OutColor)
|
||||
144: 95(fvec2) VectorShuffle 143 143 2 1
|
||||
145: 6(float) VectorExtractDynamic 144 141
|
||||
146: 6(float) FAdd 145 142
|
||||
147: 7(fvec3) Load 65(OutColor)
|
||||
148: 7(fvec3) VectorShuffle 147 147 2 1 2
|
||||
149: 7(fvec3) VectorInsertDynamic 148 146 141
|
||||
Store 65(OutColor) 149
|
||||
Return
|
||||
FunctionEnd
|
||||
|
@ -71,7 +71,7 @@ void GetColor12(const S i, int comp)
|
||||
|
||||
void GetColor13(const S i, int comp)
|
||||
{
|
||||
// OutColor.zy[comp] += i.color.x; // not yet supported
|
||||
OutColor.zy[comp] += i.color.x;
|
||||
}
|
||||
|
||||
void main()
|
||||
|
Loading…
Reference in New Issue
Block a user