diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-05-07 10:55:18 -0400 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-06-20 21:36:11 -0300 | 
| commit | 6b0695b3cdd930b0157df8fd8f3c9d2dce328595 (patch) | |
| tree | dca0a5da667579e5836d019b75e84c87567e80da /src/video_core | |
| parent | 6c410104f4f6953ac37095aa5e65804bf115c026 (diff) | |
Deglobalize Memory Manager on texture cahe and Implement Invalidation and Flushing using GPUVAddr
Diffstat (limited to 'src/video_core')
| -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) {  GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} {      auto& rasterizer{renderer.Rasterizer()};      memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer); +    rasterizer.InitMemoryMananger(*memory_manager);      dma_pusher = std::make_unique<Tegra::DmaPusher>(*this);      maxwell_3d = std::make_unique<Engines::Maxwell3D>(system, rasterizer, *memory_manager);      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) {      const u64 aligned_size{Common::AlignUp(size, page_size)};      const CacheAddr cache_addr{ToCacheAddr(GetPointer(gpu_addr))}; -    rasterizer.FlushAndInvalidateRegion(cache_addr, aligned_size); +    rasterizer.FlushAndInvalidateRegionEx(gpu_addr, cache_addr, aligned_size);      UnmapRange(gpu_addr, aligned_size);      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 @@  #include "video_core/engines/fermi_2d.h"  #include "video_core/gpu.h" +namespace Tegra { +class MemoryManager; +} +  namespace VideoCore {  enum class LoadCallbackStage { @@ -24,6 +28,8 @@ class RasterizerInterface {  public:      virtual ~RasterizerInterface() {} +    virtual void InitMemoryMananger(Tegra::MemoryManager& memory_manager) = 0; +      /// Draw the current batch of vertex arrays      virtual void DrawArrays() = 0; @@ -43,6 +49,10 @@ public:      /// and invalidated      virtual void FlushAndInvalidateRegion(CacheAddr addr, u64 size) = 0; +    /// Notify rasterizer that any caches of the specified region should be flushed to Switch memory +    /// and invalidated +    virtual void FlushAndInvalidateRegionEx(GPUVAddr gpu_addr, CacheAddr addr, u64 size) = 0; +      /// Attempt to use a faster method to perform a surface copy      virtual bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,                                         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 {  class EmuWindow;  } +namespace Tegra { +class MemoryManager; +} +  namespace OpenGL {  struct ScreenInfo; @@ -53,12 +57,16 @@ public:                                ScreenInfo& info);      ~RasterizerOpenGL() override; +    void InitMemoryMananger(Tegra::MemoryManager& memory_manager) override; +      void DrawArrays() override;      void Clear() override;      void FlushAll() override;      void FlushRegion(CacheAddr addr, u64 size) override;      void InvalidateRegion(CacheAddr addr, u64 size) override; +    void InvalidateRegionEx(GPUVAddr gpu_addr, CacheAddr addr, u64 size);      void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; +    void FlushAndInvalidateRegionEx(GPUVAddr gpu_addr, CacheAddr addr, u64 size) override;      bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,                                 const Tegra::Engines::Fermi2D::Regs::Surface& dst,                                 const Common::Rectangle<u32>& src_rect, | 
