• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2021 Google LLC
4#
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
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
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.
16
17
18# A test for a coverage-gap found by the GraphicsFuzz project.
19
20# Short description: A fragment shader that covers specific BRW code paths
21
22# The test passes because the shader always writes red.
23
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 320 es
28#
29# #define _GLF_MAKE_IN_BOUNDS_INT(IDX, SZ)  clamp(IDX, 0, SZ - 1)
30# #define _int_0 _GLF_uniform_int_values[0]
31# #define _int_2 _GLF_uniform_int_values[1]
32# #define _int_1 _GLF_uniform_int_values[2]
33# #define _int_4 _GLF_uniform_int_values[3]
34# #define _float_0_0 _GLF_uniform_float_values[0]
35# #define _float_1_0 _GLF_uniform_float_values[1]
36# #define _float_2_0 _GLF_uniform_float_values[2]
37# #define _float_3_0 _GLF_uniform_float_values[3]
38# #define _float_4_0 _GLF_uniform_float_values[4]
39# #define _float_5_0 _GLF_uniform_float_values[5]
40# #define _float_6_0 _GLF_uniform_float_values[6]
41# #define _float_7_0 _GLF_uniform_float_values[7]
42# #define _float_8_0 _GLF_uniform_float_values[8]
43# #define _float_9_0 _GLF_uniform_float_values[9]
44# #define _float_10_0 _GLF_uniform_float_values[10]
45# #define _float_11_0 _GLF_uniform_float_values[11]
46# #define _float_12_0 _GLF_uniform_float_values[12]
47# #define _float_13_0 _GLF_uniform_float_values[13]
48# #define _float_14_0 _GLF_uniform_float_values[14]
49# #define _float_15_0 _GLF_uniform_float_values[15]
50# #define _float_16_0 _GLF_uniform_float_values[16]
51# #define _float_27_0 _GLF_uniform_float_values[17]
52#
53# precision highp int;
54# precision highp float;
55#
56# // Contents of _GLF_uniform_int_values: [0, 2, 1, 4]
57# layout(set = 0, binding = 0) uniform buf0
58# {
59#     int _GLF_uniform_int_values[4];
60# };
61#
62# // Contents of _GLF_uniform_float_values:
63# // [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 27.0]
64# layout(set = 0, binding = 1) uniform buf1
65# {
66#     float _GLF_uniform_float_values[18];
67# };
68#
69# const int _GLF_global_loop_bound = 10;
70# int _GLF_global_loop_count = 0;
71#
72# // Contents of one: 1
73# layout(set = 0, binding = 2) uniform buf2
74# {
75#     int one;
76# };
77#
78# layout(location = 0) out vec4 _GLF_color;
79#
80# void main()
81# {
82#     mat4 m = mat4(_float_1_0, _float_2_0, _float_3_0, _float_4_0, _float_5_0, _float_6_0, _float_7_0, _float_8_0, _float_9_0, _float_10_0, _float_11_0, _float_12_0, _float_13_0, _float_14_0, _float_15_0, _float_16_0);
83#     vec4 v = vec4(_float_1_0, _float_2_0, _float_3_0, _float_4_0);
84#     float f = _float_1_0;
85#
86#     // Iterated once.
87#     for(int a = _int_0; _GLF_global_loop_count < _GLF_global_loop_bound; a++)
88#     {
89#         _GLF_global_loop_count++;
90#
91#         // v becomes (2, 2, 3, 4).
92#         v[_GLF_MAKE_IN_BOUNDS_INT(a, 4)] += _float_1_0;
93#
94#         // Iterated 9 times.
95#         for(int b = _int_1; _GLF_global_loop_count < _GLF_global_loop_bound; b--)
96#         {
97#             _GLF_global_loop_count++;
98#             // Iteration b = 1: f += 10. Iterations b = 0..-8: f += 2.
99#             f += v[_GLF_MAKE_IN_BOUNDS_INT(b, 4)] * m[_GLF_MAKE_IN_BOUNDS_INT(b, 4)][a];
100#         }
101#
102#         // This value is never used.
103#         m[1][_GLF_MAKE_IN_BOUNDS_INT(a, 4)] = _float_1_0;
104#
105#         // Always false.
106#         if(one == _int_0)
107#         {
108#             discard;
109#         }
110#         // Always false.
111#         if(one == _int_2)
112#         {
113#             discard;
114#         }
115#     }
116#
117#     float zero = _float_0_0;
118#     // Modify zero in case the result is not what's expected.
119#     if(f != _float_27_0)
120#     {
121#         zero = _float_1_0;
122#     }
123#
124#     _GLF_color = vec4(f, zero, _int_0, f);
125# }
126SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
127; SPIR-V
128; Version: 1.0
129; Generator: Khronos Glslang Reference Front End; 10
130; Bound: 193
131; Schema: 0
132               OpCapability Shader
133          %1 = OpExtInstImport "GLSL.std.450"
134               OpMemoryModel Logical GLSL450
135               OpEntryPoint Fragment %4 "main" %185
136               OpExecutionMode %4 OriginUpperLeft
137               OpSource ESSL 320
138               OpName %4 "main"
139               OpName %8 "_GLF_global_loop_count"
140               OpName %14 "m"
141               OpName %18 "buf1"
142               OpMemberName %18 0 "_GLF_uniform_float_values"
143               OpName %20 ""
144               OpName %78 "v"
145               OpName %89 "f"
146               OpName %93 "a"
147               OpName %96 "buf0"
148               OpMemberName %96 0 "_GLF_uniform_int_values"
149               OpName %98 ""
150               OpName %120 "b"
151               OpName %151 "buf2"
152               OpMemberName %151 0 "one"
153               OpName %153 ""
154               OpName %172 "zero"
155               OpName %185 "_GLF_color"
156               OpDecorate %17 ArrayStride 16
157               OpMemberDecorate %18 0 Offset 0
158               OpDecorate %18 Block
159               OpDecorate %20 DescriptorSet 0
160               OpDecorate %20 Binding 1
161               OpDecorate %95 ArrayStride 16
162               OpMemberDecorate %96 0 Offset 0
163               OpDecorate %96 Block
164               OpDecorate %98 DescriptorSet 0
165               OpDecorate %98 Binding 0
166               OpMemberDecorate %151 0 Offset 0
167               OpDecorate %151 Block
168               OpDecorate %153 DescriptorSet 0
169               OpDecorate %153 Binding 2
170               OpDecorate %185 Location 0
171          %2 = OpTypeVoid
172          %3 = OpTypeFunction %2
173          %6 = OpTypeInt 32 1
174          %7 = OpTypePointer Private %6
175          %8 = OpVariable %7 Private
176          %9 = OpConstant %6 0
177         %10 = OpTypeFloat 32
178         %11 = OpTypeVector %10 4
179         %12 = OpTypeMatrix %11 4
180         %13 = OpTypePointer Function %12
181         %15 = OpTypeInt 32 0
182         %16 = OpConstant %15 18
183         %17 = OpTypeArray %10 %16
184         %18 = OpTypeStruct %17
185         %19 = OpTypePointer Uniform %18
186         %20 = OpVariable %19 Uniform
187         %21 = OpConstant %6 1
188         %22 = OpTypePointer Uniform %10
189         %25 = OpConstant %6 2
190         %28 = OpConstant %6 3
191         %31 = OpConstant %6 4
192         %34 = OpConstant %6 5
193         %37 = OpConstant %6 6
194         %40 = OpConstant %6 7
195         %43 = OpConstant %6 8
196         %46 = OpConstant %6 9
197         %49 = OpConstant %6 10
198         %52 = OpConstant %6 11
199         %55 = OpConstant %6 12
200         %58 = OpConstant %6 13
201         %61 = OpConstant %6 14
202         %64 = OpConstant %6 15
203         %67 = OpConstant %6 16
204         %70 = OpConstant %10 1
205         %71 = OpConstant %10 0
206         %77 = OpTypePointer Function %11
207         %88 = OpTypePointer Function %10
208         %92 = OpTypePointer Function %6
209         %94 = OpConstant %15 4
210         %95 = OpTypeArray %6 %94
211         %96 = OpTypeStruct %95
212         %97 = OpTypePointer Uniform %96
213         %98 = OpVariable %97 Uniform
214         %99 = OpTypePointer Uniform %6
215        %108 = OpTypeBool
216        %151 = OpTypeStruct %6
217        %152 = OpTypePointer Uniform %151
218        %153 = OpVariable %152 Uniform
219        %176 = OpConstant %6 17
220        %184 = OpTypePointer Output %11
221        %185 = OpVariable %184 Output
222          %4 = OpFunction %2 None %3
223          %5 = OpLabel
224         %14 = OpVariable %13 Function
225         %78 = OpVariable %77 Function
226         %89 = OpVariable %88 Function
227         %93 = OpVariable %92 Function
228        %120 = OpVariable %92 Function
229        %172 = OpVariable %88 Function
230               OpStore %8 %9
231         %23 = OpAccessChain %22 %20 %9 %21
232         %24 = OpLoad %10 %23
233         %26 = OpAccessChain %22 %20 %9 %25
234         %27 = OpLoad %10 %26
235         %29 = OpAccessChain %22 %20 %9 %28
236         %30 = OpLoad %10 %29
237         %32 = OpAccessChain %22 %20 %9 %31
238         %33 = OpLoad %10 %32
239         %35 = OpAccessChain %22 %20 %9 %34
240         %36 = OpLoad %10 %35
241         %38 = OpAccessChain %22 %20 %9 %37
242         %39 = OpLoad %10 %38
243         %41 = OpAccessChain %22 %20 %9 %40
244         %42 = OpLoad %10 %41
245         %44 = OpAccessChain %22 %20 %9 %43
246         %45 = OpLoad %10 %44
247         %47 = OpAccessChain %22 %20 %9 %46
248         %48 = OpLoad %10 %47
249         %50 = OpAccessChain %22 %20 %9 %49
250         %51 = OpLoad %10 %50
251         %53 = OpAccessChain %22 %20 %9 %52
252         %54 = OpLoad %10 %53
253         %56 = OpAccessChain %22 %20 %9 %55
254         %57 = OpLoad %10 %56
255         %59 = OpAccessChain %22 %20 %9 %58
256         %60 = OpLoad %10 %59
257         %62 = OpAccessChain %22 %20 %9 %61
258         %63 = OpLoad %10 %62
259         %65 = OpAccessChain %22 %20 %9 %64
260         %66 = OpLoad %10 %65
261         %68 = OpAccessChain %22 %20 %9 %67
262         %69 = OpLoad %10 %68
263         %72 = OpCompositeConstruct %11 %24 %27 %30 %33
264         %73 = OpCompositeConstruct %11 %36 %39 %42 %45
265         %74 = OpCompositeConstruct %11 %48 %51 %54 %57
266         %75 = OpCompositeConstruct %11 %60 %63 %66 %69
267         %76 = OpCompositeConstruct %12 %72 %73 %74 %75
268               OpStore %14 %76
269         %79 = OpAccessChain %22 %20 %9 %21
270         %80 = OpLoad %10 %79
271         %81 = OpAccessChain %22 %20 %9 %25
272         %82 = OpLoad %10 %81
273         %83 = OpAccessChain %22 %20 %9 %28
274         %84 = OpLoad %10 %83
275         %85 = OpAccessChain %22 %20 %9 %31
276         %86 = OpLoad %10 %85
277         %87 = OpCompositeConstruct %11 %80 %82 %84 %86
278               OpStore %78 %87
279         %90 = OpAccessChain %22 %20 %9 %21
280         %91 = OpLoad %10 %90
281               OpStore %89 %91
282        %100 = OpAccessChain %99 %98 %9 %9
283        %101 = OpLoad %6 %100
284               OpStore %93 %101
285               OpBranch %102
286        %102 = OpLabel
287               OpLoopMerge %104 %105 None
288               OpBranch %106
289        %106 = OpLabel
290        %107 = OpLoad %6 %8
291        %109 = OpSLessThan %108 %107 %49
292               OpBranchConditional %109 %103 %104
293        %103 = OpLabel
294        %110 = OpLoad %6 %8
295        %111 = OpIAdd %6 %110 %21
296               OpStore %8 %111
297        %112 = OpLoad %6 %93
298        %113 = OpExtInst %6 %1 SClamp %112 %9 %28
299        %114 = OpAccessChain %22 %20 %9 %21
300        %115 = OpLoad %10 %114
301        %116 = OpAccessChain %88 %78 %113
302        %117 = OpLoad %10 %116
303        %118 = OpFAdd %10 %117 %115
304        %119 = OpAccessChain %88 %78 %113
305               OpStore %119 %118
306        %121 = OpAccessChain %99 %98 %9 %25
307        %122 = OpLoad %6 %121
308               OpStore %120 %122
309               OpBranch %123
310        %123 = OpLabel
311               OpLoopMerge %125 %126 None
312               OpBranch %127
313        %127 = OpLabel
314        %128 = OpLoad %6 %8
315        %129 = OpSLessThan %108 %128 %49
316               OpBranchConditional %129 %124 %125
317        %124 = OpLabel
318        %130 = OpLoad %6 %8
319        %131 = OpIAdd %6 %130 %21
320               OpStore %8 %131
321        %132 = OpLoad %6 %120
322        %133 = OpExtInst %6 %1 SClamp %132 %9 %28
323        %134 = OpAccessChain %88 %78 %133
324        %135 = OpLoad %10 %134
325        %136 = OpLoad %6 %120
326        %137 = OpExtInst %6 %1 SClamp %136 %9 %28
327        %138 = OpLoad %6 %93
328        %139 = OpAccessChain %88 %14 %137 %138
329        %140 = OpLoad %10 %139
330        %141 = OpFMul %10 %135 %140
331        %142 = OpLoad %10 %89
332        %143 = OpFAdd %10 %142 %141
333               OpStore %89 %143
334               OpBranch %126
335        %126 = OpLabel
336        %144 = OpLoad %6 %120
337        %145 = OpISub %6 %144 %21
338               OpStore %120 %145
339               OpBranch %123
340        %125 = OpLabel
341        %146 = OpLoad %6 %93
342        %147 = OpExtInst %6 %1 SClamp %146 %9 %28
343        %148 = OpAccessChain %22 %20 %9 %21
344        %149 = OpLoad %10 %148
345        %150 = OpAccessChain %88 %14 %21 %147
346               OpStore %150 %149
347        %154 = OpAccessChain %99 %153 %9
348        %155 = OpLoad %6 %154
349        %156 = OpAccessChain %99 %98 %9 %9
350        %157 = OpLoad %6 %156
351        %158 = OpIEqual %108 %155 %157
352               OpSelectionMerge %160 None
353               OpBranchConditional %158 %159 %160
354        %159 = OpLabel
355               OpKill
356        %160 = OpLabel
357        %162 = OpAccessChain %99 %153 %9
358        %163 = OpLoad %6 %162
359        %164 = OpAccessChain %99 %98 %9 %21
360        %165 = OpLoad %6 %164
361        %166 = OpIEqual %108 %163 %165
362               OpSelectionMerge %168 None
363               OpBranchConditional %166 %167 %168
364        %167 = OpLabel
365               OpKill
366        %168 = OpLabel
367               OpBranch %105
368        %105 = OpLabel
369        %170 = OpLoad %6 %93
370        %171 = OpIAdd %6 %170 %21
371               OpStore %93 %171
372               OpBranch %102
373        %104 = OpLabel
374        %173 = OpAccessChain %22 %20 %9 %9
375        %174 = OpLoad %10 %173
376               OpStore %172 %174
377        %175 = OpLoad %10 %89
378        %177 = OpAccessChain %22 %20 %9 %176
379        %178 = OpLoad %10 %177
380        %179 = OpFUnordNotEqual %108 %175 %178
381               OpSelectionMerge %181 None
382               OpBranchConditional %179 %180 %181
383        %180 = OpLabel
384        %182 = OpAccessChain %22 %20 %9 %21
385        %183 = OpLoad %10 %182
386               OpStore %172 %183
387               OpBranch %181
388        %181 = OpLabel
389        %186 = OpLoad %10 %89
390        %187 = OpLoad %10 %172
391        %188 = OpAccessChain %99 %98 %9 %9
392        %189 = OpLoad %6 %188
393        %190 = OpConvertSToF %10 %189
394        %191 = OpLoad %10 %89
395        %192 = OpCompositeConstruct %11 %186 %187 %190 %191
396               OpStore %185 %192
397               OpReturn
398               OpFunctionEnd
399END
400
401# uniforms for variant
402
403# one
404BUFFER variant_one DATA_TYPE int32 STD140 DATA
405 1
406END
407# _GLF_uniform_float_values
408BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
409 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 27.0
410END
411# _GLF_uniform_int_values
412BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
413 0 2 1 4
414END
415
416BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
417
418PIPELINE graphics variant_pipeline
419  ATTACH variant_vertex_shader
420  ATTACH variant_fragment_shader
421  FRAMEBUFFER_SIZE 256 256
422  BIND BUFFER variant_framebuffer AS color LOCATION 0
423  BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 2
424  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
425  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
426END
427CLEAR_COLOR variant_pipeline 0 0 0 255
428
429CLEAR variant_pipeline
430RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
431
432EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
433