aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/engines/kepler_memory.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-10-19 22:58:30 -0400
committerGitHub <noreply@github.com>2018-10-19 22:58:30 -0400
commit48495695655210c91a36a4e847aaa73278949991 (patch)
treedaabac59bf0f4958aeaa3dbcf788728c8295f1bd /src/video_core/engines/kepler_memory.cpp
parentbf66930fb9a9b22d0d21f3ad590085800f3cdde8 (diff)
parent7e665c2721863fe9784dd3de4aa430434fb10cff (diff)
Merge pull request #1517 from bunnei/dma
GPU/DMA: Flush the source region and invalidate the destination region when doing a DMA transfer.
Diffstat (limited to 'src/video_core/engines/kepler_memory.cpp')
-rw-r--r--src/video_core/engines/kepler_memory.cpp11
1 files changed, 10 insertions, 1 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 @@
#include "common/logging/log.h"
#include "core/memory.h"
#include "video_core/engines/kepler_memory.h"
+#include "video_core/rasterizer_interface.h"
namespace Tegra::Engines {
-KeplerMemory::KeplerMemory(MemoryManager& memory_manager) : memory_manager(memory_manager) {}
+KeplerMemory::KeplerMemory(VideoCore::RasterizerInterface& rasterizer,
+ MemoryManager& memory_manager)
+ : memory_manager(memory_manager), rasterizer{rasterizer} {}
+
KeplerMemory::~KeplerMemory() = default;
void KeplerMemory::WriteReg(u32 method, u32 value) {
@@ -37,6 +41,11 @@ void KeplerMemory::ProcessData(u32 data) {
VAddr dest_address =
*memory_manager.GpuToCpuAddress(address + state.write_offset * sizeof(u32));
+ // We have to invalidate the destination region to evict any outdated surfaces from the cache.
+ // We do this before actually writing the new data because the destination address might contain
+ // a dirty surface that will have to be written back to memory.
+ rasterizer.InvalidateRegion(dest_address, sizeof(u32));
+
Memory::Write32(dest_address, data);
state.write_offset++;