summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/memory_manager.cpp22
-rw-r--r--src/video_core/texture_cache/texture_cache.h4
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) {