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 specific NIR 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# #define _int_0 _GLF_uniform_int_values[0] 29# #define _int_10 _GLF_uniform_int_values[1] 30# #define _int_1 _GLF_uniform_int_values[2] 31# #define _int_6 _GLF_uniform_int_values[3] 32# #define _int_20 _GLF_uniform_int_values[4] 33# 34# precision highp int; 35# precision highp float; 36# 37# // Contents of _GLF_uniform_int_values: [0, 10, 1, 6, 20] 38# layout(set = 0, binding = 0) uniform buf0 39# { 40# int _GLF_uniform_int_values[5]; 41# }; 42# layout(location = 0) out vec4 _GLF_color; 43# 44# void main() 45# { 46# int a = _int_0; 47# int b = _int_1; 48# int c = 1; 49# 50# while (b < _int_20 && a < 10) 51# { 52# if (c > 5) 53# break; 54# 55# a++; 56# c++; 57# b++; 58# } 59# 60# for(; a < _int_10; a++) 61# { 62# } 63# 64# if(a == _int_10 && b == _int_6 && c == _int_6) 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: 106 78; Schema: 0 79 OpCapability Shader 80 %1 = OpExtInstImport "GLSL.std.450" 81 OpMemoryModel Logical GLSL450 82 OpEntryPoint Fragment %4 "main" %87 83 OpExecutionMode %4 OriginUpperLeft 84 OpSource ESSL 320 85 OpName %4 "main" 86 OpName %8 "a" 87 OpName %12 "buf0" 88 OpMemberName %12 0 "_GLF_uniform_int_values" 89 OpName %14 "" 90 OpName %19 "b" 91 OpName %23 "c" 92 OpName %87 "_GLF_color" 93 OpDecorate %11 ArrayStride 16 94 OpMemberDecorate %12 0 Offset 0 95 OpDecorate %12 Block 96 OpDecorate %14 DescriptorSet 0 97 OpDecorate %14 Binding 0 98 OpDecorate %87 Location 0 99 %2 = OpTypeVoid 100 %3 = OpTypeFunction %2 101 %6 = OpTypeInt 32 1 102 %7 = OpTypePointer Function %6 103 %9 = OpTypeInt 32 0 104 %10 = OpConstant %9 5 105 %11 = OpTypeArray %6 %10 106 %12 = OpTypeStruct %11 107 %13 = OpTypePointer Uniform %12 108 %14 = OpVariable %13 Uniform 109 %15 = OpConstant %6 0 110 %16 = OpTypePointer Uniform %6 111 %20 = OpConstant %6 2 112 %24 = OpConstant %6 1 113 %31 = OpConstant %6 4 114 %34 = OpTypeBool 115 %37 = OpConstant %6 10 116 %41 = OpConstant %6 5 117 %70 = OpConstant %6 3 118 %84 = OpTypeFloat 32 119 %85 = OpTypeVector %84 4 120 %86 = OpTypePointer Output %85 121 %87 = OpVariable %86 Output 122 %4 = OpFunction %2 None %3 123 %5 = OpLabel 124 %8 = OpVariable %7 Function 125 %19 = OpVariable %7 Function 126 %23 = OpVariable %7 Function 127 %17 = OpAccessChain %16 %14 %15 %15 128 %18 = OpLoad %6 %17 129 OpStore %8 %18 130 %21 = OpAccessChain %16 %14 %15 %20 131 %22 = OpLoad %6 %21 132 OpStore %19 %22 133 OpStore %23 %24 134 OpBranch %25 135 %25 = OpLabel 136 OpLoopMerge %27 %28 None 137 OpBranch %29 138 %29 = OpLabel 139 %30 = OpLoad %6 %19 140 %32 = OpAccessChain %16 %14 %15 %31 141 %33 = OpLoad %6 %32 142 %35 = OpSLessThan %34 %30 %33 143 %36 = OpLoad %6 %8 144 %38 = OpSLessThan %34 %36 %37 145 %39 = OpLogicalAnd %34 %35 %38 146 OpBranchConditional %39 %26 %27 147 %26 = OpLabel 148 %40 = OpLoad %6 %23 149 %42 = OpSGreaterThan %34 %40 %41 150 OpSelectionMerge %44 None 151 OpBranchConditional %42 %43 %44 152 %43 = OpLabel 153 OpBranch %27 154 %44 = OpLabel 155 %46 = OpLoad %6 %8 156 %47 = OpIAdd %6 %46 %24 157 OpStore %8 %47 158 %48 = OpLoad %6 %23 159 %49 = OpIAdd %6 %48 %24 160 OpStore %23 %49 161 %50 = OpLoad %6 %19 162 %51 = OpIAdd %6 %50 %24 163 OpStore %19 %51 164 OpBranch %28 165 %28 = OpLabel 166 OpBranch %25 167 %27 = OpLabel 168 OpBranch %52 169 %52 = OpLabel 170 OpLoopMerge %54 %55 None 171 OpBranch %56 172 %56 = OpLabel 173 %57 = OpLoad %6 %8 174 %58 = OpAccessChain %16 %14 %15 %24 175 %59 = OpLoad %6 %58 176 %60 = OpSLessThan %34 %57 %59 177 OpBranchConditional %60 %53 %54 178 %53 = OpLabel 179 OpBranch %55 180 %55 = OpLabel 181 %61 = OpLoad %6 %8 182 %62 = OpIAdd %6 %61 %24 183 OpStore %8 %62 184 OpBranch %52 185 %54 = OpLabel 186 %63 = OpLoad %6 %8 187 %64 = OpAccessChain %16 %14 %15 %24 188 %65 = OpLoad %6 %64 189 %66 = OpIEqual %34 %63 %65 190 OpSelectionMerge %68 None 191 OpBranchConditional %66 %67 %68 192 %67 = OpLabel 193 %69 = OpLoad %6 %19 194 %71 = OpAccessChain %16 %14 %15 %70 195 %72 = OpLoad %6 %71 196 %73 = OpIEqual %34 %69 %72 197 OpBranch %68 198 %68 = OpLabel 199 %74 = OpPhi %34 %66 %54 %73 %67 200 OpSelectionMerge %76 None 201 OpBranchConditional %74 %75 %76 202 %75 = OpLabel 203 %77 = OpLoad %6 %23 204 %78 = OpAccessChain %16 %14 %15 %70 205 %79 = OpLoad %6 %78 206 %80 = OpIEqual %34 %77 %79 207 OpBranch %76 208 %76 = OpLabel 209 %81 = OpPhi %34 %74 %68 %80 %75 210 OpSelectionMerge %83 None 211 OpBranchConditional %81 %82 %101 212 %82 = OpLabel 213 %88 = OpAccessChain %16 %14 %15 %20 214 %89 = OpLoad %6 %88 215 %90 = OpConvertSToF %84 %89 216 %91 = OpAccessChain %16 %14 %15 %15 217 %92 = OpLoad %6 %91 218 %93 = OpConvertSToF %84 %92 219 %94 = OpAccessChain %16 %14 %15 %15 220 %95 = OpLoad %6 %94 221 %96 = OpConvertSToF %84 %95 222 %97 = OpAccessChain %16 %14 %15 %20 223 %98 = OpLoad %6 %97 224 %99 = OpConvertSToF %84 %98 225 %100 = OpCompositeConstruct %85 %90 %93 %96 %99 226 OpStore %87 %100 227 OpBranch %83 228 %101 = OpLabel 229 %102 = OpAccessChain %16 %14 %15 %15 230 %103 = OpLoad %6 %102 231 %104 = OpConvertSToF %84 %103 232 %105 = OpCompositeConstruct %85 %104 %104 %104 %104 233 OpStore %87 %105 234 OpBranch %83 235 %83 = 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 10 1 6 20 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 256 256 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 256 256 260 261EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 262