diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2018-08-14 22:27:05 -0300 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-08-14 22:27:05 -0300 |
| commit | 0673dc183a03f58ff558e85054db456e83184df7 (patch) | |
| tree | 521876240b9ba4f08bade8ecdc2d8c0cdc949308 | |
| parent | 9ac5583513070f3f58225250ff2b1edaa080969c (diff) | |
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.
| -rw-r--r-- | Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs | 15 | ||||
| -rw-r--r-- | 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 38f8d1c9..cb1514b5 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<long> 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<long> 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 7b999eae..0e626654 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) |
