From 0673dc183a03f58ff558e85054db456e83184df7 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Tue, 14 Aug 2018 22:27:05 -0300 Subject: [PATCH] Reset cache on command buffer execution instead of sync calls (#341) Also resets const buffer cache on CbData calls. Non-const buffer data might also change while a command buffer is executing but that's very unlikely. --- Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs | 15 ++++++++----- Ryujinx.HLE/Gpu/Engines/NvGpuFifo.cs | 28 +++++++++++++++--------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs index 38f8d1c9b..cb1514b5a 100644 --- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs +++ b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs @@ -80,6 +80,14 @@ namespace Ryujinx.HLE.Gpu.Engines } } + public void ResetCache() + { + foreach (List Uploaded in UploadedKeys) + { + Uploaded.Clear(); + } + } + private void VertexEndGl(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) { LockCaches(); @@ -623,11 +631,6 @@ namespace Ryujinx.HLE.Gpu.Engines if (Mode == 0) { - foreach (List Uploaded in UploadedKeys) - { - Uploaded.Clear(); - } - //Write mode. Vmm.WriteInt32(Position, Seq); } @@ -649,6 +652,8 @@ namespace Ryujinx.HLE.Gpu.Engines } WriteRegister(NvGpuEngine3dReg.ConstBufferOffset, Offset); + + UploadedKeys[(int)NvGpuBufferType.ConstBuffer].Clear(); } private void CbBind(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuFifo.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuFifo.cs index 7b999eaed..0e6266548 100644 --- a/Ryujinx.HLE/Gpu/Engines/NvGpuFifo.cs +++ b/Ryujinx.HLE/Gpu/Engines/NvGpuFifo.cs @@ -15,7 +15,7 @@ namespace Ryujinx.HLE.Gpu.Engines private NvGpu Gpu; - private ConcurrentQueue<(NvGpuVmm, NvGpuPBEntry)> BufferQueue; + private ConcurrentQueue<(NvGpuVmm, NvGpuPBEntry[])> BufferQueue; private NvGpuEngine[] SubChannels; @@ -56,7 +56,7 @@ namespace Ryujinx.HLE.Gpu.Engines { this.Gpu = Gpu; - BufferQueue = new ConcurrentQueue<(NvGpuVmm, NvGpuPBEntry)>(); + BufferQueue = new ConcurrentQueue<(NvGpuVmm, NvGpuPBEntry[])>(); SubChannels = new NvGpuEngine[8]; @@ -69,10 +69,7 @@ namespace Ryujinx.HLE.Gpu.Engines public void PushBuffer(NvGpuVmm Vmm, NvGpuPBEntry[] Buffer) { - foreach (NvGpuPBEntry PBEntry in Buffer) - { - BufferQueue.Enqueue((Vmm, PBEntry)); - } + BufferQueue.Enqueue((Vmm, Buffer)); Event.Set(); } @@ -82,16 +79,27 @@ namespace Ryujinx.HLE.Gpu.Engines while (Step()); } + private (NvGpuVmm Vmm, NvGpuPBEntry[] Pb) Curr; + + private int CurrPbEntryIndex; + public bool Step() { - if (BufferQueue.TryDequeue(out (NvGpuVmm Vmm, NvGpuPBEntry PBEntry) Tuple)) + while (Curr.Pb == null || Curr.Pb.Length <= CurrPbEntryIndex) { - CallMethod(Tuple.Vmm, Tuple.PBEntry); + if (!BufferQueue.TryDequeue(out Curr)) + { + return false; + } - return true; + Gpu.Engine3d.ResetCache(); + + CurrPbEntryIndex = 0; } - return false; + CallMethod(Curr.Vmm, Curr.Pb[CurrPbEntryIndex++]); + + return true; } private void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry)