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 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_100 _GLF_uniform_int_values[0]
30 # #define _int_0 _GLF_uniform_int_values[1]
31 # #define _int_1 _GLF_uniform_int_values[2]
32 # #define _int_4 _GLF_uniform_int_values[3]
33 # #define _float_1_0 _GLF_uniform_float_values[0]
35 # precision highp int;
36 # precision highp float;
38 # // Contents of _GLF_uniform_float_values: 1.0
39 # layout(set = 0, binding = 0) uniform buf0
41 # float _GLF_uniform_float_values[1];
44 # // Contents of _GLF_uniform_int_values: [100, 0, 1, 4]
45 # layout(set = 0, binding = 1) uniform buf1
47 # int _GLF_uniform_int_values[4];
50 # layout(location = 0) out vec4 _GLF_color;
54 # mat4 m0 = mat4(_int_0);
56 # for(int c = _int_1; c < _int_100; c++)
58 # // m1 has no dependency outside this block.
61 # m1[c % _int_4][_int_1] = _float_1_0;
62 # m0[c % _int_4][_int_1] = _float_1_0;
66 # if(m0 == mat4(_int_0, _int_1, _int_0, _int_0, _int_0, _int_1, _int_0, _int_0, _int_0, _int_1, _int_0, _int_0, _int_0, _int_1, _int_0, _int_0))
68 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
72 # _GLF_color = vec4(_int_0);
75 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
78 ; Generator: Khronos Glslang Reference Front End; 10
82 %1 = OpExtInstImport "GLSL.std.450"
83 OpMemoryModel Logical GLSL450
84 OpEntryPoint Fragment %4 "main" %153
85 OpExecutionMode %4 OriginUpperLeft
90 OpMemberName %15 0 "_GLF_uniform_int_values"
95 OpMemberName %57 0 "_GLF_uniform_float_values"
97 OpName %153 "_GLF_color"
98 OpDecorate %14 ArrayStride 16
99 OpMemberDecorate %15 0 Offset 0
101 OpDecorate %17 DescriptorSet 0
102 OpDecorate %17 Binding 1
103 OpDecorate %56 ArrayStride 16
104 OpMemberDecorate %57 0 Offset 0
106 OpDecorate %59 DescriptorSet 0
107 OpDecorate %59 Binding 0
108 OpDecorate %153 Location 0
110 %3 = OpTypeFunction %2
112 %7 = OpTypeVector %6 4
113 %8 = OpTypeMatrix %7 4
114 %9 = OpTypePointer Function %8
117 %13 = OpConstant %12 4
118 %14 = OpTypeArray %11 %13
119 %15 = OpTypeStruct %14
120 %16 = OpTypePointer Uniform %15
121 %17 = OpVariable %16 Uniform
122 %18 = OpConstant %11 0
123 %19 = OpConstant %11 1
124 %20 = OpTypePointer Uniform %11
125 %24 = OpConstant %6 1
126 %25 = OpConstant %6 0
127 %31 = OpTypePointer Function %11
128 %33 = OpConstant %11 2
130 %49 = OpConstant %11 3
131 %55 = OpConstant %12 1
132 %56 = OpTypeArray %6 %55
133 %57 = OpTypeStruct %56
134 %58 = OpTypePointer Uniform %57
135 %59 = OpVariable %58 Uniform
136 %60 = OpTypePointer Uniform %6
137 %63 = OpTypePointer Function %6
138 %132 = OpTypeVector %44 4
139 %152 = OpTypePointer Output %7
140 %153 = OpVariable %152 Output
141 %4 = OpFunction %2 None %3
143 %10 = OpVariable %9 Function
144 %32 = OpVariable %31 Function
145 %46 = OpVariable %9 Function
146 %21 = OpAccessChain %20 %17 %18 %19
148 %23 = OpConvertSToF %6 %22
149 %26 = OpCompositeConstruct %7 %23 %25 %25 %25
150 %27 = OpCompositeConstruct %7 %25 %23 %25 %25
151 %28 = OpCompositeConstruct %7 %25 %25 %23 %25
152 %29 = OpCompositeConstruct %7 %25 %25 %25 %23
153 %30 = OpCompositeConstruct %8 %26 %27 %28 %29
155 %34 = OpAccessChain %20 %17 %18 %33
160 OpLoopMerge %38 %39 None
164 %42 = OpAccessChain %20 %17 %18 %18
166 %45 = OpSLessThan %44 %41 %43
167 OpBranchConditional %45 %37 %38
172 %50 = OpAccessChain %20 %17 %18 %49
174 %52 = OpSMod %11 %48 %51
175 %53 = OpAccessChain %20 %17 %18 %33
177 %61 = OpAccessChain %60 %59 %18 %18
179 %64 = OpAccessChain %63 %46 %52 %54
182 %66 = OpAccessChain %20 %17 %18 %49
184 %68 = OpSMod %11 %65 %67
185 %69 = OpAccessChain %20 %17 %18 %33
187 %71 = OpAccessChain %60 %59 %18 %18
189 %73 = OpAccessChain %63 %10 %68 %70
194 %75 = OpIAdd %11 %74 %19
199 %77 = OpAccessChain %20 %17 %18 %19
201 %79 = OpConvertSToF %6 %78
202 %80 = OpAccessChain %20 %17 %18 %33
204 %82 = OpConvertSToF %6 %81
205 %83 = OpAccessChain %20 %17 %18 %19
207 %85 = OpConvertSToF %6 %84
208 %86 = OpAccessChain %20 %17 %18 %19
210 %88 = OpConvertSToF %6 %87
211 %89 = OpAccessChain %20 %17 %18 %19
213 %91 = OpConvertSToF %6 %90
214 %92 = OpAccessChain %20 %17 %18 %33
216 %94 = OpConvertSToF %6 %93
217 %95 = OpAccessChain %20 %17 %18 %19
219 %97 = OpConvertSToF %6 %96
220 %98 = OpAccessChain %20 %17 %18 %19
222 %100 = OpConvertSToF %6 %99
223 %101 = OpAccessChain %20 %17 %18 %19
224 %102 = OpLoad %11 %101
225 %103 = OpConvertSToF %6 %102
226 %104 = OpAccessChain %20 %17 %18 %33
227 %105 = OpLoad %11 %104
228 %106 = OpConvertSToF %6 %105
229 %107 = OpAccessChain %20 %17 %18 %19
230 %108 = OpLoad %11 %107
231 %109 = OpConvertSToF %6 %108
232 %110 = OpAccessChain %20 %17 %18 %19
233 %111 = OpLoad %11 %110
234 %112 = OpConvertSToF %6 %111
235 %113 = OpAccessChain %20 %17 %18 %19
236 %114 = OpLoad %11 %113
237 %115 = OpConvertSToF %6 %114
238 %116 = OpAccessChain %20 %17 %18 %33
239 %117 = OpLoad %11 %116
240 %118 = OpConvertSToF %6 %117
241 %119 = OpAccessChain %20 %17 %18 %19
242 %120 = OpLoad %11 %119
243 %121 = OpConvertSToF %6 %120
244 %122 = OpAccessChain %20 %17 %18 %19
245 %123 = OpLoad %11 %122
246 %124 = OpConvertSToF %6 %123
247 %125 = OpCompositeConstruct %7 %79 %82 %85 %88
248 %126 = OpCompositeConstruct %7 %91 %94 %97 %100
249 %127 = OpCompositeConstruct %7 %103 %106 %109 %112
250 %128 = OpCompositeConstruct %7 %115 %118 %121 %124
251 %129 = OpCompositeConstruct %8 %125 %126 %127 %128
252 %130 = OpCompositeExtract %7 %76 0
253 %131 = OpCompositeExtract %7 %129 0
254 %133 = OpFOrdEqual %132 %130 %131
255 %134 = OpAll %44 %133
256 %135 = OpCompositeExtract %7 %76 1
257 %136 = OpCompositeExtract %7 %129 1
258 %137 = OpFOrdEqual %132 %135 %136
259 %138 = OpAll %44 %137
260 %139 = OpLogicalAnd %44 %134 %138
261 %140 = OpCompositeExtract %7 %76 2
262 %141 = OpCompositeExtract %7 %129 2
263 %142 = OpFOrdEqual %132 %140 %141
264 %143 = OpAll %44 %142
265 %144 = OpLogicalAnd %44 %139 %143
266 %145 = OpCompositeExtract %7 %76 3
267 %146 = OpCompositeExtract %7 %129 3
268 %147 = OpFOrdEqual %132 %145 %146
269 %148 = OpAll %44 %147
270 %149 = OpLogicalAnd %44 %144 %148
271 OpSelectionMerge %151 None
272 OpBranchConditional %149 %150 %167
274 %154 = OpAccessChain %20 %17 %18 %33
275 %155 = OpLoad %11 %154
276 %156 = OpConvertSToF %6 %155
277 %157 = OpAccessChain %20 %17 %18 %19
278 %158 = OpLoad %11 %157
279 %159 = OpConvertSToF %6 %158
280 %160 = OpAccessChain %20 %17 %18 %19
281 %161 = OpLoad %11 %160
282 %162 = OpConvertSToF %6 %161
283 %163 = OpAccessChain %20 %17 %18 %33
284 %164 = OpLoad %11 %163
285 %165 = OpConvertSToF %6 %164
286 %166 = OpCompositeConstruct %7 %156 %159 %162 %165
290 %168 = OpAccessChain %20 %17 %18 %19
291 %169 = OpLoad %11 %168
292 %170 = OpConvertSToF %6 %169
293 %171 = OpCompositeConstruct %7 %170 %170 %170 %170
301 # uniforms for variant
303 # _GLF_uniform_int_values
304 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
307 # _GLF_uniform_float_values
308 BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
312 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
314 PIPELINE graphics variant_pipeline
315 ATTACH variant_vertex_shader
316 ATTACH variant_fragment_shader
317 FRAMEBUFFER_SIZE 16 16
318 BIND BUFFER variant_framebuffer AS color LOCATION 0
319 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
320 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
322 CLEAR_COLOR variant_pipeline 0 0 0 255
324 CLEAR variant_pipeline
325 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
327 EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255