# Copyright 2019 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 dead barriers # Checks that the output value is 42. # Passes because main always writes 42 to out_data. # 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 theSSBO # { # int out_data; # }; # # layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; # void main() # { # out_data = 42; # if (injectionSwitch.x > injectionSwitch.y) // false # { # barrier(); # } # # if (injectionSwitch.x > injectionSwitch.y) // false # { # barrier(); # } # # // single iteration loop # for ( # int i = int(injectionSwitch.y); // 1 # i > 0; # --i) # { # barrier(); # } # # float GLF_live3s = 0.0; # # // single iteration loop # do # { # // single iteration loop # for ( # int i = 1; # i < 2; # i++) # { # if (injectionSwitch.x > 1.0) // false # { # barrier(); # } # # if (injectionSwitch.x > injectionSwitch.y) // false # { # barrier(); # } # # // single iteration loop # for ( # int z = int(injectionSwitch.y); // 1 # z > 0; # --z) # { # GLF_live3s += 1.0; # } # # if (i >= 1) // true # { # if (injectionSwitch.x > 1.0) // false # { # barrier(); # } # } # } # } while (injectionSwitch.x > injectionSwitch.y); // false # # } [compute shader spirv] ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 115 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %4 "main" OpExecutionMode %4 LocalSize 1 1 1 OpSource ESSL 310 OpName %4 "main" OpName %7 "theSSBO" OpMemberName %7 0 "out_data" OpName %9 "" OpName %16 "buf1" OpMemberName %16 0 "injectionSwitch" OpName %18 "" OpName %41 "i" OpName %56 "GLF_live3s" OpName %62 "i" OpName %84 "z" OpMemberDecorate %7 0 Offset 0 OpDecorate %7 BufferBlock OpDecorate %9 DescriptorSet 0 OpDecorate %9 Binding 0 OpMemberDecorate %16 0 Offset 0 OpDecorate %16 Block OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 1 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypeStruct %6 %8 = OpTypePointer Uniform %7 %9 = OpVariable %8 Uniform %10 = OpConstant %6 0 %11 = OpConstant %6 42 %12 = OpTypePointer Uniform %6 %14 = OpTypeFloat 32 %15 = OpTypeVector %14 2 %16 = OpTypeStruct %15 %17 = OpTypePointer Uniform %16 %18 = OpVariable %17 Uniform %19 = OpTypeInt 32 0 %20 = OpConstant %19 0 %21 = OpTypePointer Uniform %14 %24 = OpConstant %19 1 %27 = OpTypeBool %31 = OpConstant %19 2 %32 = OpConstant %19 264 %40 = OpTypePointer Function %6 %53 = OpConstant %6 1 %55 = OpTypePointer Function %14 %57 = OpConstant %14 0 %69 = OpConstant %6 2 %73 = OpConstant %14 1 %4 = OpFunction %2 None %3 %5 = OpLabel %41 = OpVariable %40 Function %56 = OpVariable %55 Function %62 = OpVariable %40 Function %84 = OpVariable %40 Function %13 = OpAccessChain %12 %9 %10 OpStore %13 %11 %22 = OpAccessChain %21 %18 %10 %20 %23 = OpLoad %14 %22 %25 = OpAccessChain %21 %18 %10 %24 %26 = OpLoad %14 %25 %28 = OpFOrdGreaterThan %27 %23 %26 OpSelectionMerge %30 None OpBranchConditional %28 %29 %30 %29 = OpLabel OpControlBarrier %31 %31 %32 OpBranch %30 %30 = OpLabel %33 = OpAccessChain %21 %18 %10 %20 %34 = OpLoad %14 %33 %35 = OpAccessChain %21 %18 %10 %24 %36 = OpLoad %14 %35 %37 = OpFOrdGreaterThan %27 %34 %36 OpSelectionMerge %39 None OpBranchConditional %37 %38 %39 %38 = OpLabel OpControlBarrier %31 %31 %32 OpBranch %39 %39 = OpLabel %42 = OpAccessChain %21 %18 %10 %24 %43 = OpLoad %14 %42 %44 = OpConvertFToS %6 %43 OpStore %41 %44 OpBranch %45 %45 = OpLabel OpLoopMerge %47 %48 None OpBranch %49 %49 = OpLabel %50 = OpLoad %6 %41 %51 = OpSGreaterThan %27 %50 %10 OpBranchConditional %51 %46 %47 %46 = OpLabel OpControlBarrier %31 %31 %32 OpBranch %48 %48 = OpLabel %52 = OpLoad %6 %41 %54 = OpISub %6 %52 %53 OpStore %41 %54 OpBranch %45 %47 = OpLabel OpStore %56 %57 OpBranch %58 %58 = OpLabel OpLoopMerge %60 %61 None OpBranch %59 %59 = OpLabel OpStore %62 %53 OpBranch %63 %63 = OpLabel OpLoopMerge %65 %66 None OpBranch %67 %67 = OpLabel %68 = OpLoad %6 %62 %70 = OpSLessThan %27 %68 %69 OpBranchConditional %70 %64 %65 %64 = OpLabel %71 = OpAccessChain %21 %18 %10 %20 %72 = OpLoad %14 %71 %74 = OpFOrdGreaterThan %27 %72 %73 OpSelectionMerge %76 None OpBranchConditional %74 %75 %76 %75 = OpLabel OpControlBarrier %31 %31 %32 OpBranch %76 %76 = OpLabel %77 = OpAccessChain %21 %18 %10 %20 %78 = OpLoad %14 %77 %79 = OpAccessChain %21 %18 %10 %24 %80 = OpLoad %14 %79 %81 = OpFOrdGreaterThan %27 %78 %80 OpSelectionMerge %83 None OpBranchConditional %81 %82 %83 %82 = OpLabel OpControlBarrier %31 %31 %32 OpBranch %83 %83 = OpLabel %85 = OpAccessChain %21 %18 %10 %24 %86 = OpLoad %14 %85 %87 = OpConvertFToS %6 %86 OpStore %84 %87 OpBranch %88 %88 = OpLabel OpLoopMerge %90 %91 None OpBranch %92 %92 = OpLabel %93 = OpLoad %6 %84 %94 = OpSGreaterThan %27 %93 %10 OpBranchConditional %94 %89 %90 %89 = OpLabel %95 = OpLoad %14 %56 %96 = OpFAdd %14 %95 %73 OpStore %56 %96 OpBranch %91 %91 = OpLabel %97 = OpLoad %6 %84 %98 = OpISub %6 %97 %53 OpStore %84 %98 OpBranch %88 %90 = OpLabel %99 = OpLoad %6 %62 %100 = OpSGreaterThanEqual %27 %99 %53 OpSelectionMerge %102 None OpBranchConditional %100 %101 %102 %101 = OpLabel %103 = OpAccessChain %21 %18 %10 %20 %104 = OpLoad %14 %103 %105 = OpFOrdGreaterThan %27 %104 %73 OpSelectionMerge %107 None OpBranchConditional %105 %106 %107 %106 = OpLabel OpControlBarrier %31 %31 %32 OpBranch %107 %107 = OpLabel OpBranch %102 %102 = OpLabel OpBranch %66 %66 = OpLabel %108 = OpLoad %6 %62 %109 = OpIAdd %6 %108 %53 OpStore %62 %109 OpBranch %63 %65 = OpLabel OpBranch %61 %61 = OpLabel %110 = OpAccessChain %21 %18 %10 %20 %111 = OpLoad %14 %110 %112 = OpAccessChain %21 %18 %10 %24 %113 = OpLoad %14 %112 %114 = OpFOrdGreaterThan %27 %111 %113 OpBranchConditional %114 %58 %60 %60 = OpLabel OpReturn OpFunctionEnd [test] ## Uniforms # injectionSwitch uniform ubo 0:1 vec2 0 0.0 1.0 ## SSBO ssbo 0 subdata int 0 0 compute 1 1 1 probe ssbo int 0 0 == 42