• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2019 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 bug found by GraphicsFuzz.
19
20# Short description: A compute shader with two barrier functions
21
22# The test passes because main always outputs 42.
23
24# variant_compute_shader is derived from the following GLSL:
25# #version 310 es
26# precision highp float;
27#
28# layout(std430, binding = 0) buffer doesNotMatter
29# {
30#     uint _compute_data[];
31# };
32# layout(local_size_x = 1, local_size_y = 18, local_size_z = 6) in;
33# mediump vec4 GLF_live2gl_FragCoord;
34# layout(set = 0, binding = 1) uniform buf0 {
35#  vec2 injectionSwitch;
36# };
37#
38# void main()
39# {
40#     int GLF_live2_looplimiter1 = 0;
41#     for (
42#         int i = 0;
43#         i < 1;
44#         ++i)
45#     {
46#         if (GLF_live2_looplimiter1 >= 3) //always false
47#         {
48#             for (
49#                 int j = 0;
50#                 j < 1;
51#                 ++j)
52#             {
53#                 if (int(GLF_live2gl_FragCoord.x) < 120)
54#                 {
55#                 }
56#                 else
57#                 {
58#                     barrier();
59#                 }
60#             }
61#             break;
62#         }
63#     }
64#     float GLF_dead3x = (injectionSwitch.x > injectionSwitch.y ? GLF_live2gl_FragCoord.x : 0.0); // always 0.0
65#     for (
66#         int GLF_dead3k = 0;
67#         GLF_dead3k < 2;
68#         ++GLF_dead3k)
69#     {
70#         if (GLF_dead3x > 4.0) //always false
71#         {
72#             break;
73#         }
74#         GLF_dead3x = GLF_live2gl_FragCoord.x;
75#         barrier();
76#     }
77#
78#     _compute_data[0] = 42u;
79# }
80SHADER compute variant_compute_shader SPIRV-ASM TARGET_ENV spv1.0
81; SPIR-V
82; Version: 1.0
83; Generator: Khronos Glslang Reference Front End; 7
84; Bound: 106
85; Schema: 0
86               OpCapability Shader
87          %1 = OpExtInstImport "GLSL.std.450"
88               OpMemoryModel Logical GLSL450
89               OpEntryPoint GLCompute %4 "main"
90               OpExecutionMode %4 LocalSize 1 18 6
91               OpSource ESSL 310
92               OpName %4 "main"
93               OpName %8 "GLF_live2_looplimiter1"
94               OpName %10 "i"
95               OpName %25 "j"
96               OpName %36 "GLF_live2gl_FragCoord"
97               OpName %56 "GLF_dead3x"
98               OpName %58 "buf0"
99               OpMemberName %58 0 "injectionSwitch"
100               OpName %60 ""
101               OpName %76 "GLF_dead3k"
102               OpName %96 "doesNotMatter"
103               OpMemberName %96 0 "_compute_data"
104               OpName %98 ""
105               OpDecorate %36 RelaxedPrecision
106               OpDecorate %41 RelaxedPrecision
107               OpMemberDecorate %58 0 Offset 0
108               OpDecorate %58 Block
109               OpDecorate %60 DescriptorSet 0
110               OpDecorate %60 Binding 1
111               OpDecorate %72 RelaxedPrecision
112               OpDecorate %75 RelaxedPrecision
113               OpDecorate %92 RelaxedPrecision
114               OpDecorate %95 ArrayStride 4
115               OpMemberDecorate %96 0 Offset 0
116               OpDecorate %96 BufferBlock
117               OpDecorate %98 DescriptorSet 0
118               OpDecorate %98 Binding 0
119               OpDecorate %105 BuiltIn WorkgroupSize
120          %2 = OpTypeVoid
121          %3 = OpTypeFunction %2
122          %6 = OpTypeInt 32 1
123          %7 = OpTypePointer Function %6
124          %9 = OpConstant %6 0
125         %17 = OpConstant %6 1
126         %18 = OpTypeBool
127         %21 = OpConstant %6 3
128         %33 = OpTypeFloat 32
129         %34 = OpTypeVector %33 4
130         %35 = OpTypePointer Private %34
131         %36 = OpVariable %35 Private
132         %37 = OpTypeInt 32 0
133         %38 = OpConstant %37 0
134         %39 = OpTypePointer Private %33
135         %43 = OpConstant %6 120
136         %48 = OpConstant %37 2
137         %49 = OpConstant %37 264
138         %55 = OpTypePointer Function %33
139         %57 = OpTypeVector %33 2
140         %58 = OpTypeStruct %57
141         %59 = OpTypePointer Uniform %58
142         %60 = OpVariable %59 Uniform
143         %61 = OpTypePointer Uniform %33
144         %64 = OpConstant %37 1
145         %74 = OpConstant %33 0
146         %83 = OpConstant %6 2
147         %86 = OpConstant %33 4
148         %95 = OpTypeRuntimeArray %37
149         %96 = OpTypeStruct %95
150         %97 = OpTypePointer Uniform %96
151         %98 = OpVariable %97 Uniform
152         %99 = OpConstant %37 42
153        %100 = OpTypePointer Uniform %37
154        %102 = OpTypeVector %37 3
155        %103 = OpConstant %37 18
156        %104 = OpConstant %37 6
157        %105 = OpConstantComposite %102 %64 %103 %104
158          %4 = OpFunction %2 None %3
159          %5 = OpLabel
160          %8 = OpVariable %7 Function
161         %10 = OpVariable %7 Function
162         %25 = OpVariable %7 Function
163         %56 = OpVariable %55 Function
164         %68 = OpVariable %55 Function
165         %76 = OpVariable %7 Function
166               OpStore %8 %9
167               OpStore %10 %9
168               OpBranch %11
169         %11 = OpLabel
170               OpLoopMerge %13 %14 None
171               OpBranch %15
172         %15 = OpLabel
173         %16 = OpLoad %6 %10
174         %19 = OpSLessThan %18 %16 %17
175               OpBranchConditional %19 %12 %13
176         %12 = OpLabel
177         %20 = OpLoad %6 %8
178         %22 = OpSGreaterThanEqual %18 %20 %21
179               OpSelectionMerge %24 None
180               OpBranchConditional %22 %23 %24
181         %23 = OpLabel
182               OpStore %25 %9
183               OpBranch %26
184         %26 = OpLabel
185               OpLoopMerge %28 %29 None
186               OpBranch %30
187         %30 = OpLabel
188         %31 = OpLoad %6 %25
189         %32 = OpSLessThan %18 %31 %17
190               OpBranchConditional %32 %27 %28
191         %27 = OpLabel
192         %40 = OpAccessChain %39 %36 %38
193         %41 = OpLoad %33 %40
194         %42 = OpConvertFToS %6 %41
195         %44 = OpSLessThan %18 %42 %43
196               OpSelectionMerge %46 None
197               OpBranchConditional %44 %45 %47
198         %45 = OpLabel
199               OpBranch %46
200         %47 = OpLabel
201               OpControlBarrier %48 %48 %49
202               OpBranch %46
203         %46 = OpLabel
204               OpBranch %29
205         %29 = OpLabel
206         %50 = OpLoad %6 %25
207         %51 = OpIAdd %6 %50 %17
208               OpStore %25 %51
209               OpBranch %26
210         %28 = OpLabel
211               OpBranch %13
212         %24 = OpLabel
213               OpBranch %14
214         %14 = OpLabel
215         %53 = OpLoad %6 %10
216         %54 = OpIAdd %6 %53 %17
217               OpStore %10 %54
218               OpBranch %11
219         %13 = OpLabel
220         %62 = OpAccessChain %61 %60 %9 %38
221         %63 = OpLoad %33 %62
222         %65 = OpAccessChain %61 %60 %9 %64
223         %66 = OpLoad %33 %65
224         %67 = OpFOrdGreaterThan %18 %63 %66
225               OpSelectionMerge %70 None
226               OpBranchConditional %67 %69 %73
227         %69 = OpLabel
228         %71 = OpAccessChain %39 %36 %38
229         %72 = OpLoad %33 %71
230               OpStore %68 %72
231               OpBranch %70
232         %73 = OpLabel
233               OpStore %68 %74
234               OpBranch %70
235         %70 = OpLabel
236         %75 = OpLoad %33 %68
237               OpStore %56 %75
238               OpStore %76 %9
239               OpBranch %77
240         %77 = OpLabel
241               OpLoopMerge %79 %80 None
242               OpBranch %81
243         %81 = OpLabel
244         %82 = OpLoad %6 %76
245         %84 = OpSLessThan %18 %82 %83
246               OpBranchConditional %84 %78 %79
247         %78 = OpLabel
248         %85 = OpLoad %33 %56
249         %87 = OpFOrdGreaterThan %18 %85 %86
250               OpSelectionMerge %89 None
251               OpBranchConditional %87 %88 %89
252         %88 = OpLabel
253               OpBranch %79
254         %89 = OpLabel
255         %91 = OpAccessChain %39 %36 %38
256         %92 = OpLoad %33 %91
257               OpStore %56 %92
258               OpControlBarrier %48 %48 %49
259               OpBranch %80
260         %80 = OpLabel
261         %93 = OpLoad %6 %76
262         %94 = OpIAdd %6 %93 %17
263               OpStore %76 %94
264               OpBranch %77
265         %79 = OpLabel
266        %101 = OpAccessChain %100 %98 %9 %9
267               OpStore %101 %99
268               OpReturn
269               OpFunctionEnd
270END
271
272# uniforms for variant
273
274# injectionSwitch
275BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
276 0.0 1.0
277END
278
279BUFFER variant_ssbo DATA_TYPE uint32 DATA
280 0 0 0 0 0 0 0 0 0 0
281END
282
283PIPELINE compute variant_pipeline
284  ATTACH variant_compute_shader
285  BIND BUFFER variant_ssbo AS storage DESCRIPTOR_SET 0 BINDING 0
286  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1
287END
288
289RUN variant_pipeline 1 6 2
290
291EXPECT variant_ssbo IDX 0 EQ 42