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 coverage-gap found by the GraphicsFuzz project.
20 # Short description: A fragment shader that covers specific NIR code paths
22 # The test passes because the shader always writes red.
24 SHADER vertex variant_vertex_shader PASSTHROUGH
26 # variant_fragment_shader is derived from the following GLSL:
29 # #define _int_10 _GLF_uniform_int_values[0]
30 # #define _int_28 _GLF_uniform_int_values[1]
31 # #define _int_0 _GLF_uniform_int_values[2]
32 # #define _int_1 _GLF_uniform_int_values[3]
33 # #define _int_2 _GLF_uniform_int_values[4]
35 # precision highp float;
36 # precision highp int;
38 # // Contents of _GLF_uniform_int_values: [10, 28, 0, 1, 2]
39 # layout(set = 0, binding = 0) uniform buf0
41 # int _GLF_uniform_int_values[5];
43 # layout(location = 0) out vec4 _GLF_color;
49 # _GLF_color = vec4(_int_0);
51 # for(int i = _int_0; i < _int_10; i++)
58 # for(int i = _int_0; i < _int_10; i++)
63 # for(int i = _int_0; i < _int_10; i++)
65 # a += int[2](_int_1, _int_2)[b];
70 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
73 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
76 ; Generator: Khronos Glslang Reference Front End; 10
80 %1 = OpExtInstImport "GLSL.std.450"
81 OpMemoryModel Logical GLSL450
82 OpEntryPoint Fragment %4 "main" %27
83 OpExecutionMode %4 OriginUpperLeft
88 OpMemberName %12 0 "_GLF_uniform_int_values"
91 OpName %27 "_GLF_color"
95 OpName %96 "indexable"
96 OpDecorate %11 ArrayStride 16
97 OpMemberDecorate %12 0 Offset 0
99 OpDecorate %14 DescriptorSet 0
100 OpDecorate %14 Binding 0
101 OpDecorate %27 Location 0
103 %3 = OpTypeFunction %2
105 %7 = OpTypePointer Function %6
107 %10 = OpConstant %9 5
108 %11 = OpTypeArray %6 %10
109 %12 = OpTypeStruct %11
110 %13 = OpTypePointer Uniform %12
111 %14 = OpVariable %13 Uniform
112 %15 = OpConstant %6 0
113 %16 = OpConstant %6 2
114 %17 = OpTypePointer Uniform %6
115 %21 = OpConstant %6 3
117 %25 = OpTypeVector %24 4
118 %26 = OpTypePointer Output %25
119 %27 = OpVariable %26 Output
121 %52 = OpConstant %6 1
122 %54 = OpConstantFalse %43
123 %88 = OpConstant %6 4
124 %91 = OpConstant %9 2
125 %92 = OpTypeArray %6 %91
126 %95 = OpTypePointer Function %92
127 %4 = OpFunction %2 None %3
129 %8 = OpVariable %7 Function
130 %20 = OpVariable %7 Function
131 %32 = OpVariable %7 Function
132 %57 = OpVariable %7 Function
133 %74 = OpVariable %7 Function
134 %96 = OpVariable %95 Function
135 %18 = OpAccessChain %17 %14 %15 %16
138 %22 = OpAccessChain %17 %14 %15 %21
141 %28 = OpAccessChain %17 %14 %15 %16
143 %30 = OpConvertSToF %24 %29
144 %31 = OpCompositeConstruct %25 %30 %30 %30 %30
146 %33 = OpAccessChain %17 %14 %15 %16
151 OpLoopMerge %37 %38 None
155 %41 = OpAccessChain %17 %14 %15 %15
157 %44 = OpSLessThan %43 %40 %42
158 OpBranchConditional %44 %36 %37
161 %46 = OpAccessChain %17 %14 %15 %21
163 %48 = OpSGreaterThan %43 %45 %47
164 OpSelectionMerge %50 None
165 OpBranchConditional %48 %49 %50
168 %53 = OpIAdd %6 %51 %52
170 OpSelectionMerge %56 None
171 OpBranchConditional %54 %55 %56
173 %58 = OpAccessChain %17 %14 %15 %16
178 OpLoopMerge %62 %63 None
182 %66 = OpAccessChain %17 %14 %15 %15
184 %68 = OpSLessThan %43 %65 %67
185 OpBranchConditional %68 %61 %62
198 %73 = OpIAdd %6 %72 %52
202 %75 = OpAccessChain %17 %14 %15 %16
207 OpLoopMerge %79 %80 None
211 %83 = OpAccessChain %17 %14 %15 %15
213 %85 = OpSLessThan %43 %82 %84
214 OpBranchConditional %85 %78 %79
216 %86 = OpAccessChain %17 %14 %15 %21
218 %89 = OpAccessChain %17 %14 %15 %88
220 %93 = OpCompositeConstruct %92 %87 %90
223 %97 = OpAccessChain %7 %96 %94
226 %100 = OpIAdd %6 %99 %98
231 %102 = OpIAdd %6 %101 %52
236 %104 = OpAccessChain %17 %14 %15 %52
237 %105 = OpLoad %6 %104
238 %106 = OpIEqual %43 %103 %105
239 OpSelectionMerge %108 None
240 OpBranchConditional %106 %107 %108
242 %109 = OpAccessChain %17 %14 %15 %21
243 %110 = OpLoad %6 %109
244 %111 = OpConvertSToF %24 %110
245 %112 = OpAccessChain %17 %14 %15 %16
246 %113 = OpLoad %6 %112
247 %114 = OpConvertSToF %24 %113
248 %115 = OpAccessChain %17 %14 %15 %16
249 %116 = OpLoad %6 %115
250 %117 = OpConvertSToF %24 %116
251 %118 = OpAccessChain %17 %14 %15 %21
252 %119 = OpLoad %6 %118
253 %120 = OpConvertSToF %24 %119
254 %121 = OpCompositeConstruct %25 %111 %114 %117 %120
262 # uniforms for variant
265 BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
268 # _GLF_uniform_int_values
269 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
273 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
275 PIPELINE graphics variant_pipeline
276 ATTACH variant_vertex_shader
277 ATTACH variant_fragment_shader
278 FRAMEBUFFER_SIZE 256 256
279 BIND BUFFER variant_framebuffer AS color LOCATION 0
280 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1
281 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
283 CLEAR_COLOR variant_pipeline 0 0 0 255
285 CLEAR variant_pipeline
286 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
289 SHADER vertex variant__vertex_shader PASSTHROUGH
291 # variant__fragment_shader is derived from the following GLSL:
294 # precision highp float;
295 # precision highp int;
297 # layout(location = 0) out vec4 _GLF_color;
303 # _GLF_color = vec4(0);
305 # for(int i = 0; i < 10; i++)
312 # for(int i = 0; i < 10; i++)
317 # for(int i = 0; i < 10; i++)
318 # a += int[2](1, 2)[b];
321 # _GLF_color = vec4(1, 0, 0, 1);
323 SHADER fragment variant__fragment_shader SPIRV-ASM TARGET_ENV spv1.0
326 ; Generator: Khronos Glslang Reference Front End; 10
330 %1 = OpExtInstImport "GLSL.std.450"
331 OpMemoryModel Logical GLSL450
332 OpEntryPoint Fragment %4 "main" %15
333 OpExecutionMode %4 OriginUpperLeft
338 OpName %15 "_GLF_color"
342 OpName %65 "indexable"
343 OpDecorate %15 Location 0
345 %3 = OpTypeFunction %2
347 %7 = OpTypePointer Function %6
349 %11 = OpConstant %6 1
351 %13 = OpTypeVector %12 4
352 %14 = OpTypePointer Output %13
353 %15 = OpVariable %14 Output
354 %16 = OpConstant %12 0
355 %17 = OpConstantComposite %13 %16 %16 %16 %16
356 %25 = OpConstant %6 10
358 %34 = OpConstantFalse %26
360 %59 = OpConstant %58 2
361 %60 = OpTypeArray %6 %59
362 %61 = OpConstant %6 2
363 %62 = OpConstantComposite %60 %11 %61
364 %64 = OpTypePointer Function %60
365 %73 = OpConstant %6 28
366 %77 = OpConstant %12 1
367 %78 = OpConstantComposite %13 %77 %16 %16 %77
368 %4 = OpFunction %2 None %3
370 %8 = OpVariable %7 Function
371 %10 = OpVariable %7 Function
372 %18 = OpVariable %7 Function
373 %37 = OpVariable %7 Function
374 %50 = OpVariable %7 Function
375 %65 = OpVariable %64 Function
382 OpLoopMerge %21 %22 None
386 %27 = OpSLessThan %26 %24 %25
387 OpBranchConditional %27 %20 %21
390 %29 = OpSGreaterThan %26 %28 %11
391 OpSelectionMerge %31 None
392 OpBranchConditional %29 %30 %31
395 %33 = OpIAdd %6 %32 %11
397 OpSelectionMerge %36 None
398 OpBranchConditional %34 %35 %36
403 OpLoopMerge %40 %41 None
407 %44 = OpSLessThan %26 %43 %25
408 OpBranchConditional %44 %39 %40
421 %49 = OpIAdd %6 %48 %11
428 OpLoopMerge %53 %54 None
432 %57 = OpSLessThan %26 %56 %25
433 OpBranchConditional %57 %52 %53
437 %66 = OpAccessChain %7 %65 %63
440 %69 = OpIAdd %6 %68 %67
445 %71 = OpIAdd %6 %70 %11
450 %74 = OpIEqual %26 %72 %73
451 OpSelectionMerge %76 None
452 OpBranchConditional %74 %75 %76
461 # uniforms for variant_
464 BUFFER variant__injectionSwitch DATA_TYPE vec2<float> STD140 DATA
468 BUFFER variant__framebuffer FORMAT B8G8R8A8_UNORM
470 PIPELINE graphics variant__pipeline
471 ATTACH variant__vertex_shader
472 ATTACH variant__fragment_shader
473 FRAMEBUFFER_SIZE 256 256
474 BIND BUFFER variant__framebuffer AS color LOCATION 0
475 BIND BUFFER variant__injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
477 CLEAR_COLOR variant__pipeline 0 0 0 255
479 CLEAR variant__pipeline
480 RUN variant__pipeline DRAW_RECT POS 0 0 SIZE 256 256
482 EXPECT variant_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant__framebuffer TOLERANCE 0.005
483 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255