From 2901f9b795ef42dedfc929f289ef162804388069 Mon Sep 17 00:00:00 2001 From: AsperTheDog Date: Fri, 15 May 2026 15:19:12 +0000 Subject: [PATCH] Change non-uniform shader extension to be more conservative The previous fix for Tomodachi Life (#91) included the extension to all shaders, independently on if it was needed or not. This PR fixes that by lazily adding the extension only when it is actually needed. This change should not be noticed by anyone, but it avoids having to modify shaders that do not perform any type of dynamic indexing, which apparently is something some modders care about. Co-authored-by: AsperTheDog --- .../CodeGen/Spirv/CodeGenContext.cs | 3 +++ .../CodeGen/Spirv/Instructions.cs | 9 +++++++++ .../CodeGen/Spirv/SpirvGenerator.cs | 8 -------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs index 4faba77f3..0e415ab46 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs @@ -82,6 +82,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv public bool IsMainFunction { get; private set; } public bool MayHaveReturned { get; set; } + public bool WasNonUniformAccessDeclared { get; set; } public CodeGenContext( StructuredProgramInfo info, @@ -89,6 +90,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv GeneratorPool instPool, GeneratorPool integerPool) : base(SpirvVersionPacked, instPool, integerPool) { + WasNonUniformAccessDeclared = false; + Info = info; AttributeUsage = parameters.AttributeUsage; Definitions = parameters.Definitions; diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs index 4866676a8..01940d857 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs @@ -591,7 +591,16 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { if (context.HostCapabilities.SupportsShaderNonUniformIndexing) { + if (!context.WasNonUniformAccessDeclared) + { + context.AddExtension("SPV_EXT_descriptor_indexing"); + context.AddCapability(Capability.ShaderNonUniform); + context.AddCapability(Capability.SampledImageArrayNonUniformIndexing); + context.AddCapability(Capability.StorageImageArrayNonUniformIndexing); + } + context.Decorate(inst, Decoration.NonUniform); + context.WasNonUniformAccessDeclared = true; } } diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs index ceb5fe611..b2527f91b 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs @@ -65,14 +65,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv context.AddCapability(Capability.Float64); } - if (parameters.HostCapabilities.SupportsShaderNonUniformIndexing) - { - context.AddExtension("SPV_EXT_descriptor_indexing"); - context.AddCapability(Capability.ShaderNonUniform); - context.AddCapability(Capability.SampledImageArrayNonUniformIndexing); - context.AddCapability(Capability.StorageImageArrayNonUniformIndexing); - } - if (parameters.Definitions.TransformFeedbackEnabled && parameters.Definitions.LastInVertexPipeline) { context.AddCapability(Capability.TransformFeedback);