diff options
| author | 2019-04-19 20:35:54 -0400 | |
|---|---|---|
| committer | 2019-04-19 20:35:54 -0400 | |
| commit | db4b2bc798388fd22d3ea60eb82c5f894b2b3506 (patch) | |
| tree | 76bba32ad408596e82d1d3394c269ba723b91d59 /src | |
| parent | Implement IsBlockContinous (diff) | |
| download | yuzu-db4b2bc798388fd22d3ea60eb82c5f894b2b3506.tar.gz yuzu-db4b2bc798388fd22d3ea60eb82c5f894b2b3506.tar.xz yuzu-db4b2bc798388fd22d3ea60eb82c5f894b2b3506.zip | |
make ReadBlockunsafe and WriteBlockunsafe, ignore invalid pages.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 095a7e5a4..6c98c6701 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -243,8 +243,13 @@ void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, | |||
| 243 | while (remaining_size > 0) { | 243 | while (remaining_size > 0) { |
| 244 | const std::size_t copy_amount{ | 244 | const std::size_t copy_amount{ |
| 245 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; | 245 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; |
| 246 | const u8* src_ptr{page_table.pointers[page_index] + page_offset}; | 246 | const u8* page_pointer = page_table.pointers[page_index]; |
| 247 | std::memcpy(dest_buffer, src_ptr, copy_amount); | 247 | if (page_pointer) { |
| 248 | const u8* src_ptr{page_pointer + page_offset}; | ||
| 249 | std::memcpy(dest_buffer, src_ptr, copy_amount); | ||
| 250 | } else { | ||
| 251 | std::memset(dest_buffer, 0, copy_amount); | ||
| 252 | } | ||
| 248 | page_index++; | 253 | page_index++; |
| 249 | page_offset = 0; | 254 | page_offset = 0; |
| 250 | dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount; | 255 | dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount; |
| @@ -288,8 +293,11 @@ void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, | |||
| 288 | while (remaining_size > 0) { | 293 | while (remaining_size > 0) { |
| 289 | const std::size_t copy_amount{ | 294 | const std::size_t copy_amount{ |
| 290 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; | 295 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; |
| 291 | u8* dest_ptr{page_table.pointers[page_index] + page_offset}; | 296 | u8* page_pointer = page_table.pointers[page_index]; |
| 292 | std::memcpy(dest_ptr, src_buffer, copy_amount); | 297 | if (page_pointer) { |
| 298 | u8* dest_ptr{page_pointer + page_offset}; | ||
| 299 | std::memcpy(dest_ptr, src_buffer, copy_amount); | ||
| 300 | } | ||
| 293 | page_index++; | 301 | page_index++; |
| 294 | page_offset = 0; | 302 | page_offset = 0; |
| 295 | src_buffer = static_cast<const u8*>(src_buffer) + copy_amount; | 303 | src_buffer = static_cast<const u8*>(src_buffer) + copy_amount; |