diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 22 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 4 |
2 files changed, 12 insertions, 14 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 055c79a8e..4ff3fa268 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -73,12 +73,12 @@ void MemoryManager::Unmap(GPUVAddr gpu_addr, std::size_t size) { | |||
| 73 | } | 73 | } |
| 74 | const auto submapped_ranges = GetSubmappedRange(gpu_addr, size); | 74 | const auto submapped_ranges = GetSubmappedRange(gpu_addr, size); |
| 75 | 75 | ||
| 76 | for (const auto& map : submapped_ranges) { | 76 | for (const auto& [map_addr, map_size] : submapped_ranges) { |
| 77 | // Flush and invalidate through the GPU interface, to be asynchronous if possible. | 77 | // Flush and invalidate through the GPU interface, to be asynchronous if possible. |
| 78 | const std::optional<VAddr> cpu_addr = GpuToCpuAddress(map.first); | 78 | const std::optional<VAddr> cpu_addr = GpuToCpuAddress(map_addr); |
| 79 | ASSERT(cpu_addr); | 79 | ASSERT(cpu_addr); |
| 80 | 80 | ||
| 81 | rasterizer->UnmapMemory(*cpu_addr, map.second); | 81 | rasterizer->UnmapMemory(*cpu_addr, map_size); |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | UpdateRange(gpu_addr, PageEntry::State::Unmapped, size); | 84 | UpdateRange(gpu_addr, PageEntry::State::Unmapped, size); |
| @@ -274,8 +274,8 @@ void MemoryManager::ReadBlockImpl(GPUVAddr gpu_src_addr, void* dest_buffer, std: | |||
| 274 | while (remaining_size > 0) { | 274 | while (remaining_size > 0) { |
| 275 | const std::size_t copy_amount{ | 275 | const std::size_t copy_amount{ |
| 276 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; | 276 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; |
| 277 | 277 | const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; | |
| 278 | if (const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; page_addr) { | 278 | if (page_addr && *page_addr != 0) { |
| 279 | const auto src_addr{*page_addr + page_offset}; | 279 | const auto src_addr{*page_addr + page_offset}; |
| 280 | if (is_safe) { | 280 | if (is_safe) { |
| 281 | // Flush must happen on the rasterizer interface, such that memory is always | 281 | // Flush must happen on the rasterizer interface, such that memory is always |
| @@ -313,8 +313,8 @@ void MemoryManager::WriteBlockImpl(GPUVAddr gpu_dest_addr, const void* src_buffe | |||
| 313 | while (remaining_size > 0) { | 313 | while (remaining_size > 0) { |
| 314 | const std::size_t copy_amount{ | 314 | const std::size_t copy_amount{ |
| 315 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; | 315 | std::min(static_cast<std::size_t>(page_size) - page_offset, remaining_size)}; |
| 316 | 316 | const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; | |
| 317 | if (const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; page_addr) { | 317 | if (page_addr && *page_addr != 0) { |
| 318 | const auto dest_addr{*page_addr + page_offset}; | 318 | const auto dest_addr{*page_addr + page_offset}; |
| 319 | 319 | ||
| 320 | if (is_safe) { | 320 | if (is_safe) { |
| @@ -415,15 +415,15 @@ std::vector<std::pair<GPUVAddr, std::size_t>> MemoryManager::GetSubmappedRange( | |||
| 415 | size_t page_offset{gpu_addr & page_mask}; | 415 | size_t page_offset{gpu_addr & page_mask}; |
| 416 | std::optional<std::pair<GPUVAddr, std::size_t>> last_segment{}; | 416 | std::optional<std::pair<GPUVAddr, std::size_t>> last_segment{}; |
| 417 | std::optional<VAddr> old_page_addr{}; | 417 | std::optional<VAddr> old_page_addr{}; |
| 418 | const auto extend_size = [this, &last_segment, &page_index](std::size_t bytes) { | 418 | const auto extend_size = [&last_segment, &page_index, &page_offset](std::size_t bytes) { |
| 419 | if (!last_segment) { | 419 | if (!last_segment) { |
| 420 | GPUVAddr new_base_addr = page_index << page_bits; | 420 | const GPUVAddr new_base_addr = (page_index << page_bits) + page_offset; |
| 421 | last_segment = {new_base_addr, bytes}; | 421 | last_segment = {new_base_addr, bytes}; |
| 422 | } else { | 422 | } else { |
| 423 | last_segment->second += bytes; | 423 | last_segment->second += bytes; |
| 424 | } | 424 | } |
| 425 | }; | 425 | }; |
| 426 | const auto split = [this, &last_segment, &result] { | 426 | const auto split = [&last_segment, &result] { |
| 427 | if (last_segment) { | 427 | if (last_segment) { |
| 428 | result.push_back(*last_segment); | 428 | result.push_back(*last_segment); |
| 429 | last_segment = std::nullopt; | 429 | last_segment = std::nullopt; |
| @@ -432,7 +432,7 @@ std::vector<std::pair<GPUVAddr, std::size_t>> MemoryManager::GetSubmappedRange( | |||
| 432 | while (remaining_size > 0) { | 432 | while (remaining_size > 0) { |
| 433 | const size_t num_bytes{std::min(page_size - page_offset, remaining_size)}; | 433 | const size_t num_bytes{std::min(page_size - page_offset, remaining_size)}; |
| 434 | const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; | 434 | const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; |
| 435 | if (!page_addr) { | 435 | if (!page_addr || *page_addr == 0) { |
| 436 | split(); | 436 | split(); |
| 437 | } else if (old_page_addr) { | 437 | } else if (old_page_addr) { |
| 438 | if (*old_page_addr + page_size != *page_addr) { | 438 | if (*old_page_addr + page_size != *page_addr) { |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index b494152b8..198bb0cfb 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -1376,9 +1376,7 @@ void TextureCache<P>::ForEachSparseSegment(ImageBase& image, Func&& func) { | |||
| 1376 | using FuncReturn = typename std::invoke_result<Func, GPUVAddr, VAddr, size_t>::type; | 1376 | using FuncReturn = typename std::invoke_result<Func, GPUVAddr, VAddr, size_t>::type; |
| 1377 | static constexpr bool RETURNS_BOOL = std::is_same_v<FuncReturn, bool>; | 1377 | static constexpr bool RETURNS_BOOL = std::is_same_v<FuncReturn, bool>; |
| 1378 | const auto segments = gpu_memory.GetSubmappedRange(image.gpu_addr, image.guest_size_bytes); | 1378 | const auto segments = gpu_memory.GetSubmappedRange(image.gpu_addr, image.guest_size_bytes); |
| 1379 | for (auto& segment : segments) { | 1379 | for (const auto& [gpu_addr, size] : segments) { |
| 1380 | const auto gpu_addr = segment.first; | ||
| 1381 | const auto size = segment.second; | ||
| 1382 | std::optional<VAddr> cpu_addr = gpu_memory.GpuToCpuAddress(gpu_addr); | 1380 | std::optional<VAddr> cpu_addr = gpu_memory.GpuToCpuAddress(gpu_addr); |
| 1383 | ASSERT(cpu_addr); | 1381 | ASSERT(cpu_addr); |
| 1384 | if constexpr (RETURNS_BOOL) { | 1382 | if constexpr (RETURNS_BOOL) { |