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