From c9c232727c0b4318889553d4de9adf0a8dc2757a Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Mar 2018 22:56:41 -0400 Subject: memory: Port RasterizerFlushVirtualRegion from Citra. --- src/core/memory.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/core/memory.cpp') diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 4e34d8334f..8a83de9048 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(addr); } -- cgit v1.2.3 From 6131f96f6ac7c96b4f49c491ab0fa106f7926ad6 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 23 Mar 2018 15:01:45 -0400 Subject: rasterizer: Flush and invalidate regions should be 64-bit. --- src/core/memory.cpp | 4 ++-- src/core/memory.h | 2 +- src/video_core/rasterizer_interface.h | 6 +++--- src/video_core/renderer_opengl/gl_rasterizer.cpp | 6 +++--- src/video_core/renderer_opengl/gl_rasterizer.h | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) (limited to 'src/core/memory.cpp') diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 8a83de9048..d8aab70904 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -296,7 +296,7 @@ u8* GetPhysicalPointer(PAddr address) { return target_pointer; } -void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode) { +void RasterizerFlushVirtualRegion(VAddr start, u64 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) { @@ -313,7 +313,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode) { VAddr overlap_start = std::max(start, region_start); VAddr overlap_end = std::min(end, region_end); - u32 overlap_size = overlap_end - overlap_start; + u64 overlap_size = overlap_end - overlap_start; auto* rasterizer = VideoCore::g_renderer->Rasterizer(); switch (mode) { diff --git a/src/core/memory.h b/src/core/memory.h index 1c72321154..3e2c3f23d2 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -269,6 +269,6 @@ enum class FlushMode { * Flushes and invalidates any externally cached rasterizer resources touching the given virtual * address region. */ -void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode); +void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode); } // namespace Memory diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h index 6514d7ded3..a493e1d60d 100644 --- a/src/video_core/rasterizer_interface.h +++ b/src/video_core/rasterizer_interface.h @@ -25,14 +25,14 @@ public: virtual void FlushAll() = 0; /// Notify rasterizer that any caches of the specified region should be flushed to 3DS memory - virtual void FlushRegion(VAddr addr, u32 size) = 0; + virtual void FlushRegion(VAddr addr, u64 size) = 0; /// Notify rasterizer that any caches of the specified region should be invalidated - virtual void InvalidateRegion(VAddr addr, u32 size) = 0; + virtual void InvalidateRegion(VAddr addr, u64 size) = 0; /// Notify rasterizer that any caches of the specified region should be flushed to 3DS memory /// and invalidated - virtual void FlushAndInvalidateRegion(VAddr addr, u32 size) = 0; + virtual void FlushAndInvalidateRegion(VAddr addr, u64 size) = 0; /// Attempt to use a faster method to perform a display transfer with is_texture_copy = 0 virtual bool AccelerateDisplayTransfer(const void* config) { diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index b51614c25a..09828e48d4 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -194,17 +194,17 @@ void RasterizerOpenGL::FlushAll() { res_cache.FlushAll(); } -void RasterizerOpenGL::FlushRegion(VAddr addr, u32 size) { +void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.FlushRegion(addr, size); } -void RasterizerOpenGL::InvalidateRegion(VAddr addr, u32 size) { +void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.InvalidateRegion(addr, size, nullptr); } -void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u32 size) { +void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.FlushRegion(addr, size); res_cache.InvalidateRegion(addr, size, nullptr); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index f5c7b11623..b387f383b5 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -32,9 +32,9 @@ public: void DrawTriangles() override; void NotifyMaxwellRegisterChanged(u32 id) override; void FlushAll() override; - void FlushRegion(VAddr addr, u32 size) override; - void InvalidateRegion(VAddr addr, u32 size) override; - void FlushAndInvalidateRegion(VAddr addr, u32 size) override; + void FlushRegion(VAddr addr, u64 size) override; + void InvalidateRegion(VAddr addr, u64 size) override; + void FlushAndInvalidateRegion(VAddr addr, u64 size) override; bool AccelerateDisplayTransfer(const void* config) override; bool AccelerateTextureCopy(const void* config) override; bool AccelerateFill(const void* config) override; -- cgit v1.2.3 From 4d5c052f34833571457e4e08ea4f94ff25dbe9c0 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 23 Mar 2018 15:10:02 -0400 Subject: memory: RasterizerFlushVirtualRegion should also check process image region. --- src/core/memory.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/core/memory.cpp') diff --git a/src/core/memory.cpp b/src/core/memory.cpp index d8aab70904..fd5a57022c 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -329,6 +329,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { } }; + CheckRegion(PROCESS_IMAGE_VADDR, PROCESS_IMAGE_VADDR_END); CheckRegion(HEAP_VADDR, HEAP_VADDR_END); } -- cgit v1.2.3 From c13802819b83e7f07bea17001d32cdad1a3d30b2 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 23 Mar 2018 15:46:21 -0400 Subject: memory: Fix typo in RasterizerFlushVirtualRegion. --- src/core/memory.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/core/memory.cpp') diff --git a/src/core/memory.cpp b/src/core/memory.cpp index fd5a57022c..0eca4e76ea 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -318,13 +318,13 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { auto* rasterizer = VideoCore::g_renderer->Rasterizer(); switch (mode) { case FlushMode::Flush: - rasterizer->FlushRegion(region_start, overlap_size); + rasterizer->FlushRegion(overlap_start, overlap_size); break; case FlushMode::Invalidate: - rasterizer->InvalidateRegion(region_start, overlap_size); + rasterizer->InvalidateRegion(overlap_start, overlap_size); break; case FlushMode::FlushAndInvalidate: - rasterizer->FlushAndInvalidateRegion(region_start, overlap_size); + rasterizer->FlushAndInvalidateRegion(overlap_start, overlap_size); break; } }; -- cgit v1.2.3