Explorar el Código

Fix for texture pool not being updated when it should + buffer texture related fixes (#2911)

gdkchan hace 4 años
padre
commit
e7c2dc8ec3

+ 20 - 0
Ryujinx.Graphics.Gpu/Engine/Threed/ThreedClass.cs

@@ -34,6 +34,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
                 { nameof(ThreedClassState.LaunchDma), new RwCallback(LaunchDma, null) },
                 { nameof(ThreedClassState.LoadInlineData), new RwCallback(LoadInlineData, null) },
                 { nameof(ThreedClassState.SyncpointAction), new RwCallback(IncrementSyncpoint, null) },
+                { nameof(ThreedClassState.InvalidateSamplerCacheNoWfi), new RwCallback(InvalidateSamplerCacheNoWfi, null) },
+                { nameof(ThreedClassState.InvalidateTextureHeaderCacheNoWfi), new RwCallback(InvalidateTextureHeaderCacheNoWfi, null) },
                 { nameof(ThreedClassState.TextureBarrier), new RwCallback(TextureBarrier, null) },
                 { nameof(ThreedClassState.TextureBarrierTiled), new RwCallback(TextureBarrierTiled, null) },
                 { nameof(ThreedClassState.DrawTextureSrcY), new RwCallback(DrawTexture, null) },
@@ -227,6 +229,24 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
             _context.Synchronization.IncrementSyncpoint(syncpointId);
         }
 
+        /// <summary>
+        /// Invalidates the cache with the sampler descriptors from the sampler pool.
+        /// </summary>
+        /// <param name="argument">Method call argument (unused)</param>
+        private void InvalidateSamplerCacheNoWfi(int argument)
+        {
+            _context.AdvanceSequence();
+        }
+
+        /// <summary>
+        /// Invalidates the cache with the texture descriptors from the texture pool.
+        /// </summary>
+        /// <param name="argument">Method call argument (unused)</param>
+        private void InvalidateTextureHeaderCacheNoWfi(int argument)
+        {
+            _context.AdvanceSequence();
+        }
+
         /// <summary>
         /// Issues a texture barrier.
         /// This waits until previous texture writes from the GPU to finish, before

+ 4 - 1
Ryujinx.Graphics.Gpu/Engine/Threed/ThreedClassState.cs

@@ -784,7 +784,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
         public YControl YControl;
         public float LineWidthSmooth;
         public float LineWidthAliased;
-        public fixed uint Reserved13B8[31];
+        public fixed uint Reserved13B8[27];
+        public uint InvalidateSamplerCacheNoWfi;
+        public uint InvalidateTextureHeaderCacheNoWfi;
+        public fixed uint Reserved142C[2];
         public uint FirstVertex;
         public uint FirstInstance;
         public fixed uint Reserved143C[53];

+ 38 - 33
Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs

@@ -377,18 +377,6 @@ namespace Ryujinx.Graphics.Gpu.Image
 
                 ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
 
-                if (_textureState[stageIndex][index].Texture != hostTexture || _rebind)
-                {
-                    if (UpdateScale(texture, bindingInfo, index, stage))
-                    {
-                        hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
-                    }
-
-                    _textureState[stageIndex][index].Texture = hostTexture;
-
-                    _context.Renderer.Pipeline.SetTexture(bindingInfo.Binding, hostTexture);
-                }
-
                 if (hostTexture != null && texture.Target == Target.TextureBuffer)
                 {
                     // Ensure that the buffer texture is using the correct buffer as storage.
@@ -396,16 +384,30 @@ namespace Ryujinx.Graphics.Gpu.Image
                     // to ensure we're not using a old buffer that was already deleted.
                     _channel.BufferManager.SetBufferTextureStorage(hostTexture, texture.Range.GetSubRange(0).Address, texture.Size, bindingInfo, bindingInfo.Format, false);
                 }
+                else
+                {
+                    if (_textureState[stageIndex][index].Texture != hostTexture || _rebind)
+                    {
+                        if (UpdateScale(texture, bindingInfo, index, stage))
+                        {
+                            hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
+                        }
+
+                        _textureState[stageIndex][index].Texture = hostTexture;
 
-                Sampler sampler = samplerPool?.Get(samplerId);
+                        _context.Renderer.Pipeline.SetTexture(bindingInfo.Binding, hostTexture);
+                    }
 
-                ISampler hostSampler = sampler?.GetHostSampler(texture);
+                    Sampler sampler = samplerPool?.Get(samplerId);
 
-                if (_textureState[stageIndex][index].Sampler != hostSampler || _rebind)
-                {
-                    _textureState[stageIndex][index].Sampler = hostSampler;
+                    ISampler hostSampler = sampler?.GetHostSampler(texture);
+
+                    if (_textureState[stageIndex][index].Sampler != hostSampler || _rebind)
+                    {
+                        _textureState[stageIndex][index].Sampler = hostSampler;
 
-                    _context.Renderer.Pipeline.SetSampler(bindingInfo.Binding, hostSampler);
+                        _context.Renderer.Pipeline.SetSampler(bindingInfo.Binding, hostSampler);
+                    }
                 }
             }
         }
@@ -464,28 +466,31 @@ namespace Ryujinx.Graphics.Gpu.Image
 
                     _channel.BufferManager.SetBufferTextureStorage(hostTexture, texture.Range.GetSubRange(0).Address, texture.Size, bindingInfo, format, true);
                 }
-                else if (isStore)
-                {
-                    texture?.SignalModified();
-                }
-
-                if (_imageState[stageIndex][index].Texture != hostTexture || _rebind)
+                else
                 {
-                    if (UpdateScale(texture, bindingInfo, baseScaleIndex + index, stage))
+                    if (isStore)
                     {
-                        hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
+                        texture?.SignalModified();
                     }
 
-                    _imageState[stageIndex][index].Texture = hostTexture;
+                    if (_imageState[stageIndex][index].Texture != hostTexture || _rebind)
+                    {
+                        if (UpdateScale(texture, bindingInfo, baseScaleIndex + index, stage))
+                        {
+                            hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
+                        }
 
-                    Format format = bindingInfo.Format;
+                        _imageState[stageIndex][index].Texture = hostTexture;
 
-                    if (format == 0 && texture != null)
-                    {
-                        format = texture.Format;
-                    }
+                        Format format = bindingInfo.Format;
 
-                    _context.Renderer.Pipeline.SetImage(bindingInfo.Binding, hostTexture, format);
+                        if (format == 0 && texture != null)
+                        {
+                            format = texture.Format;
+                        }
+
+                        _context.Renderer.Pipeline.SetImage(bindingInfo.Binding, hostTexture, format);
+                    }
                 }
             }
         }

+ 1 - 0
Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs

@@ -56,6 +56,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
         public void SetStorage(BufferRange buffer)
         {
             if (_buffer != BufferHandle.Null &&
+                _buffer == buffer.Handle &&
                 buffer.Offset == _bufferOffset &&
                 buffer.Size == _bufferSize &&
                 _renderer.BufferCount == _bufferCount)