1#!amber 2 3# Copyright 2021 Google LLC 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16 17 18# A test for a coverage-gap found by the GraphicsFuzz project. 19 20# Short description: A fragment shader that covers specific LLVM code paths 21 22# The test passes because the shader always writes red. 23 24SHADER vertex variant_vertex_shader PASSTHROUGH 25 26# variant_fragment_shader is derived from the following GLSL: 27# #version 320 es 28# 29# #define _int_1 _GLF_uniform_int_values[0] 30# #define _int_0 _GLF_uniform_int_values[1] 31# 32# precision highp int; 33# precision highp float; 34# 35# // Contents of _GLF_uniform_int_values: [1, 0] 36# layout(set = 0, binding = 0) uniform buf0 37# { 38# int _GLF_uniform_int_values[2]; 39# }; 40# 41# const int _GLF_global_loop_bound = 10; 42# int _GLF_global_loop_count = 0; 43# 44# layout(location = 0) out vec4 _GLF_color; 45# 46# void main() 47# { 48# int a = _int_1; 49# 50# // Iterated ten times. 51# while(_GLF_global_loop_count < _GLF_global_loop_bound) 52# { 53# _GLF_global_loop_count ++; 54# 55# int b = _int_1; 56# 57# int arr[10] = int[10](_int_0, (a / a), _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0); 58# 59# // a still has a value of one after this assignment. 60# a = arr[b]; 61# } 62# 63# // Always true. 64# if(a == _int_1) 65# { 66# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); 67# } 68# else 69# { 70# _GLF_color = vec4(_int_0); 71# } 72# } 73SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 74; SPIR-V 75; Version: 1.0 76; Generator: Khronos Glslang Reference Front End; 10 77; Bound: 93 78; Schema: 0 79 OpCapability Shader 80 %1 = OpExtInstImport "GLSL.std.450" 81 OpMemoryModel Logical GLSL450 82 OpEntryPoint Fragment %4 "main" %74 83 OpExecutionMode %4 OriginUpperLeft 84 OpSource ESSL 320 85 OpName %4 "main" 86 OpName %8 "_GLF_global_loop_count" 87 OpName %11 "a" 88 OpName %15 "buf0" 89 OpMemberName %15 0 "_GLF_uniform_int_values" 90 OpName %17 "" 91 OpName %33 "b" 92 OpName %39 "arr" 93 OpName %74 "_GLF_color" 94 OpDecorate %14 ArrayStride 16 95 OpMemberDecorate %15 0 Offset 0 96 OpDecorate %15 Block 97 OpDecorate %17 DescriptorSet 0 98 OpDecorate %17 Binding 0 99 OpDecorate %74 Location 0 100 %2 = OpTypeVoid 101 %3 = OpTypeFunction %2 102 %6 = OpTypeInt 32 1 103 %7 = OpTypePointer Private %6 104 %8 = OpVariable %7 Private 105 %9 = OpConstant %6 0 106 %10 = OpTypePointer Function %6 107 %12 = OpTypeInt 32 0 108 %13 = OpConstant %12 2 109 %14 = OpTypeArray %6 %13 110 %15 = OpTypeStruct %14 111 %16 = OpTypePointer Uniform %15 112 %17 = OpVariable %16 Uniform 113 %18 = OpTypePointer Uniform %6 114 %27 = OpConstant %6 10 115 %28 = OpTypeBool 116 %31 = OpConstant %6 1 117 %36 = OpConstant %12 10 118 %37 = OpTypeArray %6 %36 119 %38 = OpTypePointer Function %37 120 %71 = OpTypeFloat 32 121 %72 = OpTypeVector %71 4 122 %73 = OpTypePointer Output %72 123 %74 = OpVariable %73 Output 124 %4 = OpFunction %2 None %3 125 %5 = OpLabel 126 %11 = OpVariable %10 Function 127 %33 = OpVariable %10 Function 128 %39 = OpVariable %38 Function 129 OpStore %8 %9 130 %19 = OpAccessChain %18 %17 %9 %9 131 %20 = OpLoad %6 %19 132 OpStore %11 %20 133 OpBranch %21 134 %21 = OpLabel 135 OpLoopMerge %23 %24 None 136 OpBranch %25 137 %25 = OpLabel 138 %26 = OpLoad %6 %8 139 %29 = OpSLessThan %28 %26 %27 140 OpBranchConditional %29 %22 %23 141 %22 = OpLabel 142 %30 = OpLoad %6 %8 143 %32 = OpIAdd %6 %30 %31 144 OpStore %8 %32 145 %34 = OpAccessChain %18 %17 %9 %9 146 %35 = OpLoad %6 %34 147 OpStore %33 %35 148 %40 = OpAccessChain %18 %17 %9 %31 149 %41 = OpLoad %6 %40 150 %42 = OpLoad %6 %11 151 %43 = OpLoad %6 %11 152 %44 = OpSDiv %6 %42 %43 153 %45 = OpAccessChain %18 %17 %9 %31 154 %46 = OpLoad %6 %45 155 %47 = OpAccessChain %18 %17 %9 %31 156 %48 = OpLoad %6 %47 157 %49 = OpAccessChain %18 %17 %9 %31 158 %50 = OpLoad %6 %49 159 %51 = OpAccessChain %18 %17 %9 %31 160 %52 = OpLoad %6 %51 161 %53 = OpAccessChain %18 %17 %9 %31 162 %54 = OpLoad %6 %53 163 %55 = OpAccessChain %18 %17 %9 %31 164 %56 = OpLoad %6 %55 165 %57 = OpAccessChain %18 %17 %9 %31 166 %58 = OpLoad %6 %57 167 %59 = OpAccessChain %18 %17 %9 %31 168 %60 = OpLoad %6 %59 169 %61 = OpCompositeConstruct %37 %41 %44 %46 %48 %50 %52 %54 %56 %58 %60 170 OpStore %39 %61 171 %62 = OpLoad %6 %33 172 %63 = OpAccessChain %10 %39 %62 173 %64 = OpLoad %6 %63 174 OpStore %11 %64 175 OpBranch %24 176 %24 = OpLabel 177 OpBranch %21 178 %23 = OpLabel 179 %65 = OpLoad %6 %11 180 %66 = OpAccessChain %18 %17 %9 %9 181 %67 = OpLoad %6 %66 182 %68 = OpIEqual %28 %65 %67 183 OpSelectionMerge %70 None 184 OpBranchConditional %68 %69 %88 185 %69 = OpLabel 186 %75 = OpAccessChain %18 %17 %9 %9 187 %76 = OpLoad %6 %75 188 %77 = OpConvertSToF %71 %76 189 %78 = OpAccessChain %18 %17 %9 %31 190 %79 = OpLoad %6 %78 191 %80 = OpConvertSToF %71 %79 192 %81 = OpAccessChain %18 %17 %9 %31 193 %82 = OpLoad %6 %81 194 %83 = OpConvertSToF %71 %82 195 %84 = OpAccessChain %18 %17 %9 %9 196 %85 = OpLoad %6 %84 197 %86 = OpConvertSToF %71 %85 198 %87 = OpCompositeConstruct %72 %77 %80 %83 %86 199 OpStore %74 %87 200 OpBranch %70 201 %88 = OpLabel 202 %89 = OpAccessChain %18 %17 %9 %31 203 %90 = OpLoad %6 %89 204 %91 = OpConvertSToF %71 %90 205 %92 = OpCompositeConstruct %72 %91 %91 %91 %91 206 OpStore %74 %92 207 OpBranch %70 208 %70 = OpLabel 209 OpReturn 210 OpFunctionEnd 211END 212 213# uniforms for variant 214 215# _GLF_uniform_int_values 216BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 217 1 0 218END 219 220BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 221 222PIPELINE graphics variant_pipeline 223 ATTACH variant_vertex_shader 224 ATTACH variant_fragment_shader 225 FRAMEBUFFER_SIZE 16 16 226 BIND BUFFER variant_framebuffer AS color LOCATION 0 227 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0 228END 229CLEAR_COLOR variant_pipeline 0 0 0 255 230 231CLEAR variant_pipeline 232RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16 233 234EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255 235