summaryrefslogtreecommitdiffstats
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-03-23 03:56:41 +0100
committerbunnei <bunneidev@gmail.com>2018-03-23 03:56:41 +0100
commit63d3924b5bb5dd17f1de9dfe3a357df293fc113d (patch)
tree7f636f8c396ea50329ac20e45b58c387d9722eba /src/core/memory.cpp
parentgl_rasterizer_cache: LoadGLBuffer should do a morton copy. (diff)
downloadyuzu-63d3924b5bb5dd17f1de9dfe3a357df293fc113d.tar
yuzu-63d3924b5bb5dd17f1de9dfe3a357df293fc113d.tar.gz
yuzu-63d3924b5bb5dd17f1de9dfe3a357df293fc113d.tar.bz2
yuzu-63d3924b5bb5dd17f1de9dfe3a357df293fc113d.tar.lz
yuzu-63d3924b5bb5dd17f1de9dfe3a357df293fc113d.tar.xz
yuzu-63d3924b5bb5dd17f1de9dfe3a357df293fc113d.tar.zst
yuzu-63d3924b5bb5dd17f1de9dfe3a357df293fc113d.zip
Diffstat (limited to '')
-rw-r--r--src/core/memory.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 4e34d8334..8a83de904 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -42,6 +42,9 @@ static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, Pa
LOG_DEBUG(HW_Memory, "Mapping %p onto %016" PRIX64 "-%016" PRIX64, memory, base * PAGE_SIZE,
(base + size) * PAGE_SIZE);
+ RasterizerFlushVirtualRegion(base << PAGE_BITS, size * PAGE_SIZE,
+ FlushMode::FlushAndInvalidate);
+
VAddr end = base + size;
while (base != end) {
ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %016" PRIX64, base);
@@ -293,6 +296,42 @@ u8* GetPhysicalPointer(PAddr address) {
return target_pointer;
}
+void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode) {
+ // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
+ // null here
+ if (VideoCore::g_renderer == nullptr) {
+ return;
+ }
+
+ VAddr end = start + size;
+
+ auto CheckRegion = [&](VAddr region_start, VAddr region_end) {
+ if (start >= region_end || end <= region_start) {
+ // No overlap with region
+ return;
+ }
+
+ VAddr overlap_start = std::max(start, region_start);
+ VAddr overlap_end = std::min(end, region_end);
+ u32 overlap_size = overlap_end - overlap_start;
+
+ auto* rasterizer = VideoCore::g_renderer->Rasterizer();
+ switch (mode) {
+ case FlushMode::Flush:
+ rasterizer->FlushRegion(region_start, overlap_size);
+ break;
+ case FlushMode::Invalidate:
+ rasterizer->InvalidateRegion(region_start, overlap_size);
+ break;
+ case FlushMode::FlushAndInvalidate:
+ rasterizer->FlushAndInvalidateRegion(region_start, overlap_size);
+ break;
+ }
+ };
+
+ CheckRegion(HEAP_VADDR, HEAP_VADDR_END);
+}
+
u8 Read8(const VAddr addr) {
return Read<u8>(addr);
}