3 # Copyright 2022 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 LLVM 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:
28 # #define _int_1 _GLF_uniform_int_values[0]
29 # #define _int_0 _GLF_uniform_int_values[1]
30 # #define _float_0_0 _GLF_uniform_float_values[0]
32 # precision highp float;
33 # precision highp int;
35 # // Contents of _GLF_uniform_float_values: 0.0
36 # layout(set = 0, binding = 0) uniform buf0
38 # float _GLF_uniform_float_values[1];
41 # // Contents of _GLF_uniform_int_values: [1, 0]
42 # layout(set = 0, binding = 1) uniform buf1
44 # int _GLF_uniform_int_values[2];
47 # const int _GLF_global_loop_bound = 10;
48 # int _GLF_global_loop_count = 0;
50 # layout(location = 0) out vec4 _GLF_color;
56 # _GLF_global_loop_count++;
59 # if(determinant(mat4(_int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, 1, 1, _int_0, 0, 0)) == _float_0_0)
61 # return vec4(_int_1, _int_0, _int_0, _int_1);
64 # while(_GLF_global_loop_count < _GLF_global_loop_bound);
67 # return vec4(_int_0);
72 # _GLF_color = func();
74 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
77 ; Generator: Khronos Glslang Reference Front End; 10
81 %1 = OpExtInstImport "GLSL.std.450"
82 OpMemoryModel Logical GLSL450
83 OpEntryPoint Fragment %4 "main" %110
84 OpExecutionMode %4 OriginUpperLeft
88 OpName %13 "_GLF_global_loop_count"
90 OpMemberName %25 0 "_GLF_uniform_int_values"
93 OpMemberName %76 0 "_GLF_uniform_float_values"
95 OpName %110 "_GLF_color"
96 OpDecorate %24 ArrayStride 16
97 OpMemberDecorate %25 0 Offset 0
99 OpDecorate %27 DescriptorSet 0
100 OpDecorate %27 Binding 1
101 OpDecorate %75 ArrayStride 16
102 OpMemberDecorate %76 0 Offset 0
104 OpDecorate %78 DescriptorSet 0
105 OpDecorate %78 Binding 0
106 OpDecorate %110 Location 0
108 %3 = OpTypeFunction %2
110 %7 = OpTypeVector %6 4
111 %8 = OpTypeFunction %7
113 %12 = OpTypePointer Private %11
114 %13 = OpVariable %12 Private
115 %14 = OpConstant %11 0
116 %20 = OpConstant %11 1
118 %23 = OpConstant %22 2
119 %24 = OpTypeArray %11 %23
120 %25 = OpTypeStruct %24
121 %26 = OpTypePointer Uniform %25
122 %27 = OpVariable %26 Uniform
123 %28 = OpTypePointer Uniform %11
124 %62 = OpConstant %6 1
125 %66 = OpConstant %6 0
126 %67 = OpTypeMatrix %7 4
127 %74 = OpConstant %22 1
128 %75 = OpTypeArray %6 %74
129 %76 = OpTypeStruct %75
130 %77 = OpTypePointer Uniform %76
131 %78 = OpVariable %77 Uniform
132 %79 = OpTypePointer Uniform %6
134 %101 = OpConstant %11 10
135 %109 = OpTypePointer Output %7
136 %110 = OpVariable %109 Output
137 %4 = OpFunction %2 None %3
140 %111 = OpFunctionCall %7 %9
144 %9 = OpFunction %7 None %8
148 OpLoopMerge %17 %18 None
152 %21 = OpIAdd %11 %19 %20
154 %29 = OpAccessChain %28 %27 %14 %14
156 %31 = OpConvertSToF %6 %30
157 %32 = OpAccessChain %28 %27 %14 %14
159 %34 = OpConvertSToF %6 %33
160 %35 = OpAccessChain %28 %27 %14 %14
162 %37 = OpConvertSToF %6 %36
163 %38 = OpAccessChain %28 %27 %14 %14
165 %40 = OpConvertSToF %6 %39
166 %41 = OpAccessChain %28 %27 %14 %14
168 %43 = OpConvertSToF %6 %42
169 %44 = OpAccessChain %28 %27 %14 %14
171 %46 = OpConvertSToF %6 %45
172 %47 = OpAccessChain %28 %27 %14 %14
174 %49 = OpConvertSToF %6 %48
175 %50 = OpAccessChain %28 %27 %14 %14
177 %52 = OpConvertSToF %6 %51
178 %53 = OpAccessChain %28 %27 %14 %14
180 %55 = OpConvertSToF %6 %54
181 %56 = OpAccessChain %28 %27 %14 %14
183 %58 = OpConvertSToF %6 %57
184 %59 = OpAccessChain %28 %27 %14 %14
186 %61 = OpConvertSToF %6 %60
187 %63 = OpAccessChain %28 %27 %14 %20
189 %65 = OpConvertSToF %6 %64
190 %68 = OpCompositeConstruct %7 %31 %34 %37 %40
191 %69 = OpCompositeConstruct %7 %43 %46 %49 %52
192 %70 = OpCompositeConstruct %7 %55 %58 %61 %62
193 %71 = OpCompositeConstruct %7 %62 %65 %66 %66
194 %72 = OpCompositeConstruct %67 %68 %69 %70 %71
195 %73 = OpExtInst %6 %1 Determinant %72
196 %80 = OpAccessChain %79 %78 %14 %14
198 %83 = OpFOrdEqual %82 %73 %81
199 OpSelectionMerge %85 None
200 OpBranchConditional %83 %84 %85
202 %86 = OpAccessChain %28 %27 %14 %14
204 %88 = OpConvertSToF %6 %87
205 %89 = OpAccessChain %28 %27 %14 %20
207 %91 = OpConvertSToF %6 %90
208 %92 = OpAccessChain %28 %27 %14 %20
210 %94 = OpConvertSToF %6 %93
211 %95 = OpAccessChain %28 %27 %14 %14
213 %97 = OpConvertSToF %6 %96
214 %98 = OpCompositeConstruct %7 %88 %91 %94 %97
219 %100 = OpLoad %11 %13
220 %102 = OpSLessThan %82 %100 %101
221 OpBranchConditional %102 %15 %17
223 %103 = OpAccessChain %28 %27 %14 %20
224 %104 = OpLoad %11 %103
225 %105 = OpConvertSToF %6 %104
226 %106 = OpCompositeConstruct %7 %105 %105 %105 %105
231 # uniforms for variant
233 # _GLF_uniform_int_values
234 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
237 # _GLF_uniform_float_values
238 BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
242 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
244 PIPELINE graphics variant_pipeline
245 ATTACH variant_vertex_shader
246 ATTACH variant_fragment_shader
247 FRAMEBUFFER_SIZE 32 32
248 BIND BUFFER variant_framebuffer AS color LOCATION 0
249 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
250 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
252 CLEAR_COLOR variant_pipeline 0 0 0 255
254 CLEAR variant_pipeline
255 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
257 EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255