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

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

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)