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 with id used by OpPhi hidden in 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: 290 31; Schema: 0 32 OpCapability Shader 33 %1 = OpExtInstImport "GLSL.std.450" 34 OpMemoryModel Logical GLSL450 35 OpEntryPoint Fragment %4 "main" %85 %137 36 OpExecutionMode %4 OriginUpperLeft 37 OpSource ESSL 320 38 OpName %4 "main" 39 OpName %66 "c" 40 OpName %73 "buf0" 41 OpMemberName %73 0 "resolution" 42 OpName %75 "" 43 OpName %85 "gl_FragCoord" 44 OpName %137 "_GLF_color" 45 OpMemberDecorate %73 0 Offset 0 46 OpDecorate %73 Block 47 OpDecorate %75 DescriptorSet 0 48 OpDecorate %75 Binding 0 49 OpDecorate %85 BuiltIn FragCoord 50 OpDecorate %137 Location 0 51 %2 = OpTypeVoid 52 %3 = OpTypeFunction %2 53 %6 = OpTypeFloat 32 54 %7 = OpTypePointer Function %6 55 %14 = OpConstant %6 -0.5 56 %15 = OpTypeInt 32 1 57 %18 = OpConstant %15 1 58 %25 = OpConstant %15 800 59 %26 = OpTypeBool 60 %29 = OpConstant %15 32 61 %31 = OpConstant %15 0 62 %35 = OpConstant %6 0.400000006 63 %44 = OpConstant %6 0.00999999978 64 %48 = OpConstant %6 100 65 %64 = OpTypeVector %6 3 66 %65 = OpTypePointer Function %64 67 %67 = OpConstant %6 7 68 %68 = OpConstant %6 8 69 %69 = OpConstant %6 9 70 %70 = OpConstantComposite %64 %67 %68 %69 71 %72 = OpTypeVector %6 2 72 %73 = OpTypeStruct %72 73 %74 = OpTypePointer Uniform %73 74 %75 = OpVariable %74 Uniform 75 %76 = OpTypeInt 32 0 76 %77 = OpConstant %76 0 77 %78 = OpTypePointer Uniform %6 78 %83 = OpTypeVector %6 4 79 %84 = OpTypePointer Input %83 80 %85 = OpVariable %84 Input 81 %87 = OpTypePointer Input %6 82 %95 = OpConstant %76 1 83 %107 = OpConstant %76 2 84 %116 = OpConstant %15 3 85 %121 = OpConstant %6 1 86 %136 = OpTypePointer Output %83 87 %137 = OpVariable %136 Output 88 %149 = OpConstantFalse %26 89 %152 = OpConstantTrue %26 90 %261 = OpUndef %6 91 %289 = OpConstant %6 0.125 92 %4 = OpFunction %2 None %3 93 %5 = OpLabel 94 %66 = OpVariable %65 Function 95 OpStore %66 %70 96 %79 = OpAccessChain %78 %75 %31 %77 97 %80 = OpLoad %6 %79 98 %81 = OpFMul %6 %80 %289 99 %82 = OpExtInst %6 %1 Round %81 100 %88 = OpAccessChain %87 %85 %77 101 %89 = OpLoad %6 %88 102 OpSelectionMerge %199 None 103 OpSwitch %77 %161 104 %161 = OpLabel 105 OpBranch %162 106 %162 = OpLabel 107 %248 = OpPhi %6 %14 %161 %251 %192 108 %247 = OpPhi %15 %18 %161 %194 %192 109 %165 = OpSLessThan %26 %247 %25 110 OpLoopMerge %195 %192 None 111 OpBranchConditional %165 %166 %195 112 %166 = OpLabel 113 %168 = OpSMod %15 %247 %29 114 %169 = OpIEqual %26 %168 %31 115 OpSelectionMerge %184 None 116 OpBranchConditional %169 %170 %173 117 %170 = OpLabel 118 %172 = OpFAdd %6 %248 %35 119 OpBranch %184 120 %173 = OpLabel 121 %175 = OpConvertSToF %6 %247 122 %177 = OpExtInst %6 %1 Round %82 123 %178 = OpFMod %6 %175 %177 124 %179 = OpFOrdLessThanEqual %26 %178 %44 125 OpSelectionMerge %183 None 126 OpBranchConditional %179 %180 %183 127 %180 = OpLabel 128 %182 = OpFAdd %6 %248 %48 129 OpBranch %183 130 %183 = OpLabel 131 %252 = OpPhi %6 %248 %173 %182 %180 132 OpBranch %184 133 %184 = OpLabel 134 %251 = OpPhi %6 %172 %170 %252 %183 135 %186 = OpConvertSToF %6 %247 136 %188 = OpFOrdGreaterThanEqual %26 %186 %89 137 OpSelectionMerge %191 None 138 OpBranchConditional %188 %189 %191 139 %189 = OpLabel 140 OpBranch %195 141 %191 = OpLabel 142 OpBranch %192 143 %192 = OpLabel 144 %194 = OpIAdd %15 %247 %18 145 OpBranch %162 146 %195 = OpLabel 147 %259 = OpPhi %6 %261 %162 %251 %189 148 %257 = OpPhi %6 %248 %162 %251 %189 149 %253 = OpPhi %26 %149 %162 %152 %189 150 OpSelectionMerge %197 None 151 OpBranchConditional %253 %199 %197 152 %197 = OpLabel 153 OpBranch %199 154 %199 = OpLabel 155 %258 = OpPhi %6 %259 %195 %257 %197 156 %93 = OpAccessChain %7 %66 %77 157 OpStore %93 %258 158 %96 = OpAccessChain %87 %85 %95 159 %97 = OpLoad %6 %96 160 OpSelectionMerge %245 None 161 OpSwitch %77 %207 162 %207 = OpLabel 163 OpBranch %208 164 %208 = OpLabel 165 %265 = OpPhi %6 %14 %207 %268 %238 166 %264 = OpPhi %15 %18 %207 %240 %238 167 %211 = OpSLessThan %26 %264 %25 168 OpLoopMerge %241 %238 None 169 OpBranchConditional %211 %212 %241 170 %212 = OpLabel 171 %214 = OpSMod %15 %264 %29 172 %215 = OpIEqual %26 %214 %31 173 OpSelectionMerge %230 None 174 OpBranchConditional %215 %216 %219 175 %216 = OpLabel 176 %218 = OpFAdd %6 %265 %35 177 OpBranch %230 178 %219 = OpLabel 179 %221 = OpConvertSToF %6 %264 180 %223 = OpExtInst %6 %1 Round %82 181 %224 = OpFMod %6 %221 %223 182 %225 = OpFOrdLessThanEqual %26 %224 %44 183 OpSelectionMerge %229 None 184 OpBranchConditional %225 %226 %229 185 %226 = OpLabel 186 %228 = OpFAdd %6 %265 %48 187 OpBranch %229 188 %229 = OpLabel 189 %269 = OpPhi %6 %265 %219 %228 %226 190 OpBranch %230 191 %230 = OpLabel 192 %268 = OpPhi %6 %218 %216 %269 %229 193 %232 = OpConvertSToF %6 %264 194 %234 = OpFOrdGreaterThanEqual %26 %232 %97 195 OpSelectionMerge %237 None 196 OpBranchConditional %234 %235 %237 197 %235 = OpLabel 198 OpBranch %241 199 %237 = OpLabel 200 OpBranch %238 201 %238 = OpLabel 202 %240 = OpIAdd %15 %264 %18 203 OpBranch %208 204 %241 = OpLabel 205 %276 = OpPhi %6 %261 %208 %268 %235 206 %274 = OpPhi %6 %265 %208 %268 %235 207 %270 = OpPhi %26 %149 %208 %152 %235 208 OpSelectionMerge %243 None 209 OpBranchConditional %270 %245 %243 210 %243 = OpLabel 211 OpBranch %245 212 %245 = OpLabel 213 %275 = OpPhi %6 %276 %241 %274 %243 214 %101 = OpAccessChain %7 %66 %95 215 OpStore %101 %275 216 %103 = OpLoad %6 %93 217 %105 = OpLoad %6 %101 218 %106 = OpFAdd %6 %103 %105 219 %108 = OpAccessChain %7 %66 %107 220 OpStore %108 %106 221 OpBranch %110 222 %110 = OpLabel 223 %285 = OpPhi %15 %31 %245 %135 %113 224 %117 = OpSLessThan %26 %285 %116 225 OpLoopMerge %112 %113 None 226 OpBranchConditional %117 %111 %112 227 %111 = OpLabel 228 %119 = OpAccessChain %7 %66 %285 229 %120 = OpLoad %6 %119 230 %122 = OpFOrdGreaterThanEqual %26 %120 %121 231 OpSelectionMerge %124 None 232 OpBranchConditional %122 %123 %124 233 %123 = OpLabel 234 %128 = OpLoad %6 %119 235 %131 = OpLoad %6 %119 236 %132 = OpFMul %6 %128 %131 237 OpStore %119 %132 238 OpBranch %124 239 %124 = OpLabel 240 OpBranch %113 241 %113 = OpLabel 242 %135 = OpIAdd %15 %285 %18 243 OpBranch %110 244 %112 = OpLabel 245 %138 = OpLoad %64 %66 246 %139 = OpExtInst %64 %1 FAbs %138 247 %140 = OpExtInst %64 %1 Normalize %139 248 %141 = OpCompositeExtract %6 %140 0 249 %142 = OpCompositeExtract %6 %140 1 250 %143 = OpCompositeExtract %6 %140 2 251 %144 = OpCompositeConstruct %83 %141 %142 %143 %121 252 OpStore %137 %144 253 OpReturn 254 OpFunctionEnd 255END 256 257# uniforms for reference 258 259# resolution 260BUFFER reference_resolution DATA_TYPE vec2<float> DATA 261 256.0 256.0 262END 263 264BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 265 266PIPELINE graphics reference_pipeline 267 ATTACH reference_vertex_shader 268 ATTACH reference_fragment_shader 269 FRAMEBUFFER_SIZE 256 256 270 BIND BUFFER reference_framebuffer AS color LOCATION 0 271 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 272END 273CLEAR_COLOR reference_pipeline 0 0 0 255 274 275CLEAR reference_pipeline 276RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 277 278 279SHADER vertex variant_vertex_shader PASSTHROUGH 280 281SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 282; SPIR-V 283; Version: 1.0 284; Generator: Khronos Glslang Reference Front End; 7 285; Bound: 505 286; Schema: 0 287 OpCapability Shader 288 %1 = OpExtInstImport "GLSL.std.450" 289 OpMemoryModel Logical GLSL450 290 OpEntryPoint Fragment %4 "main" %85 %137 291 OpExecutionMode %4 OriginUpperLeft 292 OpSource ESSL 320 293 OpName %4 "main" 294 OpName %66 "c" 295 OpName %73 "buf0" 296 OpMemberName %73 0 "resolution" 297 OpName %75 "" 298 OpName %85 "gl_FragCoord" 299 OpName %137 "_GLF_color" 300 OpMemberDecorate %73 0 Offset 0 301 OpDecorate %73 Block 302 OpDecorate %75 DescriptorSet 0 303 OpDecorate %75 Binding 0 304 OpDecorate %85 BuiltIn FragCoord 305 OpDecorate %137 Location 0 306 %2 = OpTypeVoid 307 %3 = OpTypeFunction %2 308 %6 = OpTypeFloat 32 309 %7 = OpTypePointer Function %6 310 %14 = OpConstant %6 -0.5 311 %15 = OpTypeInt 32 1 312 %18 = OpConstant %15 1 313 %25 = OpConstant %15 800 314 %26 = OpTypeBool 315 %29 = OpConstant %15 32 316 %31 = OpConstant %15 0 317 %35 = OpConstant %6 0.400000006 318 %44 = OpConstant %6 0.00999999978 319 %48 = OpConstant %6 100 320 %64 = OpTypeVector %6 3 321 %65 = OpTypePointer Function %64 322 %67 = OpConstant %6 7 323 %68 = OpConstant %6 8 324 %69 = OpConstant %6 9 325 %70 = OpConstantComposite %64 %67 %68 %69 326 %72 = OpTypeVector %6 2 327 %73 = OpTypeStruct %72 328 %74 = OpTypePointer Uniform %73 329 %75 = OpVariable %74 Uniform 330 %76 = OpTypeInt 32 0 331 %77 = OpConstant %76 0 332 %78 = OpTypePointer Uniform %6 333 %83 = OpTypeVector %6 4 334 %84 = OpTypePointer Input %83 335 %85 = OpVariable %84 Input 336 %87 = OpTypePointer Input %6 337 %95 = OpConstant %76 1 338 %107 = OpConstant %76 2 339 %116 = OpConstant %15 3 340 %121 = OpConstant %6 1 341 %136 = OpTypePointer Output %83 342 %137 = OpVariable %136 Output 343 %149 = OpConstantFalse %26 344 %152 = OpConstantTrue %26 345 %261 = OpUndef %6 346 %289 = OpConstant %6 0.125 347 %4 = OpFunction %2 None %3 348 %5 = OpLabel 349 %66 = OpVariable %65 Function 350 OpStore %66 %70 351 %79 = OpAccessChain %78 %75 %31 %77 352 %80 = OpLoad %6 %79 353 %390 = OpCompositeConstruct %72 %121 %80 354 %81 = OpFMul %6 %80 %289 355 %82 = OpExtInst %6 %1 Round %81 356 %410 = OpCompositeConstruct %72 %261 %14 357 %88 = OpAccessChain %87 %85 %77 358 %89 = OpLoad %6 %88 359 OpSelectionMerge %199 None 360 OpSwitch %77 %161 361 %161 = OpLabel 362 OpBranch %162 363 %162 = OpLabel 364 %248 = OpPhi %6 %14 %161 %251 %192 365 %247 = OpPhi %15 %18 %161 %194 %192 366 %165 = OpSLessThan %26 %247 %25 367 OpLoopMerge %195 %192 None 368 OpBranchConditional %165 %166 %195 369 %166 = OpLabel 370 %168 = OpSMod %15 %247 %29 371 %169 = OpIEqual %26 %168 %31 372 OpSelectionMerge %184 None 373 OpBranchConditional %169 %170 %173 374 %170 = OpLabel 375 %172 = OpFAdd %6 %248 %35 376 OpBranch %184 377 %173 = OpLabel 378 %175 = OpConvertSToF %6 %247 379 %177 = OpExtInst %6 %1 Round %82 380 %178 = OpFMod %6 %175 %177 381 %179 = OpFOrdLessThanEqual %26 %178 %44 382 OpSelectionMerge %183 None 383 OpBranchConditional %179 %180 %183 384 %180 = OpLabel 385 %182 = OpFAdd %6 %248 %48 386 OpBranch %183 387 %183 = OpLabel 388 %252 = OpPhi %6 %248 %173 %182 %180 389 OpBranch %184 390 %184 = OpLabel 391 %251 = OpPhi %6 %172 %170 %252 %183 392 %186 = OpConvertSToF %6 %247 393 %188 = OpFOrdGreaterThanEqual %26 %186 %89 394 OpSelectionMerge %191 None 395 OpBranchConditional %188 %189 %191 396 %189 = OpLabel 397 OpBranch %195 398 %191 = OpLabel 399 OpBranch %192 400 %192 = OpLabel 401 %194 = OpIAdd %15 %247 %18 402 OpBranch %162 403 %195 = OpLabel 404 %259 = OpPhi %6 %261 %162 %251 %189 405 %257 = OpPhi %6 %248 %162 %251 %189 406 %253 = OpPhi %26 %149 %162 %152 %189 407 OpSelectionMerge %197 None 408 OpBranchConditional %253 %199 %197 409 %197 = OpLabel 410 OpBranch %199 411 %199 = OpLabel 412 %258 = OpPhi %6 %259 %195 %257 %197 413 %93 = OpAccessChain %7 %66 %77 414 %415 = OpCompositeConstruct %83 %257 %35 %259 %35 415 %460 = OpCompositeConstruct %64 %390 %14 416 OpStore %93 %258 417 %96 = OpAccessChain %87 %85 %95 418 %97 = OpLoad %6 %96 419 OpSelectionMerge %245 None 420 OpSwitch %77 %207 421 %207 = OpLabel 422 %417 = OpCompositeConstruct %83 %410 %261 %248 423 %504 = OpCompositeExtract %6 %460 2 424 OpBranch %208 425 %208 = OpLabel 426 %265 = OpPhi %6 %504 %207 %268 %238 427 %264 = OpPhi %15 %18 %207 %240 %238 428 %211 = OpSLessThan %26 %264 %25 429 OpLoopMerge %241 %238 None 430 OpBranchConditional %211 %212 %241 431 %212 = OpLabel 432 %214 = OpSMod %15 %264 %29 433 %215 = OpIEqual %26 %214 %31 434 OpSelectionMerge %230 None 435 OpBranchConditional %215 %216 %219 436 %216 = OpLabel 437 %218 = OpFAdd %6 %265 %35 438 OpBranch %230 439 %219 = OpLabel 440 %221 = OpConvertSToF %6 %264 441 %223 = OpExtInst %6 %1 Round %82 442 %224 = OpFMod %6 %221 %223 443 %225 = OpFOrdLessThanEqual %26 %224 %44 444 OpSelectionMerge %229 None 445 OpBranchConditional %225 %226 %229 446 %226 = OpLabel 447 %228 = OpFAdd %6 %265 %48 448 OpBranch %229 449 %229 = OpLabel 450 %269 = OpPhi %6 %265 %219 %228 %226 451 OpBranch %230 452 %230 = OpLabel 453 %268 = OpPhi %6 %218 %216 %269 %229 454 %232 = OpConvertSToF %6 %264 455 %234 = OpFOrdGreaterThanEqual %26 %232 %97 456 OpSelectionMerge %237 None 457 OpBranchConditional %234 %235 %237 458 %235 = OpLabel 459 OpBranch %241 460 %237 = OpLabel 461 OpBranch %238 462 %238 = OpLabel 463 %240 = OpIAdd %15 %264 %18 464 OpBranch %208 465 %241 = OpLabel 466 %276 = OpPhi %6 %261 %208 %268 %235 467 %274 = OpPhi %6 %265 %208 %268 %235 468 %270 = OpPhi %26 %149 %208 %152 %235 469 OpSelectionMerge %243 None 470 OpBranchConditional %270 %245 %243 471 %243 = OpLabel 472 OpBranch %245 473 %245 = OpLabel 474 %275 = OpPhi %6 %276 %241 %274 %243 475 %101 = OpAccessChain %7 %66 %95 476 OpStore %101 %275 477 %103 = OpLoad %6 %93 478 %105 = OpLoad %6 %101 479 %106 = OpFAdd %6 %103 %105 480 %108 = OpAccessChain %7 %66 %107 481 OpStore %108 %106 482 OpBranch %110 483 %110 = OpLabel 484 %285 = OpPhi %15 %31 %245 %135 %113 485 %117 = OpSLessThan %26 %285 %116 486 OpLoopMerge %112 %113 None 487 OpBranchConditional %117 %111 %112 488 %111 = OpLabel 489 %119 = OpAccessChain %7 %66 %285 490 %120 = OpLoad %6 %119 491 %122 = OpFOrdGreaterThanEqual %26 %120 %121 492 OpSelectionMerge %124 None 493 OpBranchConditional %122 %123 %124 494 %123 = OpLabel 495 %128 = OpLoad %6 %119 496 %131 = OpLoad %6 %119 497 %132 = OpFMul %6 %128 %131 498 OpStore %119 %132 499 OpBranch %124 500 %124 = OpLabel 501 OpBranch %113 502 %113 = OpLabel 503 %135 = OpIAdd %15 %285 %18 504 OpBranch %110 505 %112 = OpLabel 506 %138 = OpLoad %64 %66 507 %139 = OpExtInst %64 %1 FAbs %138 508 %140 = OpExtInst %64 %1 Normalize %139 509 %141 = OpCompositeExtract %6 %140 0 510 %142 = OpCompositeExtract %6 %140 1 511 %143 = OpCompositeExtract %6 %140 2 512 %144 = OpCompositeConstruct %83 %141 %142 %143 %121 513 OpStore %137 %144 514 OpReturn 515 OpFunctionEnd 516END 517 518# uniforms for variant 519 520# resolution 521BUFFER variant_resolution DATA_TYPE vec2<float> DATA 522 256.0 256.0 523END 524 525BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 526 527PIPELINE graphics variant_pipeline 528 ATTACH variant_vertex_shader 529 ATTACH variant_fragment_shader 530 FRAMEBUFFER_SIZE 256 256 531 BIND BUFFER variant_framebuffer AS color LOCATION 0 532 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 533END 534CLEAR_COLOR variant_pipeline 0 0 0 255 535 536CLEAR variant_pipeline 537RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 538 539EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 540