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 bug found by the GraphicsFuzz project. 19 20# Short description: Equivalent shaders, one where an id is hidden inside a composite 21 22# The test passes because both shaders render the same image. 23 24SHADER vertex reference_vertex_shader PASSTHROUGH 25 26SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 27; SPIR-V 28; Version: 1.0 29; Generator: Khronos Glslang Reference Front End; 7 30; Bound: 107 31; Schema: 0 32 OpCapability Shader 33 %1 = OpExtInstImport "GLSL.std.450" 34 OpMemoryModel Logical GLSL450 35 OpEntryPoint Fragment %4 "main" %12 %74 36 OpExecutionMode %4 OriginUpperLeft 37 OpSource ESSL 320 38 OpName %4 "main" 39 OpName %12 "gl_FragCoord" 40 OpName %15 "buf0" 41 OpMemberName %15 0 "resolution" 42 OpName %17 "" 43 OpName %74 "_GLF_color" 44 OpName %100 "indexable" 45 OpDecorate %12 BuiltIn FragCoord 46 OpMemberDecorate %15 0 Offset 0 47 OpDecorate %15 Block 48 OpDecorate %17 DescriptorSet 0 49 OpDecorate %17 Binding 0 50 OpDecorate %74 Location 0 51 %2 = OpTypeVoid 52 %3 = OpTypeFunction %2 53 %6 = OpTypeFloat 32 54 %7 = OpTypeVector %6 2 55 %10 = OpTypeVector %6 4 56 %11 = OpTypePointer Input %10 57 %12 = OpVariable %11 Input 58 %15 = OpTypeStruct %7 59 %16 = OpTypePointer Uniform %15 60 %17 = OpVariable %16 Uniform 61 %18 = OpTypeInt 32 1 62 %19 = OpConstant %18 0 63 %20 = OpTypePointer Uniform %7 64 %27 = OpTypeInt 32 0 65 %32 = OpConstant %6 10 66 %47 = OpConstant %18 10 67 %51 = OpConstant %18 100 68 %60 = OpTypeBool 69 %62 = OpConstant %18 4 70 %65 = OpConstant %18 1000 71 %71 = OpConstant %18 1 72 %73 = OpTypePointer Output %10 73 %74 = OpVariable %73 Output 74 %75 = OpConstant %27 16 75 %76 = OpTypeArray %10 %75 76 %77 = OpConstant %6 0 77 %78 = OpConstant %6 1 78 %79 = OpConstantComposite %10 %77 %77 %77 %78 79 %80 = OpConstant %6 0.5 80 %81 = OpConstantComposite %10 %80 %77 %77 %78 81 %82 = OpConstantComposite %10 %77 %80 %77 %78 82 %83 = OpConstantComposite %10 %80 %80 %77 %78 83 %84 = OpConstantComposite %10 %77 %77 %80 %78 84 %85 = OpConstantComposite %10 %80 %77 %80 %78 85 %86 = OpConstantComposite %10 %77 %80 %80 %78 86 %87 = OpConstantComposite %10 %80 %80 %80 %78 87 %88 = OpConstantComposite %10 %78 %77 %77 %78 88 %89 = OpConstantComposite %10 %77 %78 %77 %78 89 %90 = OpConstantComposite %10 %78 %78 %77 %78 90 %91 = OpConstantComposite %10 %77 %77 %78 %78 91 %92 = OpConstantComposite %10 %78 %77 %78 %78 92 %93 = OpConstantComposite %10 %77 %78 %78 %78 93 %94 = OpConstantComposite %10 %78 %78 %78 %78 94 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 95 %97 = OpConstant %18 16 96 %99 = OpTypePointer Function %76 97 %101 = OpTypePointer Function %10 98 %4 = OpFunction %2 None %3 99 %5 = OpLabel 100 %100 = OpVariable %99 Function 101 %13 = OpLoad %10 %12 102 %14 = OpVectorShuffle %7 %13 %13 0 1 103 %21 = OpAccessChain %20 %17 %19 104 %22 = OpLoad %7 %21 105 %23 = OpFDiv %7 %14 %22 106 %31 = OpCompositeExtract %6 %23 0 107 %33 = OpFMul %6 %31 %32 108 %34 = OpConvertFToS %18 %33 109 %37 = OpCompositeExtract %6 %23 1 110 %38 = OpFMul %6 %37 %32 111 %39 = OpConvertFToS %18 %38 112 %48 = OpIMul %18 %39 %47 113 %49 = OpIAdd %18 %34 %48 114 OpBranch %53 115 %53 = OpLabel 116 %106 = OpPhi %18 %51 %5 %69 %54 117 %104 = OpPhi %18 %19 %5 %72 %54 118 %61 = OpSLessThan %60 %104 %49 119 OpLoopMerge %55 %54 None 120 OpBranchConditional %61 %54 %55 121 %54 = OpLabel 122 %64 = OpIMul %18 %62 %106 123 %67 = OpISub %18 %65 %106 124 %68 = OpIMul %18 %64 %67 125 %69 = OpSDiv %18 %68 %65 126 %72 = OpIAdd %18 %104 %71 127 OpBranch %53 128 %55 = OpLabel 129 %98 = OpSMod %18 %106 %97 130 OpStore %100 %95 131 %102 = OpAccessChain %101 %100 %98 132 %103 = OpLoad %10 %102 133 OpStore %74 %103 134 OpReturn 135 OpFunctionEnd 136END 137 138# uniforms for reference 139 140# resolution 141BUFFER reference_resolution DATA_TYPE vec2<float> DATA 142 256.0 256.0 143END 144 145BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 146 147PIPELINE graphics reference_pipeline 148 ATTACH reference_vertex_shader 149 ATTACH reference_fragment_shader 150 FRAMEBUFFER_SIZE 256 256 151 BIND BUFFER reference_framebuffer AS color LOCATION 0 152 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 153END 154CLEAR_COLOR reference_pipeline 0 0 0 255 155 156CLEAR reference_pipeline 157RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 158 159 160SHADER vertex variant_vertex_shader PASSTHROUGH 161 162SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 163; SPIR-V 164; Version: 1.0 165; Generator: Khronos Glslang Reference Front End; 7 166; Bound: 395 167; Schema: 0 168 OpCapability Shader 169 %1 = OpExtInstImport "GLSL.std.450" 170 OpMemoryModel Logical GLSL450 171 OpEntryPoint Fragment %4 "main" %12 %74 172 OpExecutionMode %4 OriginUpperLeft 173 OpSource ESSL 320 174 OpName %4 "main" 175 OpName %12 "gl_FragCoord" 176 OpName %15 "buf0" 177 OpMemberName %15 0 "resolution" 178 OpName %17 "" 179 OpName %74 "_GLF_color" 180 OpName %100 "indexable" 181 OpDecorate %12 BuiltIn FragCoord 182 OpMemberDecorate %15 0 Offset 0 183 OpDecorate %15 Block 184 OpDecorate %17 DescriptorSet 0 185 OpDecorate %17 Binding 0 186 OpDecorate %74 Location 0 187 %2 = OpTypeVoid 188 %3 = OpTypeFunction %2 189 %6 = OpTypeFloat 32 190 %7 = OpTypeVector %6 2 191 %10 = OpTypeVector %6 4 192 %11 = OpTypePointer Input %10 193 %12 = OpVariable %11 Input 194 %15 = OpTypeStruct %7 195 %16 = OpTypePointer Uniform %15 196 %17 = OpVariable %16 Uniform 197 %18 = OpTypeInt 32 1 198 %19 = OpConstant %18 0 199 %20 = OpTypePointer Uniform %7 200 %27 = OpTypeInt 32 0 201 %32 = OpConstant %6 10 202 %47 = OpConstant %18 10 203 %51 = OpConstant %18 100 204 %60 = OpTypeBool 205 %62 = OpConstant %18 4 206 %65 = OpConstant %18 1000 207 %71 = OpConstant %18 1 208 %73 = OpTypePointer Output %10 209 %74 = OpVariable %73 Output 210 %75 = OpConstant %27 16 211 %76 = OpTypeArray %10 %75 212 %77 = OpConstant %6 0 213 %78 = OpConstant %6 1 214 %79 = OpConstantComposite %10 %77 %77 %77 %78 215 %80 = OpConstant %6 0.5 216 %81 = OpConstantComposite %10 %80 %77 %77 %78 217 %82 = OpConstantComposite %10 %77 %80 %77 %78 218 %83 = OpConstantComposite %10 %80 %80 %77 %78 219 %84 = OpConstantComposite %10 %77 %77 %80 %78 220 %85 = OpConstantComposite %10 %80 %77 %80 %78 221 %86 = OpConstantComposite %10 %77 %80 %80 %78 222 %87 = OpConstantComposite %10 %80 %80 %80 %78 223 %88 = OpConstantComposite %10 %78 %77 %77 %78 224 %89 = OpConstantComposite %10 %77 %78 %77 %78 225 %90 = OpConstantComposite %10 %78 %78 %77 %78 226 %91 = OpConstantComposite %10 %77 %77 %78 %78 227 %92 = OpConstantComposite %10 %78 %77 %78 %78 228 %93 = OpConstantComposite %10 %77 %78 %78 %78 229 %94 = OpConstantComposite %10 %78 %78 %78 %78 230 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 231 %97 = OpConstant %18 16 232 %99 = OpTypePointer Function %76 233 %101 = OpTypePointer Function %10 234 %213 = OpConstantComposite %7 %77 %77 235 %246 = OpConstant %6 0.5 236 %4 = OpFunction %2 None %3 237 %5 = OpLabel 238 %100 = OpVariable %99 Function 239 %13 = OpLoad %10 %12 240 %14 = OpVectorShuffle %7 %13 %13 0 1 241 %21 = OpAccessChain %20 %17 %19 242 %341 = OpCompositeConstruct %10 %77 %14 %246 243 %22 = OpLoad %7 %21 244 %23 = OpFDiv %7 %14 %22 245 %31 = OpCompositeExtract %6 %23 0 246 %388 = OpCompositeExtract %6 %341 3 247 %343 = OpCompositeConstruct %10 %388 %32 %213 248 %394 = OpCompositeExtract %6 %343 1 249 %33 = OpFMul %6 %31 %394 250 %34 = OpConvertFToS %18 %33 251 %37 = OpCompositeExtract %6 %23 1 252 %38 = OpFMul %6 %37 %32 253 %39 = OpConvertFToS %18 %38 254 %48 = OpIMul %18 %39 %47 255 %49 = OpIAdd %18 %34 %48 256 OpBranch %53 257 %53 = OpLabel 258 %106 = OpPhi %18 %51 %5 %69 %54 259 %104 = OpPhi %18 %19 %5 %72 %54 260 %61 = OpSLessThan %60 %104 %49 261 OpLoopMerge %55 %54 None 262 OpBranchConditional %61 %54 %55 263 %54 = OpLabel 264 %64 = OpIMul %18 %62 %106 265 %67 = OpISub %18 %65 %106 266 %68 = OpIMul %18 %64 %67 267 %69 = OpSDiv %18 %68 %65 268 %72 = OpIAdd %18 %104 %71 269 OpBranch %53 270 %55 = OpLabel 271 %98 = OpSMod %18 %106 %97 272 OpStore %100 %95 273 %102 = OpAccessChain %101 %100 %98 274 %103 = OpLoad %10 %102 275 OpStore %74 %103 276 OpReturn 277 OpFunctionEnd 278END 279 280# uniforms for variant 281 282# resolution 283BUFFER variant_resolution DATA_TYPE vec2<float> DATA 284 256.0 256.0 285END 286 287BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 288 289PIPELINE graphics variant_pipeline 290 ATTACH variant_vertex_shader 291 ATTACH variant_fragment_shader 292 FRAMEBUFFER_SIZE 256 256 293 BIND BUFFER variant_framebuffer AS color LOCATION 0 294 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 295END 296CLEAR_COLOR variant_pipeline 0 0 0 255 297 298CLEAR variant_pipeline 299RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 300 301EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 302