3 # Copyright 2021 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:
29 # #define _int_1 _GLF_uniform_int_values[0]
30 # #define _int_0 _GLF_uniform_int_values[1]
31 # #define _int_2 _GLF_uniform_int_values[2]
32 # #define _float_1_0 _GLF_uniform_float_values[0]
34 # precision highp int;
35 # precision highp float;
37 # // Contents of _GLF_uniform_float_values: 1.0
38 # layout(set = 0, binding = 0) uniform buf0
40 # float _GLF_uniform_float_values[1];
42 # // Contents of _GLF_uniform_int_values: [1, 0, 2]
43 # layout(set = 0, binding = 1) uniform buf1
45 # int _GLF_uniform_int_values[3];
47 # // Contents of one: 1
48 # layout(set = 0, binding = 2) uniform buf2
52 # layout(location = 0) out vec4 _GLF_color;
56 # vec4 v = vec4(_int_0);
65 # while(findMSB(_int_1) > _int_1);
67 # // Returns (0, 1, 0, 0)
73 # vec4 v = vec4(_int_0);
78 # // v becomes (0, 1, 0, 0).
81 # // v becomes (0, 2, 0, 0).
85 # if(v == vec4(_int_0, _int_2, _int_0, _int_0))
87 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
91 # _GLF_color = vec4(_int_0);
94 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
97 ; Generator: Khronos Glslang Reference Front End; 10
101 %1 = OpExtInstImport "GLSL.std.450"
102 OpMemoryModel Logical GLSL450
103 OpEntryPoint Fragment %4 "main" %100
104 OpExecutionMode %4 OriginUpperLeft
110 OpMemberName %17 0 "_GLF_uniform_int_values"
114 OpMemberName %38 0 "_GLF_uniform_float_values"
118 OpMemberName %63 0 "one"
120 OpName %100 "_GLF_color"
121 OpDecorate %16 ArrayStride 16
122 OpMemberDecorate %17 0 Offset 0
124 OpDecorate %19 DescriptorSet 0
125 OpDecorate %19 Binding 1
126 OpDecorate %37 ArrayStride 16
127 OpMemberDecorate %38 0 Offset 0
129 OpDecorate %40 DescriptorSet 0
130 OpDecorate %40 Binding 0
131 OpMemberDecorate %63 0 Offset 0
133 OpDecorate %65 DescriptorSet 0
134 OpDecorate %65 Binding 2
135 OpDecorate %100 Location 0
137 %3 = OpTypeFunction %2
139 %7 = OpTypeVector %6 4
140 %8 = OpTypeFunction %7
141 %11 = OpTypePointer Function %7
144 %15 = OpConstant %14 3
145 %16 = OpTypeArray %13 %15
146 %17 = OpTypeStruct %16
147 %18 = OpTypePointer Uniform %17
148 %19 = OpVariable %18 Uniform
149 %20 = OpConstant %13 0
150 %21 = OpConstant %13 1
151 %22 = OpTypePointer Uniform %13
152 %27 = OpTypePointer Function %13
153 %36 = OpConstant %14 1
154 %37 = OpTypeArray %6 %36
155 %38 = OpTypeStruct %37
156 %39 = OpTypePointer Uniform %38
157 %40 = OpVariable %39 Uniform
158 %41 = OpTypePointer Uniform %6
159 %44 = OpTypePointer Function %6
161 %63 = OpTypeStruct %13
162 %64 = OpTypePointer Uniform %63
163 %65 = OpVariable %64 Uniform
164 %83 = OpConstant %13 2
165 %94 = OpTypeVector %53 4
166 %99 = OpTypePointer Output %7
167 %100 = OpVariable %99 Output
168 %4 = OpFunction %2 None %3
170 %58 = OpVariable %11 Function
171 %59 = OpAccessChain %22 %19 %20 %21
173 %61 = OpConvertSToF %6 %60
174 %62 = OpCompositeConstruct %7 %61 %61 %61 %61
176 %66 = OpAccessChain %22 %65 %20
178 %68 = OpAccessChain %22 %19 %20 %21
180 %70 = OpSGreaterThan %53 %67 %69
181 OpSelectionMerge %72 None
182 OpBranchConditional %70 %71 %72
185 %74 = OpFunctionCall %7 %9
186 %75 = OpFAdd %7 %73 %74
191 %77 = OpFunctionCall %7 %9
192 %78 = OpFAdd %7 %76 %77
195 %80 = OpAccessChain %22 %19 %20 %21
197 %82 = OpConvertSToF %6 %81
198 %84 = OpAccessChain %22 %19 %20 %83
200 %86 = OpConvertSToF %6 %85
201 %87 = OpAccessChain %22 %19 %20 %21
203 %89 = OpConvertSToF %6 %88
204 %90 = OpAccessChain %22 %19 %20 %21
206 %92 = OpConvertSToF %6 %91
207 %93 = OpCompositeConstruct %7 %82 %86 %89 %92
208 %95 = OpFOrdEqual %94 %79 %93
210 OpSelectionMerge %98 None
211 OpBranchConditional %96 %97 %114
213 %101 = OpAccessChain %22 %19 %20 %20
214 %102 = OpLoad %13 %101
215 %103 = OpConvertSToF %6 %102
216 %104 = OpAccessChain %22 %19 %20 %21
217 %105 = OpLoad %13 %104
218 %106 = OpConvertSToF %6 %105
219 %107 = OpAccessChain %22 %19 %20 %21
220 %108 = OpLoad %13 %107
221 %109 = OpConvertSToF %6 %108
222 %110 = OpAccessChain %22 %19 %20 %20
223 %111 = OpLoad %13 %110
224 %112 = OpConvertSToF %6 %111
225 %113 = OpCompositeConstruct %7 %103 %106 %109 %112
229 %115 = OpAccessChain %22 %19 %20 %21
230 %116 = OpLoad %13 %115
231 %117 = OpConvertSToF %6 %116
232 %118 = OpCompositeConstruct %7 %117 %117 %117 %117
238 %9 = OpFunction %7 None %8
240 %12 = OpVariable %11 Function
241 %28 = OpVariable %27 Function
242 %23 = OpAccessChain %22 %19 %20 %21
244 %25 = OpConvertSToF %6 %24
245 %26 = OpCompositeConstruct %7 %25 %25 %25 %25
247 %29 = OpAccessChain %22 %19 %20 %20
252 OpLoopMerge %33 %34 None
256 %42 = OpAccessChain %41 %40 %20 %20
258 %45 = OpAccessChain %44 %12 %35
261 %47 = OpIAdd %13 %46 %21
265 %48 = OpAccessChain %22 %19 %20 %20
267 %50 = OpExtInst %13 %1 FindSMsb %49
268 %51 = OpAccessChain %22 %19 %20 %20
270 %54 = OpSGreaterThan %53 %50 %52
271 OpBranchConditional %54 %31 %33
278 # uniforms for variant
281 BUFFER variant_one DATA_TYPE int32 STD140 DATA
284 # _GLF_uniform_int_values
285 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
288 # _GLF_uniform_float_values
289 BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
293 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
295 PIPELINE graphics variant_pipeline
296 ATTACH variant_vertex_shader
297 ATTACH variant_fragment_shader
298 FRAMEBUFFER_SIZE 256 256
299 BIND BUFFER variant_framebuffer AS color LOCATION 0
300 BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 2
301 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
302 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
304 CLEAR_COLOR variant_pipeline 0 0 0 255
306 CLEAR variant_pipeline
307 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
309 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255