From 48888bd0144162b28a127d89c8dd131b7a2abdd3 Mon Sep 17 00:00:00 2001 From: AsperTheDog Date: Fri, 15 May 2026 15:19:12 +0000 Subject: [PATCH] Change non-unform shader extension to be more conservative (#99) 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 Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/99 --- .../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 4fe214778..3f80c2ae0 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 9de806d89..77a23d1f2 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 2dd7186ba..e1561446b 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs @@ -60,14 +60,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);