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.
This commit is contained in:
ReinUsesLisp 2018-08-14 22:27:05 -03:00 committed by gdkchan
parent 9ac5583513
commit 0673dc183a
2 changed files with 28 additions and 15 deletions

View file

@ -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)