Generate separate stores for partially swizzled memory stores

Full vector and fully specified vector swizzle stores are not affected by this change, only partial swizzles ie swizzles with fewer components than the vector being stored to.

Previously the vector being stored to loaded and any components not specified in the swizzle were used to create a full store to the vector.

While this change generates more SPIR-V instructions, it is necessary for correctness.

Fixes #2518.
This commit is contained in:
Jeremy Hayes 2021-07-16 15:07:16 -06:00
parent 9158061398
commit 6d5b40f051
50 changed files with 31343 additions and 26594 deletions

View file

@ -2,7 +2,7 @@ spv.float64.frag
Validation failed
// Module Version 10300
// Generated by (magic number): 8000a
// Id's are bound by 524
// Id's are bound by 532
Capability Shader
Capability Float16
@ -83,53 +83,53 @@ Validation failed
Name 441 "f64v2"
Name 459 "f64v"
Name 461 "if64v"
Name 510 "S"
MemberName 510(S) 0 "x"
MemberName 510(S) 1 "y"
MemberName 510(S) 2 "z"
Name 512 "B1"
MemberName 512(B1) 0 "a"
MemberName 512(B1) 1 "b"
MemberName 512(B1) 2 "c"
MemberName 512(B1) 3 "d"
MemberName 512(B1) 4 "e"
MemberName 512(B1) 5 "f"
MemberName 512(B1) 6 "g"
MemberName 512(B1) 7 "h"
Name 514 ""
Name 515 "sf16"
Name 517 "sf"
Name 518 "sd"
Name 519 "f16_to_f"
Name 521 "f16_to_d"
Name 522 "f_to_f16"
Name 523 "d_to_f16"
Name 518 "S"
MemberName 518(S) 0 "x"
MemberName 518(S) 1 "y"
MemberName 518(S) 2 "z"
Name 520 "B1"
MemberName 520(B1) 0 "a"
MemberName 520(B1) 1 "b"
MemberName 520(B1) 2 "c"
MemberName 520(B1) 3 "d"
MemberName 520(B1) 4 "e"
MemberName 520(B1) 5 "f"
MemberName 520(B1) 6 "g"
MemberName 520(B1) 7 "h"
Name 522 ""
Name 523 "sf16"
Name 525 "sf"
Name 526 "sd"
Name 527 "f16_to_f"
Name 529 "f16_to_d"
Name 530 "f_to_f16"
Name 531 "d_to_f16"
Decorate 461(if64v) Flat
Decorate 461(if64v) Location 0
Decorate 508 ArrayStride 16
Decorate 509 ArrayStride 64
MemberDecorate 510(S) 0 Offset 0
MemberDecorate 510(S) 1 Offset 16
MemberDecorate 510(S) 2 Offset 32
Decorate 511 ArrayStride 64
MemberDecorate 512(B1) 0 Offset 0
MemberDecorate 512(B1) 1 Offset 16
MemberDecorate 512(B1) 2 Offset 32
MemberDecorate 512(B1) 3 Offset 64
MemberDecorate 512(B1) 4 ColMajor
MemberDecorate 512(B1) 4 Offset 96
MemberDecorate 512(B1) 4 MatrixStride 32
MemberDecorate 512(B1) 5 ColMajor
MemberDecorate 512(B1) 5 Offset 160
MemberDecorate 512(B1) 5 MatrixStride 32
MemberDecorate 512(B1) 6 Offset 288
MemberDecorate 512(B1) 7 Offset 352
Decorate 512(B1) Block
Decorate 514 DescriptorSet 0
Decorate 514 Binding 0
Decorate 515(sf16) SpecId 100
Decorate 517(sf) SpecId 101
Decorate 518(sd) SpecId 102
Decorate 516 ArrayStride 16
Decorate 517 ArrayStride 64
MemberDecorate 518(S) 0 Offset 0
MemberDecorate 518(S) 1 Offset 16
MemberDecorate 518(S) 2 Offset 32
Decorate 519 ArrayStride 64
MemberDecorate 520(B1) 0 Offset 0
MemberDecorate 520(B1) 1 Offset 16
MemberDecorate 520(B1) 2 Offset 32
MemberDecorate 520(B1) 3 Offset 64
MemberDecorate 520(B1) 4 ColMajor
MemberDecorate 520(B1) 4 Offset 96
MemberDecorate 520(B1) 4 MatrixStride 32
MemberDecorate 520(B1) 5 ColMajor
MemberDecorate 520(B1) 5 Offset 160
MemberDecorate 520(B1) 5 MatrixStride 32
MemberDecorate 520(B1) 6 Offset 288
MemberDecorate 520(B1) 7 Offset 352
Decorate 520(B1) Block
Decorate 522 DescriptorSet 0
Decorate 522 Binding 0
Decorate 523(sf16) SpecId 100
Decorate 525(sf) SpecId 101
Decorate 526(sd) SpecId 102
2: TypeVoid
3: TypeFunction 2
26: TypeFloat 64
@ -195,26 +195,26 @@ Validation failed
460: TypePointer Input 149(f64vec3)
461(if64v): 460(ptr) Variable Input
462: TypePointer Input 26(float64_t)
499: 182(int) Constant 1
504:26(float64_t) Constant 0 1071644672
505: 27(f64vec2) ConstantComposite 504 504
507: 31(int) Constant 2
508: TypeArray 26(float64_t) 507
509: TypeArray 402 507
510(S): TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3)
511: TypeArray 510(S) 507
512(B1): TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3) 508 402 509 510(S) 511
513: TypePointer Uniform 512(B1)
514: 513(ptr) Variable Uniform
515(sf16):162(float16_t) SpecConstant 12288
516: TypeFloat 32
517(sf): 516(float) SpecConstant 1048576000
518(sd):26(float64_t) SpecConstant 0 1071644672
519(f16_to_f): 516(float) SpecConstantOp 115 515(sf16)
520: 516(float) SpecConstantOp 115 515(sf16)
521(f16_to_d):26(float64_t) SpecConstantOp 115 520
522(f_to_f16):162(float16_t) SpecConstantOp 115 517(sf)
523(d_to_f16):162(float16_t) SpecConstantOp 115 518(sd)
505: 182(int) Constant 1
512:26(float64_t) Constant 0 1071644672
513: 27(f64vec2) ConstantComposite 512 512
515: 31(int) Constant 2
516: TypeArray 26(float64_t) 515
517: TypeArray 402 515
518(S): TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3)
519: TypeArray 518(S) 515
520(B1): TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3) 516 402 517 518(S) 519
521: TypePointer Uniform 520(B1)
522: 521(ptr) Variable Uniform
523(sf16):162(float16_t) SpecConstant 12288
524: TypeFloat 32
525(sf): 524(float) SpecConstant 1048576000
526(sd):26(float64_t) SpecConstant 0 1071644672
527(f16_to_f): 524(float) SpecConstantOp 115 523(sf16)
528: 524(float) SpecConstantOp 115 523(sf16)
529(f16_to_d):26(float64_t) SpecConstantOp 115 528
530(f_to_f16):162(float16_t) SpecConstantOp 115 525(sf)
531(d_to_f16):162(float16_t) SpecConstantOp 115 526(sd)
4(main): 2 Function None 3
5: Label
Return
@ -754,45 +754,57 @@ Validation failed
471:149(f64vec3) Load 461(if64v)
472: 27(f64vec2) VectorShuffle 471 471 0 1
473: 27(f64vec2) DPdxFine 472
474:149(f64vec3) Load 459(f64v)
475:149(f64vec3) VectorShuffle 474 473 3 4 2
Store 459(f64v) 475
476:149(f64vec3) Load 461(if64v)
477: 27(f64vec2) VectorShuffle 476 476 0 1
478: 27(f64vec2) DPdyFine 477
479:149(f64vec3) Load 459(f64v)
480:149(f64vec3) VectorShuffle 479 478 3 4 2
Store 459(f64v) 480
481:149(f64vec3) Load 461(if64v)
482:149(f64vec3) DPdxCoarse 481
Store 459(f64v) 482
483:149(f64vec3) Load 461(if64v)
484:149(f64vec3) DPdxCoarse 483
Store 459(f64v) 484
485: 462(ptr) AccessChain 461(if64v) 32
486:26(float64_t) Load 485
487:26(float64_t) Fwidth 486
488: 33(ptr) AccessChain 459(f64v) 32
Store 488 487
489:149(f64vec3) Load 461(if64v)
490: 27(f64vec2) VectorShuffle 489 489 0 1
491: 27(f64vec2) FwidthFine 490
492:149(f64vec3) Load 459(f64v)
493:149(f64vec3) VectorShuffle 492 491 3 4 2
Store 459(f64v) 493
494:149(f64vec3) Load 461(if64v)
495:149(f64vec3) FwidthCoarse 494
Store 459(f64v) 495
496: 462(ptr) AccessChain 461(if64v) 32
497:26(float64_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 496
498: 33(ptr) AccessChain 459(f64v) 32
Store 498 497
500:149(f64vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 461(if64v) 499
501: 27(f64vec2) VectorShuffle 500 500 0 1
502:149(f64vec3) Load 459(f64v)
503:149(f64vec3) VectorShuffle 502 501 3 4 2
Store 459(f64v) 503
506:149(f64vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 461(if64v) 505
Store 459(f64v) 506
474: 33(ptr) AccessChain 459(f64v) 32
475:26(float64_t) CompositeExtract 473 0
Store 474 475
476: 33(ptr) AccessChain 459(f64v) 88
477:26(float64_t) CompositeExtract 473 1
Store 476 477
478:149(f64vec3) Load 461(if64v)
479: 27(f64vec2) VectorShuffle 478 478 0 1
480: 27(f64vec2) DPdyFine 479
481: 33(ptr) AccessChain 459(f64v) 32
482:26(float64_t) CompositeExtract 480 0
Store 481 482
483: 33(ptr) AccessChain 459(f64v) 88
484:26(float64_t) CompositeExtract 480 1
Store 483 484
485:149(f64vec3) Load 461(if64v)
486:149(f64vec3) DPdxCoarse 485
Store 459(f64v) 486
487:149(f64vec3) Load 461(if64v)
488:149(f64vec3) DPdxCoarse 487
Store 459(f64v) 488
489: 462(ptr) AccessChain 461(if64v) 32
490:26(float64_t) Load 489
491:26(float64_t) Fwidth 490
492: 33(ptr) AccessChain 459(f64v) 32
Store 492 491
493:149(f64vec3) Load 461(if64v)
494: 27(f64vec2) VectorShuffle 493 493 0 1
495: 27(f64vec2) FwidthFine 494
496: 33(ptr) AccessChain 459(f64v) 32
497:26(float64_t) CompositeExtract 495 0
Store 496 497
498: 33(ptr) AccessChain 459(f64v) 88
499:26(float64_t) CompositeExtract 495 1
Store 498 499
500:149(f64vec3) Load 461(if64v)
501:149(f64vec3) FwidthCoarse 500
Store 459(f64v) 501
502: 462(ptr) AccessChain 461(if64v) 32
503:26(float64_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 502
504: 33(ptr) AccessChain 459(f64v) 32
Store 504 503
506:149(f64vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 461(if64v) 505
507: 27(f64vec2) VectorShuffle 506 506 0 1
508: 33(ptr) AccessChain 459(f64v) 32
509:26(float64_t) CompositeExtract 507 0
Store 508 509
510: 33(ptr) AccessChain 459(f64v) 88
511:26(float64_t) CompositeExtract 507 1
Store 510 511
514:149(f64vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 461(if64v) 513
Store 459(f64v) 514
Return
FunctionEnd