diff options
| author | 2019-04-15 23:01:35 -0400 | |
|---|---|---|
| committer | 2019-04-15 23:01:35 -0400 | |
| commit | 367704aa829a515188d87860ffd230b1b2a136c8 (patch) | |
| tree | 86258d0c357bc05516a459b31553bb334b0eead3 /src | |
| parent | Merge pull request #2378 from lioncash/ro (diff) | |
| download | yuzu-367704aa829a515188d87860ffd230b1b2a136c8.tar.gz yuzu-367704aa829a515188d87860ffd230b1b2a136c8.tar.xz yuzu-367704aa829a515188d87860ffd230b1b2a136c8.zip | |
GPU MemoryManager: Implement ReadBlockUnsafe and WriteBlockUnsafe
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 32 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 2 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 0f4e820aa..3b9f6caf0 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -226,6 +226,22 @@ void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t | |||
| 226 | } | 226 | } |
| 227 | } | 227 | } |
| 228 | 228 | ||
| 229 | void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const { | ||
| 230 | std::size_t remaining_size{size}; | ||
| 231 | std::size_t page_index{src_addr >> page_bits}; | ||
| 232 | std::size_t page_offset{src_addr & page_mask}; | ||
| 233 | |||
| 234 | while (remaining_size > 0) { | ||
| 235 | const std::size_t copy_amount{ | ||
| 236 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; | ||
| 237 | std::memcpy(dest_buffer, src_ptr, copy_amount); | ||
| 238 | page_index++; | ||
| 239 | page_offset = 0; | ||
| 240 | dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount; | ||
| 241 | remaining_size -= copy_amount; | ||
| 242 | } | ||
| 243 | } | ||
| 244 | |||
| 229 | void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { | 245 | void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { |
| 230 | std::size_t remaining_size{size}; | 246 | std::size_t remaining_size{size}; |
| 231 | std::size_t page_index{dest_addr >> page_bits}; | 247 | std::size_t page_index{dest_addr >> page_bits}; |
| @@ -253,6 +269,22 @@ void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std:: | |||
| 253 | } | 269 | } |
| 254 | } | 270 | } |
| 255 | 271 | ||
| 272 | void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { | ||
| 273 | std::size_t remaining_size{size}; | ||
| 274 | std::size_t page_index{dest_addr >> page_bits}; | ||
| 275 | std::size_t page_offset{dest_addr & page_mask}; | ||
| 276 | |||
| 277 | while (remaining_size > 0) { | ||
| 278 | const std::size_t copy_amount{ | ||
| 279 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; | ||
| 280 | std::memcpy(dest_ptr, src_buffer, copy_amount); | ||
| 281 | page_index++; | ||
| 282 | page_offset = 0; | ||
| 283 | src_buffer = static_cast<const u8*>(src_buffer) + copy_amount; | ||
| 284 | remaining_size -= copy_amount; | ||
| 285 | } | ||
| 286 | } | ||
| 287 | |||
| 256 | void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size) { | 288 | void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size) { |
| 257 | std::size_t remaining_size{size}; | 289 | std::size_t remaining_size{size}; |
| 258 | std::size_t page_index{src_addr >> page_bits}; | 290 | std::size_t page_index{src_addr >> page_bits}; |
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 647cbf93a..29f3860c1 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -67,6 +67,8 @@ public: | |||
| 67 | 67 | ||
| 68 | void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; | 68 | void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; |
| 69 | void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); | 69 | void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); |
| 70 | void ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; | ||
| 71 | void WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); | ||
| 70 | void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); | 72 | void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); |
| 71 | 73 | ||
| 72 | private: | 74 | private: |