Просмотр исходного кода

Small optimizations on texture and sampler pool invalidation

gdk 6 лет назад
Родитель
Сommit
b2b2e04669

+ 8 - 1
Ryujinx.Graphics.Gpu/Image/SamplerPool.cs

@@ -5,6 +5,8 @@ namespace Ryujinx.Graphics.Gpu.Image
 {
     class SamplerPool : Pool<Sampler>
     {
+        private int _sequenceNumber;
+
         public SamplerPool(GpuContext context, ulong address, int maximumId) : base(context, address, maximumId) { }
 
         public override Sampler Get(int id)
@@ -14,7 +16,12 @@ namespace Ryujinx.Graphics.Gpu.Image
                 return null;
             }
 
-            SynchronizeMemory();
+            if (_sequenceNumber != Context.SequenceNumber)
+            {
+                _sequenceNumber = Context.SequenceNumber;
+
+                SynchronizeMemory();
+            }
 
             Sampler sampler = Items[id];
 

+ 7 - 6
Ryujinx.Graphics.Gpu/Image/TexturePool.cs

@@ -11,11 +11,7 @@ namespace Ryujinx.Graphics.Gpu.Image
     {
         public LinkedListNode<TexturePool> CacheNode { get; set; }
 
-        private struct TextureContainer
-        {
-            public Texture Texture0 { get; set; }
-            public Texture Texture1 { get; set; }
-        }
+        private int _sequenceNumber;
 
         public TexturePool(
             GpuContext context,
@@ -29,7 +25,12 @@ namespace Ryujinx.Graphics.Gpu.Image
                 return null;
             }
 
-            SynchronizeMemory();
+            if (_sequenceNumber != Context.SequenceNumber)
+            {
+                _sequenceNumber = Context.SequenceNumber;
+
+                SynchronizeMemory();
+            }
 
             Texture texture = Items[id];
 

+ 14 - 3
Ryujinx.Graphics.Gpu/Memory/BufferManager.cs

@@ -3,7 +3,6 @@ using Ryujinx.Graphics.GAL.InputAssembler;
 using Ryujinx.Graphics.Gpu.State;
 using Ryujinx.Graphics.Shader;
 using System;
-using System.Runtime.InteropServices;
 
 namespace Ryujinx.Graphics.Gpu.Memory
 {
@@ -48,6 +47,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
 
         private bool _indexBufferDirty;
         private bool _vertexBuffersDirty;
+        private uint _vertexBuffersEnableMask;
 
         private bool _rebind;
 
@@ -93,6 +93,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
             _vertexBuffers[index].Divisor = divisor;
 
             _vertexBuffersDirty = true;
+
+            if (address != 0)
+            {
+                _vertexBuffersEnableMask |= 1u << index;
+            }
+            else
+            {
+                _vertexBuffersEnableMask &= ~(1u << index);
+            }
         }
 
         public void SetComputeStorageBuffer(int index, ulong gpuVa, ulong size)
@@ -322,13 +331,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
                 SynchronizeBufferRange(_indexBuffer.Address, _indexBuffer.Size);
             }
 
+            uint vbEnableMask = _vertexBuffersEnableMask;
+
             if (_vertexBuffersDirty || _rebind)
             {
                 _vertexBuffersDirty = false;
 
                 VertexBufferDescriptor[] vertexBuffers = new VertexBufferDescriptor[Constants.TotalVertexBuffers];
 
-                for (int index = 0; index < Constants.TotalVertexBuffers; index++)
+                for (int index = 0; (vbEnableMask >> index) != 0; index++)
                 {
                     VertexBuffer vb = _vertexBuffers[index];
 
@@ -346,7 +357,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
             }
             else
             {
-                for (int index = 0; index < Constants.TotalVertexBuffers; index++)
+                for (int index = 0; (vbEnableMask >> index) != 0; index++)
                 {
                     VertexBuffer vb = _vertexBuffers[index];
 

+ 36 - 9
Ryujinx.Graphics.Gpu/State/GpuState.cs

@@ -114,23 +114,50 @@ namespace Ryujinx.Graphics.Gpu.State
             _registers[(int)offset].Callback = callback;
         }
 
-        public bool QueryModified(params MethodOffset[] offsets)
+        public bool QueryModified(MethodOffset offset)
         {
-            bool modified = false;
+            bool modified = _registers[(int)offset].Modified;
 
-            for (int index = 0; index < offsets.Length; index++)
-            {
-                modified |= QueryModified(offsets[index]);
-            }
+            _registers[(int)offset].Modified = false;
 
             return modified;
         }
 
-        public bool QueryModified(MethodOffset offset)
+        public bool QueryModified(MethodOffset m1, MethodOffset m2)
         {
-            bool modified = _registers[(int)offset].Modified;
+            bool modified = _registers[(int)m1].Modified ||
+                            _registers[(int)m2].Modified;
 
-            _registers[(int)offset].Modified = false;
+            _registers[(int)m1].Modified = false;
+            _registers[(int)m2].Modified = false;
+
+            return modified;
+        }
+
+        public bool QueryModified(MethodOffset m1, MethodOffset m2, MethodOffset m3)
+        {
+            bool modified = _registers[(int)m1].Modified ||
+                            _registers[(int)m2].Modified ||
+                            _registers[(int)m3].Modified;
+
+            _registers[(int)m1].Modified = false;
+            _registers[(int)m2].Modified = false;
+            _registers[(int)m3].Modified = false;
+
+            return modified;
+        }
+
+        public bool QueryModified(MethodOffset m1, MethodOffset m2, MethodOffset m3, MethodOffset m4)
+        {
+            bool modified = _registers[(int)m1].Modified ||
+                            _registers[(int)m2].Modified ||
+                            _registers[(int)m3].Modified ||
+                            _registers[(int)m4].Modified;
+
+            _registers[(int)m1].Modified = false;
+            _registers[(int)m2].Modified = false;
+            _registers[(int)m3].Modified = false;
+            _registers[(int)m4].Modified = false;
 
             return modified;
         }