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