diff options
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 4 |
2 files changed, 11 insertions, 3 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 01fb5b546..e06ce5d14 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -170,6 +170,7 @@ void MemoryManager::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_) | |||
| 170 | 170 | ||
| 171 | GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size, PTEKind kind, | 171 | GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size, PTEKind kind, |
| 172 | bool is_big_pages) { | 172 | bool is_big_pages) { |
| 173 | std::unique_lock<std::mutex> lock(guard); | ||
| 173 | if (is_big_pages) [[likely]] { | 174 | if (is_big_pages) [[likely]] { |
| 174 | return BigPageTableOp<EntryType::Mapped>(gpu_addr, cpu_addr, size, kind); | 175 | return BigPageTableOp<EntryType::Mapped>(gpu_addr, cpu_addr, size, kind); |
| 175 | } | 176 | } |
| @@ -177,6 +178,7 @@ GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size, | |||
| 177 | } | 178 | } |
| 178 | 179 | ||
| 179 | GPUVAddr MemoryManager::MapSparse(GPUVAddr gpu_addr, std::size_t size, bool is_big_pages) { | 180 | GPUVAddr MemoryManager::MapSparse(GPUVAddr gpu_addr, std::size_t size, bool is_big_pages) { |
| 181 | std::unique_lock<std::mutex> lock(guard); | ||
| 180 | if (is_big_pages) [[likely]] { | 182 | if (is_big_pages) [[likely]] { |
| 181 | return BigPageTableOp<EntryType::Reserved>(gpu_addr, 0, size, PTEKind::INVALID); | 183 | return BigPageTableOp<EntryType::Reserved>(gpu_addr, 0, size, PTEKind::INVALID); |
| 182 | } | 184 | } |
| @@ -187,6 +189,7 @@ void MemoryManager::Unmap(GPUVAddr gpu_addr, std::size_t size) { | |||
| 187 | if (size == 0) { | 189 | if (size == 0) { |
| 188 | return; | 190 | return; |
| 189 | } | 191 | } |
| 192 | std::unique_lock<std::mutex> lock(guard); | ||
| 190 | GetSubmappedRangeImpl<false>(gpu_addr, size, page_stash); | 193 | GetSubmappedRangeImpl<false>(gpu_addr, size, page_stash); |
| 191 | 194 | ||
| 192 | for (const auto& [map_addr, map_size] : page_stash) { | 195 | for (const auto& [map_addr, map_size] : page_stash) { |
| @@ -553,6 +556,7 @@ size_t MemoryManager::MaxContinuousRange(GPUVAddr gpu_addr, size_t size) const { | |||
| 553 | } | 556 | } |
| 554 | 557 | ||
| 555 | size_t MemoryManager::GetMemoryLayoutSize(GPUVAddr gpu_addr, size_t max_size) const { | 558 | size_t MemoryManager::GetMemoryLayoutSize(GPUVAddr gpu_addr, size_t max_size) const { |
| 559 | std::unique_lock<std::mutex> lock(guard); | ||
| 556 | return kind_map.GetContinuousSizeFrom(gpu_addr); | 560 | return kind_map.GetContinuousSizeFrom(gpu_addr); |
| 557 | } | 561 | } |
| 558 | 562 | ||
| @@ -745,10 +749,10 @@ void MemoryManager::FlushCaching() { | |||
| 745 | return; | 749 | return; |
| 746 | } | 750 | } |
| 747 | accumulator->Callback([this](GPUVAddr addr, size_t size) { | 751 | accumulator->Callback([this](GPUVAddr addr, size_t size) { |
| 748 | GetSubmappedRangeImpl<false>(addr, size, page_stash); | 752 | GetSubmappedRangeImpl<false>(addr, size, page_stash2); |
| 749 | }); | 753 | }); |
| 750 | rasterizer->InnerInvalidation(page_stash); | 754 | rasterizer->InnerInvalidation(page_stash2); |
| 751 | page_stash.clear(); | 755 | page_stash2.clear(); |
| 752 | accumulator->Clear(); | 756 | accumulator->Clear(); |
| 753 | } | 757 | } |
| 754 | 758 | ||
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index fbbe856c4..794535122 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include <atomic> | 6 | #include <atomic> |
| 7 | #include <map> | 7 | #include <map> |
| 8 | #include <mutex> | ||
| 8 | #include <optional> | 9 | #include <optional> |
| 9 | #include <vector> | 10 | #include <vector> |
| 10 | 11 | ||
| @@ -215,6 +216,9 @@ private: | |||
| 215 | 216 | ||
| 216 | std::vector<u64> big_page_continuous; | 217 | std::vector<u64> big_page_continuous; |
| 217 | std::vector<std::pair<VAddr, std::size_t>> page_stash{}; | 218 | std::vector<std::pair<VAddr, std::size_t>> page_stash{}; |
| 219 | std::vector<std::pair<VAddr, std::size_t>> page_stash2{}; | ||
| 220 | |||
| 221 | mutable std::mutex guard; | ||
| 218 | 222 | ||
| 219 | static constexpr size_t continuous_bits = 64; | 223 | static constexpr size_t continuous_bits = 64; |
| 220 | 224 | ||