diff options
| author | 2019-05-07 10:55:18 -0400 | |
|---|---|---|
| committer | 2019-06-20 21:36:11 -0300 | |
| commit | 6b0695b3cdd930b0157df8fd8f3c9d2dce328595 (patch) | |
| tree | dca0a5da667579e5836d019b75e84c87567e80da /src | |
| parent | texture_cache: Remove execution context copies from the texture cache (diff) | |
| download | yuzu-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.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/memory_manager.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/rasterizer_interface.h | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 8 |
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) { | |||
| 32 | GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} { | 32 | GPU::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 | ||
| 13 | namespace Tegra { | ||
| 14 | class MemoryManager; | ||
| 15 | } | ||
| 16 | |||
| 13 | namespace VideoCore { | 17 | namespace VideoCore { |
| 14 | 18 | ||
| 15 | enum class LoadCallbackStage { | 19 | enum class LoadCallbackStage { |
| @@ -24,6 +28,8 @@ class RasterizerInterface { | |||
| 24 | public: | 28 | public: |
| 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 { | |||
| 41 | class EmuWindow; | 41 | class EmuWindow; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | namespace Tegra { | ||
| 45 | class MemoryManager; | ||
| 46 | } | ||
| 47 | |||
| 44 | namespace OpenGL { | 48 | namespace OpenGL { |
| 45 | 49 | ||
| 46 | struct ScreenInfo; | 50 | struct 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, |