# 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 an early return and a barrier # Checks that the output value is 42. # Passes because main always writes 42 to out_data. # Optimized using spirv-opt with the following arguments: # '-O' # spirv-opt commit hash: a2ef7be242bcacaa9127a3ce011602ec54b2c9ed # Derived from the following GLSL. # Compute shader GLSL: # #version 310 es # # precision highp float; # # layout(std430, binding = 0) buffer theSSBO { # int out_data; # }; # # layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; # void f(vec2 v) # { # if(1.0 < v.x) # { # return; # } # barrier(); # } # void main() # { # out_data = 42; # mat2 m; # for(int i = 1; i > 0; i --) # { # m = mat2(1.0); # } # f(vec2(1.0) * (m - mat2(1.0))); # } [compute shader spirv] ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 87 ; 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 %27 "theSSBO" OpMemberName %27 0 "out_data" OpName %29 "" OpMemberDecorate %27 0 Offset 0 OpDecorate %27 BufferBlock OpDecorate %29 DescriptorSet 0 OpDecorate %29 Binding 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeVector %6 2 %13 = OpConstant %6 1 %14 = OpTypeInt 32 0 %19 = OpTypeBool %24 = OpConstant %14 2 %25 = OpConstant %14 264 %26 = OpTypeInt 32 1 %27 = OpTypeStruct %26 %28 = OpTypePointer Uniform %27 %29 = OpVariable %28 Uniform %30 = OpConstant %26 0 %31 = OpConstant %26 42 %32 = OpTypePointer Uniform %26 %36 = OpConstant %26 1 %44 = OpTypeMatrix %7 2 %47 = OpConstant %6 0 %48 = OpConstantComposite %7 %13 %47 %49 = OpConstantComposite %7 %47 %13 %50 = OpConstantComposite %44 %48 %49 %53 = OpConstantComposite %7 %13 %13 %86 = OpUndef %44 %4 = OpFunction %2 None %3 %5 = OpLabel %33 = OpAccessChain %32 %29 %30 OpStore %33 %31 OpBranch %37 %37 = OpLabel %85 = OpPhi %44 %86 %5 %50 %38 %84 = OpPhi %26 %36 %5 %52 %38 %43 = OpSGreaterThan %19 %84 %30 OpLoopMerge %39 %38 None OpBranchConditional %43 %38 %39 %38 = OpLabel %52 = OpISub %26 %84 %36 OpBranch %37 %39 = OpLabel %55 = OpCompositeExtract %7 %85 0 %57 = OpFSub %7 %55 %48 %58 = OpCompositeExtract %7 %85 1 %60 = OpFSub %7 %58 %49 %61 = OpCompositeConstruct %44 %57 %60 %62 = OpVectorTimesMatrix %7 %53 %61 OpBranch %74 %74 = OpLabel OpLoopMerge %75 %76 None OpBranch %77 %77 = OpLabel %79 = OpCompositeExtract %6 %62 0 %80 = OpFOrdLessThan %19 %13 %79 OpSelectionMerge %81 None OpBranchConditional %80 %82 %81 %82 = OpLabel OpBranch %75 %81 = OpLabel OpControlBarrier %24 %24 %25 OpBranch %75 %76 = OpLabel OpBranch %74 %75 = OpLabel OpReturn OpFunctionEnd [test] ## SSBO ssbo 0 subdata int 0 0 compute 1 1 1 probe ssbo int 0 0 == 42