• 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 NIR code paths
21
22# The test passes because the shader always writes red.
23
24# Optimized using spirv-opt with the following arguments:
25# '--eliminate-dead-inserts'
26# '--eliminate-dead-branches'
27# '--merge-blocks'
28# spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af
29
30
31
32SHADER vertex variant_vertex_shader PASSTHROUGH
33
34# variant_fragment_shader is derived from the following GLSL:
35# #version 320 es
36#
37# #define _GLF_MAKE_IN_BOUNDS_INT(IDX, SZ)  clamp(IDX, 0, SZ - 1)
38# #define _int_0 _GLF_uniform_int_values[0]
39# #define _int_2 _GLF_uniform_int_values[1]
40# #define _int_4 _GLF_uniform_int_values[2]
41# #define _int_1 _GLF_uniform_int_values[3]
42# #define _float_1_0 _GLF_uniform_float_values[0]
43#
44# precision highp float;
45# precision highp int;
46#
47# // Contents of _GLF_uniform_float_values: 1.0
48# layout(set = 0, binding = 0) uniform buf0
49# {
50#     float _GLF_uniform_float_values[1];
51# };
52#
53# // Contents of _GLF_uniform_int_values: [0, 2, 4, 1]
54# layout(set = 0, binding = 1) uniform buf1
55# {
56#     int _GLF_uniform_int_values[4];
57# };
58#
59# // Contents of one: 1.0
60# layout(set = 0, binding = 2) uniform buf2
61# {
62#     float one;
63# };
64#
65# layout(location = 0) out vec4 _GLF_color;
66#
67# mat4x2 m = mat4x2(0.0);
68#
69# void func0(int x)
70# {
71#     // Always false.
72#     if (x < 1 || (x > 1 && one > _float_1_0))
73#     {
74#         return;
75#     }
76#
77#     // Always true.
78#     if (one == _float_1_0)
79#     {
80#         for(int i = 0; i < 2; i ++)
81#         {
82#             m[_GLF_MAKE_IN_BOUNDS_INT(x, 4)][i] += _float_1_0;
83#         }
84#     }
85# }
86#
87# void func1()
88# {
89#     // Always false.
90#     if (gl_FragCoord.y < 0.0)
91#     {
92#         return;
93#     }
94#
95#     func0(1);
96# }
97#
98# void main()
99# {
100#     // Called twice causing two of the matrix elements to increase by two.
101#     func1();
102#     func1();
103#
104#     // Always true.
105#     if(m == mat4x2(_int_0, _int_0, _int_2, _int_2, _int_0, _int_0, _int_0, _int_0))
106#     {
107#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
108#     }
109#     else
110#     {
111#         _GLF_color = vec4(_int_0);
112#     }
113# }
114SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
115; SPIR-V
116; Version: 1.0
117; Generator: Khronos Glslang Reference Front End; 10
118; Bound: 176
119; Schema: 0
120               OpCapability Shader
121          %1 = OpExtInstImport "GLSL.std.450"
122               OpMemoryModel Logical GLSL450
123               OpEntryPoint Fragment %4 "main" %85 %157
124               OpExecutionMode %4 OriginUpperLeft
125               OpSource ESSL 320
126               OpName %4 "main"
127               OpName %10 "func0(i1;"
128               OpName %9 "x"
129               OpName %12 "func1("
130               OpName %18 "m"
131               OpName %33 "buf2"
132               OpMemberName %33 0 "one"
133               OpName %35 ""
134               OpName %43 "buf0"
135               OpMemberName %43 0 "_GLF_uniform_float_values"
136               OpName %45 ""
137               OpName %61 "i"
138               OpName %85 "gl_FragCoord"
139               OpName %93 "param"
140               OpName %100 "buf1"
141               OpMemberName %100 0 "_GLF_uniform_int_values"
142               OpName %102 ""
143               OpName %157 "_GLF_color"
144               OpMemberDecorate %33 0 Offset 0
145               OpDecorate %33 Block
146               OpDecorate %35 DescriptorSet 0
147               OpDecorate %35 Binding 2
148               OpDecorate %42 ArrayStride 16
149               OpMemberDecorate %43 0 Offset 0
150               OpDecorate %43 Block
151               OpDecorate %45 DescriptorSet 0
152               OpDecorate %45 Binding 0
153               OpDecorate %85 BuiltIn FragCoord
154               OpDecorate %99 ArrayStride 16
155               OpMemberDecorate %100 0 Offset 0
156               OpDecorate %100 Block
157               OpDecorate %102 DescriptorSet 0
158               OpDecorate %102 Binding 1
159               OpDecorate %157 Location 0
160          %2 = OpTypeVoid
161          %3 = OpTypeFunction %2
162          %6 = OpTypeInt 32 1
163          %7 = OpTypePointer Function %6
164          %8 = OpTypeFunction %2 %7
165         %14 = OpTypeFloat 32
166         %15 = OpTypeVector %14 2
167         %16 = OpTypeMatrix %15 4
168         %17 = OpTypePointer Private %16
169         %18 = OpVariable %17 Private
170         %19 = OpConstant %14 0
171         %20 = OpConstantComposite %15 %19 %19
172         %21 = OpConstantComposite %16 %20 %20 %20 %20
173         %22 = OpTypeBool
174         %24 = OpConstant %6 1
175         %33 = OpTypeStruct %14
176         %34 = OpTypePointer Uniform %33
177         %35 = OpVariable %34 Uniform
178         %36 = OpConstant %6 0
179         %37 = OpTypePointer Uniform %14
180         %40 = OpTypeInt 32 0
181         %41 = OpConstant %40 1
182         %42 = OpTypeArray %14 %41
183         %43 = OpTypeStruct %42
184         %44 = OpTypePointer Uniform %43
185         %45 = OpVariable %44 Uniform
186         %68 = OpConstant %6 2
187         %71 = OpConstant %6 3
188         %76 = OpTypePointer Private %14
189         %83 = OpTypeVector %14 4
190         %84 = OpTypePointer Input %83
191         %85 = OpVariable %84 Input
192         %86 = OpTypePointer Input %14
193         %98 = OpConstant %40 4
194         %99 = OpTypeArray %6 %98
195        %100 = OpTypeStruct %99
196        %101 = OpTypePointer Uniform %100
197        %102 = OpVariable %101 Uniform
198        %103 = OpTypePointer Uniform %6
199        %128 = OpConstant %14 1
200        %136 = OpTypeVector %22 2
201        %156 = OpTypePointer Output %83
202        %157 = OpVariable %156 Output
203          %4 = OpFunction %2 None %3
204          %5 = OpLabel
205               OpStore %18 %21
206         %95 = OpFunctionCall %2 %12
207         %96 = OpFunctionCall %2 %12
208         %97 = OpLoad %16 %18
209        %104 = OpAccessChain %103 %102 %36 %36
210        %105 = OpLoad %6 %104
211        %106 = OpConvertSToF %14 %105
212        %107 = OpAccessChain %103 %102 %36 %36
213        %108 = OpLoad %6 %107
214        %109 = OpConvertSToF %14 %108
215        %110 = OpAccessChain %103 %102 %36 %24
216        %111 = OpLoad %6 %110
217        %112 = OpConvertSToF %14 %111
218        %113 = OpAccessChain %103 %102 %36 %24
219        %114 = OpLoad %6 %113
220        %115 = OpConvertSToF %14 %114
221        %116 = OpAccessChain %103 %102 %36 %36
222        %117 = OpLoad %6 %116
223        %118 = OpConvertSToF %14 %117
224        %119 = OpAccessChain %103 %102 %36 %36
225        %120 = OpLoad %6 %119
226        %121 = OpConvertSToF %14 %120
227        %122 = OpAccessChain %103 %102 %36 %36
228        %123 = OpLoad %6 %122
229        %124 = OpConvertSToF %14 %123
230        %125 = OpAccessChain %103 %102 %36 %36
231        %126 = OpLoad %6 %125
232        %127 = OpConvertSToF %14 %126
233        %129 = OpCompositeConstruct %15 %106 %109
234        %130 = OpCompositeConstruct %15 %112 %115
235        %131 = OpCompositeConstruct %15 %118 %121
236        %132 = OpCompositeConstruct %15 %124 %127
237        %133 = OpCompositeConstruct %16 %129 %130 %131 %132
238        %134 = OpCompositeExtract %15 %97 0
239        %135 = OpCompositeExtract %15 %133 0
240        %137 = OpFOrdEqual %136 %134 %135
241        %138 = OpAll %22 %137
242        %139 = OpCompositeExtract %15 %97 1
243        %140 = OpCompositeExtract %15 %133 1
244        %141 = OpFOrdEqual %136 %139 %140
245        %142 = OpAll %22 %141
246        %143 = OpLogicalAnd %22 %138 %142
247        %144 = OpCompositeExtract %15 %97 2
248        %145 = OpCompositeExtract %15 %133 2
249        %146 = OpFOrdEqual %136 %144 %145
250        %147 = OpAll %22 %146
251        %148 = OpLogicalAnd %22 %143 %147
252        %149 = OpCompositeExtract %15 %97 3
253        %150 = OpCompositeExtract %15 %133 3
254        %151 = OpFOrdEqual %136 %149 %150
255        %152 = OpAll %22 %151
256        %153 = OpLogicalAnd %22 %148 %152
257               OpSelectionMerge %155 None
258               OpBranchConditional %153 %154 %171
259        %154 = OpLabel
260        %158 = OpAccessChain %103 %102 %36 %71
261        %159 = OpLoad %6 %158
262        %160 = OpConvertSToF %14 %159
263        %161 = OpAccessChain %103 %102 %36 %36
264        %162 = OpLoad %6 %161
265        %163 = OpConvertSToF %14 %162
266        %164 = OpAccessChain %103 %102 %36 %36
267        %165 = OpLoad %6 %164
268        %166 = OpConvertSToF %14 %165
269        %167 = OpAccessChain %103 %102 %36 %71
270        %168 = OpLoad %6 %167
271        %169 = OpConvertSToF %14 %168
272        %170 = OpCompositeConstruct %83 %160 %163 %166 %169
273               OpStore %157 %170
274               OpBranch %155
275        %171 = OpLabel
276        %172 = OpAccessChain %103 %102 %36 %36
277        %173 = OpLoad %6 %172
278        %174 = OpConvertSToF %14 %173
279        %175 = OpCompositeConstruct %83 %174 %174 %174 %174
280               OpStore %157 %175
281               OpBranch %155
282        %155 = OpLabel
283               OpReturn
284               OpFunctionEnd
285         %10 = OpFunction %2 None %8
286          %9 = OpFunctionParameter %7
287         %11 = OpLabel
288         %61 = OpVariable %7 Function
289         %23 = OpLoad %6 %9
290         %25 = OpSLessThan %22 %23 %24
291         %26 = OpLogicalNot %22 %25
292               OpSelectionMerge %28 None
293               OpBranchConditional %26 %27 %28
294         %27 = OpLabel
295         %29 = OpLoad %6 %9
296         %30 = OpSGreaterThan %22 %29 %24
297               OpSelectionMerge %32 None
298               OpBranchConditional %30 %31 %32
299         %31 = OpLabel
300         %38 = OpAccessChain %37 %35 %36
301         %39 = OpLoad %14 %38
302         %46 = OpAccessChain %37 %45 %36 %36
303         %47 = OpLoad %14 %46
304         %48 = OpFOrdGreaterThan %22 %39 %47
305               OpBranch %32
306         %32 = OpLabel
307         %49 = OpPhi %22 %30 %27 %48 %31
308               OpBranch %28
309         %28 = OpLabel
310         %50 = OpPhi %22 %25 %11 %49 %32
311               OpSelectionMerge %52 None
312               OpBranchConditional %50 %51 %52
313         %51 = OpLabel
314               OpReturn
315         %52 = OpLabel
316         %54 = OpAccessChain %37 %35 %36
317         %55 = OpLoad %14 %54
318         %56 = OpAccessChain %37 %45 %36 %36
319         %57 = OpLoad %14 %56
320         %58 = OpFOrdEqual %22 %55 %57
321               OpSelectionMerge %60 None
322               OpBranchConditional %58 %59 %60
323         %59 = OpLabel
324               OpStore %61 %36
325               OpBranch %62
326         %62 = OpLabel
327         %67 = OpLoad %6 %61
328         %69 = OpSLessThan %22 %67 %68
329               OpLoopMerge %64 %63 None
330               OpBranchConditional %69 %63 %64
331         %63 = OpLabel
332         %70 = OpLoad %6 %9
333         %72 = OpExtInst %6 %1 SClamp %70 %36 %71
334         %73 = OpLoad %6 %61
335         %74 = OpAccessChain %37 %45 %36 %36
336         %75 = OpLoad %14 %74
337         %77 = OpAccessChain %76 %18 %72 %73
338         %78 = OpLoad %14 %77
339         %79 = OpFAdd %14 %78 %75
340         %80 = OpAccessChain %76 %18 %72 %73
341               OpStore %80 %79
342         %81 = OpLoad %6 %61
343         %82 = OpIAdd %6 %81 %24
344               OpStore %61 %82
345               OpBranch %62
346         %64 = OpLabel
347               OpBranch %60
348         %60 = OpLabel
349               OpReturn
350               OpFunctionEnd
351         %12 = OpFunction %2 None %3
352         %13 = OpLabel
353         %93 = OpVariable %7 Function
354         %87 = OpAccessChain %86 %85 %41
355         %88 = OpLoad %14 %87
356         %89 = OpFOrdLessThan %22 %88 %19
357               OpSelectionMerge %91 None
358               OpBranchConditional %89 %90 %91
359         %90 = OpLabel
360               OpReturn
361         %91 = OpLabel
362               OpStore %93 %24
363         %94 = OpFunctionCall %2 %10 %93
364               OpReturn
365               OpFunctionEnd
366END
367
368# uniforms for variant
369
370# one
371BUFFER variant_one DATA_TYPE float STD140 DATA
372 1.0
373END
374# _GLF_uniform_int_values
375BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
376 0 2 4 1
377END
378# _GLF_uniform_float_values
379BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
380 1.0
381END
382
383BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
384
385PIPELINE graphics variant_pipeline
386  ATTACH variant_vertex_shader
387  ATTACH variant_fragment_shader
388  FRAMEBUFFER_SIZE 256 256
389  BIND BUFFER variant_framebuffer AS color LOCATION 0
390  BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 2
391  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
392  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
393END
394CLEAR_COLOR variant_pipeline 0 0 0 255
395
396CLEAR variant_pipeline
397RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
398
399EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
400