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);