diff options
| author | 2021-04-13 05:32:21 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:27 -0400 | |
| commit | fa75b9b0626c8e118e27207dd1e82e2f415fc0bc (patch) | |
| tree | 29738f645876c19fd561a39b8f9d62799bf92ef9 /src/shader_recompiler/ir_opt | |
| parent | shader: Fix fixed pipeline point size on geometry shaders (diff) | |
| download | yuzu-fa75b9b0626c8e118e27207dd1e82e2f415fc0bc.tar.gz yuzu-fa75b9b0626c8e118e27207dd1e82e2f415fc0bc.tar.xz yuzu-fa75b9b0626c8e118e27207dd1e82e2f415fc0bc.zip | |
spirv: Rework storage buffers and shader memory
Diffstat (limited to 'src/shader_recompiler/ir_opt')
| -rw-r--r-- | src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp | 69 |
1 files changed, 64 insertions, 5 deletions
diff --git a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp index ab529e86d..116d93c1c 100644 --- a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp +++ b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp | |||
| @@ -315,6 +315,23 @@ void VisitUsages(Info& info, IR::Inst& inst) { | |||
| 315 | case IR::Opcode::ConvertF32U64: | 315 | case IR::Opcode::ConvertF32U64: |
| 316 | case IR::Opcode::ConvertF64U64: | 316 | case IR::Opcode::ConvertF64U64: |
| 317 | case IR::Opcode::SharedAtomicExchange64: | 317 | case IR::Opcode::SharedAtomicExchange64: |
| 318 | case IR::Opcode::GlobalAtomicIAdd64: | ||
| 319 | case IR::Opcode::GlobalAtomicSMin64: | ||
| 320 | case IR::Opcode::GlobalAtomicUMin64: | ||
| 321 | case IR::Opcode::GlobalAtomicSMax64: | ||
| 322 | case IR::Opcode::GlobalAtomicUMax64: | ||
| 323 | case IR::Opcode::GlobalAtomicAnd64: | ||
| 324 | case IR::Opcode::GlobalAtomicOr64: | ||
| 325 | case IR::Opcode::GlobalAtomicXor64: | ||
| 326 | case IR::Opcode::GlobalAtomicExchange64: | ||
| 327 | case IR::Opcode::StorageAtomicIAdd64: | ||
| 328 | case IR::Opcode::StorageAtomicSMin64: | ||
| 329 | case IR::Opcode::StorageAtomicUMin64: | ||
| 330 | case IR::Opcode::StorageAtomicSMax64: | ||
| 331 | case IR::Opcode::StorageAtomicUMax64: | ||
| 332 | case IR::Opcode::StorageAtomicAnd64: | ||
| 333 | case IR::Opcode::StorageAtomicOr64: | ||
| 334 | case IR::Opcode::StorageAtomicXor64: | ||
| 318 | info.uses_int64 = true; | 335 | info.uses_int64 = true; |
| 319 | break; | 336 | break; |
| 320 | default: | 337 | default: |
| @@ -457,46 +474,91 @@ void VisitUsages(Info& info, IR::Inst& inst) { | |||
| 457 | case IR::Opcode::FSwizzleAdd: | 474 | case IR::Opcode::FSwizzleAdd: |
| 458 | info.uses_fswzadd = true; | 475 | info.uses_fswzadd = true; |
| 459 | break; | 476 | break; |
| 477 | case IR::Opcode::LoadStorageU8: | ||
| 478 | case IR::Opcode::LoadStorageS8: | ||
| 479 | case IR::Opcode::WriteStorageU8: | ||
| 480 | case IR::Opcode::WriteStorageS8: | ||
| 481 | info.used_storage_buffer_types |= IR::Type::U8; | ||
| 482 | break; | ||
| 483 | case IR::Opcode::LoadStorageU16: | ||
| 484 | case IR::Opcode::LoadStorageS16: | ||
| 485 | case IR::Opcode::WriteStorageU16: | ||
| 486 | case IR::Opcode::WriteStorageS16: | ||
| 487 | info.used_storage_buffer_types |= IR::Type::U16; | ||
| 488 | break; | ||
| 489 | case IR::Opcode::LoadStorage32: | ||
| 490 | case IR::Opcode::WriteStorage32: | ||
| 491 | case IR::Opcode::StorageAtomicIAdd32: | ||
| 492 | case IR::Opcode::StorageAtomicSMin32: | ||
| 493 | case IR::Opcode::StorageAtomicUMin32: | ||
| 494 | case IR::Opcode::StorageAtomicSMax32: | ||
| 495 | case IR::Opcode::StorageAtomicUMax32: | ||
| 496 | case IR::Opcode::StorageAtomicAnd32: | ||
| 497 | case IR::Opcode::StorageAtomicOr32: | ||
| 498 | case IR::Opcode::StorageAtomicXor32: | ||
| 499 | case IR::Opcode::StorageAtomicExchange32: | ||
| 500 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 501 | break; | ||
| 502 | case IR::Opcode::LoadStorage64: | ||
| 503 | case IR::Opcode::WriteStorage64: | ||
| 504 | info.used_storage_buffer_types |= IR::Type::U32x2; | ||
| 505 | break; | ||
| 506 | case IR::Opcode::LoadStorage128: | ||
| 507 | case IR::Opcode::WriteStorage128: | ||
| 508 | info.used_storage_buffer_types |= IR::Type::U32x4; | ||
| 509 | break; | ||
| 460 | case IR::Opcode::SharedAtomicInc32: | 510 | case IR::Opcode::SharedAtomicInc32: |
| 461 | info.uses_shared_increment = true; | 511 | info.uses_shared_increment = true; |
| 462 | break; | 512 | break; |
| 463 | case IR::Opcode::SharedAtomicDec32: | 513 | case IR::Opcode::SharedAtomicDec32: |
| 464 | info.uses_shared_decrement = true; | 514 | info.uses_shared_decrement = true; |
| 465 | break; | 515 | break; |
| 516 | case IR::Opcode::SharedAtomicExchange64: | ||
| 517 | info.uses_int64_bit_atomics = true; | ||
| 518 | break; | ||
| 466 | case IR::Opcode::GlobalAtomicInc32: | 519 | case IR::Opcode::GlobalAtomicInc32: |
| 467 | case IR::Opcode::StorageAtomicInc32: | 520 | case IR::Opcode::StorageAtomicInc32: |
| 521 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 468 | info.uses_global_increment = true; | 522 | info.uses_global_increment = true; |
| 469 | break; | 523 | break; |
| 470 | case IR::Opcode::GlobalAtomicDec32: | 524 | case IR::Opcode::GlobalAtomicDec32: |
| 471 | case IR::Opcode::StorageAtomicDec32: | 525 | case IR::Opcode::StorageAtomicDec32: |
| 526 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 472 | info.uses_global_decrement = true; | 527 | info.uses_global_decrement = true; |
| 473 | break; | 528 | break; |
| 474 | case IR::Opcode::GlobalAtomicAddF32: | 529 | case IR::Opcode::GlobalAtomicAddF32: |
| 475 | case IR::Opcode::StorageAtomicAddF32: | 530 | case IR::Opcode::StorageAtomicAddF32: |
| 531 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 476 | info.uses_atomic_f32_add = true; | 532 | info.uses_atomic_f32_add = true; |
| 477 | break; | 533 | break; |
| 478 | case IR::Opcode::GlobalAtomicAddF16x2: | 534 | case IR::Opcode::GlobalAtomicAddF16x2: |
| 479 | case IR::Opcode::StorageAtomicAddF16x2: | 535 | case IR::Opcode::StorageAtomicAddF16x2: |
| 536 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 480 | info.uses_atomic_f16x2_add = true; | 537 | info.uses_atomic_f16x2_add = true; |
| 481 | break; | 538 | break; |
| 482 | case IR::Opcode::GlobalAtomicAddF32x2: | 539 | case IR::Opcode::GlobalAtomicAddF32x2: |
| 483 | case IR::Opcode::StorageAtomicAddF32x2: | 540 | case IR::Opcode::StorageAtomicAddF32x2: |
| 541 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 484 | info.uses_atomic_f32x2_add = true; | 542 | info.uses_atomic_f32x2_add = true; |
| 485 | break; | 543 | break; |
| 486 | case IR::Opcode::GlobalAtomicMinF16x2: | 544 | case IR::Opcode::GlobalAtomicMinF16x2: |
| 487 | case IR::Opcode::StorageAtomicMinF16x2: | 545 | case IR::Opcode::StorageAtomicMinF16x2: |
| 546 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 488 | info.uses_atomic_f16x2_min = true; | 547 | info.uses_atomic_f16x2_min = true; |
| 489 | break; | 548 | break; |
| 490 | case IR::Opcode::GlobalAtomicMinF32x2: | 549 | case IR::Opcode::GlobalAtomicMinF32x2: |
| 491 | case IR::Opcode::StorageAtomicMinF32x2: | 550 | case IR::Opcode::StorageAtomicMinF32x2: |
| 551 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 492 | info.uses_atomic_f32x2_min = true; | 552 | info.uses_atomic_f32x2_min = true; |
| 493 | break; | 553 | break; |
| 494 | case IR::Opcode::GlobalAtomicMaxF16x2: | 554 | case IR::Opcode::GlobalAtomicMaxF16x2: |
| 495 | case IR::Opcode::StorageAtomicMaxF16x2: | 555 | case IR::Opcode::StorageAtomicMaxF16x2: |
| 556 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 496 | info.uses_atomic_f16x2_max = true; | 557 | info.uses_atomic_f16x2_max = true; |
| 497 | break; | 558 | break; |
| 498 | case IR::Opcode::GlobalAtomicMaxF32x2: | 559 | case IR::Opcode::GlobalAtomicMaxF32x2: |
| 499 | case IR::Opcode::StorageAtomicMaxF32x2: | 560 | case IR::Opcode::StorageAtomicMaxF32x2: |
| 561 | info.used_storage_buffer_types |= IR::Type::U32; | ||
| 500 | info.uses_atomic_f32x2_max = true; | 562 | info.uses_atomic_f32x2_max = true; |
| 501 | break; | 563 | break; |
| 502 | case IR::Opcode::GlobalAtomicIAdd64: | 564 | case IR::Opcode::GlobalAtomicIAdd64: |
| @@ -516,11 +578,8 @@ void VisitUsages(Info& info, IR::Inst& inst) { | |||
| 516 | case IR::Opcode::StorageAtomicAnd64: | 578 | case IR::Opcode::StorageAtomicAnd64: |
| 517 | case IR::Opcode::StorageAtomicOr64: | 579 | case IR::Opcode::StorageAtomicOr64: |
| 518 | case IR::Opcode::StorageAtomicXor64: | 580 | case IR::Opcode::StorageAtomicXor64: |
| 519 | info.uses_64_bit_atomics = true; | 581 | info.used_storage_buffer_types |= IR::Type::U64; |
| 520 | break; | 582 | info.uses_int64_bit_atomics = true; |
| 521 | case IR::Opcode::SharedAtomicExchange64: | ||
| 522 | info.uses_64_bit_atomics = true; | ||
| 523 | info.uses_shared_memory_u32x2 = true; | ||
| 524 | break; | 583 | break; |
| 525 | default: | 584 | default: |
| 526 | break; | 585 | break; |