| #!amber |
| |
| # Copyright 2021 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 the GraphicsFuzz project. |
| |
| # Short description: A fragment shader that covers specific LLVM code paths |
| |
| # The test passes because the shader always writes red. |
| |
| # Optimized using spirv-opt with the following arguments: |
| # '--copy-propagate-arrays' |
| # '--eliminate-dead-branches' |
| # '--merge-blocks' |
| # '--private-to-local' |
| # '--reduce-load-size' |
| # '--eliminate-dead-code-aggressive' |
| # '--ccp' |
| # '--reduce-load-size' |
| # '--convert-local-access-chains' |
| # '--eliminate-dead-branches' |
| # '--merge-return' |
| # '--eliminate-local-single-block' |
| # '--eliminate-dead-code-aggressive' |
| # '--redundancy-elimination' |
| # '--eliminate-dead-branches' |
| # '--merge-return' |
| # '--eliminate-local-multi-store' |
| # '--reduce-load-size' |
| # '--inline-entry-points-exhaustive' |
| # '--vector-dce' |
| # '--eliminate-dead-branches' |
| # '--merge-return' |
| # '--eliminate-local-multi-store' |
| # '--eliminate-dead-branches' |
| # '--merge-blocks' |
| # '--eliminate-local-single-store' |
| # spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af |
| |
| |
| |
| SHADER vertex variant_vertex_shader PASSTHROUGH |
| |
| # variant_fragment_shader is derived from the following GLSL: |
| # #version 320 es |
| # #define _float_1_0 _GLF_uniform_float_values[0] |
| # #define _float_0_0 _GLF_uniform_float_values[1] |
| # |
| # precision highp float; |
| # precision highp int; |
| # |
| # // Contents of _GLF_uniform_float_values: [1.0, 0.0] |
| # layout(set = 0, binding = 0) uniform buf0 |
| # { |
| # float _GLF_uniform_float_values[2]; |
| # }; |
| # |
| # const int _GLF_global_loop_bound = 10; |
| # int _GLF_global_loop_count = 0; |
| # |
| # layout(location = 0) out vec4 _GLF_color; |
| # |
| # // Returns values 1.0 or greater. |
| # float func(float x) |
| # { |
| # float f = 1.0; |
| # |
| # while(_GLF_global_loop_count < _GLF_global_loop_bound) |
| # { |
| # _GLF_global_loop_count ++; |
| # |
| # f += _float_1_0; |
| # _GLF_color = vec4(_float_0_0); |
| # |
| # // Always true. |
| # if(gl_FragCoord.x >= _float_0_0) |
| # { |
| # _GLF_color = vec4(_float_1_0); |
| # } |
| # |
| # // Always false. |
| # if(x < _float_0_0) |
| # { |
| # return f; |
| # } |
| # } |
| # |
| # return f; |
| # } |
| # |
| # void main() |
| # { |
| # // Always false. |
| # if(gl_FragCoord.x < 0.1) |
| # { |
| # return; |
| # } |
| # |
| # // Always false. |
| # if(gl_FragCoord.y < 0.1) |
| # { |
| # return; |
| # } |
| # |
| # // v becomes (x, 0, 0, x), where x >= 1. |
| # vec4 v = vec4(_float_0_0); |
| # v.x = v.w = func(gl_FragCoord.y); |
| # |
| # // Always false. |
| # if(gl_FragCoord.x < 0.0) |
| # { |
| # return; |
| # } |
| # |
| # // Result clamps to (1, 0, 0, 1) |
| # _GLF_color = v; |
| # } |
| SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 |
| ; SPIR-V |
| ; Version: 1.0 |
| ; Generator: Khronos Glslang Reference Front End; 10 |
| ; Bound: 171 |
| ; Schema: 0 |
| OpCapability Shader |
| %1 = OpExtInstImport "GLSL.std.450" |
| OpMemoryModel Logical GLSL450 |
| OpEntryPoint Fragment %4 "main" %43 %48 |
| OpExecutionMode %4 OriginUpperLeft |
| OpSource ESSL 320 |
| OpName %4 "main" |
| OpName %10 "func(f1;" |
| OpName %9 "x" |
| OpName %14 "_GLF_global_loop_count" |
| OpName %16 "f" |
| OpName %33 "buf0" |
| OpMemberName %33 0 "_GLF_uniform_float_values" |
| OpName %35 "" |
| OpName %43 "_GLF_color" |
| OpName %48 "gl_FragCoord" |
| OpName %87 "v" |
| OpName %91 "param" |
| OpDecorate %32 ArrayStride 16 |
| OpMemberDecorate %33 0 Offset 0 |
| OpDecorate %33 Block |
| OpDecorate %35 DescriptorSet 0 |
| OpDecorate %35 Binding 0 |
| OpDecorate %43 Location 0 |
| OpDecorate %48 BuiltIn FragCoord |
| %2 = OpTypeVoid |
| %3 = OpTypeFunction %2 |
| %6 = OpTypeFloat 32 |
| %7 = OpTypePointer Function %6 |
| %8 = OpTypeFunction %6 %7 |
| %12 = OpTypeInt 32 1 |
| %13 = OpTypePointer Private %12 |
| %14 = OpVariable %13 Private |
| %15 = OpConstant %12 0 |
| %17 = OpConstant %6 1 |
| %24 = OpConstant %12 10 |
| %25 = OpTypeBool |
| %28 = OpConstant %12 1 |
| %30 = OpTypeInt 32 0 |
| %31 = OpConstant %30 2 |
| %32 = OpTypeArray %6 %31 |
| %33 = OpTypeStruct %32 |
| %34 = OpTypePointer Uniform %33 |
| %35 = OpVariable %34 Uniform |
| %36 = OpTypePointer Uniform %6 |
| %41 = OpTypeVector %6 4 |
| %42 = OpTypePointer Output %41 |
| %43 = OpVariable %42 Output |
| %47 = OpTypePointer Input %41 |
| %48 = OpVariable %47 Input |
| %49 = OpConstant %30 0 |
| %50 = OpTypePointer Input %6 |
| %74 = OpConstant %6 0.100000001 |
| %79 = OpConstant %30 1 |
| %86 = OpTypePointer Function %41 |
| %100 = OpConstant %6 0 |
| %112 = OpConstantFalse %25 |
| %113 = OpTypePointer Function %25 |
| %115 = OpConstantTrue %25 |
| %132 = OpUndef %6 |
| %4 = OpFunction %2 None %3 |
| %5 = OpLabel |
| %134 = OpVariable %113 Function %112 |
| %135 = OpVariable %7 Function |
| %136 = OpVariable %7 Function |
| %137 = OpVariable %7 Function |
| %87 = OpVariable %86 Function |
| %91 = OpVariable %7 Function |
| OpSelectionMerge %110 None |
| OpSwitch %49 %111 |
| %111 = OpLabel |
| OpStore %14 %15 |
| %72 = OpAccessChain %50 %48 %49 |
| %73 = OpLoad %6 %72 |
| %75 = OpFOrdLessThan %25 %73 %74 |
| OpSelectionMerge %77 None |
| OpBranchConditional %75 %76 %77 |
| %76 = OpLabel |
| OpBranch %110 |
| %77 = OpLabel |
| %80 = OpAccessChain %50 %48 %79 |
| %81 = OpLoad %6 %80 |
| %82 = OpFOrdLessThan %25 %81 %74 |
| OpSelectionMerge %84 None |
| OpBranchConditional %82 %83 %84 |
| %83 = OpLabel |
| OpBranch %110 |
| %84 = OpLabel |
| %88 = OpAccessChain %36 %35 %15 %28 |
| %89 = OpLoad %6 %88 |
| %90 = OpCompositeConstruct %41 %89 %89 %89 %89 |
| OpStore %87 %90 |
| OpStore %91 %81 |
| OpStore %134 %112 |
| OpSelectionMerge %169 None |
| OpSwitch %49 %139 |
| %139 = OpLabel |
| OpStore %136 %17 |
| OpBranch %140 |
| %140 = OpLabel |
| %141 = OpPhi %6 %17 %139 %149 %163 |
| %142 = OpLoad %12 %14 |
| %143 = OpSLessThan %25 %142 %24 |
| OpLoopMerge %164 %163 None |
| OpBranchConditional %143 %144 %164 |
| %144 = OpLabel |
| %145 = OpLoad %12 %14 |
| %146 = OpIAdd %12 %145 %28 |
| OpStore %14 %146 |
| %147 = OpAccessChain %36 %35 %15 %15 |
| %148 = OpLoad %6 %147 |
| %149 = OpFAdd %6 %141 %148 |
| OpStore %136 %149 |
| %150 = OpAccessChain %36 %35 %15 %28 |
| %151 = OpLoad %6 %150 |
| %152 = OpCompositeConstruct %41 %151 %151 %151 %151 |
| OpStore %43 %152 |
| %153 = OpAccessChain %50 %48 %49 |
| %154 = OpLoad %6 %153 |
| %155 = OpFOrdGreaterThanEqual %25 %154 %151 |
| OpSelectionMerge %158 None |
| OpBranchConditional %155 %156 %158 |
| %156 = OpLabel |
| %157 = OpCompositeConstruct %41 %148 %148 %148 %148 |
| OpStore %43 %157 |
| OpBranch %158 |
| %158 = OpLabel |
| %160 = OpFOrdLessThan %25 %81 %151 |
| OpSelectionMerge %162 None |
| OpBranchConditional %160 %161 %162 |
| %161 = OpLabel |
| OpStore %134 %115 |
| OpStore %135 %149 |
| OpBranch %164 |
| %162 = OpLabel |
| OpBranch %163 |
| %163 = OpLabel |
| OpBranch %140 |
| %164 = OpLabel |
| %165 = OpPhi %6 %132 %140 %149 %161 |
| %166 = OpPhi %6 %141 %140 %149 %161 |
| %167 = OpPhi %25 %112 %140 %115 %161 |
| OpSelectionMerge %168 None |
| OpBranchConditional %167 %169 %168 |
| %168 = OpLabel |
| OpStore %134 %115 |
| OpStore %135 %166 |
| OpBranch %169 |
| %169 = OpLabel |
| %170 = OpPhi %6 %165 %164 %166 %168 |
| OpStore %137 %170 |
| %107 = OpCompositeInsert %41 %170 %90 3 |
| %109 = OpCompositeInsert %41 %170 %107 0 |
| OpStore %87 %109 |
| %101 = OpFOrdLessThan %25 %73 %100 |
| OpSelectionMerge %103 None |
| OpBranchConditional %101 %102 %103 |
| %102 = OpLabel |
| OpBranch %110 |
| %103 = OpLabel |
| OpStore %43 %109 |
| OpBranch %110 |
| %110 = OpLabel |
| OpReturn |
| OpFunctionEnd |
| %10 = OpFunction %6 None %8 |
| %9 = OpFunctionParameter %7 |
| %11 = OpLabel |
| %120 = OpVariable %113 Function %112 |
| %117 = OpVariable %7 Function |
| %16 = OpVariable %7 Function |
| OpSelectionMerge %116 None |
| OpSwitch %49 %119 |
| %119 = OpLabel |
| OpStore %16 %17 |
| OpBranch %18 |
| %18 = OpLabel |
| %123 = OpPhi %6 %17 %119 %40 %21 |
| %23 = OpLoad %12 %14 |
| %26 = OpSLessThan %25 %23 %24 |
| OpLoopMerge %20 %21 None |
| OpBranchConditional %26 %19 %20 |
| %19 = OpLabel |
| %27 = OpLoad %12 %14 |
| %29 = OpIAdd %12 %27 %28 |
| OpStore %14 %29 |
| %37 = OpAccessChain %36 %35 %15 %15 |
| %38 = OpLoad %6 %37 |
| %40 = OpFAdd %6 %123 %38 |
| OpStore %16 %40 |
| %44 = OpAccessChain %36 %35 %15 %28 |
| %45 = OpLoad %6 %44 |
| %46 = OpCompositeConstruct %41 %45 %45 %45 %45 |
| OpStore %43 %46 |
| %51 = OpAccessChain %50 %48 %49 |
| %52 = OpLoad %6 %51 |
| %55 = OpFOrdGreaterThanEqual %25 %52 %45 |
| OpSelectionMerge %57 None |
| OpBranchConditional %55 %56 %57 |
| %56 = OpLabel |
| %60 = OpCompositeConstruct %41 %38 %38 %38 %38 |
| OpStore %43 %60 |
| OpBranch %57 |
| %57 = OpLabel |
| %61 = OpLoad %6 %9 |
| %64 = OpFOrdLessThan %25 %61 %45 |
| OpSelectionMerge %66 None |
| OpBranchConditional %64 %65 %66 |
| %65 = OpLabel |
| OpStore %120 %115 |
| OpStore %117 %40 |
| OpBranch %20 |
| %66 = OpLabel |
| OpBranch %21 |
| %21 = OpLabel |
| OpBranch %18 |
| %20 = OpLabel |
| %130 = OpPhi %6 %132 %18 %40 %65 |
| %128 = OpPhi %6 %123 %18 %40 %65 |
| %125 = OpPhi %25 %112 %18 %115 %65 |
| OpSelectionMerge %121 None |
| OpBranchConditional %125 %116 %121 |
| %121 = OpLabel |
| OpStore %120 %115 |
| OpStore %117 %128 |
| OpBranch %116 |
| %116 = OpLabel |
| %129 = OpPhi %6 %130 %20 %128 %121 |
| OpReturnValue %129 |
| OpFunctionEnd |
| END |
| |
| # uniforms for variant |
| |
| # _GLF_uniform_float_values |
| BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA |
| 1.0 0.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__GLF_uniform_float_values 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 |