1#!amber 2 3# Copyright 2020 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 a specific instruction simplify code path 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 310 es 28# #define _int_0 _GLF_uniform_int_values[0] 29# #define _int_2 _GLF_uniform_int_values[1] 30# #define _int_3 _GLF_uniform_int_values[2] 31# #define _int_1 _GLF_uniform_int_values[3] 32# #define _int_4 _GLF_uniform_int_values[4] 33# 34# precision highp float; 35# 36# precision highp int; 37# 38# // Contents of _GLF_uniform_int_values: [0, 2, 3, 1, 4] 39# layout(set = 0, binding = 0) uniform buf0 40# { 41# int _GLF_uniform_int_values[5]; 42# }; 43# 44# layout(location = 0) out vec4 _GLF_color; 45# 46# void main() 47# { 48# int A[4]; 49# for (int i = _int_0; i < _int_4; i++) 50# { 51# A[i] = _int_0; 52# 53# // Sets the first two elements of A to 1. 54# if (max(2 * i, 2 * _int_1) == _int_2) 55# { 56# A[i] = 1; 57# } 58# } 59# 60# if (A[_int_0] == _int_1 && A[_int_1] == _int_1 && A[_int_2] == _int_0 && 61# A[_int_3] == _int_0) 62# { 63# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); 64# } 65# else 66# { 67# _GLF_color = vec4(1); 68# } 69# } 70SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 71; SPIR-V 72; Version: 1.0 73; Generator: Khronos Glslang Reference Front End; 8 74; Bound: 115 75; Schema: 0 76 OpCapability Shader 77 %1 = OpExtInstImport "GLSL.std.450" 78 OpMemoryModel Logical GLSL450 79 OpEntryPoint Fragment %4 "main" %98 80 OpExecutionMode %4 OriginUpperLeft 81 OpSource ESSL 310 82 OpName %4 "main" 83 OpName %8 "i" 84 OpName %12 "buf0" 85 OpMemberName %12 0 "_GLF_uniform_int_values" 86 OpName %14 "" 87 OpName %33 "A" 88 OpName %98 "_GLF_color" 89 OpDecorate %11 ArrayStride 16 90 OpMemberDecorate %12 0 Offset 0 91 OpDecorate %12 Block 92 OpDecorate %14 DescriptorSet 0 93 OpDecorate %14 Binding 0 94 OpDecorate %98 Location 0 95 %2 = OpTypeVoid 96 %3 = OpTypeFunction %2 97 %6 = OpTypeInt 32 1 98 %7 = OpTypePointer Function %6 99 %9 = OpTypeInt 32 0 100 %10 = OpConstant %9 5 101 %11 = OpTypeArray %6 %10 102 %12 = OpTypeStruct %11 103 %13 = OpTypePointer Uniform %12 104 %14 = OpVariable %13 Uniform 105 %15 = OpConstant %6 0 106 %16 = OpTypePointer Uniform %6 107 %25 = OpConstant %6 4 108 %28 = OpTypeBool 109 %30 = OpConstant %9 4 110 %31 = OpTypeArray %6 %30 111 %32 = OpTypePointer Function %31 112 %38 = OpConstant %6 2 113 %41 = OpConstant %6 3 114 %46 = OpConstant %6 1 115 %95 = OpTypeFloat 32 116 %96 = OpTypeVector %95 4 117 %97 = OpTypePointer Output %96 118 %98 = OpVariable %97 Output 119 %113 = OpConstant %95 1 120 %114 = OpConstantComposite %96 %113 %113 %113 %113 121 %4 = OpFunction %2 None %3 122 %5 = OpLabel 123 %8 = OpVariable %7 Function 124 %33 = OpVariable %32 Function 125 %17 = OpAccessChain %16 %14 %15 %15 126 %18 = OpLoad %6 %17 127 OpStore %8 %18 128 OpBranch %19 129 %19 = OpLabel 130 OpLoopMerge %21 %22 None 131 OpBranch %23 132 %23 = OpLabel 133 %24 = OpLoad %6 %8 134 %26 = OpAccessChain %16 %14 %15 %25 135 %27 = OpLoad %6 %26 136 %29 = OpSLessThan %28 %24 %27 137 OpBranchConditional %29 %20 %21 138 %20 = OpLabel 139 %34 = OpLoad %6 %8 140 %35 = OpAccessChain %16 %14 %15 %15 141 %36 = OpLoad %6 %35 142 %37 = OpAccessChain %7 %33 %34 143 OpStore %37 %36 144 %39 = OpLoad %6 %8 145 %40 = OpIMul %6 %38 %39 146 %42 = OpAccessChain %16 %14 %15 %41 147 %43 = OpLoad %6 %42 148 %44 = OpIMul %6 %38 %43 149 %45 = OpExtInst %6 %1 SMax %40 %44 150 %47 = OpAccessChain %16 %14 %15 %46 151 %48 = OpLoad %6 %47 152 %49 = OpIEqual %28 %45 %48 153 OpSelectionMerge %51 None 154 OpBranchConditional %49 %50 %51 155 %50 = OpLabel 156 %52 = OpLoad %6 %8 157 %53 = OpAccessChain %7 %33 %52 158 OpStore %53 %46 159 OpBranch %51 160 %51 = OpLabel 161 OpBranch %22 162 %22 = OpLabel 163 %54 = OpLoad %6 %8 164 %55 = OpIAdd %6 %54 %46 165 OpStore %8 %55 166 OpBranch %19 167 %21 = OpLabel 168 %56 = OpAccessChain %16 %14 %15 %15 169 %57 = OpLoad %6 %56 170 %58 = OpAccessChain %7 %33 %57 171 %59 = OpLoad %6 %58 172 %60 = OpAccessChain %16 %14 %15 %41 173 %61 = OpLoad %6 %60 174 %62 = OpIEqual %28 %59 %61 175 OpSelectionMerge %64 None 176 OpBranchConditional %62 %63 %64 177 %63 = OpLabel 178 %65 = OpAccessChain %16 %14 %15 %41 179 %66 = OpLoad %6 %65 180 %67 = OpAccessChain %7 %33 %66 181 %68 = OpLoad %6 %67 182 %69 = OpAccessChain %16 %14 %15 %41 183 %70 = OpLoad %6 %69 184 %71 = OpIEqual %28 %68 %70 185 OpBranch %64 186 %64 = OpLabel 187 %72 = OpPhi %28 %62 %21 %71 %63 188 OpSelectionMerge %74 None 189 OpBranchConditional %72 %73 %74 190 %73 = OpLabel 191 %75 = OpAccessChain %16 %14 %15 %46 192 %76 = OpLoad %6 %75 193 %77 = OpAccessChain %7 %33 %76 194 %78 = OpLoad %6 %77 195 %79 = OpAccessChain %16 %14 %15 %15 196 %80 = OpLoad %6 %79 197 %81 = OpIEqual %28 %78 %80 198 OpBranch %74 199 %74 = OpLabel 200 %82 = OpPhi %28 %72 %64 %81 %73 201 OpSelectionMerge %84 None 202 OpBranchConditional %82 %83 %84 203 %83 = OpLabel 204 %85 = OpAccessChain %16 %14 %15 %38 205 %86 = OpLoad %6 %85 206 %87 = OpAccessChain %7 %33 %86 207 %88 = OpLoad %6 %87 208 %89 = OpAccessChain %16 %14 %15 %15 209 %90 = OpLoad %6 %89 210 %91 = OpIEqual %28 %88 %90 211 OpBranch %84 212 %84 = OpLabel 213 %92 = OpPhi %28 %82 %74 %91 %83 214 OpSelectionMerge %94 None 215 OpBranchConditional %92 %93 %112 216 %93 = OpLabel 217 %99 = OpAccessChain %16 %14 %15 %41 218 %100 = OpLoad %6 %99 219 %101 = OpConvertSToF %95 %100 220 %102 = OpAccessChain %16 %14 %15 %15 221 %103 = OpLoad %6 %102 222 %104 = OpConvertSToF %95 %103 223 %105 = OpAccessChain %16 %14 %15 %15 224 %106 = OpLoad %6 %105 225 %107 = OpConvertSToF %95 %106 226 %108 = OpAccessChain %16 %14 %15 %41 227 %109 = OpLoad %6 %108 228 %110 = OpConvertSToF %95 %109 229 %111 = OpCompositeConstruct %96 %101 %104 %107 %110 230 OpStore %98 %111 231 OpBranch %94 232 %112 = OpLabel 233 OpStore %98 %114 234 OpBranch %94 235 %94 = OpLabel 236 OpReturn 237 OpFunctionEnd 238END 239 240# uniforms for variant 241 242# _GLF_uniform_int_values 243BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 244 0 2 3 1 4 245END 246 247BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 248 249PIPELINE graphics variant_pipeline 250 ATTACH variant_vertex_shader 251 ATTACH variant_fragment_shader 252 FRAMEBUFFER_SIZE 16 16 253 BIND BUFFER variant_framebuffer AS color LOCATION 0 254 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0 255END 256CLEAR_COLOR variant_pipeline 0 0 0 255 257 258CLEAR variant_pipeline 259RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16 260 261EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255 262