• 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 loops, breaks, returns
21
22# The test passes because the shader immediately writes 42 to the 0th position
23# in the SSBO and that is the only thing we check. All loops terminate. All
24# other writes to the SSBO are at indices greater than 0.
25
26# Optimized using spirv-opt with the following arguments:
27# '--eliminate-dead-code-aggressive'
28# '--simplify-instructions'
29# '--redundancy-elimination'
30# '--copy-propagate-arrays'
31# '--convert-local-access-chains'
32# '--eliminate-dead-branches'
33# '--eliminate-local-multi-store'
34# '--eliminate-local-multi-store'
35# '--eliminate-dead-inserts'
36# '--eliminate-local-single-block'
37# '--redundancy-elimination'
38# '--eliminate-dead-branches'
39# spirv-opt commit hash: 4a00a80c40484a6f6f72f48c9d34943cf8f180d4
40
41
42
43# variant_compute_shader is derived from the following GLSL:
44# #version 310 es
45#
46# layout(std430, binding = 0) buffer theSSBO
47# {
48#   uint data_out[5];
49# };
50#
51# layout(set = 0, binding = 1) uniform buf0 {
52#   vec2 injectionSwitch;
53# };
54#
55# layout(local_size_x = 100, local_size_y = 1, local_size_z = 1) in;
56#
57# void main()
58# {
59#   data_out[0] = 42u;
60#   uint gid = uint(injectionSwitch.y); // 1
61#   do
62#   {
63#     if (1u != gid) // always false
64#     {
65#       data_out[1] = 1u;
66#       return;
67#     }
68#   } while (false);
69#
70#   uint d;
71#   while (true)
72#   {
73#     if (d != 0u)
74#     {
75#       data_out[1] = 2u;
76#       for (int i = 0; i < 1; ++i)
77#       {
78#         data_out[1] = 3u;
79#         return;
80#       }
81#     }
82#     break;
83#   }
84#   data_out[gid] = 7u; // gid == 1
85# }
86SHADER compute variant_compute_shader SPIRV-ASM TARGET_ENV spv1.0
87; SPIR-V
88; Version: 1.0
89; Generator: Khronos Glslang Reference Front End; 7
90; Bound: 86
91; Schema: 0
92               OpCapability Shader
93          %1 = OpExtInstImport "GLSL.std.450"
94               OpMemoryModel Logical GLSL450
95               OpEntryPoint GLCompute %4 "main"
96               OpExecutionMode %4 LocalSize 100 1 1
97               OpSource ESSL 310
98               OpName %4 "main"
99               OpName %9 "theSSBO"
100               OpMemberName %9 0 "data_out"
101               OpName %11 ""
102               OpName %18 "gid"
103               OpName %21 "buf0"
104               OpMemberName %21 0 "injectionSwitch"
105               OpName %23 ""
106               OpName %48 "d"
107               OpName %57 "i"
108               OpDecorate %8 ArrayStride 4
109               OpMemberDecorate %9 0 Offset 0
110               OpDecorate %9 BufferBlock
111               OpDecorate %11 DescriptorSet 0
112               OpDecorate %11 Binding 0
113               OpMemberDecorate %21 0 Offset 0
114               OpDecorate %21 Block
115               OpDecorate %23 DescriptorSet 0
116               OpDecorate %23 Binding 1
117               OpDecorate %76 BuiltIn WorkgroupSize
118          %2 = OpTypeVoid
119          %3 = OpTypeFunction %2
120          %6 = OpTypeInt 32 0
121          %7 = OpConstant %6 5
122          %8 = OpTypeArray %6 %7
123          %9 = OpTypeStruct %8
124         %10 = OpTypePointer Uniform %9
125         %11 = OpVariable %10 Uniform
126         %12 = OpTypeInt 32 1
127         %13 = OpConstant %12 0
128         %14 = OpConstant %6 42
129         %15 = OpTypePointer Uniform %6
130         %17 = OpTypePointer Function %6
131         %19 = OpTypeFloat 32
132         %20 = OpTypeVector %19 2
133         %21 = OpTypeStruct %20
134         %22 = OpTypePointer Uniform %21
135         %23 = OpVariable %22 Uniform
136         %24 = OpConstant %6 1
137         %25 = OpTypePointer Uniform %19
138         %34 = OpTypeBool
139         %38 = OpConstant %12 1
140         %41 = OpConstantFalse %34
141         %47 = OpConstantTrue %34
142         %50 = OpConstant %6 0
143         %54 = OpConstant %6 2
144         %56 = OpTypePointer Function %12
145         %65 = OpConstant %6 3
146         %72 = OpConstant %6 7
147         %74 = OpTypeVector %6 3
148         %75 = OpConstant %6 100
149         %76 = OpConstantComposite %74 %75 %24 %24
150         %80 = OpUndef %6
151         %85 = OpUndef %12
152          %4 = OpFunction %2 None %3
153          %5 = OpLabel
154         %18 = OpVariable %17 Function
155         %48 = OpVariable %17 Function
156         %57 = OpVariable %56 Function
157         %16 = OpAccessChain %15 %11 %13 %13
158               OpStore %16 %14
159         %26 = OpAccessChain %25 %23 %13 %24
160         %27 = OpLoad %19 %26
161         %28 = OpConvertFToU %6 %27
162               OpStore %18 %28
163               OpBranch %29
164         %29 = OpLabel
165               OpLoopMerge %31 %32 None
166               OpBranch %30
167         %30 = OpLabel
168         %35 = OpINotEqual %34 %24 %28
169               OpSelectionMerge %37 None
170               OpBranchConditional %35 %36 %37
171         %36 = OpLabel
172         %39 = OpAccessChain %15 %11 %13 %38
173               OpStore %39 %24
174               OpReturn
175         %37 = OpLabel
176               OpBranch %32
177         %32 = OpLabel
178               OpBranchConditional %41 %29 %31
179         %31 = OpLabel
180               OpBranch %42
181         %42 = OpLabel
182               OpLoopMerge %44 %45 None
183               OpBranch %46
184         %46 = OpLabel
185               OpBranch %43
186         %43 = OpLabel
187         %51 = OpINotEqual %34 %80 %50
188               OpSelectionMerge %53 None
189               OpBranchConditional %51 %52 %53
190         %52 = OpLabel
191         %55 = OpAccessChain %15 %11 %13 %38
192               OpStore %55 %54
193               OpStore %57 %13
194               OpBranch %58
195         %58 = OpLabel
196               OpLoopMerge %60 %61 None
197               OpBranch %62
198         %62 = OpLabel
199         %64 = OpSLessThan %34 %13 %38
200               OpBranchConditional %64 %59 %60
201         %59 = OpLabel
202               OpStore %55 %65
203               OpReturn
204         %61 = OpLabel
205               OpBranch %58
206         %60 = OpLabel
207               OpBranch %53
208         %53 = OpLabel
209         %82 = OpPhi %6 %28 %43 %28 %60
210               OpBranch %44
211         %45 = OpLabel
212               OpBranch %42
213         %44 = OpLabel
214         %73 = OpAccessChain %15 %11 %13 %82
215               OpStore %73 %72
216               OpReturn
217               OpFunctionEnd
218END
219
220# uniforms for variant
221
222# injectionSwitch
223BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
224 0.0 1.0
225END
226
227BUFFER variant_ssbo DATA_TYPE uint32 DATA
228 0 0 0 0 0
229END
230
231PIPELINE compute variant_pipeline
232  ATTACH variant_compute_shader
233  BIND BUFFER variant_ssbo AS storage DESCRIPTOR_SET 0 BINDING 0
234  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1
235END
236
237RUN variant_pipeline 1 1 1
238
239EXPECT variant_ssbo IDX 0 EQ 42
240