• 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 more complex branching
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: 197
31; Schema: 0
32               OpCapability Shader
33          %1 = OpExtInstImport "GLSL.std.450"
34               OpMemoryModel Logical GLSL450
35               OpEntryPoint Fragment %4 "main" %16 %139
36               OpExecutionMode %4 OriginUpperLeft
37               OpSource ESSL 320
38               OpName %4 "main"
39               OpName %16 "gl_FragCoord"
40               OpName %23 "buf1"
41               OpMemberName %23 0 "resolution"
42               OpName %25 ""
43               OpName %61 "data"
44               OpName %66 "buf0"
45               OpMemberName %66 0 "injectionSwitch"
46               OpName %68 ""
47               OpName %139 "_GLF_color"
48               OpDecorate %16 BuiltIn FragCoord
49               OpMemberDecorate %23 0 Offset 0
50               OpDecorate %23 Block
51               OpDecorate %25 DescriptorSet 0
52               OpDecorate %25 Binding 1
53               OpMemberDecorate %66 0 Offset 0
54               OpDecorate %66 Block
55               OpDecorate %68 DescriptorSet 0
56               OpDecorate %68 Binding 0
57               OpDecorate %139 Location 0
58          %2 = OpTypeVoid
59          %3 = OpTypeFunction %2
60          %6 = OpTypeFloat 32
61          %7 = OpTypePointer Function %6
62          %8 = OpTypeBool
63         %14 = OpTypeVector %6 4
64         %15 = OpTypePointer Input %14
65         %16 = OpVariable %15 Input
66         %17 = OpTypeInt 32 0
67         %18 = OpConstant %17 1
68         %19 = OpTypePointer Input %6
69         %22 = OpTypeVector %6 2
70         %23 = OpTypeStruct %22
71         %24 = OpTypePointer Uniform %23
72         %25 = OpVariable %24 Uniform
73         %26 = OpTypeInt 32 1
74         %27 = OpConstant %26 0
75         %28 = OpTypePointer Uniform %6
76         %56 = OpConstant %26 10
77         %58 = OpConstant %17 10
78         %59 = OpTypeArray %6 %58
79         %60 = OpTypePointer Function %59
80         %66 = OpTypeStruct %22
81         %67 = OpTypePointer Uniform %66
82         %68 = OpVariable %67 Uniform
83         %74 = OpConstant %26 1
84         %83 = OpConstant %26 9
85        %129 = OpConstant %17 0
86        %138 = OpTypePointer Output %14
87        %139 = OpVariable %138 Output
88        %144 = OpConstant %26 5
89        %151 = OpConstant %6 1
90        %195 = OpConstant %6 0.5
91        %196 = OpConstant %6 0.100000001
92          %4 = OpFunction %2 None %3
93          %5 = OpLabel
94         %61 = OpVariable %60 Function
95               OpBranch %50
96         %50 = OpLabel
97        %183 = OpPhi %26 %27 %5 %75 %51
98         %57 = OpSLessThan %8 %183 %56
99               OpLoopMerge %52 %51 None
100               OpBranchConditional %57 %51 %52
101         %51 = OpLabel
102         %64 = OpISub %26 %56 %183
103         %65 = OpConvertSToF %6 %64
104         %69 = OpAccessChain %28 %68 %27 %18
105         %70 = OpLoad %6 %69
106         %71 = OpFMul %6 %65 %70
107         %72 = OpAccessChain %7 %61 %183
108               OpStore %72 %71
109         %75 = OpIAdd %26 %183 %74
110               OpBranch %50
111         %52 = OpLabel
112               OpBranch %77
113         %77 = OpLabel
114        %184 = OpPhi %26 %27 %52 %128 %80
115         %84 = OpSLessThan %8 %184 %83
116               OpLoopMerge %79 %80 None
117               OpBranchConditional %84 %78 %79
118         %78 = OpLabel
119               OpBranch %86
120         %86 = OpLabel
121        %185 = OpPhi %26 %27 %78 %126 %89
122         %92 = OpSLessThan %8 %185 %56
123               OpLoopMerge %88 %89 None
124               OpBranchConditional %92 %87 %88
125         %87 = OpLabel
126         %95 = OpIAdd %26 %184 %74
127         %96 = OpSLessThan %8 %185 %95
128               OpSelectionMerge %98 None
129               OpBranchConditional %96 %97 %98
130         %97 = OpLabel
131               OpBranch %89
132         %98 = OpLabel
133        %104 = OpAccessChain %7 %61 %184
134        %105 = OpLoad %6 %104
135        %107 = OpAccessChain %7 %61 %185
136        %108 = OpLoad %6 %107
137        %167 = OpAccessChain %19 %16 %18
138        %168 = OpLoad %6 %167
139        %169 = OpAccessChain %28 %25 %27 %18
140        %170 = OpLoad %6 %169
141        %171 = OpFMul %6 %170 %195
142        %172 = OpFOrdLessThan %8 %168 %171
143               OpSelectionMerge %181 None
144               OpBranchConditional %172 %173 %177
145        %173 = OpLabel
146        %176 = OpFOrdGreaterThan %8 %105 %108
147               OpBranch %181
148        %177 = OpLabel
149        %180 = OpFOrdLessThan %8 %105 %108
150               OpBranch %181
151        %181 = OpLabel
152        %187 = OpPhi %8 %176 %173 %180 %177
153               OpSelectionMerge %112 None
154               OpBranchConditional %187 %111 %112
155        %111 = OpLabel
156        %116 = OpLoad %6 %104
157        %120 = OpLoad %6 %107
158               OpStore %104 %120
159               OpStore %107 %116
160               OpBranch %112
161        %112 = OpLabel
162               OpBranch %89
163         %89 = OpLabel
164        %126 = OpIAdd %26 %185 %74
165               OpBranch %86
166         %88 = OpLabel
167               OpBranch %80
168         %80 = OpLabel
169        %128 = OpIAdd %26 %184 %74
170               OpBranch %77
171         %79 = OpLabel
172        %130 = OpAccessChain %19 %16 %129
173        %131 = OpLoad %6 %130
174        %132 = OpAccessChain %28 %25 %27 %129
175        %133 = OpLoad %6 %132
176        %134 = OpFMul %6 %133 %195
177        %135 = OpFOrdLessThan %8 %131 %134
178               OpSelectionMerge %137 None
179               OpBranchConditional %135 %136 %153
180        %136 = OpLabel
181        %140 = OpAccessChain %7 %61 %27
182        %141 = OpLoad %6 %140
183        %143 = OpFMul %6 %141 %196
184        %145 = OpAccessChain %7 %61 %144
185        %146 = OpLoad %6 %145
186        %147 = OpFMul %6 %146 %196
187        %148 = OpAccessChain %7 %61 %83
188        %149 = OpLoad %6 %148
189        %150 = OpFMul %6 %149 %196
190        %152 = OpCompositeConstruct %14 %143 %147 %150 %151
191               OpStore %139 %152
192               OpBranch %137
193        %153 = OpLabel
194        %154 = OpAccessChain %7 %61 %144
195        %155 = OpLoad %6 %154
196        %156 = OpFMul %6 %155 %196
197        %157 = OpAccessChain %7 %61 %83
198        %158 = OpLoad %6 %157
199        %159 = OpFMul %6 %158 %196
200        %160 = OpAccessChain %7 %61 %27
201        %161 = OpLoad %6 %160
202        %162 = OpFMul %6 %161 %196
203        %163 = OpCompositeConstruct %14 %156 %159 %162 %151
204               OpStore %139 %163
205               OpBranch %137
206        %137 = OpLabel
207               OpReturn
208               OpFunctionEnd
209END
210
211# uniforms for reference
212
213# injectionSwitch
214BUFFER reference_injectionSwitch DATA_TYPE vec2<float> DATA
215 0.0 1.0
216END
217# resolution
218BUFFER reference_resolution DATA_TYPE vec2<float> DATA
219 256.0 256.0
220END
221
222BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
223
224PIPELINE graphics reference_pipeline
225  ATTACH reference_vertex_shader
226  ATTACH reference_fragment_shader
227  FRAMEBUFFER_SIZE 256 256
228  BIND BUFFER reference_framebuffer AS color LOCATION 0
229  BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
230  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
231END
232CLEAR_COLOR reference_pipeline 0 0 0 255
233
234CLEAR reference_pipeline
235RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
236
237
238SHADER vertex variant_vertex_shader PASSTHROUGH
239
240SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
241; SPIR-V
242; Version: 1.0
243; Generator: Khronos Glslang Reference Front End; 7
244; Bound: 304
245; Schema: 0
246               OpCapability Shader
247          %1 = OpExtInstImport "GLSL.std.450"
248               OpMemoryModel Logical GLSL450
249               OpEntryPoint Fragment %4 "main" %16 %139
250               OpExecutionMode %4 OriginUpperLeft
251               OpSource ESSL 320
252               OpName %4 "main"
253               OpName %16 "gl_FragCoord"
254               OpName %23 "buf1"
255               OpMemberName %23 0 "resolution"
256               OpName %25 ""
257               OpName %61 "data"
258               OpName %66 "buf0"
259               OpMemberName %66 0 "injectionSwitch"
260               OpName %68 ""
261               OpName %139 "_GLF_color"
262               OpDecorate %16 BuiltIn FragCoord
263               OpMemberDecorate %23 0 Offset 0
264               OpDecorate %23 Block
265               OpDecorate %25 DescriptorSet 0
266               OpDecorate %25 Binding 1
267               OpMemberDecorate %66 0 Offset 0
268               OpDecorate %66 Block
269               OpDecorate %68 DescriptorSet 0
270               OpDecorate %68 Binding 0
271               OpDecorate %139 Location 0
272          %2 = OpTypeVoid
273          %3 = OpTypeFunction %2
274          %6 = OpTypeFloat 32
275          %7 = OpTypePointer Function %6
276          %8 = OpTypeBool
277         %14 = OpTypeVector %6 4
278         %15 = OpTypePointer Input %14
279         %16 = OpVariable %15 Input
280         %17 = OpTypeInt 32 0
281         %18 = OpConstant %17 1
282         %19 = OpTypePointer Input %6
283         %22 = OpTypeVector %6 2
284         %23 = OpTypeStruct %22
285         %24 = OpTypePointer Uniform %23
286         %25 = OpVariable %24 Uniform
287         %26 = OpTypeInt 32 1
288         %27 = OpConstant %26 0
289         %28 = OpTypePointer Uniform %6
290         %56 = OpConstant %26 10
291         %58 = OpConstant %17 10
292         %59 = OpTypeArray %6 %58
293         %60 = OpTypePointer Function %59
294         %66 = OpTypeStruct %22
295         %67 = OpTypePointer Uniform %66
296         %68 = OpVariable %67 Uniform
297         %74 = OpConstant %26 1
298         %83 = OpConstant %26 9
299        %129 = OpConstant %17 0
300        %138 = OpTypePointer Output %14
301        %139 = OpVariable %138 Output
302        %144 = OpConstant %26 5
303        %151 = OpConstant %6 1
304        %195 = OpConstant %6 0.5
305        %196 = OpConstant %6 0.100000001
306        %303 = OpConstantTrue %8
307          %4 = OpFunction %2 None %3
308          %5 = OpLabel
309         %61 = OpVariable %60 Function
310               OpBranch %50
311         %50 = OpLabel
312        %183 = OpPhi %26 %27 %5 %75 %51
313         %57 = OpSLessThan %8 %183 %56
314               OpLoopMerge %52 %51 None
315               OpBranchConditional %57 %51 %52
316         %51 = OpLabel
317         %64 = OpISub %26 %56 %183
318         %65 = OpConvertSToF %6 %64
319         %69 = OpAccessChain %28 %68 %27 %18
320         %70 = OpLoad %6 %69
321         %71 = OpFMul %6 %65 %70
322         %72 = OpAccessChain %7 %61 %183
323               OpStore %72 %71
324         %75 = OpIAdd %26 %183 %74
325               OpBranch %50
326         %52 = OpLabel
327               OpBranch %77
328         %77 = OpLabel
329        %184 = OpPhi %26 %27 %52 %128 %80
330         %84 = OpSLessThan %8 %184 %83
331               OpLoopMerge %79 %80 None
332               OpBranchConditional %84 %78 %79
333         %78 = OpLabel
334               OpBranch %86
335         %86 = OpLabel
336        %185 = OpPhi %26 %27 %78 %126 %89
337         %92 = OpSLessThan %8 %185 %56
338               OpLoopMerge %88 %89 None
339               OpBranchConditional %92 %87 %88
340         %87 = OpLabel
341         %95 = OpIAdd %26 %184 %74
342         %96 = OpSLessThan %8 %185 %95
343               OpSelectionMerge %98 None
344               OpBranchConditional %96 %97 %98
345         %97 = OpLabel
346               OpBranch %89
347         %98 = OpLabel
348        %104 = OpAccessChain %7 %61 %184
349        %105 = OpLoad %6 %104
350        %107 = OpAccessChain %7 %61 %185
351        %108 = OpLoad %6 %107
352        %167 = OpAccessChain %19 %16 %18
353        %168 = OpLoad %6 %167
354        %169 = OpAccessChain %28 %25 %27 %18
355        %170 = OpLoad %6 %169
356        %171 = OpFMul %6 %170 %195
357        %172 = OpFOrdLessThan %8 %168 %171
358               OpSelectionMerge %181 None
359               OpBranchConditional %172 %173 %177
360        %173 = OpLabel
361        %176 = OpFOrdGreaterThan %8 %105 %108
362               OpBranch %181
363        %177 = OpLabel
364        %180 = OpFOrdLessThan %8 %105 %108
365               OpBranch %181
366        %181 = OpLabel
367        %187 = OpPhi %8 %176 %173 %180 %177
368               OpSelectionMerge %112 None
369               OpBranchConditional %187 %111 %112
370        %111 = OpLabel
371        %116 = OpLoad %6 %104
372        %120 = OpLoad %6 %107
373               OpStore %104 %120
374               OpStore %107 %116
375               OpBranch %112
376        %112 = OpLabel
377               OpBranch %89
378         %89 = OpLabel
379        %126 = OpIAdd %26 %185 %74
380               OpBranch %86
381         %88 = OpLabel
382               OpBranch %80
383         %80 = OpLabel
384        %128 = OpIAdd %26 %184 %74
385               OpBranch %77
386         %79 = OpLabel
387        %130 = OpAccessChain %19 %16 %129
388        %131 = OpLoad %6 %130
389        %132 = OpAccessChain %28 %25 %27 %129
390        %133 = OpLoad %6 %132
391        %134 = OpFMul %6 %133 %195
392        %135 = OpFOrdLessThan %8 %131 %134
393               OpSelectionMerge %137 None
394               OpBranchConditional %135 %136 %153
395        %136 = OpLabel
396        %140 = OpAccessChain %7 %61 %27
397        %141 = OpLoad %6 %140
398        %143 = OpFMul %6 %141 %196
399        %145 = OpAccessChain %7 %61 %144
400        %146 = OpLoad %6 %145
401        %147 = OpFMul %6 %146 %196
402        %148 = OpAccessChain %7 %61 %83
403        %149 = OpLoad %6 %148
404        %150 = OpFMul %6 %149 %196
405        %152 = OpCompositeConstruct %14 %143 %147 %150 %151
406               OpStore %139 %152
407               OpBranch %137
408        %153 = OpLabel
409        %154 = OpAccessChain %7 %61 %144
410        %155 = OpLoad %6 %154
411        %156 = OpFMul %6 %155 %196
412        %157 = OpAccessChain %7 %61 %83
413        %158 = OpLoad %6 %157
414        %159 = OpFMul %6 %158 %196
415        %160 = OpAccessChain %7 %61 %27
416        %161 = OpLoad %6 %160
417        %162 = OpFMul %6 %161 %196
418        %163 = OpCompositeConstruct %14 %156 %159 %162 %151
419               OpStore %139 %163
420               OpBranchConditional %303 %137 %137
421        %137 = OpLabel
422               OpReturn
423               OpFunctionEnd
424END
425
426# uniforms for variant
427
428# injectionSwitch
429BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
430 0.0 1.0
431END
432# resolution
433BUFFER variant_resolution DATA_TYPE vec2<float> DATA
434 256.0 256.0
435END
436
437BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
438
439PIPELINE graphics variant_pipeline
440  ATTACH variant_vertex_shader
441  ATTACH variant_fragment_shader
442  FRAMEBUFFER_SIZE 256 256
443  BIND BUFFER variant_framebuffer AS color LOCATION 0
444  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
445  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 1
446END
447CLEAR_COLOR variant_pipeline 0 0 0 255
448
449CLEAR variant_pipeline
450RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
451
452EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
453