summaryrefslogtreecommitdiff
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
authorGravatar Subv2016-05-15 12:43:52 -0500
committerGravatar Subv2016-05-28 13:52:50 -0500
commit0aef634a54f786c49241c24b8d0c7aa3555b0fa1 (patch)
tree774d974cc9a4941f7f6d83eedf0345f417d7a74f /src/core/memory.cpp
parentMemory: Make ReadBlock and WriteBlock accept void pointers. (diff)
downloadyuzu-0aef634a54f786c49241c24b8d0c7aa3555b0fa1.tar.gz
yuzu-0aef634a54f786c49241c24b8d0c7aa3555b0fa1.tar.xz
yuzu-0aef634a54f786c49241c24b8d0c7aa3555b0fa1.zip
Memory: Handle RasterizerCachedMemory and RasterizerCachedSpecial page types in the memory block manipulation functions.
Diffstat (limited to 'src/core/memory.cpp')
-rw-r--r--src/core/memory.cpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 2ac3e7de4..8c9e5d46d 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -392,6 +392,20 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
392 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount); 392 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount);
393 break; 393 break;
394 } 394 }
395 case PageType::RasterizerCachedMemory: {
396 RasterizerFlushRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
397
398 std::memcpy(dest_buffer, GetPointerFromVMA(current_vaddr), copy_amount);
399 break;
400 }
401 case PageType::RasterizerCachedSpecial: {
402 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
403
404 RasterizerFlushRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
405
406 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount);
407 break;
408 }
395 default: 409 default:
396 UNREACHABLE(); 410 UNREACHABLE();
397 } 411 }
@@ -446,6 +460,20 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size
446 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount); 460 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount);
447 break; 461 break;
448 } 462 }
463 case PageType::RasterizerCachedMemory: {
464 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
465
466 std::memcpy(GetPointerFromVMA(current_vaddr), src_buffer, copy_amount);
467 break;
468 }
469 case PageType::RasterizerCachedSpecial: {
470 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
471
472 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
473
474 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount);
475 break;
476 }
449 default: 477 default:
450 UNREACHABLE(); 478 UNREACHABLE();
451 } 479 }
@@ -462,6 +490,8 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
462 size_t page_index = dest_addr >> PAGE_BITS; 490 size_t page_index = dest_addr >> PAGE_BITS;
463 size_t page_offset = dest_addr & PAGE_MASK; 491 size_t page_offset = dest_addr & PAGE_MASK;
464 492
493 static const std::array<u8, PAGE_SIZE> zeros = {};
494
465 while (remaining_size > 0) { 495 while (remaining_size > 0) {
466 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); 496 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
467 const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; 497 const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
@@ -481,7 +511,20 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
481 case PageType::Special: { 511 case PageType::Special: {
482 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 512 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
483 513
484 static const std::array<u8, PAGE_SIZE> zeros = {}; 514 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount);
515 break;
516 }
517 case PageType::RasterizerCachedMemory: {
518 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
519
520 std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount);
521 break;
522 }
523 case PageType::RasterizerCachedSpecial: {
524 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
525
526 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
527
485 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount); 528 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount);
486 break; 529 break;
487 } 530 }
@@ -524,6 +567,22 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
524 WriteBlock(dest_addr, buffer.data(), buffer.size()); 567 WriteBlock(dest_addr, buffer.data(), buffer.size());
525 break; 568 break;
526 } 569 }
570 case PageType::RasterizerCachedMemory: {
571 RasterizerFlushRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
572
573 WriteBlock(dest_addr, GetPointerFromVMA(current_vaddr), copy_amount);
574 break;
575 }
576 case PageType::RasterizerCachedSpecial: {
577 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
578
579 RasterizerFlushRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount);
580
581 std::vector<u8> buffer(copy_amount);
582 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, buffer.data(), buffer.size());
583 WriteBlock(dest_addr, buffer.data(), buffer.size());
584 break;
585 }
527 default: 586 default:
528 UNREACHABLE(); 587 UNREACHABLE();
529 } 588 }