diff --git a/Ryujinx.Graphics.Gpu/Engine/MethodCopyBuffer.cs b/Ryujinx.Graphics.Gpu/Engine/MethodCopyBuffer.cs
index 19ffb0e3c..40560ab13 100644
--- a/Ryujinx.Graphics.Gpu/Engine/MethodCopyBuffer.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/MethodCopyBuffer.cs
@@ -69,10 +69,6 @@ namespace Ryujinx.Graphics.Gpu.Engine
             {
                 // Buffer to buffer copy.
                 _bufferManager.CopyBuffer(cbp.SrcAddress, cbp.DstAddress, (uint)size);
-
-                Span<byte> data = _context.MemoryAccessor.Read(cbp.SrcAddress.Pack(), (uint)size);
-
-                _context.MemoryAccessor.Write(cbp.DstAddress.Pack(), data);
             }
         }
     }
diff --git a/Ryujinx.Graphics.Gpu/Memory/Buffer.cs b/Ryujinx.Graphics.Gpu/Memory/Buffer.cs
index 6f904d0fe..e37fbc0fc 100644
--- a/Ryujinx.Graphics.Gpu/Memory/Buffer.cs
+++ b/Ryujinx.Graphics.Gpu/Memory/Buffer.cs
@@ -9,6 +9,8 @@ namespace Ryujinx.Graphics.Gpu.Memory
 
         private IBuffer _buffer;
 
+        public IBuffer HostBuffer => _buffer;
+
         public ulong Address { get; }
         public ulong Size    { get; }
 
@@ -86,6 +88,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
             _buffer.CopyTo(destination._buffer, 0, dstOffset, (int)Size);
         }
 
+        public void Flush(ulong address, ulong size)
+        {
+            int offset = (int)(address - Address);
+
+            byte[] data = _buffer.GetData(offset, (int)size);
+
+            _context.PhysicalMemory.Write(address, data);
+        }
+
         public void Invalidate()
         {
             _buffer.SetData(0, _context.PhysicalMemory.Read(Address, Size));
diff --git a/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs b/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs
index 6d7fab68b..c4240061b 100644
--- a/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs
+++ b/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs
@@ -484,17 +484,27 @@ namespace Ryujinx.Graphics.Gpu.Memory
             ulong srcAddress = TranslateAndCreateBuffer(srcVa.Pack(), size);
             ulong dstAddress = TranslateAndCreateBuffer(dstVa.Pack(), size);
 
-            BufferRange srcBuffer = GetBufferRange(srcAddress, size);
-            BufferRange dstBuffer = GetBufferRange(dstAddress, size);
+            Buffer srcBuffer = GetBuffer(srcAddress, size);
+            Buffer dstBuffer = GetBuffer(dstAddress, size);
 
-            srcBuffer.Buffer.CopyTo(
-                dstBuffer.Buffer,
-                srcBuffer.Offset,
-                dstBuffer.Offset,
+            int srcOffset = (int)(srcAddress - srcBuffer.Address);
+            int dstOffset = (int)(dstAddress - dstBuffer.Address);
+
+            srcBuffer.HostBuffer.CopyTo(
+                dstBuffer.HostBuffer,
+                srcOffset,
+                dstOffset,
                 (int)size);
+
+            dstBuffer.Flush(dstAddress, size);
         }
 
         private BufferRange GetBufferRange(ulong address, ulong size)
+        {
+            return GetBuffer(address, size).GetRange(address, size);
+        }
+
+        private Buffer GetBuffer(ulong address, ulong size)
         {
             Buffer buffer;
 
@@ -509,7 +519,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
                 buffer = _buffers.FindFirstOverlap(address, 1);
             }
 
-            return buffer.GetRange(address, size);
+            return buffer;
         }
 
         private void SynchronizeBufferRange(ulong address, ulong size)
@@ -521,15 +531,5 @@ namespace Ryujinx.Graphics.Gpu.Memory
                 buffer.SynchronizeMemory(address, size);
             }
         }
-
-        public void InvalidateRange(ulong address, ulong size)
-        {
-            Buffer[] overlappingBuffers = _buffers.FindOverlaps(address, size);
-
-            foreach (Buffer buffer in overlappingBuffers)
-            {
-                buffer.Invalidate();
-            }
-        }
     }
 }
\ No newline at end of file