• 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 mem pass code path.
21
22# The test passes because shader always writes red.
23
24# Optimized using spirv-opt with the following arguments:
25# '--redundancy-elimination'
26# '--eliminate-dead-inserts'
27# '--private-to-local'
28# '--redundancy-elimination'
29# '--eliminate-local-multi-store'
30# '--if-conversion'
31# '--scalar-replacement=100'
32# '--combine-access-chains'
33# '--reduce-load-size'
34# '--eliminate-dead-branches'
35# '--merge-return'
36# '--eliminate-local-single-block'
37# '--if-conversion'
38# '--private-to-local'
39# '--eliminate-dead-inserts'
40# '--copy-propagate-arrays'
41# '--inline-entry-points-exhaustive'
42# '--copy-propagate-arrays'
43# '--convert-local-access-chains'
44# spirv-opt commit hash: 9215c1b7df0029f27807e8c8d7ec80532ce90a87
45
46
47
48SHADER vertex variant_vertex_shader PASSTHROUGH
49
50# variant_fragment_shader is derived from the following GLSL:
51# #version 310 es
52# precision highp float;
53# precision highp int;
54#
55# layout(location = 0) out vec4 _GLF_color;
56# layout(set = 0, binding = 0) uniform buf0
57# {
58#     int one;
59# };
60#
61# struct S
62# {
63#     int a;
64#     int b;
65#     int c;
66# };
67#
68# int func(S s, int x)
69# {
70#     s.a = x;
71#
72#     // Always false.
73#     if(s.a == 2)
74#         s.a = 9;
75#
76#     s.b = x + 1;
77#     s.c = x + 2;
78#
79#     // Always false.
80#     if(s.b == 2)
81#         s.b = 7;
82#
83#     return s.a + s.b + s.c;
84# }
85#
86# void main()
87# {
88#     S arr[2];
89#     arr[one].a = 2;
90#
91#     // Always false.
92#     if(arr[1].a < 1)
93#     {
94#         _GLF_color = vec4(0);
95#         return;
96#     }
97#     else
98#     {
99#         if (func(arr[1], 2 + one) == 12)
100#             _GLF_color = vec4(1, 0, 0, 1);
101#         else
102#             _GLF_color = vec4(0);
103#     }
104# }
105SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
106; SPIR-V
107; Version: 1.0
108; Generator: Khronos Glslang Reference Front End; 8
109; Bound: 136
110; Schema: 0
111               OpCapability Shader
112          %1 = OpExtInstImport "GLSL.std.450"
113               OpMemoryModel Logical GLSL450
114               OpEntryPoint Fragment %4 "main" %71
115               OpExecutionMode %4 OriginUpperLeft
116               OpSource ESSL 310
117               OpName %4 "main"
118               OpName %7 "S"
119               OpMemberName %7 0 "a"
120               OpMemberName %7 1 "b"
121               OpMemberName %7 2 "c"
122               OpName %13 "func(struct-S-i1-i1-i11;i1;"
123               OpName %11 "s"
124               OpName %12 "x"
125               OpName %55 "arr"
126               OpName %56 "buf0"
127               OpMemberName %56 0 "one"
128               OpName %58 ""
129               OpName %71 "_GLF_color"
130               OpName %79 "param"
131               OpName %82 "param"
132               OpMemberDecorate %56 0 Offset 0
133               OpDecorate %56 Block
134               OpDecorate %58 DescriptorSet 0
135               OpDecorate %58 Binding 0
136               OpDecorate %71 Location 0
137          %2 = OpTypeVoid
138          %3 = OpTypeFunction %2
139          %6 = OpTypeInt 32 1
140          %7 = OpTypeStruct %6 %6 %6
141          %8 = OpTypePointer Function %7
142          %9 = OpTypePointer Function %6
143         %10 = OpTypeFunction %6 %8 %9
144         %15 = OpConstant %6 0
145         %20 = OpConstant %6 2
146         %21 = OpTypeBool
147         %25 = OpConstant %6 9
148         %27 = OpConstant %6 1
149         %39 = OpConstant %6 7
150         %51 = OpTypeInt 32 0
151         %52 = OpConstant %51 2
152         %53 = OpTypeArray %7 %52
153         %54 = OpTypePointer Function %53
154         %56 = OpTypeStruct %6
155         %57 = OpTypePointer Uniform %56
156         %58 = OpVariable %57 Uniform
157         %59 = OpTypePointer Uniform %6
158         %68 = OpTypeFloat 32
159         %69 = OpTypeVector %68 4
160         %70 = OpTypePointer Output %69
161         %71 = OpVariable %70 Output
162         %72 = OpConstant %68 0
163         %73 = OpConstantComposite %69 %72 %72 %72 %72
164         %84 = OpConstant %6 12
165         %88 = OpConstant %68 1
166         %89 = OpConstantComposite %69 %88 %72 %72 %88
167         %95 = OpConstantFalse %21
168         %96 = OpTypePointer Function %21
169         %98 = OpConstantTrue %21
170          %4 = OpFunction %2 None %3
171          %5 = OpLabel
172         %99 = OpVariable %9 Function
173         %97 = OpVariable %96 Function %95
174         %55 = OpVariable %54 Function
175         %79 = OpVariable %8 Function
176         %82 = OpVariable %9 Function
177               OpBranch %92
178         %92 = OpLabel
179               OpLoopMerge %91 %94 None
180               OpBranch %93
181         %93 = OpLabel
182         %60 = OpAccessChain %59 %58 %15
183         %61 = OpLoad %6 %60
184         %62 = OpAccessChain %9 %55 %61 %15
185               OpStore %62 %20
186         %63 = OpAccessChain %9 %55 %27 %15
187         %64 = OpLoad %6 %63
188         %65 = OpSLessThan %21 %64 %27
189               OpSelectionMerge %67 None
190               OpBranchConditional %65 %66 %75
191         %66 = OpLabel
192               OpStore %71 %73
193               OpStore %97 %98
194               OpBranch %91
195         %75 = OpLabel
196         %78 = OpIAdd %6 %20 %61
197         %80 = OpAccessChain %8 %55 %27
198         %81 = OpLoad %7 %80
199               OpStore %79 %81
200               OpStore %82 %78
201        %100 = OpLoad %6 %82
202        %101 = OpAccessChain %9 %79 %15
203        %121 = OpLoad %7 %79
204        %122 = OpCompositeInsert %7 %100 %121 0
205               OpStore %79 %122
206        %123 = OpLoad %7 %79
207        %102 = OpCompositeExtract %6 %123 0
208        %103 = OpIEqual %21 %102 %20
209               OpSelectionMerge %104 None
210               OpBranchConditional %103 %105 %104
211        %105 = OpLabel
212        %124 = OpLoad %7 %79
213        %125 = OpCompositeInsert %7 %25 %124 0
214               OpStore %79 %125
215               OpBranch %104
216        %104 = OpLabel
217        %106 = OpLoad %6 %82
218        %107 = OpIAdd %6 %106 %27
219        %108 = OpAccessChain %9 %79 %27
220        %126 = OpLoad %7 %79
221        %127 = OpCompositeInsert %7 %107 %126 1
222               OpStore %79 %127
223        %109 = OpLoad %6 %82
224        %110 = OpIAdd %6 %109 %20
225        %111 = OpAccessChain %9 %79 %20
226        %128 = OpLoad %7 %79
227        %129 = OpCompositeInsert %7 %110 %128 2
228               OpStore %79 %129
229        %130 = OpLoad %7 %79
230        %112 = OpCompositeExtract %6 %130 1
231        %113 = OpIEqual %21 %112 %20
232               OpSelectionMerge %114 None
233               OpBranchConditional %113 %115 %114
234        %115 = OpLabel
235        %131 = OpLoad %7 %79
236        %132 = OpCompositeInsert %7 %39 %131 1
237               OpStore %79 %132
238               OpBranch %114
239        %114 = OpLabel
240        %133 = OpLoad %7 %79
241        %116 = OpCompositeExtract %6 %133 0
242        %134 = OpLoad %7 %79
243        %117 = OpCompositeExtract %6 %134 1
244        %118 = OpIAdd %6 %116 %117
245        %135 = OpLoad %7 %79
246        %119 = OpCompositeExtract %6 %135 2
247        %120 = OpIAdd %6 %118 %119
248               OpStore %99 %120
249         %83 = OpLoad %6 %99
250         %85 = OpIEqual %21 %83 %84
251               OpSelectionMerge %87 None
252               OpBranchConditional %85 %86 %90
253         %86 = OpLabel
254               OpStore %71 %89
255               OpBranch %87
256         %90 = OpLabel
257               OpStore %71 %73
258               OpBranch %87
259         %87 = OpLabel
260               OpBranch %67
261         %67 = OpLabel
262               OpStore %97 %98
263               OpBranch %91
264         %94 = OpLabel
265               OpBranch %92
266         %91 = OpLabel
267               OpReturn
268               OpFunctionEnd
269         %13 = OpFunction %6 None %10
270         %11 = OpFunctionParameter %8
271         %12 = OpFunctionParameter %9
272         %14 = OpLabel
273         %16 = OpLoad %6 %12
274         %17 = OpAccessChain %9 %11 %15
275               OpStore %17 %16
276         %19 = OpLoad %6 %17
277         %22 = OpIEqual %21 %19 %20
278               OpSelectionMerge %24 None
279               OpBranchConditional %22 %23 %24
280         %23 = OpLabel
281               OpStore %17 %25
282               OpBranch %24
283         %24 = OpLabel
284         %28 = OpLoad %6 %12
285         %29 = OpIAdd %6 %28 %27
286         %30 = OpAccessChain %9 %11 %27
287               OpStore %30 %29
288         %31 = OpLoad %6 %12
289         %32 = OpIAdd %6 %31 %20
290         %33 = OpAccessChain %9 %11 %20
291               OpStore %33 %32
292         %35 = OpLoad %6 %30
293         %36 = OpIEqual %21 %35 %20
294               OpSelectionMerge %38 None
295               OpBranchConditional %36 %37 %38
296         %37 = OpLabel
297               OpStore %30 %39
298               OpBranch %38
299         %38 = OpLabel
300         %42 = OpLoad %6 %17
301         %44 = OpLoad %6 %30
302         %45 = OpIAdd %6 %42 %44
303         %47 = OpLoad %6 %33
304         %48 = OpIAdd %6 %45 %47
305               OpReturnValue %48
306               OpFunctionEnd
307END
308
309# uniforms for variant
310
311# one
312BUFFER variant_one DATA_TYPE int32 DATA
313 1
314END
315
316BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
317
318PIPELINE graphics variant_pipeline
319  ATTACH variant_vertex_shader
320  ATTACH variant_fragment_shader
321  FRAMEBUFFER_SIZE 256 256
322  BIND BUFFER variant_framebuffer AS color LOCATION 0
323  BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0
324END
325CLEAR_COLOR variant_pipeline 0 0 0 255
326
327CLEAR variant_pipeline
328RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
329
330EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
331