summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-05-07 10:55:18 -0400
committerGravatar ReinUsesLisp2019-06-20 21:36:11 -0300
commit6b0695b3cdd930b0157df8fd8f3c9d2dce328595 (patch)
treedca0a5da667579e5836d019b75e84c87567e80da /src
parenttexture_cache: Remove execution context copies from the texture cache (diff)
downloadyuzu-6b0695b3cdd930b0157df8fd8f3c9d2dce328595.tar.gz
yuzu-6b0695b3cdd930b0157df8fd8f3c9d2dce328595.tar.xz
yuzu-6b0695b3cdd930b0157df8fd8f3c9d2dce328595.zip
Deglobalize Memory Manager on texture cahe and Implement Invalidation and Flushing using GPUVAddr
Diffstat (limited to 'src')
-rw-r--r--src/video_core/gpu.cpp1
-rw-r--r--src/video_core/memory_manager.cpp2
-rw-r--r--src/video_core/rasterizer_interface.h10
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h8
4 files changed, 20 insertions, 1 deletions
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index 52706505b..619e06a0e 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -32,6 +32,7 @@ u32 FramebufferConfig::BytesPerPixel(PixelFormat format) {
32GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} { 32GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} {
33 auto& rasterizer{renderer.Rasterizer()}; 33 auto& rasterizer{renderer.Rasterizer()};
34 memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer); 34 memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer);
35 rasterizer.InitMemoryMananger(*memory_manager);
35 dma_pusher = std::make_unique<Tegra::DmaPusher>(*this); 36 dma_pusher = std::make_unique<Tegra::DmaPusher>(*this);
36 maxwell_3d = std::make_unique<Engines::Maxwell3D>(system, rasterizer, *memory_manager); 37 maxwell_3d = std::make_unique<Engines::Maxwell3D>(system, rasterizer, *memory_manager);
37 fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager); 38 fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager);
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index 5d8d126c1..74a1441e3 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -69,7 +69,7 @@ GPUVAddr MemoryManager::UnmapBuffer(GPUVAddr gpu_addr, u64 size) {
69 const u64 aligned_size{Common::AlignUp(size, page_size)}; 69 const u64 aligned_size{Common::AlignUp(size, page_size)};
70 const CacheAddr cache_addr{ToCacheAddr(GetPointer(gpu_addr))}; 70 const CacheAddr cache_addr{ToCacheAddr(GetPointer(gpu_addr))};
71 71
72 rasterizer.FlushAndInvalidateRegion(cache_addr, aligned_size); 72 rasterizer.FlushAndInvalidateRegionEx(gpu_addr, cache_addr, aligned_size);
73 UnmapRange(gpu_addr, aligned_size); 73 UnmapRange(gpu_addr, aligned_size);
74 74
75 return gpu_addr; 75 return gpu_addr;
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h
index d7b86df38..d5505ef9c 100644
--- a/src/video_core/rasterizer_interface.h
+++ b/src/video_core/rasterizer_interface.h
@@ -10,6 +10,10 @@
10#include "video_core/engines/fermi_2d.h" 10#include "video_core/engines/fermi_2d.h"
11#include "video_core/gpu.h" 11#include "video_core/gpu.h"
12 12
13namespace Tegra {
14class MemoryManager;
15}
16
13namespace VideoCore { 17namespace VideoCore {
14 18
15enum class LoadCallbackStage { 19enum class LoadCallbackStage {
@@ -24,6 +28,8 @@ class RasterizerInterface {
24public: 28public:
25 virtual ~RasterizerInterface() {} 29 virtual ~RasterizerInterface() {}
26 30
31 virtual void InitMemoryMananger(Tegra::MemoryManager& memory_manager) = 0;
32
27 /// Draw the current batch of vertex arrays 33 /// Draw the current batch of vertex arrays
28 virtual void DrawArrays() = 0; 34 virtual void DrawArrays() = 0;
29 35
@@ -43,6 +49,10 @@ public:
43 /// and invalidated 49 /// and invalidated
44 virtual void FlushAndInvalidateRegion(CacheAddr addr, u64 size) = 0; 50 virtual void FlushAndInvalidateRegion(CacheAddr addr, u64 size) = 0;
45 51
52 /// Notify rasterizer that any caches of the specified region should be flushed to Switch memory
53 /// and invalidated
54 virtual void FlushAndInvalidateRegionEx(GPUVAddr gpu_addr, CacheAddr addr, u64 size) = 0;
55
46 /// Attempt to use a faster method to perform a surface copy 56 /// Attempt to use a faster method to perform a surface copy
47 virtual bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src, 57 virtual bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,
48 const Tegra::Engines::Fermi2D::Regs::Surface& dst, 58 const Tegra::Engines::Fermi2D::Regs::Surface& dst,
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 8e5009eeb..971a38ab7 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -41,6 +41,10 @@ namespace Core::Frontend {
41class EmuWindow; 41class EmuWindow;
42} 42}
43 43
44namespace Tegra {
45class MemoryManager;
46}
47
44namespace OpenGL { 48namespace OpenGL {
45 49
46struct ScreenInfo; 50struct ScreenInfo;
@@ -53,12 +57,16 @@ public:
53 ScreenInfo& info); 57 ScreenInfo& info);
54 ~RasterizerOpenGL() override; 58 ~RasterizerOpenGL() override;
55 59
60 void InitMemoryMananger(Tegra::MemoryManager& memory_manager) override;
61
56 void DrawArrays() override; 62 void DrawArrays() override;
57 void Clear() override; 63 void Clear() override;
58 void FlushAll() override; 64 void FlushAll() override;
59 void FlushRegion(CacheAddr addr, u64 size) override; 65 void FlushRegion(CacheAddr addr, u64 size) override;
60 void InvalidateRegion(CacheAddr addr, u64 size) override; 66 void InvalidateRegion(CacheAddr addr, u64 size) override;
67 void InvalidateRegionEx(GPUVAddr gpu_addr, CacheAddr addr, u64 size);
61 void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; 68 void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override;
69 void FlushAndInvalidateRegionEx(GPUVAddr gpu_addr, CacheAddr addr, u64 size) override;
62 bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src, 70 bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,
63 const Tegra::Engines::Fermi2D::Regs::Surface& dst, 71 const Tegra::Engines::Fermi2D::Regs::Surface& dst,
64 const Common::Rectangle<u32>& src_rect, 72 const Common::Rectangle<u32>& src_rect,