diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index 139cd51cc6..fd669d5f04 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -195,10 +195,12 @@ Id Texture(EmitContext& ctx, IR::TextureInstInfo info, [[maybe_unused]] const IR const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; if (def.count > 1) { auto const idx = index.IsImmediate() ? ctx.Const(index.U32()) : ctx.Def(index); + if (!ctx.non_uniform_ids.contains(idx) && IsNonUniformDescriptor(ctx, index)) { + ctx.Decorate(idx, spv::Decoration::NonUniform); + ctx.non_uniform_ids.insert(idx); + } const Id pointer{ctx.OpAccessChain(def.pointer_type, def.id, idx)}; const Id object{ctx.OpLoad(def.sampled_type, pointer)}; - if (IsNonUniformDescriptor(ctx, index)) - ctx.Decorate(idx, spv::Decoration::NonUniform); return object; } else { return ctx.OpLoad(def.sampled_type, def.id); @@ -218,11 +220,13 @@ Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& ind const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; if (def.count > 1) { auto const idx = index.IsImmediate() ? ctx.Const(index.U32()) : ctx.Def(index); + if (!ctx.non_uniform_ids.contains(idx) && IsNonUniformDescriptor(ctx, index)) { + ctx.Decorate(idx, spv::Decoration::NonUniform); + ctx.non_uniform_ids.insert(idx); + } const Id ptr = ctx.OpAccessChain(def.pointer_type, def.id, idx); const Id object = ctx.OpLoad(def.sampled_type, ptr); const Id image = ctx.OpImage(def.image_type, object); - if (IsNonUniformDescriptor(ctx, index)) - ctx.Decorate(idx, spv::Decoration::NonUniform); return image; } return ctx.OpImage(def.image_type, ctx.OpLoad(def.sampled_type, def.id)); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index de56809a98..7b7ccc80e3 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -9,6 +9,7 @@ #include #include +#include #include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/frontend/ir/program.h" @@ -366,6 +367,8 @@ public: Id load_const_func_u32x2{}; Id load_const_func_u32x4{}; + ankerl::unordered_dense::set non_uniform_ids; + private: void DefineCommonTypes(const Info& info); void DefineCommonConstants();