• 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 GraphicsFuzz.
19
20# Short description: A fragment shader that covers a specific interval map code path.
21
22# The test passes because shader always writes red.
23
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 310 es
28# precision highp float;
29# precision highp int;
30#
31# layout(location = 0) out vec4 _GLF_color;
32#
33# vec3 func()
34# {
35#     vec2 v = vec2(1);
36#     int i = 0;
37#     for(int k = 0; k < 2; k++)
38#     {
39#         if(v.y + 1.0 > 4.0) // Always false.
40#             break;
41#
42#         v.y = 1.0;
43#         i++;
44#     }
45#
46#     if(i < 10) // Always true.
47#         return vec3(1, 0, 0);
48#     else
49#         return vec3(0, 0, 1);
50# }
51#
52# void main()
53# {
54#     vec3 data[2];
55#
56#     // Writes data[0] = (1, 0, 0).
57#     for(int j = 0; j < 1; j++)
58#         data[j] = func();
59#
60#     // Writes data[1] = (1, 0, 0).
61#     for(int j = 0; j < 1; j++)
62#         data[4*j + 1] = func();
63#
64#     if (data[0] == vec3(1, 0, 0) && data[1] == vec3(1, 0, 0)) // Always true.
65#         _GLF_color = vec4(1, 0, 0, 1);
66#     else
67#         _GLF_color = vec4(0);
68# }
69SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
70; SPIR-V
71; Version: 1.0
72; Generator: Khronos Glslang Reference Front End; 8
73; Bound: 113
74; Schema: 0
75               OpCapability Shader
76          %1 = OpExtInstImport "GLSL.std.450"
77               OpMemoryModel Logical GLSL450
78               OpEntryPoint Fragment %4 "main" %109
79               OpExecutionMode %4 OriginUpperLeft
80               OpSource ESSL 310
81               OpName %4 "main"
82               OpName %9 "func("
83               OpName %13 "v"
84               OpName %18 "i"
85               OpName %20 "k"
86               OpName %59 "j"
87               OpName %70 "data"
88               OpName %77 "j"
89               OpName %109 "_GLF_color"
90               OpDecorate %109 Location 0
91          %2 = OpTypeVoid
92          %3 = OpTypeFunction %2
93          %6 = OpTypeFloat 32
94          %7 = OpTypeVector %6 3
95          %8 = OpTypeFunction %7
96         %11 = OpTypeVector %6 2
97         %12 = OpTypePointer Function %11
98         %14 = OpConstant %6 1
99         %15 = OpConstantComposite %11 %14 %14
100         %16 = OpTypeInt 32 1
101         %17 = OpTypePointer Function %16
102         %19 = OpConstant %16 0
103         %27 = OpConstant %16 2
104         %28 = OpTypeBool
105         %30 = OpTypeInt 32 0
106         %31 = OpConstant %30 1
107         %32 = OpTypePointer Function %6
108         %36 = OpConstant %6 4
109         %43 = OpConstant %16 1
110         %48 = OpConstant %16 10
111         %52 = OpConstant %6 0
112         %53 = OpConstantComposite %7 %14 %52 %52
113         %56 = OpConstantComposite %7 %52 %52 %14
114         %67 = OpConstant %30 2
115         %68 = OpTypeArray %7 %67
116         %69 = OpTypePointer Function %68
117         %73 = OpTypePointer Function %7
118         %85 = OpConstant %16 4
119         %95 = OpTypeVector %28 3
120        %107 = OpTypeVector %6 4
121        %108 = OpTypePointer Output %107
122        %109 = OpVariable %108 Output
123        %110 = OpConstantComposite %107 %14 %52 %52 %14
124        %112 = OpConstantComposite %107 %52 %52 %52 %52
125          %4 = OpFunction %2 None %3
126          %5 = OpLabel
127         %59 = OpVariable %17 Function
128         %70 = OpVariable %69 Function
129         %77 = OpVariable %17 Function
130               OpStore %59 %19
131               OpBranch %60
132         %60 = OpLabel
133               OpLoopMerge %62 %63 None
134               OpBranch %64
135         %64 = OpLabel
136         %65 = OpLoad %16 %59
137         %66 = OpSLessThan %28 %65 %43
138               OpBranchConditional %66 %61 %62
139         %61 = OpLabel
140         %71 = OpLoad %16 %59
141         %72 = OpFunctionCall %7 %9
142         %74 = OpAccessChain %73 %70 %71
143               OpStore %74 %72
144               OpBranch %63
145         %63 = OpLabel
146         %75 = OpLoad %16 %59
147         %76 = OpIAdd %16 %75 %43
148               OpStore %59 %76
149               OpBranch %60
150         %62 = OpLabel
151               OpStore %77 %19
152               OpBranch %78
153         %78 = OpLabel
154               OpLoopMerge %80 %81 None
155               OpBranch %82
156         %82 = OpLabel
157         %83 = OpLoad %16 %77
158         %84 = OpSLessThan %28 %83 %43
159               OpBranchConditional %84 %79 %80
160         %79 = OpLabel
161         %86 = OpLoad %16 %77
162         %87 = OpIMul %16 %85 %86
163         %88 = OpIAdd %16 %87 %43
164         %89 = OpFunctionCall %7 %9
165         %90 = OpAccessChain %73 %70 %88
166               OpStore %90 %89
167               OpBranch %81
168         %81 = OpLabel
169         %91 = OpLoad %16 %77
170         %92 = OpIAdd %16 %91 %43
171               OpStore %77 %92
172               OpBranch %78
173         %80 = OpLabel
174         %93 = OpAccessChain %73 %70 %19
175         %94 = OpLoad %7 %93
176         %96 = OpFOrdEqual %95 %94 %53
177         %97 = OpAll %28 %96
178               OpSelectionMerge %99 None
179               OpBranchConditional %97 %98 %99
180         %98 = OpLabel
181        %100 = OpAccessChain %73 %70 %43
182        %101 = OpLoad %7 %100
183        %102 = OpFOrdEqual %95 %101 %53
184        %103 = OpAll %28 %102
185               OpBranch %99
186         %99 = OpLabel
187        %104 = OpPhi %28 %97 %80 %103 %98
188               OpSelectionMerge %106 None
189               OpBranchConditional %104 %105 %111
190        %105 = OpLabel
191               OpStore %109 %110
192               OpBranch %106
193        %111 = OpLabel
194               OpStore %109 %112
195               OpBranch %106
196        %106 = OpLabel
197               OpReturn
198               OpFunctionEnd
199          %9 = OpFunction %7 None %8
200         %10 = OpLabel
201         %13 = OpVariable %12 Function
202         %18 = OpVariable %17 Function
203         %20 = OpVariable %17 Function
204               OpStore %13 %15
205               OpStore %18 %19
206               OpStore %20 %19
207               OpBranch %21
208         %21 = OpLabel
209               OpLoopMerge %23 %24 None
210               OpBranch %25
211         %25 = OpLabel
212         %26 = OpLoad %16 %20
213         %29 = OpSLessThan %28 %26 %27
214               OpBranchConditional %29 %22 %23
215         %22 = OpLabel
216         %33 = OpAccessChain %32 %13 %31
217         %34 = OpLoad %6 %33
218         %35 = OpFAdd %6 %34 %14
219         %37 = OpFOrdGreaterThan %28 %35 %36
220               OpSelectionMerge %39 None
221               OpBranchConditional %37 %38 %39
222         %38 = OpLabel
223               OpBranch %23
224         %39 = OpLabel
225         %41 = OpAccessChain %32 %13 %31
226               OpStore %41 %14
227         %42 = OpLoad %16 %18
228         %44 = OpIAdd %16 %42 %43
229               OpStore %18 %44
230               OpBranch %24
231         %24 = OpLabel
232         %45 = OpLoad %16 %20
233         %46 = OpIAdd %16 %45 %43
234               OpStore %20 %46
235               OpBranch %21
236         %23 = OpLabel
237         %47 = OpLoad %16 %18
238         %49 = OpSLessThan %28 %47 %48
239               OpSelectionMerge %51 None
240               OpBranchConditional %49 %50 %55
241         %50 = OpLabel
242               OpReturnValue %53
243         %55 = OpLabel
244               OpReturnValue %56
245         %51 = OpLabel
246               OpUnreachable
247               OpFunctionEnd
248END
249
250
251BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
252
253PIPELINE graphics variant_pipeline
254  ATTACH variant_vertex_shader
255  ATTACH variant_fragment_shader
256  FRAMEBUFFER_SIZE 256 256
257  BIND BUFFER variant_framebuffer AS color LOCATION 0
258END
259CLEAR_COLOR variant_pipeline 0 0 0 255
260
261CLEAR variant_pipeline
262RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
263
264EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
265