summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/ir_opt
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-04-13 05:32:21 -0300
committerGravatar ameerj2021-07-22 21:51:27 -0400
commitfa75b9b0626c8e118e27207dd1e82e2f415fc0bc (patch)
tree29738f645876c19fd561a39b8f9d62799bf92ef9 /src/shader_recompiler/ir_opt
parentshader: Fix fixed pipeline point size on geometry shaders (diff)
downloadyuzu-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.cpp69
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;