#!amber # Copyright 2020 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 coverage-gap found by GraphicsFuzz. # Short description: A fragment shader that covers a specific DAG combiner code path # The test passes because the shader always writes red. SHADER vertex variant_vertex_shader PASSTHROUGH # variant_fragment_shader is derived from the following GLSL: # #version 310 es # precision highp float; # precision highp int; # # layout(location = 0) out vec4 _GLF_color; # layout(set = 0, binding = 0) uniform buf0 # { # float one; # }; # # void main() # { # vec3 v; # float f = one; # int a = 1, b = 0, c = 1; # # for (int i = 0; i < 3; i++) # v[i] = f + float(i); # # if(one == 1.0) # { # do # { # _GLF_color = vec4(0); # } # while ((c & (a | b)) == 0); # # if(one == 1.0) # _GLF_color = vec4(1); # } # # _GLF_color.rgb = vec3(v.x == 1.0 ? 1.0 : 0.0, # v.y == 2.0 ? 0.0 : 1.0, # v.z == 3.0 ? 0.0 : 1.0); # _GLF_color.a = 1.0; # } SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 8 ; Bound: 94 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %55 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpName %4 "main" OpName %8 "f" OpName %9 "buf0" OpMemberName %9 0 "one" OpName %11 "" OpName %18 "a" OpName %20 "b" OpName %21 "c" OpName %22 "i" OpName %34 "v" OpName %55 "_GLF_color" OpMemberDecorate %9 0 Offset 0 OpDecorate %9 Block OpDecorate %11 DescriptorSet 0 OpDecorate %11 Binding 0 OpDecorate %55 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypePointer Function %6 %9 = OpTypeStruct %6 %10 = OpTypePointer Uniform %9 %11 = OpVariable %10 Uniform %12 = OpTypeInt 32 1 %13 = OpConstant %12 0 %14 = OpTypePointer Uniform %6 %17 = OpTypePointer Function %12 %19 = OpConstant %12 1 %29 = OpConstant %12 3 %30 = OpTypeBool %32 = OpTypeVector %6 3 %33 = OpTypePointer Function %32 %45 = OpConstant %6 1 %53 = OpTypeVector %6 4 %54 = OpTypePointer Output %53 %55 = OpVariable %54 Output %56 = OpConstant %6 0 %57 = OpConstantComposite %53 %56 %56 %56 %56 %69 = OpConstantComposite %53 %45 %45 %45 %45 %70 = OpTypeInt 32 0 %71 = OpConstant %70 0 %76 = OpConstant %70 1 %79 = OpConstant %6 2 %82 = OpConstant %70 2 %85 = OpConstant %6 3 %91 = OpConstant %70 3 %92 = OpTypePointer Output %6 %4 = OpFunction %2 None %3 %5 = OpLabel %8 = OpVariable %7 Function %18 = OpVariable %17 Function %20 = OpVariable %17 Function %21 = OpVariable %17 Function %22 = OpVariable %17 Function %34 = OpVariable %33 Function %15 = OpAccessChain %14 %11 %13 %16 = OpLoad %6 %15 OpStore %8 %16 OpStore %18 %19 OpStore %20 %13 OpStore %21 %19 OpStore %22 %13 OpBranch %23 %23 = OpLabel OpLoopMerge %25 %26 None OpBranch %27 %27 = OpLabel %28 = OpLoad %12 %22 %31 = OpSLessThan %30 %28 %29 OpBranchConditional %31 %24 %25 %24 = OpLabel %35 = OpLoad %12 %22 %36 = OpLoad %6 %8 %37 = OpLoad %12 %22 %38 = OpConvertSToF %6 %37 %39 = OpFAdd %6 %36 %38 %40 = OpAccessChain %7 %34 %35 OpStore %40 %39 OpBranch %26 %26 = OpLabel %41 = OpLoad %12 %22 %42 = OpIAdd %12 %41 %19 OpStore %22 %42 OpBranch %23 %25 = OpLabel %43 = OpAccessChain %14 %11 %13 %44 = OpLoad %6 %43 %46 = OpFOrdEqual %30 %44 %45 OpSelectionMerge %48 None OpBranchConditional %46 %47 %48 %47 = OpLabel OpBranch %49 %49 = OpLabel OpLoopMerge %51 %52 None OpBranch %50 %50 = OpLabel OpStore %55 %57 OpBranch %52 %52 = OpLabel %58 = OpLoad %12 %21 %59 = OpLoad %12 %18 %60 = OpLoad %12 %20 %61 = OpBitwiseOr %12 %59 %60 %62 = OpBitwiseAnd %12 %58 %61 %63 = OpIEqual %30 %62 %13 OpBranchConditional %63 %49 %51 %51 = OpLabel %64 = OpAccessChain %14 %11 %13 %65 = OpLoad %6 %64 %66 = OpFOrdEqual %30 %65 %45 OpSelectionMerge %68 None OpBranchConditional %66 %67 %68 %67 = OpLabel OpStore %55 %69 OpBranch %68 %68 = OpLabel OpBranch %48 %48 = OpLabel %72 = OpAccessChain %7 %34 %71 %73 = OpLoad %6 %72 %74 = OpFOrdEqual %30 %73 %45 %75 = OpSelect %6 %74 %45 %56 %77 = OpAccessChain %7 %34 %76 %78 = OpLoad %6 %77 %80 = OpFOrdEqual %30 %78 %79 %81 = OpSelect %6 %80 %56 %45 %83 = OpAccessChain %7 %34 %82 %84 = OpLoad %6 %83 %86 = OpFOrdEqual %30 %84 %85 %87 = OpSelect %6 %86 %56 %45 %88 = OpCompositeConstruct %32 %75 %81 %87 %89 = OpLoad %53 %55 %90 = OpVectorShuffle %53 %89 %88 4 5 6 3 OpStore %55 %90 %93 = OpAccessChain %92 %55 %91 OpStore %93 %45 OpReturn OpFunctionEnd END # uniforms for variant # one BUFFER variant_one DATA_TYPE float DATA 1.0 END BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics variant_pipeline ATTACH variant_vertex_shader ATTACH variant_fragment_shader FRAMEBUFFER_SIZE 256 256 BIND BUFFER variant_framebuffer AS color LOCATION 0 BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0 END CLEAR_COLOR variant_pipeline 0 0 0 255 CLEAR variant_pipeline RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255