# Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # A test for a bug found by GraphicsFuzz. # Short description: A compute shader with a barrier in a loop with a break # Derived from the following GLSL. # Compute shader GLSL: # #version 310 es # # layout(set = 0, binding = 1) uniform buf1 { # vec2 injectionSwitch; # }; # layout(std430, binding = 0) buffer doesNotMatter { # int global_seed; # int data[]; # }; # layout(local_size_x = 16, local_size_y = 1) in; # void main() # { # int lid = int(gl_LocalInvocationID.x); # int val = global_seed; # for( # int i = 0; # i < 2; # i ++ # ) # { # if(lid > 0) # { # val += data[lid - 1]; # if(injectionSwitch.x > 100.0) # { # break; # } # } # barrier(); # } # if (lid == 0) { # data[0] = 42; # } # } [compute shader spirv] ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 74 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %4 "main" %12 OpExecutionMode %4 LocalSize 16 1 1 OpSource ESSL 310 OpName %4 "main" OpName %8 "lid" OpName %12 "gl_LocalInvocationID" OpName %18 "val" OpName %20 "doesNotMatter" OpMemberName %20 0 "global_seed" OpMemberName %20 1 "data" OpName %22 "" OpName %27 "i" OpName %50 "buf1" OpMemberName %50 0 "injectionSwitch" OpName %52 "" OpDecorate %12 BuiltIn LocalInvocationId OpDecorate %19 ArrayStride 4 OpMemberDecorate %20 0 Offset 0 OpMemberDecorate %20 1 Offset 4 OpDecorate %20 BufferBlock OpDecorate %22 DescriptorSet 0 OpDecorate %22 Binding 0 OpMemberDecorate %50 0 Offset 0 OpDecorate %50 Block OpDecorate %52 DescriptorSet 0 OpDecorate %52 Binding 1 OpDecorate %73 BuiltIn WorkgroupSize %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypePointer Function %6 %9 = OpTypeInt 32 0 %10 = OpTypeVector %9 3 %11 = OpTypePointer Input %10 %12 = OpVariable %11 Input %13 = OpConstant %9 0 %14 = OpTypePointer Input %9 %19 = OpTypeRuntimeArray %6 %20 = OpTypeStruct %6 %19 %21 = OpTypePointer Uniform %20 %22 = OpVariable %21 Uniform %23 = OpConstant %6 0 %24 = OpTypePointer Uniform %6 %34 = OpConstant %6 2 %35 = OpTypeBool %41 = OpConstant %6 1 %48 = OpTypeFloat 32 %49 = OpTypeVector %48 2 %50 = OpTypeStruct %49 %51 = OpTypePointer Uniform %50 %52 = OpVariable %51 Uniform %53 = OpTypePointer Uniform %48 %56 = OpConstant %48 100 %61 = OpConstant %9 2 %62 = OpConstant %9 264 %69 = OpConstant %6 42 %71 = OpConstant %9 16 %72 = OpConstant %9 1 %73 = OpConstantComposite %10 %71 %72 %72 %4 = OpFunction %2 None %3 %5 = OpLabel %8 = OpVariable %7 Function %18 = OpVariable %7 Function %27 = OpVariable %7 Function %15 = OpAccessChain %14 %12 %13 %16 = OpLoad %9 %15 %17 = OpBitcast %6 %16 OpStore %8 %17 %25 = OpAccessChain %24 %22 %23 %26 = OpLoad %6 %25 OpStore %18 %26 OpStore %27 %23 OpBranch %28 %28 = OpLabel OpLoopMerge %30 %31 None OpBranch %32 %32 = OpLabel %33 = OpLoad %6 %27 %36 = OpSLessThan %35 %33 %34 OpBranchConditional %36 %29 %30 %29 = OpLabel %37 = OpLoad %6 %8 %38 = OpSGreaterThan %35 %37 %23 OpSelectionMerge %40 None OpBranchConditional %38 %39 %40 %39 = OpLabel %42 = OpLoad %6 %8 %43 = OpISub %6 %42 %41 %44 = OpAccessChain %24 %22 %41 %43 %45 = OpLoad %6 %44 %46 = OpLoad %6 %18 %47 = OpIAdd %6 %46 %45 OpStore %18 %47 %54 = OpAccessChain %53 %52 %23 %13 %55 = OpLoad %48 %54 %57 = OpFOrdGreaterThan %35 %55 %56 OpSelectionMerge %59 None OpBranchConditional %57 %58 %59 %58 = OpLabel OpBranch %30 %59 = OpLabel OpBranch %40 %40 = OpLabel OpControlBarrier %61 %61 %62 OpBranch %31 %31 = OpLabel %63 = OpLoad %6 %27 %64 = OpIAdd %6 %63 %41 OpStore %27 %64 OpBranch %28 %30 = OpLabel %65 = OpLoad %6 %8 %66 = OpIEqual %35 %65 %23 OpSelectionMerge %68 None OpBranchConditional %66 %67 %68 %67 = OpLabel %70 = OpAccessChain %24 %22 %41 %23 OpStore %70 %69 OpBranch %68 %68 = OpLabel OpReturn OpFunctionEnd [test] ## Uniforms # injectionSwitch uniform ubo 0:1 vec2 0 0.0 1.0 ## SSBO ssbo 0 subdata int 0 12345 ssbo 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 compute 1 1 1 probe ssbo int 0 4 == 42