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 texgen_vert PASSTHROUGH 25 26SHADER fragment texgen_frag GLSL 27#version 430 28precision highp float; 29 30layout(location = 0) out vec4 _GLF_color; 31 32void main() 33{ 34 _GLF_color = vec4( 35 gl_FragCoord.x * (1.0 / 256.0), 36 (int(gl_FragCoord.x) ^ int(gl_FragCoord.y)) * (1.0 / 256.0), 37 gl_FragCoord.y * (1.0 / 256.0), 38 1.0); 39} 40END 41BUFFER default_texture FORMAT B8G8R8A8_UNORM 42 43PIPELINE graphics texgen_pipeline 44 ATTACH texgen_vert 45 ATTACH texgen_frag 46 FRAMEBUFFER_SIZE 256 256 47 BIND BUFFER default_texture AS color LOCATION 0 48END 49 50CLEAR_COLOR texgen_pipeline 0 0 0 255 51CLEAR texgen_pipeline 52RUN texgen_pipeline DRAW_RECT POS 0 0 SIZE 256 256 53 54SHADER vertex variant_vertex_shader PASSTHROUGH 55 56# variant_fragment_shader is derived from the following GLSL: 57# #version 320 es 58# #define _int_1 _GLF_uniform_int_values[0] 59# #define _int_0 _GLF_uniform_int_values[1] 60# #define _float_1_0 _GLF_uniform_float_values[0] 61# 62# precision highp int; 63# precision highp float; 64# 65# // Contents of _GLF_uniform_int_values: [1, 0] 66# layout(set = 0, binding = 0) uniform buf0 67# { 68# int _GLF_uniform_int_values[2]; 69# }; 70# // Contents of _GLF_uniform_float_values: 1.0 71# layout(set = 0, binding = 1) uniform buf1 72# { 73# float _GLF_uniform_float_values[1]; 74# }; 75# 76# layout(location = 0) out vec4 _GLF_color; 77# layout(set = 0, binding = 2) uniform sampler2D tex; 78# 79# float a = 1.0; 80# float b = 2.0; 81# vec4 v = vec4(1.0); 82# 83# // Effectively copies b = a. Sampling doesn't matter since 84# // the same texel has been already sampled. 85# void func() 86# { 87# if(b != a) 88# { 89# b = a; 90# return; 91# } 92# v = texture(tex, vec2(0.0)); 93# } 94# 95# void main() 96# { 97# v = texture(tex, vec2(0.0)); 98# // b becomes 1. 99# func(); 100# // a becomes 2. 101# a += v.a; 102# // b becomes 2. 103# func(); 104# 105# // Iterated once making a = 3. 106# while((b > 1.0)) 107# { 108# b -= _float_1_0; 109# a += _float_1_0; 110# } 111# 112# if(a == 3.0) 113# { 114# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); 115# } 116# else 117# { 118# _GLF_color = vec4(_int_0); 119# } 120# } 121SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 122; SPIR-V 123; Version: 1.0 124; Generator: Khronos Glslang Reference Front End; 10 125; Bound: 100 126; Schema: 0 127 OpCapability Shader 128 %1 = OpExtInstImport "GLSL.std.450" 129 OpMemoryModel Logical GLSL450 130 OpEntryPoint Fragment %4 "main" %74 131 OpExecutionMode %4 OriginUpperLeft 132 OpSource ESSL 320 133 OpName %4 "main" 134 OpName %6 "func(" 135 OpName %10 "a" 136 OpName %12 "b" 137 OpName %16 "v" 138 OpName %29 "tex" 139 OpName %54 "buf1" 140 OpMemberName %54 0 "_GLF_uniform_float_values" 141 OpName %56 "" 142 OpName %74 "_GLF_color" 143 OpName %77 "buf0" 144 OpMemberName %77 0 "_GLF_uniform_int_values" 145 OpName %79 "" 146 OpDecorate %29 RelaxedPrecision 147 OpDecorate %29 DescriptorSet 0 148 OpDecorate %29 Binding 2 149 OpDecorate %30 RelaxedPrecision 150 OpDecorate %34 RelaxedPrecision 151 OpDecorate %35 RelaxedPrecision 152 OpDecorate %36 RelaxedPrecision 153 OpDecorate %53 ArrayStride 16 154 OpMemberDecorate %54 0 Offset 0 155 OpDecorate %54 Block 156 OpDecorate %56 DescriptorSet 0 157 OpDecorate %56 Binding 1 158 OpDecorate %74 Location 0 159 OpDecorate %76 ArrayStride 16 160 OpMemberDecorate %77 0 Offset 0 161 OpDecorate %77 Block 162 OpDecorate %79 DescriptorSet 0 163 OpDecorate %79 Binding 0 164 %2 = OpTypeVoid 165 %3 = OpTypeFunction %2 166 %8 = OpTypeFloat 32 167 %9 = OpTypePointer Private %8 168 %10 = OpVariable %9 Private 169 %11 = OpConstant %8 1 170 %12 = OpVariable %9 Private 171 %13 = OpConstant %8 2 172 %14 = OpTypeVector %8 4 173 %15 = OpTypePointer Private %14 174 %16 = OpVariable %15 Private 175 %17 = OpConstantComposite %14 %11 %11 %11 %11 176 %20 = OpTypeBool 177 %26 = OpTypeImage %8 2D 0 0 0 1 Unknown 178 %27 = OpTypeSampledImage %26 179 %28 = OpTypePointer UniformConstant %27 180 %29 = OpVariable %28 UniformConstant 181 %31 = OpTypeVector %8 2 182 %32 = OpConstant %8 0 183 %33 = OpConstantComposite %31 %32 %32 184 %38 = OpTypeInt 32 0 185 %39 = OpConstant %38 3 186 %52 = OpConstant %38 1 187 %53 = OpTypeArray %8 %52 188 %54 = OpTypeStruct %53 189 %55 = OpTypePointer Uniform %54 190 %56 = OpVariable %55 Uniform 191 %57 = OpTypeInt 32 1 192 %58 = OpConstant %57 0 193 %59 = OpTypePointer Uniform %8 194 %69 = OpConstant %8 3 195 %73 = OpTypePointer Output %14 196 %74 = OpVariable %73 Output 197 %75 = OpConstant %38 2 198 %76 = OpTypeArray %57 %75 199 %77 = OpTypeStruct %76 200 %78 = OpTypePointer Uniform %77 201 %79 = OpVariable %78 Uniform 202 %80 = OpTypePointer Uniform %57 203 %84 = OpConstant %57 1 204 %4 = OpFunction %2 None %3 205 %5 = OpLabel 206 OpStore %10 %11 207 OpStore %12 %13 208 OpStore %16 %17 209 %35 = OpLoad %27 %29 210 %36 = OpImageSampleImplicitLod %14 %35 %33 211 OpStore %16 %36 212 %37 = OpFunctionCall %2 %6 213 %40 = OpAccessChain %9 %16 %39 214 %41 = OpLoad %8 %40 215 %42 = OpLoad %8 %10 216 %43 = OpFAdd %8 %42 %41 217 OpStore %10 %43 218 %44 = OpFunctionCall %2 %6 219 OpBranch %45 220 %45 = OpLabel 221 OpLoopMerge %47 %48 None 222 OpBranch %49 223 %49 = OpLabel 224 %50 = OpLoad %8 %12 225 %51 = OpFOrdGreaterThan %20 %50 %11 226 OpBranchConditional %51 %46 %47 227 %46 = OpLabel 228 %60 = OpAccessChain %59 %56 %58 %58 229 %61 = OpLoad %8 %60 230 %62 = OpLoad %8 %12 231 %63 = OpFSub %8 %62 %61 232 OpStore %12 %63 233 %64 = OpAccessChain %59 %56 %58 %58 234 %65 = OpLoad %8 %64 235 %66 = OpLoad %8 %10 236 %67 = OpFAdd %8 %66 %65 237 OpStore %10 %67 238 OpBranch %48 239 %48 = OpLabel 240 OpBranch %45 241 %47 = OpLabel 242 %68 = OpLoad %8 %10 243 %70 = OpFOrdEqual %20 %68 %69 244 OpSelectionMerge %72 None 245 OpBranchConditional %70 %71 %95 246 %71 = OpLabel 247 %81 = OpAccessChain %80 %79 %58 %58 248 %82 = OpLoad %57 %81 249 %83 = OpConvertSToF %8 %82 250 %85 = OpAccessChain %80 %79 %58 %84 251 %86 = OpLoad %57 %85 252 %87 = OpConvertSToF %8 %86 253 %88 = OpAccessChain %80 %79 %58 %84 254 %89 = OpLoad %57 %88 255 %90 = OpConvertSToF %8 %89 256 %91 = OpAccessChain %80 %79 %58 %58 257 %92 = OpLoad %57 %91 258 %93 = OpConvertSToF %8 %92 259 %94 = OpCompositeConstruct %14 %83 %87 %90 %93 260 OpStore %74 %94 261 OpBranch %72 262 %95 = OpLabel 263 %96 = OpAccessChain %80 %79 %58 %84 264 %97 = OpLoad %57 %96 265 %98 = OpConvertSToF %8 %97 266 %99 = OpCompositeConstruct %14 %98 %98 %98 %98 267 OpStore %74 %99 268 OpBranch %72 269 %72 = OpLabel 270 OpReturn 271 OpFunctionEnd 272 %6 = OpFunction %2 None %3 273 %7 = OpLabel 274 %18 = OpLoad %8 %12 275 %19 = OpLoad %8 %10 276 %21 = OpFUnordNotEqual %20 %18 %19 277 OpSelectionMerge %23 None 278 OpBranchConditional %21 %22 %23 279 %22 = OpLabel 280 %24 = OpLoad %8 %10 281 OpStore %12 %24 282 OpReturn 283 %23 = OpLabel 284 %30 = OpLoad %27 %29 285 %34 = OpImageSampleImplicitLod %14 %30 %33 286 OpStore %16 %34 287 OpReturn 288 OpFunctionEnd 289END 290 291# uniforms for variant 292 293# tex 294SAMPLER variant_tex 295 296# _GLF_uniform_float_values 297BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 298 1.0 299END 300# _GLF_uniform_int_values 301BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 302 1 0 303END 304 305BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 306 307PIPELINE graphics variant_pipeline 308 ATTACH variant_vertex_shader 309 ATTACH variant_fragment_shader 310 FRAMEBUFFER_SIZE 256 256 311 BIND BUFFER variant_framebuffer AS color LOCATION 0 312 BIND BUFFER default_texture AS combined_image_sampler SAMPLER variant_tex DESCRIPTOR_SET 0 BINDING 2 313 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1 314 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0 315END 316CLEAR_COLOR variant_pipeline 0 0 0 255 317 318CLEAR variant_pipeline 319RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 320 321EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 322