From 17fb11ddb98e94aaf494eaf6002ab149c5d54000 Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Fri, 6 Dec 2019 20:19:12 -0300
Subject: [PATCH] Fix wrong maximum id on sampler pool in some cases

---
 Ryujinx.Graphics.Gpu/Engine/Methods.cs               | 9 +++++++--
 Ryujinx.Graphics.Gpu/Image/Pool.cs                   | 5 ++++-
 Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs | 2 +-
 Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs | 3 ---
 Ryujinx.Graphics.Shader/CodeGen/Glsl/DefaultNames.cs | 3 ---
 Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs  | 2 ++
 6 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
index 5388c86d53..29360cf9cb 100644
--- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
@@ -123,7 +123,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
             }
 
             // Pools.
-            if (state.QueryModified(MethodOffset.SamplerPoolState))
+            if (state.QueryModified(MethodOffset.SamplerPoolState, MethodOffset.SamplerIndex))
             {
                 UpdateSamplerPoolState(state);
             }
@@ -422,11 +422,16 @@ namespace Ryujinx.Graphics.Gpu.Engine
 
         private void UpdateSamplerPoolState(GpuState state)
         {
+            var texturePool = state.Get<PoolState>(MethodOffset.TexturePoolState);
             var samplerPool = state.Get<PoolState>(MethodOffset.SamplerPoolState);
 
             var samplerIndex = state.Get<SamplerIndex>(MethodOffset.SamplerIndex);
 
-            _textureManager.SetGraphicsSamplerPool(samplerPool.Address.Pack(), samplerPool.MaximumId, samplerIndex);
+            int maximumId = samplerIndex == SamplerIndex.ViaHeaderIndex
+                ? texturePool.MaximumId
+                : samplerPool.MaximumId;
+
+            _textureManager.SetGraphicsSamplerPool(samplerPool.Address.Pack(), maximumId, samplerIndex);
         }
 
         private void UpdateTexturePoolState(GpuState state)
diff --git a/Ryujinx.Graphics.Gpu/Image/Pool.cs b/Ryujinx.Graphics.Gpu/Image/Pool.cs
index 7457de1981..5ce8d7f689 100644
--- a/Ryujinx.Graphics.Gpu/Image/Pool.cs
+++ b/Ryujinx.Graphics.Gpu/Image/Pool.cs
@@ -11,12 +11,15 @@ namespace Ryujinx.Graphics.Gpu.Image
 
         protected T[] Items;
 
+        public int MaximumId { get; }
+
         public ulong Address { get; }
         public ulong Size    { get; }
 
         public Pool(GpuContext context, ulong address, int maximumId)
         {
-            Context = context;
+            Context   = context;
+            MaximumId = maximumId;
 
             int count = maximumId + 1;
 
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
index 290bb665f3..63a42709ef 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
@@ -76,7 +76,7 @@ namespace Ryujinx.Graphics.Gpu.Image
 
             if (_samplerPool != null)
             {
-                if (_samplerPool.Address == address)
+                if (_samplerPool.Address == address && _samplerPool.MaximumId >= maximumId)
                 {
                     return;
                 }
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
index 85a0001b01..32c90c2d4a 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
@@ -180,9 +180,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
 
         public static void DeclareLocals(CodeGenContext context, StructuredProgramInfo info)
         {
-            context.AppendLine(GetVarTypeName(VariableType.S32) + " " + DefaultNames.DummyIntName + ";");
-            context.AppendLine(GetVarTypeName(VariableType.U32) + " " + DefaultNames.DummyUintName + ";");
-
             foreach (AstOperand decl in info.Locals)
             {
                 string name = context.OperandManager.DeclareLocal(decl);
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/DefaultNames.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/DefaultNames.cs
index 90853b9f6c..4da38b2de5 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/DefaultNames.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/DefaultNames.cs
@@ -22,9 +22,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
         public const string LocalMemoryName  = "local_mem";
         public const string SharedMemoryName = "shared_mem";
 
-        public const string DummyIntName  = "dummyInt";
-        public const string DummyUintName = "dummyUint";
-
         public const string UndefinedName = "undef";
     }
 }
\ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs
index 2a8f00ccb5..0cb854e910 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs
@@ -241,6 +241,8 @@ namespace Ryujinx.Graphics.Shader.Instructions
 
             res = context.IAdd(res, srcC);
 
+            // TODO: CC, X, SAT, and more?
+
             context.Copy(GetDest(context), res);
         }