1e5c31af7Sopenharmony_ci# Copyright 2018 Google LLC
2e5c31af7Sopenharmony_ci#
3e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
4e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
5e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
10e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
11e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
13e5c31af7Sopenharmony_ci# limitations under the License.
14e5c31af7Sopenharmony_ci
15e5c31af7Sopenharmony_ci# A test for a bug found by GraphicsFuzz.
16e5c31af7Sopenharmony_ci
17e5c31af7Sopenharmony_ci# Short description: A compute shader with a barrier in a loop with a break
18e5c31af7Sopenharmony_ci
19e5c31af7Sopenharmony_ci# Derived from the following GLSL.
20e5c31af7Sopenharmony_ci
21e5c31af7Sopenharmony_ci# Compute shader GLSL:
22e5c31af7Sopenharmony_ci# #version 310 es
23e5c31af7Sopenharmony_ci#
24e5c31af7Sopenharmony_ci# layout(set = 0, binding = 1) uniform buf1 {
25e5c31af7Sopenharmony_ci#  vec2 injectionSwitch;
26e5c31af7Sopenharmony_ci# };
27e5c31af7Sopenharmony_ci# layout(std430, binding = 0) buffer doesNotMatter {
28e5c31af7Sopenharmony_ci#  int global_seed;
29e5c31af7Sopenharmony_ci#  int data[];
30e5c31af7Sopenharmony_ci# };
31e5c31af7Sopenharmony_ci# layout(local_size_x = 16, local_size_y = 1) in;
32e5c31af7Sopenharmony_ci# void main()
33e5c31af7Sopenharmony_ci# {
34e5c31af7Sopenharmony_ci#  int lid = int(gl_LocalInvocationID.x);
35e5c31af7Sopenharmony_ci#  int val = global_seed;
36e5c31af7Sopenharmony_ci#  for(
37e5c31af7Sopenharmony_ci#      int i = 0;
38e5c31af7Sopenharmony_ci#      i < 2;
39e5c31af7Sopenharmony_ci#      i ++
40e5c31af7Sopenharmony_ci#  )
41e5c31af7Sopenharmony_ci#   {
42e5c31af7Sopenharmony_ci#    if(lid > 0)
43e5c31af7Sopenharmony_ci#     {
44e5c31af7Sopenharmony_ci#      val += data[lid - 1];
45e5c31af7Sopenharmony_ci#      if(injectionSwitch.x > 100.0)
46e5c31af7Sopenharmony_ci#       {
47e5c31af7Sopenharmony_ci#        break;
48e5c31af7Sopenharmony_ci#       }
49e5c31af7Sopenharmony_ci#     }
50e5c31af7Sopenharmony_ci#    barrier();
51e5c31af7Sopenharmony_ci#  }
52e5c31af7Sopenharmony_ci#  if (lid == 0) {
53e5c31af7Sopenharmony_ci#    data[0] = 42;
54e5c31af7Sopenharmony_ci#  }
55e5c31af7Sopenharmony_ci# }
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ci[compute shader spirv]
58e5c31af7Sopenharmony_ci; SPIR-V
59e5c31af7Sopenharmony_ci; Version: 1.0
60e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 7
61e5c31af7Sopenharmony_ci; Bound: 74
62e5c31af7Sopenharmony_ci; Schema: 0
63e5c31af7Sopenharmony_ci               OpCapability Shader
64e5c31af7Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
65e5c31af7Sopenharmony_ci               OpMemoryModel Logical GLSL450
66e5c31af7Sopenharmony_ci               OpEntryPoint GLCompute %4 "main" %12
67e5c31af7Sopenharmony_ci               OpExecutionMode %4 LocalSize 16 1 1
68e5c31af7Sopenharmony_ci               OpSource ESSL 310
69e5c31af7Sopenharmony_ci               OpName %4 "main"
70e5c31af7Sopenharmony_ci               OpName %8 "lid"
71e5c31af7Sopenharmony_ci               OpName %12 "gl_LocalInvocationID"
72e5c31af7Sopenharmony_ci               OpName %18 "val"
73e5c31af7Sopenharmony_ci               OpName %20 "doesNotMatter"
74e5c31af7Sopenharmony_ci               OpMemberName %20 0 "global_seed"
75e5c31af7Sopenharmony_ci               OpMemberName %20 1 "data"
76e5c31af7Sopenharmony_ci               OpName %22 ""
77e5c31af7Sopenharmony_ci               OpName %27 "i"
78e5c31af7Sopenharmony_ci               OpName %50 "buf1"
79e5c31af7Sopenharmony_ci               OpMemberName %50 0 "injectionSwitch"
80e5c31af7Sopenharmony_ci               OpName %52 ""
81e5c31af7Sopenharmony_ci               OpDecorate %12 BuiltIn LocalInvocationId
82e5c31af7Sopenharmony_ci               OpDecorate %19 ArrayStride 4
83e5c31af7Sopenharmony_ci               OpMemberDecorate %20 0 Offset 0
84e5c31af7Sopenharmony_ci               OpMemberDecorate %20 1 Offset 4
85e5c31af7Sopenharmony_ci               OpDecorate %20 BufferBlock
86e5c31af7Sopenharmony_ci               OpDecorate %22 DescriptorSet 0
87e5c31af7Sopenharmony_ci               OpDecorate %22 Binding 0
88e5c31af7Sopenharmony_ci               OpMemberDecorate %50 0 Offset 0
89e5c31af7Sopenharmony_ci               OpDecorate %50 Block
90e5c31af7Sopenharmony_ci               OpDecorate %52 DescriptorSet 0
91e5c31af7Sopenharmony_ci               OpDecorate %52 Binding 1
92e5c31af7Sopenharmony_ci               OpDecorate %73 BuiltIn WorkgroupSize
93e5c31af7Sopenharmony_ci          %2 = OpTypeVoid
94e5c31af7Sopenharmony_ci          %3 = OpTypeFunction %2
95e5c31af7Sopenharmony_ci          %6 = OpTypeInt 32 1
96e5c31af7Sopenharmony_ci          %7 = OpTypePointer Function %6
97e5c31af7Sopenharmony_ci          %9 = OpTypeInt 32 0
98e5c31af7Sopenharmony_ci         %10 = OpTypeVector %9 3
99e5c31af7Sopenharmony_ci         %11 = OpTypePointer Input %10
100e5c31af7Sopenharmony_ci         %12 = OpVariable %11 Input
101e5c31af7Sopenharmony_ci         %13 = OpConstant %9 0
102e5c31af7Sopenharmony_ci         %14 = OpTypePointer Input %9
103e5c31af7Sopenharmony_ci         %19 = OpTypeRuntimeArray %6
104e5c31af7Sopenharmony_ci         %20 = OpTypeStruct %6 %19
105e5c31af7Sopenharmony_ci         %21 = OpTypePointer Uniform %20
106e5c31af7Sopenharmony_ci         %22 = OpVariable %21 Uniform
107e5c31af7Sopenharmony_ci         %23 = OpConstant %6 0
108e5c31af7Sopenharmony_ci         %24 = OpTypePointer Uniform %6
109e5c31af7Sopenharmony_ci         %34 = OpConstant %6 2
110e5c31af7Sopenharmony_ci         %35 = OpTypeBool
111e5c31af7Sopenharmony_ci         %41 = OpConstant %6 1
112e5c31af7Sopenharmony_ci         %48 = OpTypeFloat 32
113e5c31af7Sopenharmony_ci         %49 = OpTypeVector %48 2
114e5c31af7Sopenharmony_ci         %50 = OpTypeStruct %49
115e5c31af7Sopenharmony_ci         %51 = OpTypePointer Uniform %50
116e5c31af7Sopenharmony_ci         %52 = OpVariable %51 Uniform
117e5c31af7Sopenharmony_ci         %53 = OpTypePointer Uniform %48
118e5c31af7Sopenharmony_ci         %56 = OpConstant %48 100
119e5c31af7Sopenharmony_ci         %61 = OpConstant %9 2
120e5c31af7Sopenharmony_ci         %62 = OpConstant %9 264
121e5c31af7Sopenharmony_ci         %69 = OpConstant %6 42
122e5c31af7Sopenharmony_ci         %71 = OpConstant %9 16
123e5c31af7Sopenharmony_ci         %72 = OpConstant %9 1
124e5c31af7Sopenharmony_ci         %73 = OpConstantComposite %10 %71 %72 %72
125e5c31af7Sopenharmony_ci          %4 = OpFunction %2 None %3
126e5c31af7Sopenharmony_ci          %5 = OpLabel
127e5c31af7Sopenharmony_ci          %8 = OpVariable %7 Function
128e5c31af7Sopenharmony_ci         %18 = OpVariable %7 Function
129e5c31af7Sopenharmony_ci         %27 = OpVariable %7 Function
130e5c31af7Sopenharmony_ci         %15 = OpAccessChain %14 %12 %13
131e5c31af7Sopenharmony_ci         %16 = OpLoad %9 %15
132e5c31af7Sopenharmony_ci         %17 = OpBitcast %6 %16
133e5c31af7Sopenharmony_ci               OpStore %8 %17
134e5c31af7Sopenharmony_ci         %25 = OpAccessChain %24 %22 %23
135e5c31af7Sopenharmony_ci         %26 = OpLoad %6 %25
136e5c31af7Sopenharmony_ci               OpStore %18 %26
137e5c31af7Sopenharmony_ci               OpStore %27 %23
138e5c31af7Sopenharmony_ci               OpBranch %28
139e5c31af7Sopenharmony_ci         %28 = OpLabel
140e5c31af7Sopenharmony_ci               OpLoopMerge %30 %31 None
141e5c31af7Sopenharmony_ci               OpBranch %32
142e5c31af7Sopenharmony_ci         %32 = OpLabel
143e5c31af7Sopenharmony_ci         %33 = OpLoad %6 %27
144e5c31af7Sopenharmony_ci         %36 = OpSLessThan %35 %33 %34
145e5c31af7Sopenharmony_ci               OpBranchConditional %36 %29 %30
146e5c31af7Sopenharmony_ci         %29 = OpLabel
147e5c31af7Sopenharmony_ci         %37 = OpLoad %6 %8
148e5c31af7Sopenharmony_ci         %38 = OpSGreaterThan %35 %37 %23
149e5c31af7Sopenharmony_ci               OpSelectionMerge %40 None
150e5c31af7Sopenharmony_ci               OpBranchConditional %38 %39 %40
151e5c31af7Sopenharmony_ci         %39 = OpLabel
152e5c31af7Sopenharmony_ci         %42 = OpLoad %6 %8
153e5c31af7Sopenharmony_ci         %43 = OpISub %6 %42 %41
154e5c31af7Sopenharmony_ci         %44 = OpAccessChain %24 %22 %41 %43
155e5c31af7Sopenharmony_ci         %45 = OpLoad %6 %44
156e5c31af7Sopenharmony_ci         %46 = OpLoad %6 %18
157e5c31af7Sopenharmony_ci         %47 = OpIAdd %6 %46 %45
158e5c31af7Sopenharmony_ci               OpStore %18 %47
159e5c31af7Sopenharmony_ci         %54 = OpAccessChain %53 %52 %23 %13
160e5c31af7Sopenharmony_ci         %55 = OpLoad %48 %54
161e5c31af7Sopenharmony_ci         %57 = OpFOrdGreaterThan %35 %55 %56
162e5c31af7Sopenharmony_ci               OpSelectionMerge %59 None
163e5c31af7Sopenharmony_ci               OpBranchConditional %57 %58 %59
164e5c31af7Sopenharmony_ci         %58 = OpLabel
165e5c31af7Sopenharmony_ci               OpBranch %30
166e5c31af7Sopenharmony_ci         %59 = OpLabel
167e5c31af7Sopenharmony_ci               OpBranch %40
168e5c31af7Sopenharmony_ci         %40 = OpLabel
169e5c31af7Sopenharmony_ci               OpControlBarrier %61 %61 %62
170e5c31af7Sopenharmony_ci               OpBranch %31
171e5c31af7Sopenharmony_ci         %31 = OpLabel
172e5c31af7Sopenharmony_ci         %63 = OpLoad %6 %27
173e5c31af7Sopenharmony_ci         %64 = OpIAdd %6 %63 %41
174e5c31af7Sopenharmony_ci               OpStore %27 %64
175e5c31af7Sopenharmony_ci               OpBranch %28
176e5c31af7Sopenharmony_ci         %30 = OpLabel
177e5c31af7Sopenharmony_ci         %65 = OpLoad %6 %8
178e5c31af7Sopenharmony_ci         %66 = OpIEqual %35 %65 %23
179e5c31af7Sopenharmony_ci               OpSelectionMerge %68 None
180e5c31af7Sopenharmony_ci               OpBranchConditional %66 %67 %68
181e5c31af7Sopenharmony_ci         %67 = OpLabel
182e5c31af7Sopenharmony_ci         %70 = OpAccessChain %24 %22 %41 %23
183e5c31af7Sopenharmony_ci               OpStore %70 %69
184e5c31af7Sopenharmony_ci               OpBranch %68
185e5c31af7Sopenharmony_ci         %68 = OpLabel
186e5c31af7Sopenharmony_ci               OpReturn
187e5c31af7Sopenharmony_ci               OpFunctionEnd
188e5c31af7Sopenharmony_ci
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci[test]
191e5c31af7Sopenharmony_ci## Uniforms
192e5c31af7Sopenharmony_ci# injectionSwitch
193e5c31af7Sopenharmony_ciuniform ubo 0:1 vec2 0 0.0 1.0
194e5c31af7Sopenharmony_ci## SSBO
195e5c31af7Sopenharmony_cissbo 0 subdata int 0 12345
196e5c31af7Sopenharmony_cissbo 0 subdata int 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
197e5c31af7Sopenharmony_ci
198e5c31af7Sopenharmony_cicompute 1 1 1
199e5c31af7Sopenharmony_ciprobe ssbo int 0 4 == 42
200