aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-08-14 22:27:05 -0300
committergdkchan <gab.dark.100@gmail.com>2018-08-14 22:27:05 -0300
commit0673dc183a03f58ff558e85054db456e83184df7 (patch)
tree521876240b9ba4f08bade8ecdc2d8c0cdc949308
parent9ac5583513070f3f58225250ff2b1edaa080969c (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.cs15
-rw-r--r--Ryujinx.HLE/Gpu/Engines/NvGpuFifo.cs28
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)