#!amber # 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 two barrier functions # The test passes because main always outputs 42. # variant_compute_shader is derived from the following GLSL: # #version 310 es # precision highp float; # # layout(std430, binding = 0) buffer doesNotMatter # { # uint _compute_data[]; # }; # layout(local_size_x = 1, local_size_y = 18, local_size_z = 6) in; # mediump vec4 GLF_live2gl_FragCoord; # layout(set = 0, binding = 1) uniform buf0 { # vec2 injectionSwitch; # }; # # void main() # { # int GLF_live2_looplimiter1 = 0; # for ( # int i = 0; # i < 1; # ++i) # { # if (GLF_live2_looplimiter1 >= 3) //always false # { # for ( # int j = 0; # j < 1; # ++j) # { # if (int(GLF_live2gl_FragCoord.x) < 120) # { # } # else # { # barrier(); # } # } # break; # } # } # float GLF_dead3x = (injectionSwitch.x > injectionSwitch.y ? GLF_live2gl_FragCoord.x : 0.0); // always 0.0 # for ( # int GLF_dead3k = 0; # GLF_dead3k < 2; # ++GLF_dead3k) # { # if (GLF_dead3x > 4.0) //always false # { # break; # } # GLF_dead3x = GLF_live2gl_FragCoord.x; # barrier(); # } # # _compute_data[0] = 42u; # } SHADER compute variant_compute_shader SPIRV-ASM TARGET_ENV spv1.0 ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 106 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %4 "main" OpExecutionMode %4 LocalSize 1 18 6 OpSource ESSL 310 OpName %4 "main" OpName %8 "GLF_live2_looplimiter1" OpName %10 "i" OpName %25 "j" OpName %36 "GLF_live2gl_FragCoord" OpName %56 "GLF_dead3x" OpName %58 "buf0" OpMemberName %58 0 "injectionSwitch" OpName %60 "" OpName %76 "GLF_dead3k" OpName %96 "doesNotMatter" OpMemberName %96 0 "_compute_data" OpName %98 "" OpDecorate %36 RelaxedPrecision OpDecorate %41 RelaxedPrecision OpMemberDecorate %58 0 Offset 0 OpDecorate %58 Block OpDecorate %60 DescriptorSet 0 OpDecorate %60 Binding 1 OpDecorate %72 RelaxedPrecision OpDecorate %75 RelaxedPrecision OpDecorate %92 RelaxedPrecision OpDecorate %95 ArrayStride 4 OpMemberDecorate %96 0 Offset 0 OpDecorate %96 BufferBlock OpDecorate %98 DescriptorSet 0 OpDecorate %98 Binding 0 OpDecorate %105 BuiltIn WorkgroupSize %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypePointer Function %6 %9 = OpConstant %6 0 %17 = OpConstant %6 1 %18 = OpTypeBool %21 = OpConstant %6 3 %33 = OpTypeFloat 32 %34 = OpTypeVector %33 4 %35 = OpTypePointer Private %34 %36 = OpVariable %35 Private %37 = OpTypeInt 32 0 %38 = OpConstant %37 0 %39 = OpTypePointer Private %33 %43 = OpConstant %6 120 %48 = OpConstant %37 2 %49 = OpConstant %37 264 %55 = OpTypePointer Function %33 %57 = OpTypeVector %33 2 %58 = OpTypeStruct %57 %59 = OpTypePointer Uniform %58 %60 = OpVariable %59 Uniform %61 = OpTypePointer Uniform %33 %64 = OpConstant %37 1 %74 = OpConstant %33 0 %83 = OpConstant %6 2 %86 = OpConstant %33 4 %95 = OpTypeRuntimeArray %37 %96 = OpTypeStruct %95 %97 = OpTypePointer Uniform %96 %98 = OpVariable %97 Uniform %99 = OpConstant %37 42 %100 = OpTypePointer Uniform %37 %102 = OpTypeVector %37 3 %103 = OpConstant %37 18 %104 = OpConstant %37 6 %105 = OpConstantComposite %102 %64 %103 %104 %4 = OpFunction %2 None %3 %5 = OpLabel %8 = OpVariable %7 Function %10 = OpVariable %7 Function %25 = OpVariable %7 Function %56 = OpVariable %55 Function %68 = OpVariable %55 Function %76 = OpVariable %7 Function OpStore %8 %9 OpStore %10 %9 OpBranch %11 %11 = OpLabel OpLoopMerge %13 %14 None OpBranch %15 %15 = OpLabel %16 = OpLoad %6 %10 %19 = OpSLessThan %18 %16 %17 OpBranchConditional %19 %12 %13 %12 = OpLabel %20 = OpLoad %6 %8 %22 = OpSGreaterThanEqual %18 %20 %21 OpSelectionMerge %24 None OpBranchConditional %22 %23 %24 %23 = OpLabel OpStore %25 %9 OpBranch %26 %26 = OpLabel OpLoopMerge %28 %29 None OpBranch %30 %30 = OpLabel %31 = OpLoad %6 %25 %32 = OpSLessThan %18 %31 %17 OpBranchConditional %32 %27 %28 %27 = OpLabel %40 = OpAccessChain %39 %36 %38 %41 = OpLoad %33 %40 %42 = OpConvertFToS %6 %41 %44 = OpSLessThan %18 %42 %43 OpSelectionMerge %46 None OpBranchConditional %44 %45 %47 %45 = OpLabel OpBranch %46 %47 = OpLabel OpControlBarrier %48 %48 %49 OpBranch %46 %46 = OpLabel OpBranch %29 %29 = OpLabel %50 = OpLoad %6 %25 %51 = OpIAdd %6 %50 %17 OpStore %25 %51 OpBranch %26 %28 = OpLabel OpBranch %13 %24 = OpLabel OpBranch %14 %14 = OpLabel %53 = OpLoad %6 %10 %54 = OpIAdd %6 %53 %17 OpStore %10 %54 OpBranch %11 %13 = OpLabel %62 = OpAccessChain %61 %60 %9 %38 %63 = OpLoad %33 %62 %65 = OpAccessChain %61 %60 %9 %64 %66 = OpLoad %33 %65 %67 = OpFOrdGreaterThan %18 %63 %66 OpSelectionMerge %70 None OpBranchConditional %67 %69 %73 %69 = OpLabel %71 = OpAccessChain %39 %36 %38 %72 = OpLoad %33 %71 OpStore %68 %72 OpBranch %70 %73 = OpLabel OpStore %68 %74 OpBranch %70 %70 = OpLabel %75 = OpLoad %33 %68 OpStore %56 %75 OpStore %76 %9 OpBranch %77 %77 = OpLabel OpLoopMerge %79 %80 None OpBranch %81 %81 = OpLabel %82 = OpLoad %6 %76 %84 = OpSLessThan %18 %82 %83 OpBranchConditional %84 %78 %79 %78 = OpLabel %85 = OpLoad %33 %56 %87 = OpFOrdGreaterThan %18 %85 %86 OpSelectionMerge %89 None OpBranchConditional %87 %88 %89 %88 = OpLabel OpBranch %79 %89 = OpLabel %91 = OpAccessChain %39 %36 %38 %92 = OpLoad %33 %91 OpStore %56 %92 OpControlBarrier %48 %48 %49 OpBranch %80 %80 = OpLabel %93 = OpLoad %6 %76 %94 = OpIAdd %6 %93 %17 OpStore %76 %94 OpBranch %77 %79 = OpLabel %101 = OpAccessChain %100 %98 %9 %9 OpStore %101 %99 OpReturn OpFunctionEnd END # uniforms for variant # injectionSwitch BUFFER variant_injectionSwitch DATA_TYPE vec2 DATA 0.0 1.0 END BUFFER variant_ssbo DATA_TYPE uint32 DATA 0 0 0 0 0 0 0 0 0 0 END PIPELINE compute variant_pipeline ATTACH variant_compute_shader BIND BUFFER variant_ssbo AS storage DESCRIPTOR_SET 0 BINDING 0 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1 END RUN variant_pipeline 1 6 2 EXPECT variant_ssbo IDX 0 EQ 42