3 # Copyright 2020 Google LLC
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # A test for a bug found by the GraphicsFuzz project.
20 # Short description: Three shaders diff: mutate var, vector shuffle
22 # The test renders three images using semantically equivalent shaders, and then
23 # checks that the images are similar.
24 # The test passes because the shaders have the same semantics and so the images
27 SHADER vertex reference_vertex_shader PASSTHROUGH
29 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
32 ; Generator: Khronos Glslang Reference Front End; 7
36 %1 = OpExtInstImport "GLSL.std.450"
37 OpMemoryModel Logical GLSL450
38 OpEntryPoint Fragment %4 "main" %12 %74
39 OpExecutionMode %4 OriginUpperLeft
42 OpName %12 "gl_FragCoord"
44 OpMemberName %15 0 "resolution"
46 OpName %74 "_GLF_color"
47 OpName %100 "indexable"
48 OpDecorate %12 BuiltIn FragCoord
49 OpMemberDecorate %15 0 Offset 0
51 OpDecorate %17 DescriptorSet 0
52 OpDecorate %17 Binding 0
53 OpDecorate %74 Location 0
55 %3 = OpTypeFunction %2
57 %7 = OpTypeVector %6 2
58 %10 = OpTypeVector %6 4
59 %11 = OpTypePointer Input %10
60 %12 = OpVariable %11 Input
62 %16 = OpTypePointer Uniform %15
63 %17 = OpVariable %16 Uniform
65 %19 = OpConstant %18 0
66 %20 = OpTypePointer Uniform %7
68 %32 = OpConstant %6 10
69 %47 = OpConstant %18 10
70 %51 = OpConstant %18 100
72 %62 = OpConstant %18 4
73 %65 = OpConstant %18 1000
74 %71 = OpConstant %18 1
75 %73 = OpTypePointer Output %10
76 %74 = OpVariable %73 Output
77 %75 = OpConstant %27 16
78 %76 = OpTypeArray %10 %75
81 %79 = OpConstantComposite %10 %77 %77 %77 %78
82 %80 = OpConstant %6 0.5
83 %81 = OpConstantComposite %10 %80 %77 %77 %78
84 %82 = OpConstantComposite %10 %77 %80 %77 %78
85 %83 = OpConstantComposite %10 %80 %80 %77 %78
86 %84 = OpConstantComposite %10 %77 %77 %80 %78
87 %85 = OpConstantComposite %10 %80 %77 %80 %78
88 %86 = OpConstantComposite %10 %77 %80 %80 %78
89 %87 = OpConstantComposite %10 %80 %80 %80 %78
90 %88 = OpConstantComposite %10 %78 %77 %77 %78
91 %89 = OpConstantComposite %10 %77 %78 %77 %78
92 %90 = OpConstantComposite %10 %78 %78 %77 %78
93 %91 = OpConstantComposite %10 %77 %77 %78 %78
94 %92 = OpConstantComposite %10 %78 %77 %78 %78
95 %93 = OpConstantComposite %10 %77 %78 %78 %78
96 %94 = OpConstantComposite %10 %78 %78 %78 %78
97 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
98 %97 = OpConstant %18 16
99 %99 = OpTypePointer Function %76
100 %101 = OpTypePointer Function %10
101 %4 = OpFunction %2 None %3
103 %100 = OpVariable %99 Function
105 %14 = OpVectorShuffle %7 %13 %13 0 1
106 %21 = OpAccessChain %20 %17 %19
108 %23 = OpFDiv %7 %14 %22
109 %31 = OpCompositeExtract %6 %23 0
110 %33 = OpFMul %6 %31 %32
111 %34 = OpConvertFToS %18 %33
112 %37 = OpCompositeExtract %6 %23 1
113 %38 = OpFMul %6 %37 %32
114 %39 = OpConvertFToS %18 %38
115 %48 = OpIMul %18 %39 %47
116 %49 = OpIAdd %18 %34 %48
119 %106 = OpPhi %18 %51 %5 %69 %54
120 %104 = OpPhi %18 %19 %5 %72 %54
121 %61 = OpSLessThan %60 %104 %49
122 OpLoopMerge %55 %54 None
123 OpBranchConditional %61 %54 %55
125 %64 = OpIMul %18 %62 %106
126 %67 = OpISub %18 %65 %106
127 %68 = OpIMul %18 %64 %67
128 %69 = OpSDiv %18 %68 %65
129 %72 = OpIAdd %18 %104 %71
132 %98 = OpSMod %18 %106 %97
134 %102 = OpAccessChain %101 %100 %98
135 %103 = OpLoad %10 %102
141 # uniforms for reference
144 BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
148 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
150 PIPELINE graphics reference_pipeline
151 ATTACH reference_vertex_shader
152 ATTACH reference_fragment_shader
153 FRAMEBUFFER_SIZE 256 256
154 BIND BUFFER reference_framebuffer AS color LOCATION 0
155 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
157 CLEAR_COLOR reference_pipeline 0 0 0 255
159 CLEAR reference_pipeline
160 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
163 SHADER vertex variant_vertex_shader PASSTHROUGH
165 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
168 ; Generator: Khronos Glslang Reference Front End; 7
172 %1 = OpExtInstImport "GLSL.std.450"
173 OpMemoryModel Logical GLSL450
174 OpEntryPoint Fragment %4 "main" %12 %74
175 OpExecutionMode %4 OriginUpperLeft
178 OpName %12 "gl_FragCoord"
180 OpMemberName %15 0 "resolution"
182 OpName %74 "_GLF_color"
183 OpName %100 "indexable"
184 OpDecorate %12 BuiltIn FragCoord
185 OpMemberDecorate %15 0 Offset 0
187 OpDecorate %17 DescriptorSet 0
188 OpDecorate %17 Binding 0
189 OpDecorate %74 Location 0
191 %3 = OpTypeFunction %2
193 %7 = OpTypeVector %6 2
194 %10 = OpTypeVector %6 4
195 %11 = OpTypePointer Input %10
196 %12 = OpVariable %11 Input
197 %15 = OpTypeStruct %7
198 %16 = OpTypePointer Uniform %15
199 %17 = OpVariable %16 Uniform
201 %19 = OpConstant %18 0
202 %20 = OpTypePointer Uniform %7
204 %32 = OpConstant %6 10
205 %47 = OpConstant %18 10
206 %51 = OpConstant %18 100
208 %62 = OpConstant %18 4
209 %65 = OpConstant %18 1000
210 %71 = OpConstant %18 1
211 %73 = OpTypePointer Output %10
212 %74 = OpVariable %73 Output
213 %75 = OpConstant %27 16
214 %76 = OpTypeArray %10 %75
215 %77 = OpConstant %6 0
216 %78 = OpConstant %6 1
217 %79 = OpConstantComposite %10 %77 %77 %77 %78
218 %80 = OpConstant %6 0.5
219 %81 = OpConstantComposite %10 %80 %77 %77 %78
220 %82 = OpConstantComposite %10 %77 %80 %77 %78
221 %83 = OpConstantComposite %10 %80 %80 %77 %78
222 %84 = OpConstantComposite %10 %77 %77 %80 %78
223 %85 = OpConstantComposite %10 %80 %77 %80 %78
224 %86 = OpConstantComposite %10 %77 %80 %80 %78
225 %87 = OpConstantComposite %10 %80 %80 %80 %78
226 %88 = OpConstantComposite %10 %78 %77 %77 %78
227 %89 = OpConstantComposite %10 %77 %78 %77 %78
228 %90 = OpConstantComposite %10 %78 %78 %77 %78
229 %91 = OpConstantComposite %10 %77 %77 %78 %78
230 %92 = OpConstantComposite %10 %78 %77 %78 %78
231 %93 = OpConstantComposite %10 %77 %78 %78 %78
232 %94 = OpConstantComposite %10 %78 %78 %78 %78
233 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
234 %97 = OpConstant %18 16
235 %99 = OpTypePointer Function %76
236 %101 = OpTypePointer Function %10
237 %234 = OpConstant %6 0
238 %235 = OpConstantComposite %10 %234 %234 %234 %234
239 %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235
240 %4 = OpFunction %2 None %3
242 %100 = OpVariable %99 Function
244 %14 = OpVectorShuffle %7 %13 %13 0 1
245 %21 = OpAccessChain %20 %17 %19
247 %23 = OpFDiv %7 %14 %22
248 %31 = OpCompositeExtract %6 %23 0
249 %33 = OpFMul %6 %31 %32
250 %34 = OpConvertFToS %18 %33
251 %37 = OpCompositeExtract %6 %23 1
252 %38 = OpFMul %6 %37 %32
253 %39 = OpConvertFToS %18 %38
254 %48 = OpIMul %18 %39 %47
255 %49 = OpIAdd %18 %34 %48
258 %106 = OpPhi %18 %51 %5 %69 %54
259 %104 = OpPhi %18 %19 %5 %72 %54
260 %61 = OpSLessThan %60 %104 %49
261 OpLoopMerge %55 %54 None
262 OpBranchConditional %61 %54 %55
264 %64 = OpIMul %18 %62 %106
265 %67 = OpISub %18 %65 %106
266 %68 = OpIMul %18 %64 %67
267 %69 = OpSDiv %18 %68 %65
268 %72 = OpIAdd %18 %104 %71
271 %98 = OpSMod %18 %106 %97
273 %262 = OpLoad %76 %100
276 %231 = OpVectorShuffle %7 %89 %85 1 4
277 %102 = OpAccessChain %101 %100 %98
278 %103 = OpLoad %10 %102
284 # uniforms for variant
287 BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
291 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
293 PIPELINE graphics variant_pipeline
294 ATTACH variant_vertex_shader
295 ATTACH variant_fragment_shader
296 FRAMEBUFFER_SIZE 256 256
297 BIND BUFFER variant_framebuffer AS color LOCATION 0
298 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
300 CLEAR_COLOR variant_pipeline 0 0 0 255
302 CLEAR variant_pipeline
303 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
306 SHADER vertex variant_2_vertex_shader PASSTHROUGH
308 SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
311 ; Generator: Khronos Glslang Reference Front End; 7
315 %1 = OpExtInstImport "GLSL.std.450"
316 OpMemoryModel Logical GLSL450
317 OpEntryPoint Fragment %4 "main" %12 %74
318 OpExecutionMode %4 OriginUpperLeft
321 OpName %12 "gl_FragCoord"
323 OpMemberName %15 0 "resolution"
325 OpName %74 "_GLF_color"
326 OpName %100 "indexable"
327 OpDecorate %12 BuiltIn FragCoord
328 OpMemberDecorate %15 0 Offset 0
330 OpDecorate %17 DescriptorSet 0
331 OpDecorate %17 Binding 0
332 OpDecorate %74 Location 0
334 %3 = OpTypeFunction %2
336 %7 = OpTypeVector %6 2
337 %10 = OpTypeVector %6 4
338 %11 = OpTypePointer Input %10
339 %12 = OpVariable %11 Input
340 %15 = OpTypeStruct %7
341 %16 = OpTypePointer Uniform %15
342 %17 = OpVariable %16 Uniform
344 %19 = OpConstant %18 0
345 %20 = OpTypePointer Uniform %7
347 %32 = OpConstant %6 10
348 %47 = OpConstant %18 10
349 %51 = OpConstant %18 100
351 %62 = OpConstant %18 4
352 %65 = OpConstant %18 1000
353 %71 = OpConstant %18 1
354 %73 = OpTypePointer Output %10
355 %74 = OpVariable %73 Output
356 %75 = OpConstant %27 16
357 %76 = OpTypeArray %10 %75
358 %77 = OpConstant %6 0
359 %78 = OpConstant %6 1
360 %79 = OpConstantComposite %10 %77 %77 %77 %78
361 %80 = OpConstant %6 0.5
362 %81 = OpConstantComposite %10 %80 %77 %77 %78
363 %82 = OpConstantComposite %10 %77 %80 %77 %78
364 %83 = OpConstantComposite %10 %80 %80 %77 %78
365 %84 = OpConstantComposite %10 %77 %77 %80 %78
366 %85 = OpConstantComposite %10 %80 %77 %80 %78
367 %86 = OpConstantComposite %10 %77 %80 %80 %78
368 %87 = OpConstantComposite %10 %80 %80 %80 %78
369 %88 = OpConstantComposite %10 %78 %77 %77 %78
370 %89 = OpConstantComposite %10 %77 %78 %77 %78
371 %90 = OpConstantComposite %10 %78 %78 %77 %78
372 %91 = OpConstantComposite %10 %77 %77 %78 %78
373 %92 = OpConstantComposite %10 %78 %77 %78 %78
374 %93 = OpConstantComposite %10 %77 %78 %78 %78
375 %94 = OpConstantComposite %10 %78 %78 %78 %78
376 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
377 %97 = OpConstant %18 16
378 %99 = OpTypePointer Function %76
379 %101 = OpTypePointer Function %10
380 %234 = OpConstant %6 0
381 %235 = OpConstantComposite %10 %234 %234 %234 %234
382 %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235
383 %4 = OpFunction %2 None %3
385 %100 = OpVariable %99 Function
387 %14 = OpVectorShuffle %7 %13 %13 0 1
388 %21 = OpAccessChain %20 %17 %19
390 %23 = OpFDiv %7 %14 %22
391 %31 = OpCompositeExtract %6 %23 0
392 %33 = OpFMul %6 %31 %32
393 %34 = OpConvertFToS %18 %33
394 %37 = OpCompositeExtract %6 %23 1
395 %38 = OpFMul %6 %37 %32
396 %39 = OpConvertFToS %18 %38
397 %48 = OpIMul %18 %39 %47
398 %49 = OpIAdd %18 %34 %48
401 %106 = OpPhi %18 %51 %5 %69 %54
402 %104 = OpPhi %18 %19 %5 %72 %54
403 %61 = OpSLessThan %60 %104 %49
404 OpLoopMerge %55 %54 None
405 OpBranchConditional %61 %54 %55
407 %64 = OpIMul %18 %62 %106
408 %67 = OpISub %18 %65 %106
409 %68 = OpIMul %18 %64 %67
410 %69 = OpSDiv %18 %68 %65
411 %72 = OpIAdd %18 %104 %71
414 %98 = OpSMod %18 %106 %97
416 %231 = OpVectorShuffle %7 %89 %85 1 4
417 %102 = OpAccessChain %101 %100 %98
418 %103 = OpLoad %10 %102
424 # uniforms for variant_2
427 BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA
431 BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
433 PIPELINE graphics variant_2_pipeline
434 ATTACH variant_2_vertex_shader
435 ATTACH variant_2_fragment_shader
436 FRAMEBUFFER_SIZE 256 256
437 BIND BUFFER variant_2_framebuffer AS color LOCATION 0
438 BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
440 CLEAR_COLOR variant_2_pipeline 0 0 0 255
442 CLEAR variant_2_pipeline
443 RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
445 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
446 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005