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: Three shaders diff: mutate var, vector shuffle 21 22# The test renders three images using semantically equivalent shaders, and then 23# checks that the images are similar. 24# The test passes because the shaders have the same semantics and so the images 25# should be the same. 26 27SHADER vertex reference_vertex_shader PASSTHROUGH 28 29SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 30; SPIR-V 31; Version: 1.0 32; Generator: Khronos Glslang Reference Front End; 7 33; Bound: 107 34; Schema: 0 35 OpCapability Shader 36 %1 = OpExtInstImport "GLSL.std.450" 37 OpMemoryModel Logical GLSL450 38 OpEntryPoint Fragment %4 "main" %12 %74 39 OpExecutionMode %4 OriginUpperLeft 40 OpSource ESSL 320 41 OpName %4 "main" 42 OpName %12 "gl_FragCoord" 43 OpName %15 "buf0" 44 OpMemberName %15 0 "resolution" 45 OpName %17 "" 46 OpName %74 "_GLF_color" 47 OpName %100 "indexable" 48 OpDecorate %12 BuiltIn FragCoord 49 OpMemberDecorate %15 0 Offset 0 50 OpDecorate %15 Block 51 OpDecorate %17 DescriptorSet 0 52 OpDecorate %17 Binding 0 53 OpDecorate %74 Location 0 54 %2 = OpTypeVoid 55 %3 = OpTypeFunction %2 56 %6 = OpTypeFloat 32 57 %7 = OpTypeVector %6 2 58 %10 = OpTypeVector %6 4 59 %11 = OpTypePointer Input %10 60 %12 = OpVariable %11 Input 61 %15 = OpTypeStruct %7 62 %16 = OpTypePointer Uniform %15 63 %17 = OpVariable %16 Uniform 64 %18 = OpTypeInt 32 1 65 %19 = OpConstant %18 0 66 %20 = OpTypePointer Uniform %7 67 %27 = OpTypeInt 32 0 68 %32 = OpConstant %6 10 69 %47 = OpConstant %18 10 70 %51 = OpConstant %18 100 71 %60 = OpTypeBool 72 %62 = OpConstant %18 4 73 %65 = OpConstant %18 1000 74 %71 = OpConstant %18 1 75 %73 = OpTypePointer Output %10 76 %74 = OpVariable %73 Output 77 %75 = OpConstant %27 16 78 %76 = OpTypeArray %10 %75 79 %77 = OpConstant %6 0 80 %78 = OpConstant %6 1 81 %79 = OpConstantComposite %10 %77 %77 %77 %78 82 %80 = OpConstant %6 0.5 83 %81 = OpConstantComposite %10 %80 %77 %77 %78 84 %82 = OpConstantComposite %10 %77 %80 %77 %78 85 %83 = OpConstantComposite %10 %80 %80 %77 %78 86 %84 = OpConstantComposite %10 %77 %77 %80 %78 87 %85 = OpConstantComposite %10 %80 %77 %80 %78 88 %86 = OpConstantComposite %10 %77 %80 %80 %78 89 %87 = OpConstantComposite %10 %80 %80 %80 %78 90 %88 = OpConstantComposite %10 %78 %77 %77 %78 91 %89 = OpConstantComposite %10 %77 %78 %77 %78 92 %90 = OpConstantComposite %10 %78 %78 %77 %78 93 %91 = OpConstantComposite %10 %77 %77 %78 %78 94 %92 = OpConstantComposite %10 %78 %77 %78 %78 95 %93 = OpConstantComposite %10 %77 %78 %78 %78 96 %94 = OpConstantComposite %10 %78 %78 %78 %78 97 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 98 %97 = OpConstant %18 16 99 %99 = OpTypePointer Function %76 100 %101 = OpTypePointer Function %10 101 %4 = OpFunction %2 None %3 102 %5 = OpLabel 103 %100 = OpVariable %99 Function 104 %13 = OpLoad %10 %12 105 %14 = OpVectorShuffle %7 %13 %13 0 1 106 %21 = OpAccessChain %20 %17 %19 107 %22 = OpLoad %7 %21 108 %23 = OpFDiv %7 %14 %22 109 %31 = OpCompositeExtract %6 %23 0 110 %33 = OpFMul %6 %31 %32 111 %34 = OpConvertFToS %18 %33 112 %37 = OpCompositeExtract %6 %23 1 113 %38 = OpFMul %6 %37 %32 114 %39 = OpConvertFToS %18 %38 115 %48 = OpIMul %18 %39 %47 116 %49 = OpIAdd %18 %34 %48 117 OpBranch %53 118 %53 = OpLabel 119 %106 = OpPhi %18 %51 %5 %69 %54 120 %104 = OpPhi %18 %19 %5 %72 %54 121 %61 = OpSLessThan %60 %104 %49 122 OpLoopMerge %55 %54 None 123 OpBranchConditional %61 %54 %55 124 %54 = OpLabel 125 %64 = OpIMul %18 %62 %106 126 %67 = OpISub %18 %65 %106 127 %68 = OpIMul %18 %64 %67 128 %69 = OpSDiv %18 %68 %65 129 %72 = OpIAdd %18 %104 %71 130 OpBranch %53 131 %55 = OpLabel 132 %98 = OpSMod %18 %106 %97 133 OpStore %100 %95 134 %102 = OpAccessChain %101 %100 %98 135 %103 = OpLoad %10 %102 136 OpStore %74 %103 137 OpReturn 138 OpFunctionEnd 139END 140 141# uniforms for reference 142 143# resolution 144BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA 145 256.0 256.0 146END 147 148BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 149 150PIPELINE graphics reference_pipeline 151 ATTACH reference_vertex_shader 152 ATTACH reference_fragment_shader 153 FRAMEBUFFER_SIZE 256 256 154 BIND BUFFER reference_framebuffer AS color LOCATION 0 155 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 156END 157CLEAR_COLOR reference_pipeline 0 0 0 255 158 159CLEAR reference_pipeline 160RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 161 162 163SHADER vertex variant_vertex_shader PASSTHROUGH 164 165SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 166; SPIR-V 167; Version: 1.0 168; Generator: Khronos Glslang Reference Front End; 7 169; Bound: 263 170; Schema: 0 171 OpCapability Shader 172 %1 = OpExtInstImport "GLSL.std.450" 173 OpMemoryModel Logical GLSL450 174 OpEntryPoint Fragment %4 "main" %12 %74 175 OpExecutionMode %4 OriginUpperLeft 176 OpSource ESSL 320 177 OpName %4 "main" 178 OpName %12 "gl_FragCoord" 179 OpName %15 "buf0" 180 OpMemberName %15 0 "resolution" 181 OpName %17 "" 182 OpName %74 "_GLF_color" 183 OpName %100 "indexable" 184 OpDecorate %12 BuiltIn FragCoord 185 OpMemberDecorate %15 0 Offset 0 186 OpDecorate %15 Block 187 OpDecorate %17 DescriptorSet 0 188 OpDecorate %17 Binding 0 189 OpDecorate %74 Location 0 190 %2 = OpTypeVoid 191 %3 = OpTypeFunction %2 192 %6 = OpTypeFloat 32 193 %7 = OpTypeVector %6 2 194 %10 = OpTypeVector %6 4 195 %11 = OpTypePointer Input %10 196 %12 = OpVariable %11 Input 197 %15 = OpTypeStruct %7 198 %16 = OpTypePointer Uniform %15 199 %17 = OpVariable %16 Uniform 200 %18 = OpTypeInt 32 1 201 %19 = OpConstant %18 0 202 %20 = OpTypePointer Uniform %7 203 %27 = OpTypeInt 32 0 204 %32 = OpConstant %6 10 205 %47 = OpConstant %18 10 206 %51 = OpConstant %18 100 207 %60 = OpTypeBool 208 %62 = OpConstant %18 4 209 %65 = OpConstant %18 1000 210 %71 = OpConstant %18 1 211 %73 = OpTypePointer Output %10 212 %74 = OpVariable %73 Output 213 %75 = OpConstant %27 16 214 %76 = OpTypeArray %10 %75 215 %77 = OpConstant %6 0 216 %78 = OpConstant %6 1 217 %79 = OpConstantComposite %10 %77 %77 %77 %78 218 %80 = OpConstant %6 0.5 219 %81 = OpConstantComposite %10 %80 %77 %77 %78 220 %82 = OpConstantComposite %10 %77 %80 %77 %78 221 %83 = OpConstantComposite %10 %80 %80 %77 %78 222 %84 = OpConstantComposite %10 %77 %77 %80 %78 223 %85 = OpConstantComposite %10 %80 %77 %80 %78 224 %86 = OpConstantComposite %10 %77 %80 %80 %78 225 %87 = OpConstantComposite %10 %80 %80 %80 %78 226 %88 = OpConstantComposite %10 %78 %77 %77 %78 227 %89 = OpConstantComposite %10 %77 %78 %77 %78 228 %90 = OpConstantComposite %10 %78 %78 %77 %78 229 %91 = OpConstantComposite %10 %77 %77 %78 %78 230 %92 = OpConstantComposite %10 %78 %77 %78 %78 231 %93 = OpConstantComposite %10 %77 %78 %78 %78 232 %94 = OpConstantComposite %10 %78 %78 %78 %78 233 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 234 %97 = OpConstant %18 16 235 %99 = OpTypePointer Function %76 236 %101 = OpTypePointer Function %10 237 %234 = OpConstant %6 0 238 %235 = OpConstantComposite %10 %234 %234 %234 %234 239 %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 240 %4 = OpFunction %2 None %3 241 %5 = OpLabel 242 %100 = OpVariable %99 Function 243 %13 = OpLoad %10 %12 244 %14 = OpVectorShuffle %7 %13 %13 0 1 245 %21 = OpAccessChain %20 %17 %19 246 %22 = OpLoad %7 %21 247 %23 = OpFDiv %7 %14 %22 248 %31 = OpCompositeExtract %6 %23 0 249 %33 = OpFMul %6 %31 %32 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 %262 = OpLoad %76 %100 274 OpStore %100 %236 275 OpStore %100 %262 276 %231 = OpVectorShuffle %7 %89 %85 1 4 277 %102 = OpAccessChain %101 %100 %98 278 %103 = OpLoad %10 %102 279 OpStore %74 %103 280 OpReturn 281 OpFunctionEnd 282END 283 284# uniforms for variant 285 286# resolution 287BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA 288 256.0 256.0 289END 290 291BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 292 293PIPELINE graphics variant_pipeline 294 ATTACH variant_vertex_shader 295 ATTACH variant_fragment_shader 296 FRAMEBUFFER_SIZE 256 256 297 BIND BUFFER variant_framebuffer AS color LOCATION 0 298 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 299END 300CLEAR_COLOR variant_pipeline 0 0 0 255 301 302CLEAR variant_pipeline 303RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 304 305 306SHADER vertex variant_2_vertex_shader PASSTHROUGH 307 308SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 309; SPIR-V 310; Version: 1.0 311; Generator: Khronos Glslang Reference Front End; 7 312; Bound: 237 313; Schema: 0 314 OpCapability Shader 315 %1 = OpExtInstImport "GLSL.std.450" 316 OpMemoryModel Logical GLSL450 317 OpEntryPoint Fragment %4 "main" %12 %74 318 OpExecutionMode %4 OriginUpperLeft 319 OpSource ESSL 320 320 OpName %4 "main" 321 OpName %12 "gl_FragCoord" 322 OpName %15 "buf0" 323 OpMemberName %15 0 "resolution" 324 OpName %17 "" 325 OpName %74 "_GLF_color" 326 OpName %100 "indexable" 327 OpDecorate %12 BuiltIn FragCoord 328 OpMemberDecorate %15 0 Offset 0 329 OpDecorate %15 Block 330 OpDecorate %17 DescriptorSet 0 331 OpDecorate %17 Binding 0 332 OpDecorate %74 Location 0 333 %2 = OpTypeVoid 334 %3 = OpTypeFunction %2 335 %6 = OpTypeFloat 32 336 %7 = OpTypeVector %6 2 337 %10 = OpTypeVector %6 4 338 %11 = OpTypePointer Input %10 339 %12 = OpVariable %11 Input 340 %15 = OpTypeStruct %7 341 %16 = OpTypePointer Uniform %15 342 %17 = OpVariable %16 Uniform 343 %18 = OpTypeInt 32 1 344 %19 = OpConstant %18 0 345 %20 = OpTypePointer Uniform %7 346 %27 = OpTypeInt 32 0 347 %32 = OpConstant %6 10 348 %47 = OpConstant %18 10 349 %51 = OpConstant %18 100 350 %60 = OpTypeBool 351 %62 = OpConstant %18 4 352 %65 = OpConstant %18 1000 353 %71 = OpConstant %18 1 354 %73 = OpTypePointer Output %10 355 %74 = OpVariable %73 Output 356 %75 = OpConstant %27 16 357 %76 = OpTypeArray %10 %75 358 %77 = OpConstant %6 0 359 %78 = OpConstant %6 1 360 %79 = OpConstantComposite %10 %77 %77 %77 %78 361 %80 = OpConstant %6 0.5 362 %81 = OpConstantComposite %10 %80 %77 %77 %78 363 %82 = OpConstantComposite %10 %77 %80 %77 %78 364 %83 = OpConstantComposite %10 %80 %80 %77 %78 365 %84 = OpConstantComposite %10 %77 %77 %80 %78 366 %85 = OpConstantComposite %10 %80 %77 %80 %78 367 %86 = OpConstantComposite %10 %77 %80 %80 %78 368 %87 = OpConstantComposite %10 %80 %80 %80 %78 369 %88 = OpConstantComposite %10 %78 %77 %77 %78 370 %89 = OpConstantComposite %10 %77 %78 %77 %78 371 %90 = OpConstantComposite %10 %78 %78 %77 %78 372 %91 = OpConstantComposite %10 %77 %77 %78 %78 373 %92 = OpConstantComposite %10 %78 %77 %78 %78 374 %93 = OpConstantComposite %10 %77 %78 %78 %78 375 %94 = OpConstantComposite %10 %78 %78 %78 %78 376 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 377 %97 = OpConstant %18 16 378 %99 = OpTypePointer Function %76 379 %101 = OpTypePointer Function %10 380 %234 = OpConstant %6 0 381 %235 = OpConstantComposite %10 %234 %234 %234 %234 382 %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 383 %4 = OpFunction %2 None %3 384 %5 = OpLabel 385 %100 = OpVariable %99 Function 386 %13 = OpLoad %10 %12 387 %14 = OpVectorShuffle %7 %13 %13 0 1 388 %21 = OpAccessChain %20 %17 %19 389 %22 = OpLoad %7 %21 390 %23 = OpFDiv %7 %14 %22 391 %31 = OpCompositeExtract %6 %23 0 392 %33 = OpFMul %6 %31 %32 393 %34 = OpConvertFToS %18 %33 394 %37 = OpCompositeExtract %6 %23 1 395 %38 = OpFMul %6 %37 %32 396 %39 = OpConvertFToS %18 %38 397 %48 = OpIMul %18 %39 %47 398 %49 = OpIAdd %18 %34 %48 399 OpBranch %53 400 %53 = OpLabel 401 %106 = OpPhi %18 %51 %5 %69 %54 402 %104 = OpPhi %18 %19 %5 %72 %54 403 %61 = OpSLessThan %60 %104 %49 404 OpLoopMerge %55 %54 None 405 OpBranchConditional %61 %54 %55 406 %54 = OpLabel 407 %64 = OpIMul %18 %62 %106 408 %67 = OpISub %18 %65 %106 409 %68 = OpIMul %18 %64 %67 410 %69 = OpSDiv %18 %68 %65 411 %72 = OpIAdd %18 %104 %71 412 OpBranch %53 413 %55 = OpLabel 414 %98 = OpSMod %18 %106 %97 415 OpStore %100 %95 416 %231 = OpVectorShuffle %7 %89 %85 1 4 417 %102 = OpAccessChain %101 %100 %98 418 %103 = OpLoad %10 %102 419 OpStore %74 %103 420 OpReturn 421 OpFunctionEnd 422END 423 424# uniforms for variant_2 425 426# resolution 427BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA 428 256.0 256.0 429END 430 431BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM 432 433PIPELINE graphics variant_2_pipeline 434 ATTACH variant_2_vertex_shader 435 ATTACH variant_2_fragment_shader 436 FRAMEBUFFER_SIZE 256 256 437 BIND BUFFER variant_2_framebuffer AS color LOCATION 0 438 BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 439END 440CLEAR_COLOR variant_2_pipeline 0 0 0 255 441 442CLEAR variant_2_pipeline 443RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256 444 445EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 446EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005 447