From 17fb11ddb98e94aaf494eaf6002ab149c5d54000 Mon Sep 17 00:00:00 2001 From: gdkchan 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 5388c86d..29360cf9 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(MethodOffset.TexturePoolState); var samplerPool = state.Get(MethodOffset.SamplerPoolState); var samplerIndex = state.Get(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 7457de19..5ce8d7f6 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 290bb665..63a42709 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 85a0001b..32c90c2d 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 90853b9f..4da38b2d 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 2a8f00cc..0cb854e9 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); }