Ver código fonte

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.
ReinUsesLisp 7 anos atrás
pai
commit
0673dc183a

+ 10 - 5
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)

+ 18 - 10
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)