diff options
| author | 2018-10-17 20:44:07 -0400 | |
|---|---|---|
| committer | 2018-10-18 22:41:13 -0400 | |
| commit | a5d853a9f8a19dedbc6cb77e8ca714f65819ad1d (patch) | |
| tree | 22c956e71c5fb69d5101bb4908a99188bfc174e2 /src | |
| parent | fermi_2d: Add support for more accurate surface copies. (diff) | |
| download | yuzu-a5d853a9f8a19dedbc6cb77e8ca714f65819ad1d.tar.gz yuzu-a5d853a9f8a19dedbc6cb77e8ca714f65819ad1d.tar.xz yuzu-a5d853a9f8a19dedbc6cb77e8ca714f65819ad1d.zip | |
GPU: Invalidate destination address of kepler_memory writes.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/kepler_memory.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/engines/kepler_memory.h | 7 | ||||
| -rw-r--r-- | src/video_core/gpu.cpp | 2 |
3 files changed, 17 insertions, 3 deletions
diff --git a/src/video_core/engines/kepler_memory.cpp b/src/video_core/engines/kepler_memory.cpp index 66ae6332d..585290d9f 100644 --- a/src/video_core/engines/kepler_memory.cpp +++ b/src/video_core/engines/kepler_memory.cpp | |||
| @@ -5,10 +5,14 @@ | |||
| 5 | #include "common/logging/log.h" | 5 | #include "common/logging/log.h" |
| 6 | #include "core/memory.h" | 6 | #include "core/memory.h" |
| 7 | #include "video_core/engines/kepler_memory.h" | 7 | #include "video_core/engines/kepler_memory.h" |
| 8 | #include "video_core/rasterizer_interface.h" | ||
| 8 | 9 | ||
| 9 | namespace Tegra::Engines { | 10 | namespace Tegra::Engines { |
| 10 | 11 | ||
| 11 | KeplerMemory::KeplerMemory(MemoryManager& memory_manager) : memory_manager(memory_manager) {} | 12 | KeplerMemory::KeplerMemory(VideoCore::RasterizerInterface& rasterizer, |
| 13 | MemoryManager& memory_manager) | ||
| 14 | : memory_manager(memory_manager), rasterizer{rasterizer} {} | ||
| 15 | |||
| 12 | KeplerMemory::~KeplerMemory() = default; | 16 | KeplerMemory::~KeplerMemory() = default; |
| 13 | 17 | ||
| 14 | void KeplerMemory::WriteReg(u32 method, u32 value) { | 18 | void KeplerMemory::WriteReg(u32 method, u32 value) { |
| @@ -37,6 +41,11 @@ void KeplerMemory::ProcessData(u32 data) { | |||
| 37 | VAddr dest_address = | 41 | VAddr dest_address = |
| 38 | *memory_manager.GpuToCpuAddress(address + state.write_offset * sizeof(u32)); | 42 | *memory_manager.GpuToCpuAddress(address + state.write_offset * sizeof(u32)); |
| 39 | 43 | ||
| 44 | // We have to invalidate the destination region to evict any outdated surfaces from the cache. | ||
| 45 | // We do this before actually writing the new data because the destination address might contain | ||
| 46 | // a dirty surface that will have to be written back to memory. | ||
| 47 | rasterizer.InvalidateRegion(dest_address, sizeof(u32)); | ||
| 48 | |||
| 40 | Memory::Write32(dest_address, data); | 49 | Memory::Write32(dest_address, data); |
| 41 | 50 | ||
| 42 | state.write_offset++; | 51 | state.write_offset++; |
diff --git a/src/video_core/engines/kepler_memory.h b/src/video_core/engines/kepler_memory.h index b0d0078cf..bf4a13cff 100644 --- a/src/video_core/engines/kepler_memory.h +++ b/src/video_core/engines/kepler_memory.h | |||
| @@ -11,6 +11,10 @@ | |||
| 11 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 12 | #include "video_core/memory_manager.h" | 12 | #include "video_core/memory_manager.h" |
| 13 | 13 | ||
| 14 | namespace VideoCore { | ||
| 15 | class RasterizerInterface; | ||
| 16 | } | ||
| 17 | |||
| 14 | namespace Tegra::Engines { | 18 | namespace Tegra::Engines { |
| 15 | 19 | ||
| 16 | #define KEPLERMEMORY_REG_INDEX(field_name) \ | 20 | #define KEPLERMEMORY_REG_INDEX(field_name) \ |
| @@ -18,7 +22,7 @@ namespace Tegra::Engines { | |||
| 18 | 22 | ||
| 19 | class KeplerMemory final { | 23 | class KeplerMemory final { |
| 20 | public: | 24 | public: |
| 21 | KeplerMemory(MemoryManager& memory_manager); | 25 | KeplerMemory(VideoCore::RasterizerInterface& rasterizer, MemoryManager& memory_manager); |
| 22 | ~KeplerMemory(); | 26 | ~KeplerMemory(); |
| 23 | 27 | ||
| 24 | /// Write the value to the register identified by method. | 28 | /// Write the value to the register identified by method. |
| @@ -72,6 +76,7 @@ public: | |||
| 72 | 76 | ||
| 73 | private: | 77 | private: |
| 74 | MemoryManager& memory_manager; | 78 | MemoryManager& memory_manager; |
| 79 | VideoCore::RasterizerInterface& rasterizer; | ||
| 75 | 80 | ||
| 76 | void ProcessData(u32 data); | 81 | void ProcessData(u32 data); |
| 77 | }; | 82 | }; |
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 9ba7e3533..2d70a833b 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp | |||
| @@ -28,7 +28,7 @@ GPU::GPU(VideoCore::RasterizerInterface& rasterizer) { | |||
| 28 | fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager); | 28 | fermi_2d = std::make_unique<Engines::Fermi2D>(rasterizer, *memory_manager); |
| 29 | maxwell_compute = std::make_unique<Engines::MaxwellCompute>(); | 29 | maxwell_compute = std::make_unique<Engines::MaxwellCompute>(); |
| 30 | maxwell_dma = std::make_unique<Engines::MaxwellDMA>(*memory_manager); | 30 | maxwell_dma = std::make_unique<Engines::MaxwellDMA>(*memory_manager); |
| 31 | kepler_memory = std::make_unique<Engines::KeplerMemory>(*memory_manager); | 31 | kepler_memory = std::make_unique<Engines::KeplerMemory>(rasterizer, *memory_manager); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | GPU::~GPU() = default; | 34 | GPU::~GPU() = default; |