summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/video_core/memory_manager.cpp10
-rw-r--r--src/video_core/memory_manager.h4
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
171GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size, PTEKind kind, 171GPUVAddr 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
179GPUVAddr MemoryManager::MapSparse(GPUVAddr gpu_addr, std::size_t size, bool is_big_pages) { 180GPUVAddr 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
555size_t MemoryManager::GetMemoryLayoutSize(GPUVAddr gpu_addr, size_t max_size) const { 558size_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