• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2020 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
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 320 es
28# #define _int_0 _GLF_uniform_int_values[0]
29# #define _int_10 _GLF_uniform_int_values[1]
30# #define _int_1 _GLF_uniform_int_values[2]
31# #define _int_2 _GLF_uniform_int_values[3]
32#
33# precision highp float;
34# precision highp int;
35#
36# // Contents of _GLF_uniform_int_values: [0, 10, 1, 2]
37# layout(set = 0, binding = 0) uniform buf0
38# {
39#     int _GLF_uniform_int_values[4];
40# };
41# layout(location = 0) out vec4 _GLF_color;
42#
43# void main()
44# {
45#     int a = _int_0;
46#     int b = _int_10;
47#     int c = _int_1;
48#
49#     // Loop iterates 10 times where a goes from 0 to 10
50#     // during the loop, and c goes from 1 to 2 on the
51#     // first iteration.
52#     while (a < b)
53#     {
54#         a++;
55#
56#         // True for the first iteration.
57#         if (c == _int_1)
58#         {
59#             c *= _int_2;
60#         }
61#         else if (true)
62#         {
63#             continue;
64#         }
65#     }
66#
67#     // Always true.
68#     if (a == b && c == _int_2)
69#     {
70#         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
71#     }
72#     else
73#     {
74#         _GLF_color = vec4(_int_0);
75#     }
76# }
77SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
78; SPIR-V
79; Version: 1.0
80; Generator: Khronos Glslang Reference Front End; 10
81; Bound: 88
82; Schema: 0
83               OpCapability Shader
84          %1 = OpExtInstImport "GLSL.std.450"
85               OpMemoryModel Logical GLSL450
86               OpEntryPoint Fragment %4 "main" %69
87               OpExecutionMode %4 OriginUpperLeft
88               OpSource ESSL 320
89               OpName %4 "main"
90               OpName %8 "a"
91               OpName %12 "buf0"
92               OpMemberName %12 0 "_GLF_uniform_int_values"
93               OpName %14 ""
94               OpName %19 "b"
95               OpName %23 "c"
96               OpName %69 "_GLF_color"
97               OpDecorate %11 ArrayStride 16
98               OpMemberDecorate %12 0 Offset 0
99               OpDecorate %12 Block
100               OpDecorate %14 DescriptorSet 0
101               OpDecorate %14 Binding 0
102               OpDecorate %69 Location 0
103          %2 = OpTypeVoid
104          %3 = OpTypeFunction %2
105          %6 = OpTypeInt 32 1
106          %7 = OpTypePointer Function %6
107          %9 = OpTypeInt 32 0
108         %10 = OpConstant %9 4
109         %11 = OpTypeArray %6 %10
110         %12 = OpTypeStruct %11
111         %13 = OpTypePointer Uniform %12
112         %14 = OpVariable %13 Uniform
113         %15 = OpConstant %6 0
114         %16 = OpTypePointer Uniform %6
115         %20 = OpConstant %6 1
116         %24 = OpConstant %6 2
117         %34 = OpTypeBool
118         %44 = OpConstant %6 3
119         %50 = OpConstantTrue %34
120         %66 = OpTypeFloat 32
121         %67 = OpTypeVector %66 4
122         %68 = OpTypePointer Output %67
123         %69 = OpVariable %68 Output
124          %4 = OpFunction %2 None %3
125          %5 = OpLabel
126          %8 = OpVariable %7 Function
127         %19 = OpVariable %7 Function
128         %23 = OpVariable %7 Function
129         %17 = OpAccessChain %16 %14 %15 %15
130         %18 = OpLoad %6 %17
131               OpStore %8 %18
132         %21 = OpAccessChain %16 %14 %15 %20
133         %22 = OpLoad %6 %21
134               OpStore %19 %22
135         %25 = OpAccessChain %16 %14 %15 %24
136         %26 = OpLoad %6 %25
137               OpStore %23 %26
138               OpBranch %27
139         %27 = OpLabel
140               OpLoopMerge %29 %30 None
141               OpBranch %31
142         %31 = OpLabel
143         %32 = OpLoad %6 %8
144         %33 = OpLoad %6 %19
145         %35 = OpSLessThan %34 %32 %33
146               OpBranchConditional %35 %28 %29
147         %28 = OpLabel
148         %36 = OpLoad %6 %8
149         %37 = OpIAdd %6 %36 %20
150               OpStore %8 %37
151         %38 = OpLoad %6 %23
152         %39 = OpAccessChain %16 %14 %15 %24
153         %40 = OpLoad %6 %39
154         %41 = OpIEqual %34 %38 %40
155               OpSelectionMerge %43 None
156               OpBranchConditional %41 %42 %49
157         %42 = OpLabel
158         %45 = OpAccessChain %16 %14 %15 %44
159         %46 = OpLoad %6 %45
160         %47 = OpLoad %6 %23
161         %48 = OpIMul %6 %47 %46
162               OpStore %23 %48
163               OpBranch %43
164         %49 = OpLabel
165               OpSelectionMerge %52 None
166               OpBranchConditional %50 %51 %52
167         %51 = OpLabel
168               OpBranch %30
169         %52 = OpLabel
170               OpBranch %43
171         %43 = OpLabel
172               OpBranch %30
173         %30 = OpLabel
174               OpBranch %27
175         %29 = OpLabel
176         %54 = OpLoad %6 %8
177         %55 = OpLoad %6 %19
178         %56 = OpIEqual %34 %54 %55
179               OpSelectionMerge %58 None
180               OpBranchConditional %56 %57 %58
181         %57 = OpLabel
182         %59 = OpLoad %6 %23
183         %60 = OpAccessChain %16 %14 %15 %44
184         %61 = OpLoad %6 %60
185         %62 = OpIEqual %34 %59 %61
186               OpBranch %58
187         %58 = OpLabel
188         %63 = OpPhi %34 %56 %29 %62 %57
189               OpSelectionMerge %65 None
190               OpBranchConditional %63 %64 %83
191         %64 = OpLabel
192         %70 = OpAccessChain %16 %14 %15 %24
193         %71 = OpLoad %6 %70
194         %72 = OpConvertSToF %66 %71
195         %73 = OpAccessChain %16 %14 %15 %15
196         %74 = OpLoad %6 %73
197         %75 = OpConvertSToF %66 %74
198         %76 = OpAccessChain %16 %14 %15 %15
199         %77 = OpLoad %6 %76
200         %78 = OpConvertSToF %66 %77
201         %79 = OpAccessChain %16 %14 %15 %24
202         %80 = OpLoad %6 %79
203         %81 = OpConvertSToF %66 %80
204         %82 = OpCompositeConstruct %67 %72 %75 %78 %81
205               OpStore %69 %82
206               OpBranch %65
207         %83 = OpLabel
208         %84 = OpAccessChain %16 %14 %15 %15
209         %85 = OpLoad %6 %84
210         %86 = OpConvertSToF %66 %85
211         %87 = OpCompositeConstruct %67 %86 %86 %86 %86
212               OpStore %69 %87
213               OpBranch %65
214         %65 = OpLabel
215               OpReturn
216               OpFunctionEnd
217END
218
219# uniforms for variant
220
221# _GLF_uniform_int_values
222BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
223 0 10 1 2
224END
225
226BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
227
228PIPELINE graphics variant_pipeline
229  ATTACH variant_vertex_shader
230  ATTACH variant_fragment_shader
231  FRAMEBUFFER_SIZE 256 256
232  BIND BUFFER variant_framebuffer AS color LOCATION 0
233  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
234END
235CLEAR_COLOR variant_pipeline 0 0 0 255
236
237CLEAR variant_pipeline
238RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
239
240EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
241