Generate separate stores for partially swizzled memory stores

Full vector and fully specified vector swizzle stores are not affected by this change, only partial swizzles ie swizzles with fewer components than the vector being stored to.

Previously the vector being stored to loaded and any components not specified in the swizzle were used to create a full store to the vector.

While this change generates more SPIR-V instructions, it is necessary for correctness.

Fixes #2518.
This commit is contained in:
Jeremy Hayes 2021-07-16 15:07:16 -06:00
parent 9158061398
commit 6d5b40f051
50 changed files with 31343 additions and 26594 deletions

View file

@ -1,12 +1,12 @@
spv.accessChain.frag
// Module Version 10000
// Generated by (magic number): 8000a
// Id's are bound by 222
// Id's are bound by 228
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 69 170
EntryPoint Fragment 4 "main" 69 176
ExecutionMode 4 OriginUpperLeft
Source GLSL 420
Name 4 "main"
@ -54,24 +54,24 @@ spv.accessChain.frag
Name 64 "i"
Name 65 "comp"
Name 69 "OutColor"
Name 165 "s"
Name 170 "u"
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"
Name 207 "param"
Name 211 "param"
Name 215 "param"
Name 219 "param"
Name 171 "s"
Name 176 "u"
Name 177 "param"
Name 181 "param"
Name 185 "param"
Name 189 "param"
Name 193 "param"
Name 197 "param"
Name 201 "param"
Name 205 "param"
Name 209 "param"
Name 213 "param"
Name 217 "param"
Name 221 "param"
Name 225 "param"
Decorate 69(OutColor) Location 0
Decorate 170(u) Flat
Decorate 170(u) Location 0
Decorate 176(u) Flat
Decorate 176(u) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
@ -87,89 +87,89 @@ spv.accessChain.frag
71: TypeInt 32 0
72: 71(int) Constant 0
99: TypeVector 6(float) 2
113: 71(int) Constant 2
140: TypePointer Output 6(float)
147: 71(int) Constant 1
148: TypeVector 71(int) 2
149: 148(ivec2) ConstantComposite 113 147
158: TypeVector 71(int) 3
159: 158(ivec3) ConstantComposite 113 147 72
162: 6(float) Constant 0
163: 7(fvec3) ConstantComposite 162 162 162
164: TypePointer Function 8(S)
169: TypePointer Input 13(int)
170(u): 169(ptr) Variable Input
111: TypePointer Output 6(float)
114: 71(int) Constant 1
117: 71(int) Constant 2
154: TypeVector 71(int) 2
155: 154(ivec2) ConstantComposite 117 114
164: TypeVector 71(int) 3
165: 164(ivec3) ConstantComposite 117 114 72
168: 6(float) Constant 0
169: 7(fvec3) ConstantComposite 168 168 168
170: TypePointer Function 8(S)
175: TypePointer Input 13(int)
176(u): 175(ptr) Variable Input
4(main): 2 Function None 3
5: Label
165(s): 164(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
207(param): 14(ptr) Variable Function
211(param): 14(ptr) Variable Function
215(param): 14(ptr) Variable Function
219(param): 14(ptr) Variable Function
Store 69(OutColor) 163
166: 8(S) Load 165(s)
167: 2 FunctionCall 11(GetColor1(struct-S-vf31;) 166
168: 8(S) Load 165(s)
172: 13(int) Load 170(u)
Store 171(param) 172
173: 2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 168 171(param)
174: 8(S) Load 165(s)
176: 13(int) Load 170(u)
Store 175(param) 176
177: 2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 174 175(param)
178: 8(S) Load 165(s)
180: 13(int) Load 170(u)
Store 179(param) 180
181: 2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 178 179(param)
182: 8(S) Load 165(s)
184: 13(int) Load 170(u)
Store 183(param) 184
185: 2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 182 183(param)
186: 8(S) Load 165(s)
188: 13(int) Load 170(u)
Store 187(param) 188
189: 2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 186 187(param)
190: 8(S) Load 165(s)
192: 13(int) Load 170(u)
Store 191(param) 192
193: 2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 190 191(param)
194: 8(S) Load 165(s)
196: 13(int) Load 170(u)
Store 195(param) 196
197: 2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 194 195(param)
198: 8(S) Load 165(s)
200: 13(int) Load 170(u)
Store 199(param) 200
201: 2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 198 199(param)
202: 8(S) Load 165(s)
204: 13(int) Load 170(u)
Store 203(param) 204
205: 2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 202 203(param)
206: 8(S) Load 165(s)
208: 13(int) Load 170(u)
Store 207(param) 208
209: 2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 206 207(param)
210: 8(S) Load 165(s)
212: 13(int) Load 170(u)
Store 211(param) 212
213: 2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 210 211(param)
214: 8(S) Load 165(s)
216: 13(int) Load 170(u)
Store 215(param) 216
217: 2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 214 215(param)
218: 8(S) Load 165(s)
220: 13(int) Load 170(u)
Store 219(param) 220
221: 2 FunctionCall 66(GetColor14(struct-S-vf31;i1;) 218 219(param)
171(s): 170(ptr) Variable Function
177(param): 14(ptr) Variable Function
181(param): 14(ptr) Variable Function
185(param): 14(ptr) Variable Function
189(param): 14(ptr) Variable Function
193(param): 14(ptr) Variable Function
197(param): 14(ptr) Variable Function
201(param): 14(ptr) Variable Function
205(param): 14(ptr) Variable Function
209(param): 14(ptr) Variable Function
213(param): 14(ptr) Variable Function
217(param): 14(ptr) Variable Function
221(param): 14(ptr) Variable Function
225(param): 14(ptr) Variable Function
Store 69(OutColor) 169
172: 8(S) Load 171(s)
173: 2 FunctionCall 11(GetColor1(struct-S-vf31;) 172
174: 8(S) Load 171(s)
178: 13(int) Load 176(u)
Store 177(param) 178
179: 2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 174 177(param)
180: 8(S) Load 171(s)
182: 13(int) Load 176(u)
Store 181(param) 182
183: 2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 180 181(param)
184: 8(S) Load 171(s)
186: 13(int) Load 176(u)
Store 185(param) 186
187: 2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 184 185(param)
188: 8(S) Load 171(s)
190: 13(int) Load 176(u)
Store 189(param) 190
191: 2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 188 189(param)
192: 8(S) Load 171(s)
194: 13(int) Load 176(u)
Store 193(param) 194
195: 2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 192 193(param)
196: 8(S) Load 171(s)
198: 13(int) Load 176(u)
Store 197(param) 198
199: 2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 196 197(param)
200: 8(S) Load 171(s)
202: 13(int) Load 176(u)
Store 201(param) 202
203: 2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 200 201(param)
204: 8(S) Load 171(s)
206: 13(int) Load 176(u)
Store 205(param) 206
207: 2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 204 205(param)
208: 8(S) Load 171(s)
210: 13(int) Load 176(u)
Store 209(param) 210
211: 2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 208 209(param)
212: 8(S) Load 171(s)
214: 13(int) Load 176(u)
Store 213(param) 214
215: 2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 212 213(param)
216: 8(S) Load 171(s)
218: 13(int) Load 176(u)
Store 217(param) 218
219: 2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 216 217(param)
220: 8(S) Load 171(s)
222: 13(int) Load 176(u)
Store 221(param) 222
223: 2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 220 221(param)
224: 8(S) Load 171(s)
226: 13(int) Load 176(u)
Store 225(param) 226
227: 2 FunctionCall 66(GetColor14(struct-S-vf31;i1;) 224 225(param)
Return
FunctionEnd
11(GetColor1(struct-S-vf31;): 2 Function None 9
@ -254,99 +254,108 @@ spv.accessChain.frag
108: 7(fvec3) Load 69(OutColor)
109: 99(fvec2) VectorShuffle 108 108 0 1
110: 99(fvec2) FAdd 109 107
111: 7(fvec3) Load 69(OutColor)
112: 7(fvec3) VectorShuffle 111 110 3 4 2
Store 69(OutColor) 112
112: 111(ptr) AccessChain 69(OutColor) 72
113: 6(float) CompositeExtract 110 0
Store 112 113
115: 111(ptr) AccessChain 69(OutColor) 114
116: 6(float) CompositeExtract 110 1
Store 115 116
Return
FunctionEnd
42(GetColor8(struct-S-vf31;i1;): 2 Function None 15
40(i): 8(S) FunctionParameter
41(comp): 14(ptr) FunctionParameter
43: Label
114: 6(float) CompositeExtract 40(i) 0 2
115: 7(fvec3) Load 69(OutColor)
116: 7(fvec3) CompositeConstruct 114 114 114
117: 7(fvec3) FAdd 115 116
Store 69(OutColor) 117
118: 6(float) CompositeExtract 40(i) 0 2
119: 7(fvec3) Load 69(OutColor)
120: 7(fvec3) CompositeConstruct 118 118 118
121: 7(fvec3) FAdd 119 120
Store 69(OutColor) 121
Return
FunctionEnd
46(GetColor9(struct-S-vf31;i1;): 2 Function None 15
44(i): 8(S) FunctionParameter
45(comp): 14(ptr) FunctionParameter
47: Label
118: 7(fvec3) CompositeExtract 44(i) 0
119: 7(fvec3) Load 69(OutColor)
120: 7(fvec3) VectorShuffle 119 119 2 0 1
121: 7(fvec3) FAdd 120 118
122: 7(fvec3) Load 69(OutColor)
123: 7(fvec3) VectorShuffle 122 121 4 5 3
Store 69(OutColor) 123
122: 7(fvec3) CompositeExtract 44(i) 0
123: 7(fvec3) Load 69(OutColor)
124: 7(fvec3) VectorShuffle 123 123 2 0 1
125: 7(fvec3) FAdd 124 122
126: 7(fvec3) Load 69(OutColor)
127: 7(fvec3) VectorShuffle 126 125 4 5 3
Store 69(OutColor) 127
Return
FunctionEnd
50(GetColor10(struct-S-vf31;i1;): 2 Function None 15
48(i): 8(S) FunctionParameter
49(comp): 14(ptr) FunctionParameter
51: Label
124: 7(fvec3) CompositeExtract 48(i) 0
125: 99(fvec2) VectorShuffle 124 124 0 1
126: 7(fvec3) Load 69(OutColor)
127: 99(fvec2) VectorShuffle 126 126 2 1
128: 99(fvec2) FAdd 127 125
129: 7(fvec3) Load 69(OutColor)
130: 7(fvec3) VectorShuffle 129 128 0 4 3
Store 69(OutColor) 130
128: 7(fvec3) CompositeExtract 48(i) 0
129: 99(fvec2) VectorShuffle 128 128 0 1
130: 7(fvec3) Load 69(OutColor)
131: 99(fvec2) VectorShuffle 130 130 2 1
132: 99(fvec2) FAdd 131 129
133: 111(ptr) AccessChain 69(OutColor) 117
134: 6(float) CompositeExtract 132 0
Store 133 134
135: 111(ptr) AccessChain 69(OutColor) 114
136: 6(float) CompositeExtract 132 1
Store 135 136
Return
FunctionEnd
54(GetColor11(struct-S-vf31;i1;): 2 Function None 15
52(i): 8(S) FunctionParameter
53(comp): 14(ptr) FunctionParameter
55: Label
131: 7(fvec3) CompositeExtract 52(i) 0
132: 99(fvec2) VectorShuffle 131 131 0 1
133: 7(fvec3) Load 69(OutColor)
134: 99(fvec2) VectorShuffle 133 133 0 2
135: 99(fvec2) FAdd 134 132
136: 7(fvec3) Load 69(OutColor)
137: 7(fvec3) VectorShuffle 136 135 3 1 4
Store 69(OutColor) 137
137: 7(fvec3) CompositeExtract 52(i) 0
138: 99(fvec2) VectorShuffle 137 137 0 1
139: 7(fvec3) Load 69(OutColor)
140: 99(fvec2) VectorShuffle 139 139 0 2
141: 99(fvec2) FAdd 140 138
142: 111(ptr) AccessChain 69(OutColor) 72
143: 6(float) CompositeExtract 141 0
Store 142 143
144: 111(ptr) AccessChain 69(OutColor) 117
145: 6(float) CompositeExtract 141 1
Store 144 145
Return
FunctionEnd
58(GetColor12(struct-S-vf31;i1;): 2 Function None 15
56(i): 8(S) FunctionParameter
57(comp): 14(ptr) FunctionParameter
59: Label
138: 13(int) Load 57(comp)
139: 6(float) CompositeExtract 56(i) 0 0
141: 140(ptr) AccessChain 69(OutColor) 138
142: 6(float) Load 141
143: 6(float) FAdd 142 139
144: 140(ptr) AccessChain 69(OutColor) 138
Store 144 143
146: 13(int) Load 57(comp)
147: 6(float) CompositeExtract 56(i) 0 0
148: 111(ptr) AccessChain 69(OutColor) 146
149: 6(float) Load 148
150: 6(float) FAdd 149 147
151: 111(ptr) AccessChain 69(OutColor) 146
Store 151 150
Return
FunctionEnd
62(GetColor13(struct-S-vf31;i1;): 2 Function None 15
60(i): 8(S) FunctionParameter
61(comp): 14(ptr) FunctionParameter
63: Label
145: 13(int) Load 61(comp)
146: 6(float) CompositeExtract 60(i) 0 0
150: 71(int) VectorExtractDynamic 149 145
151: 140(ptr) AccessChain 69(OutColor) 150
152: 6(float) Load 151
153: 6(float) FAdd 152 146
154: 71(int) VectorExtractDynamic 149 145
155: 140(ptr) AccessChain 69(OutColor) 154
Store 155 153
152: 13(int) Load 61(comp)
153: 6(float) CompositeExtract 60(i) 0 0
156: 71(int) VectorExtractDynamic 155 152
157: 111(ptr) AccessChain 69(OutColor) 156
158: 6(float) Load 157
159: 6(float) FAdd 158 153
160: 71(int) VectorExtractDynamic 155 152
161: 111(ptr) AccessChain 69(OutColor) 160
Store 161 159
Return
FunctionEnd
66(GetColor14(struct-S-vf31;i1;): 2 Function None 15
64(i): 8(S) FunctionParameter
65(comp): 14(ptr) FunctionParameter
67: Label
156: 13(int) Load 65(comp)
157: 6(float) CompositeExtract 64(i) 0 0
160: 71(int) VectorExtractDynamic 159 156
161: 140(ptr) AccessChain 69(OutColor) 160
Store 161 157
162: 13(int) Load 65(comp)
163: 6(float) CompositeExtract 64(i) 0 0
166: 71(int) VectorExtractDynamic 165 162
167: 111(ptr) AccessChain 69(OutColor) 166
Store 167 163
Return
FunctionEnd