Просмотр исходного кода

Deglobalize Memory Manager on texture cahe and Implement Invalidation and Flushing using GPUVAddr

Fernando Sahmkow 7 лет назад
Родитель
Сommit
6b0695b3cd

+ 1 - 0
src/video_core/gpu.cpp

@@ -32,6 +32,7 @@ u32 FramebufferConfig::BytesPerPixel(PixelFormat format) {
 GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} {
 GPU::GPU(Core::System& system, VideoCore::RendererBase& renderer) : renderer{renderer} {
     auto& rasterizer{renderer.Rasterizer()};
     auto& rasterizer{renderer.Rasterizer()};
     memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer);
     memory_manager = std::make_unique<Tegra::MemoryManager>(rasterizer);
+    rasterizer.InitMemoryMananger(*memory_manager);
     dma_pusher = std::make_unique<Tegra::DmaPusher>(*this);
     dma_pusher = std::make_unique<Tegra::DmaPusher>(*this);
     maxwell_3d = std::make_unique<Engines::Maxwell3D>(system, rasterizer, *memory_manager);
     maxwell_3d = std::make_unique<Engines::Maxwell3D>(system, rasterizer, *memory_manager);
     fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager);
     fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager);

+ 1 - 1
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 u64 aligned_size{Common::AlignUp(size, page_size)};
     const CacheAddr cache_addr{ToCacheAddr(GetPointer(gpu_addr))};
     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);
     UnmapRange(gpu_addr, aligned_size);
 
 
     return gpu_addr;
     return gpu_addr;

+ 10 - 0
src/video_core/rasterizer_interface.h

@@ -10,6 +10,10 @@
 #include "video_core/engines/fermi_2d.h"
 #include "video_core/engines/fermi_2d.h"
 #include "video_core/gpu.h"
 #include "video_core/gpu.h"
 
 
+namespace Tegra {
+class MemoryManager;
+}
+
 namespace VideoCore {
 namespace VideoCore {
 
 
 enum class LoadCallbackStage {
 enum class LoadCallbackStage {
@@ -24,6 +28,8 @@ class RasterizerInterface {
 public:
 public:
     virtual ~RasterizerInterface() {}
     virtual ~RasterizerInterface() {}
 
 
+    virtual void InitMemoryMananger(Tegra::MemoryManager& memory_manager) = 0;
+
     /// Draw the current batch of vertex arrays
     /// Draw the current batch of vertex arrays
     virtual void DrawArrays() = 0;
     virtual void DrawArrays() = 0;
 
 
@@ -43,6 +49,10 @@ public:
     /// and invalidated
     /// and invalidated
     virtual void FlushAndInvalidateRegion(CacheAddr addr, u64 size) = 0;
     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
     /// Attempt to use a faster method to perform a surface copy
     virtual bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,
     virtual bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,
                                        const Tegra::Engines::Fermi2D::Regs::Surface& dst,
                                        const Tegra::Engines::Fermi2D::Regs::Surface& dst,

+ 8 - 0
src/video_core/renderer_opengl/gl_rasterizer.h

@@ -41,6 +41,10 @@ namespace Core::Frontend {
 class EmuWindow;
 class EmuWindow;
 }
 }
 
 
+namespace Tegra {
+class MemoryManager;
+}
+
 namespace OpenGL {
 namespace OpenGL {
 
 
 struct ScreenInfo;
 struct ScreenInfo;
@@ -53,12 +57,16 @@ public:
                               ScreenInfo& info);
                               ScreenInfo& info);
     ~RasterizerOpenGL() override;
     ~RasterizerOpenGL() override;
 
 
+    void InitMemoryMananger(Tegra::MemoryManager& memory_manager) override;
+
     void DrawArrays() override;
     void DrawArrays() override;
     void Clear() override;
     void Clear() override;
     void FlushAll() override;
     void FlushAll() override;
     void FlushRegion(CacheAddr addr, u64 size) override;
     void FlushRegion(CacheAddr addr, u64 size) override;
     void InvalidateRegion(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 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,
     bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src,
                                const Tegra::Engines::Fermi2D::Regs::Surface& dst,
                                const Tegra::Engines::Fermi2D::Regs::Surface& dst,
                                const Common::Rectangle<u32>& src_rect,
                                const Common::Rectangle<u32>& src_rect,