summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-04-15 23:01:35 -0400
committerGravatar Fernando Sahmkow2019-04-15 23:01:35 -0400
commit367704aa829a515188d87860ffd230b1b2a136c8 (patch)
tree86258d0c357bc05516a459b31553bb334b0eead3 /src
parentMerge pull request #2378 from lioncash/ro (diff)
downloadyuzu-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.cpp32
-rw-r--r--src/video_core/memory_manager.h2
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
229void 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
229void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { 245void 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
272void 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
256void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size) { 288void 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
72private: 74private: