• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2020 Google LLC
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17
18# A test for a bug found by the GraphicsFuzz project.
19
20# Short description: Equivalent shaders, one with id used by OpPhi hidden in composite
21
22# The test passes because both shaders render the same image.
23
24SHADER vertex reference_vertex_shader PASSTHROUGH
25
26SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
27; SPIR-V
28; Version: 1.0
29; Generator: Khronos Glslang Reference Front End; 7
30; Bound: 290
31; Schema: 0
32               OpCapability Shader
33          %1 = OpExtInstImport "GLSL.std.450"
34               OpMemoryModel Logical GLSL450
35               OpEntryPoint Fragment %4 "main" %85 %137
36               OpExecutionMode %4 OriginUpperLeft
37               OpSource ESSL 320
38               OpName %4 "main"
39               OpName %66 "c"
40               OpName %73 "buf0"
41               OpMemberName %73 0 "resolution"
42               OpName %75 ""
43               OpName %85 "gl_FragCoord"
44               OpName %137 "_GLF_color"
45               OpMemberDecorate %73 0 Offset 0
46               OpDecorate %73 Block
47               OpDecorate %75 DescriptorSet 0
48               OpDecorate %75 Binding 0
49               OpDecorate %85 BuiltIn FragCoord
50               OpDecorate %137 Location 0
51          %2 = OpTypeVoid
52          %3 = OpTypeFunction %2
53          %6 = OpTypeFloat 32
54          %7 = OpTypePointer Function %6
55         %14 = OpConstant %6 -0.5
56         %15 = OpTypeInt 32 1
57         %18 = OpConstant %15 1
58         %25 = OpConstant %15 800
59         %26 = OpTypeBool
60         %29 = OpConstant %15 32
61         %31 = OpConstant %15 0
62         %35 = OpConstant %6 0.400000006
63         %44 = OpConstant %6 0.00999999978
64         %48 = OpConstant %6 100
65         %64 = OpTypeVector %6 3
66         %65 = OpTypePointer Function %64
67         %67 = OpConstant %6 7
68         %68 = OpConstant %6 8
69         %69 = OpConstant %6 9
70         %70 = OpConstantComposite %64 %67 %68 %69
71         %72 = OpTypeVector %6 2
72         %73 = OpTypeStruct %72
73         %74 = OpTypePointer Uniform %73
74         %75 = OpVariable %74 Uniform
75         %76 = OpTypeInt 32 0
76         %77 = OpConstant %76 0
77         %78 = OpTypePointer Uniform %6
78         %83 = OpTypeVector %6 4
79         %84 = OpTypePointer Input %83
80         %85 = OpVariable %84 Input
81         %87 = OpTypePointer Input %6
82         %95 = OpConstant %76 1
83        %107 = OpConstant %76 2
84        %116 = OpConstant %15 3
85        %121 = OpConstant %6 1
86        %136 = OpTypePointer Output %83
87        %137 = OpVariable %136 Output
88        %149 = OpConstantFalse %26
89        %152 = OpConstantTrue %26
90        %261 = OpUndef %6
91        %289 = OpConstant %6 0.125
92          %4 = OpFunction %2 None %3
93          %5 = OpLabel
94         %66 = OpVariable %65 Function
95               OpStore %66 %70
96         %79 = OpAccessChain %78 %75 %31 %77
97         %80 = OpLoad %6 %79
98         %81 = OpFMul %6 %80 %289
99         %82 = OpExtInst %6 %1 Round %81
100         %88 = OpAccessChain %87 %85 %77
101         %89 = OpLoad %6 %88
102               OpSelectionMerge %199 None
103               OpSwitch %77 %161
104        %161 = OpLabel
105               OpBranch %162
106        %162 = OpLabel
107        %248 = OpPhi %6 %14 %161 %251 %192
108        %247 = OpPhi %15 %18 %161 %194 %192
109        %165 = OpSLessThan %26 %247 %25
110               OpLoopMerge %195 %192 None
111               OpBranchConditional %165 %166 %195
112        %166 = OpLabel
113        %168 = OpSMod %15 %247 %29
114        %169 = OpIEqual %26 %168 %31
115               OpSelectionMerge %184 None
116               OpBranchConditional %169 %170 %173
117        %170 = OpLabel
118        %172 = OpFAdd %6 %248 %35
119               OpBranch %184
120        %173 = OpLabel
121        %175 = OpConvertSToF %6 %247
122        %177 = OpExtInst %6 %1 Round %82
123        %178 = OpFMod %6 %175 %177
124        %179 = OpFOrdLessThanEqual %26 %178 %44
125               OpSelectionMerge %183 None
126               OpBranchConditional %179 %180 %183
127        %180 = OpLabel
128        %182 = OpFAdd %6 %248 %48
129               OpBranch %183
130        %183 = OpLabel
131        %252 = OpPhi %6 %248 %173 %182 %180
132               OpBranch %184
133        %184 = OpLabel
134        %251 = OpPhi %6 %172 %170 %252 %183
135        %186 = OpConvertSToF %6 %247
136        %188 = OpFOrdGreaterThanEqual %26 %186 %89
137               OpSelectionMerge %191 None
138               OpBranchConditional %188 %189 %191
139        %189 = OpLabel
140               OpBranch %195
141        %191 = OpLabel
142               OpBranch %192
143        %192 = OpLabel
144        %194 = OpIAdd %15 %247 %18
145               OpBranch %162
146        %195 = OpLabel
147        %259 = OpPhi %6 %261 %162 %251 %189
148        %257 = OpPhi %6 %248 %162 %251 %189
149        %253 = OpPhi %26 %149 %162 %152 %189
150               OpSelectionMerge %197 None
151               OpBranchConditional %253 %199 %197
152        %197 = OpLabel
153               OpBranch %199
154        %199 = OpLabel
155        %258 = OpPhi %6 %259 %195 %257 %197
156         %93 = OpAccessChain %7 %66 %77
157               OpStore %93 %258
158         %96 = OpAccessChain %87 %85 %95
159         %97 = OpLoad %6 %96
160               OpSelectionMerge %245 None
161               OpSwitch %77 %207
162        %207 = OpLabel
163               OpBranch %208
164        %208 = OpLabel
165        %265 = OpPhi %6 %14 %207 %268 %238
166        %264 = OpPhi %15 %18 %207 %240 %238
167        %211 = OpSLessThan %26 %264 %25
168               OpLoopMerge %241 %238 None
169               OpBranchConditional %211 %212 %241
170        %212 = OpLabel
171        %214 = OpSMod %15 %264 %29
172        %215 = OpIEqual %26 %214 %31
173               OpSelectionMerge %230 None
174               OpBranchConditional %215 %216 %219
175        %216 = OpLabel
176        %218 = OpFAdd %6 %265 %35
177               OpBranch %230
178        %219 = OpLabel
179        %221 = OpConvertSToF %6 %264
180        %223 = OpExtInst %6 %1 Round %82
181        %224 = OpFMod %6 %221 %223
182        %225 = OpFOrdLessThanEqual %26 %224 %44
183               OpSelectionMerge %229 None
184               OpBranchConditional %225 %226 %229
185        %226 = OpLabel
186        %228 = OpFAdd %6 %265 %48
187               OpBranch %229
188        %229 = OpLabel
189        %269 = OpPhi %6 %265 %219 %228 %226
190               OpBranch %230
191        %230 = OpLabel
192        %268 = OpPhi %6 %218 %216 %269 %229
193        %232 = OpConvertSToF %6 %264
194        %234 = OpFOrdGreaterThanEqual %26 %232 %97
195               OpSelectionMerge %237 None
196               OpBranchConditional %234 %235 %237
197        %235 = OpLabel
198               OpBranch %241
199        %237 = OpLabel
200               OpBranch %238
201        %238 = OpLabel
202        %240 = OpIAdd %15 %264 %18
203               OpBranch %208
204        %241 = OpLabel
205        %276 = OpPhi %6 %261 %208 %268 %235
206        %274 = OpPhi %6 %265 %208 %268 %235
207        %270 = OpPhi %26 %149 %208 %152 %235
208               OpSelectionMerge %243 None
209               OpBranchConditional %270 %245 %243
210        %243 = OpLabel
211               OpBranch %245
212        %245 = OpLabel
213        %275 = OpPhi %6 %276 %241 %274 %243
214        %101 = OpAccessChain %7 %66 %95
215               OpStore %101 %275
216        %103 = OpLoad %6 %93
217        %105 = OpLoad %6 %101
218        %106 = OpFAdd %6 %103 %105
219        %108 = OpAccessChain %7 %66 %107
220               OpStore %108 %106
221               OpBranch %110
222        %110 = OpLabel
223        %285 = OpPhi %15 %31 %245 %135 %113
224        %117 = OpSLessThan %26 %285 %116
225               OpLoopMerge %112 %113 None
226               OpBranchConditional %117 %111 %112
227        %111 = OpLabel
228        %119 = OpAccessChain %7 %66 %285
229        %120 = OpLoad %6 %119
230        %122 = OpFOrdGreaterThanEqual %26 %120 %121
231               OpSelectionMerge %124 None
232               OpBranchConditional %122 %123 %124
233        %123 = OpLabel
234        %128 = OpLoad %6 %119
235        %131 = OpLoad %6 %119
236        %132 = OpFMul %6 %128 %131
237               OpStore %119 %132
238               OpBranch %124
239        %124 = OpLabel
240               OpBranch %113
241        %113 = OpLabel
242        %135 = OpIAdd %15 %285 %18
243               OpBranch %110
244        %112 = OpLabel
245        %138 = OpLoad %64 %66
246        %139 = OpExtInst %64 %1 FAbs %138
247        %140 = OpExtInst %64 %1 Normalize %139
248        %141 = OpCompositeExtract %6 %140 0
249        %142 = OpCompositeExtract %6 %140 1
250        %143 = OpCompositeExtract %6 %140 2
251        %144 = OpCompositeConstruct %83 %141 %142 %143 %121
252               OpStore %137 %144
253               OpReturn
254               OpFunctionEnd
255END
256
257# uniforms for reference
258
259# resolution
260BUFFER reference_resolution DATA_TYPE vec2<float> DATA
261 256.0 256.0
262END
263
264BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
265
266PIPELINE graphics reference_pipeline
267  ATTACH reference_vertex_shader
268  ATTACH reference_fragment_shader
269  FRAMEBUFFER_SIZE 256 256
270  BIND BUFFER reference_framebuffer AS color LOCATION 0
271  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
272END
273CLEAR_COLOR reference_pipeline 0 0 0 255
274
275CLEAR reference_pipeline
276RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
277
278
279SHADER vertex variant_vertex_shader PASSTHROUGH
280
281SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
282; SPIR-V
283; Version: 1.0
284; Generator: Khronos Glslang Reference Front End; 7
285; Bound: 505
286; Schema: 0
287               OpCapability Shader
288          %1 = OpExtInstImport "GLSL.std.450"
289               OpMemoryModel Logical GLSL450
290               OpEntryPoint Fragment %4 "main" %85 %137
291               OpExecutionMode %4 OriginUpperLeft
292               OpSource ESSL 320
293               OpName %4 "main"
294               OpName %66 "c"
295               OpName %73 "buf0"
296               OpMemberName %73 0 "resolution"
297               OpName %75 ""
298               OpName %85 "gl_FragCoord"
299               OpName %137 "_GLF_color"
300               OpMemberDecorate %73 0 Offset 0
301               OpDecorate %73 Block
302               OpDecorate %75 DescriptorSet 0
303               OpDecorate %75 Binding 0
304               OpDecorate %85 BuiltIn FragCoord
305               OpDecorate %137 Location 0
306          %2 = OpTypeVoid
307          %3 = OpTypeFunction %2
308          %6 = OpTypeFloat 32
309          %7 = OpTypePointer Function %6
310         %14 = OpConstant %6 -0.5
311         %15 = OpTypeInt 32 1
312         %18 = OpConstant %15 1
313         %25 = OpConstant %15 800
314         %26 = OpTypeBool
315         %29 = OpConstant %15 32
316         %31 = OpConstant %15 0
317         %35 = OpConstant %6 0.400000006
318         %44 = OpConstant %6 0.00999999978
319         %48 = OpConstant %6 100
320         %64 = OpTypeVector %6 3
321         %65 = OpTypePointer Function %64
322         %67 = OpConstant %6 7
323         %68 = OpConstant %6 8
324         %69 = OpConstant %6 9
325         %70 = OpConstantComposite %64 %67 %68 %69
326         %72 = OpTypeVector %6 2
327         %73 = OpTypeStruct %72
328         %74 = OpTypePointer Uniform %73
329         %75 = OpVariable %74 Uniform
330         %76 = OpTypeInt 32 0
331         %77 = OpConstant %76 0
332         %78 = OpTypePointer Uniform %6
333         %83 = OpTypeVector %6 4
334         %84 = OpTypePointer Input %83
335         %85 = OpVariable %84 Input
336         %87 = OpTypePointer Input %6
337         %95 = OpConstant %76 1
338        %107 = OpConstant %76 2
339        %116 = OpConstant %15 3
340        %121 = OpConstant %6 1
341        %136 = OpTypePointer Output %83
342        %137 = OpVariable %136 Output
343        %149 = OpConstantFalse %26
344        %152 = OpConstantTrue %26
345        %261 = OpUndef %6
346        %289 = OpConstant %6 0.125
347          %4 = OpFunction %2 None %3
348          %5 = OpLabel
349         %66 = OpVariable %65 Function
350               OpStore %66 %70
351         %79 = OpAccessChain %78 %75 %31 %77
352         %80 = OpLoad %6 %79
353        %390 = OpCompositeConstruct %72 %121 %80
354         %81 = OpFMul %6 %80 %289
355         %82 = OpExtInst %6 %1 Round %81
356        %410 = OpCompositeConstruct %72 %261 %14
357         %88 = OpAccessChain %87 %85 %77
358         %89 = OpLoad %6 %88
359               OpSelectionMerge %199 None
360               OpSwitch %77 %161
361        %161 = OpLabel
362               OpBranch %162
363        %162 = OpLabel
364        %248 = OpPhi %6 %14 %161 %251 %192
365        %247 = OpPhi %15 %18 %161 %194 %192
366        %165 = OpSLessThan %26 %247 %25
367               OpLoopMerge %195 %192 None
368               OpBranchConditional %165 %166 %195
369        %166 = OpLabel
370        %168 = OpSMod %15 %247 %29
371        %169 = OpIEqual %26 %168 %31
372               OpSelectionMerge %184 None
373               OpBranchConditional %169 %170 %173
374        %170 = OpLabel
375        %172 = OpFAdd %6 %248 %35
376               OpBranch %184
377        %173 = OpLabel
378        %175 = OpConvertSToF %6 %247
379        %177 = OpExtInst %6 %1 Round %82
380        %178 = OpFMod %6 %175 %177
381        %179 = OpFOrdLessThanEqual %26 %178 %44
382               OpSelectionMerge %183 None
383               OpBranchConditional %179 %180 %183
384        %180 = OpLabel
385        %182 = OpFAdd %6 %248 %48
386               OpBranch %183
387        %183 = OpLabel
388        %252 = OpPhi %6 %248 %173 %182 %180
389               OpBranch %184
390        %184 = OpLabel
391        %251 = OpPhi %6 %172 %170 %252 %183
392        %186 = OpConvertSToF %6 %247
393        %188 = OpFOrdGreaterThanEqual %26 %186 %89
394               OpSelectionMerge %191 None
395               OpBranchConditional %188 %189 %191
396        %189 = OpLabel
397               OpBranch %195
398        %191 = OpLabel
399               OpBranch %192
400        %192 = OpLabel
401        %194 = OpIAdd %15 %247 %18
402               OpBranch %162
403        %195 = OpLabel
404        %259 = OpPhi %6 %261 %162 %251 %189
405        %257 = OpPhi %6 %248 %162 %251 %189
406        %253 = OpPhi %26 %149 %162 %152 %189
407               OpSelectionMerge %197 None
408               OpBranchConditional %253 %199 %197
409        %197 = OpLabel
410               OpBranch %199
411        %199 = OpLabel
412        %258 = OpPhi %6 %259 %195 %257 %197
413         %93 = OpAccessChain %7 %66 %77
414        %415 = OpCompositeConstruct %83 %257 %35 %259 %35
415        %460 = OpCompositeConstruct %64 %390 %14
416               OpStore %93 %258
417         %96 = OpAccessChain %87 %85 %95
418         %97 = OpLoad %6 %96
419               OpSelectionMerge %245 None
420               OpSwitch %77 %207
421        %207 = OpLabel
422        %417 = OpCompositeConstruct %83 %410 %261 %248
423        %504 = OpCompositeExtract %6 %460 2
424               OpBranch %208
425        %208 = OpLabel
426        %265 = OpPhi %6 %504 %207 %268 %238
427        %264 = OpPhi %15 %18 %207 %240 %238
428        %211 = OpSLessThan %26 %264 %25
429               OpLoopMerge %241 %238 None
430               OpBranchConditional %211 %212 %241
431        %212 = OpLabel
432        %214 = OpSMod %15 %264 %29
433        %215 = OpIEqual %26 %214 %31
434               OpSelectionMerge %230 None
435               OpBranchConditional %215 %216 %219
436        %216 = OpLabel
437        %218 = OpFAdd %6 %265 %35
438               OpBranch %230
439        %219 = OpLabel
440        %221 = OpConvertSToF %6 %264
441        %223 = OpExtInst %6 %1 Round %82
442        %224 = OpFMod %6 %221 %223
443        %225 = OpFOrdLessThanEqual %26 %224 %44
444               OpSelectionMerge %229 None
445               OpBranchConditional %225 %226 %229
446        %226 = OpLabel
447        %228 = OpFAdd %6 %265 %48
448               OpBranch %229
449        %229 = OpLabel
450        %269 = OpPhi %6 %265 %219 %228 %226
451               OpBranch %230
452        %230 = OpLabel
453        %268 = OpPhi %6 %218 %216 %269 %229
454        %232 = OpConvertSToF %6 %264
455        %234 = OpFOrdGreaterThanEqual %26 %232 %97
456               OpSelectionMerge %237 None
457               OpBranchConditional %234 %235 %237
458        %235 = OpLabel
459               OpBranch %241
460        %237 = OpLabel
461               OpBranch %238
462        %238 = OpLabel
463        %240 = OpIAdd %15 %264 %18
464               OpBranch %208
465        %241 = OpLabel
466        %276 = OpPhi %6 %261 %208 %268 %235
467        %274 = OpPhi %6 %265 %208 %268 %235
468        %270 = OpPhi %26 %149 %208 %152 %235
469               OpSelectionMerge %243 None
470               OpBranchConditional %270 %245 %243
471        %243 = OpLabel
472               OpBranch %245
473        %245 = OpLabel
474        %275 = OpPhi %6 %276 %241 %274 %243
475        %101 = OpAccessChain %7 %66 %95
476               OpStore %101 %275
477        %103 = OpLoad %6 %93
478        %105 = OpLoad %6 %101
479        %106 = OpFAdd %6 %103 %105
480        %108 = OpAccessChain %7 %66 %107
481               OpStore %108 %106
482               OpBranch %110
483        %110 = OpLabel
484        %285 = OpPhi %15 %31 %245 %135 %113
485        %117 = OpSLessThan %26 %285 %116
486               OpLoopMerge %112 %113 None
487               OpBranchConditional %117 %111 %112
488        %111 = OpLabel
489        %119 = OpAccessChain %7 %66 %285
490        %120 = OpLoad %6 %119
491        %122 = OpFOrdGreaterThanEqual %26 %120 %121
492               OpSelectionMerge %124 None
493               OpBranchConditional %122 %123 %124
494        %123 = OpLabel
495        %128 = OpLoad %6 %119
496        %131 = OpLoad %6 %119
497        %132 = OpFMul %6 %128 %131
498               OpStore %119 %132
499               OpBranch %124
500        %124 = OpLabel
501               OpBranch %113
502        %113 = OpLabel
503        %135 = OpIAdd %15 %285 %18
504               OpBranch %110
505        %112 = OpLabel
506        %138 = OpLoad %64 %66
507        %139 = OpExtInst %64 %1 FAbs %138
508        %140 = OpExtInst %64 %1 Normalize %139
509        %141 = OpCompositeExtract %6 %140 0
510        %142 = OpCompositeExtract %6 %140 1
511        %143 = OpCompositeExtract %6 %140 2
512        %144 = OpCompositeConstruct %83 %141 %142 %143 %121
513               OpStore %137 %144
514               OpReturn
515               OpFunctionEnd
516END
517
518# uniforms for variant
519
520# resolution
521BUFFER variant_resolution DATA_TYPE vec2<float> DATA
522 256.0 256.0
523END
524
525BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
526
527PIPELINE graphics variant_pipeline
528  ATTACH variant_vertex_shader
529  ATTACH variant_fragment_shader
530  FRAMEBUFFER_SIZE 256 256
531  BIND BUFFER variant_framebuffer AS color LOCATION 0
532  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
533END
534CLEAR_COLOR variant_pipeline 0 0 0 255
535
536CLEAR variant_pipeline
537RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
538
539EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
540