From baaf9a628cb9dd063bb81043b80dab35dfca40fe Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Thu, 2 Jul 2026 03:56:49 -0400 Subject: [PATCH] [spir-v] Correcting output components --- .../backend/glasm/emit_glasm_warp.cpp | 15 +++++++++------ .../backend/spirv/emit_spirv.cpp | 3 ++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp index 80ba7556de..42b525443b 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -98,22 +101,22 @@ void EmitShuffleButterfly(EmitContext& ctx, IR::Inst& inst, ScalarU32 value, Sca } void EmitQuadBroadcast(EmitContext& ctx, IR::Inst& inst, ScalarU32 value, ScalarU32 lane) { - // QuadBroadcast: src = (thread_id & ~3) | (lane & 3) — SHFLIDX with quad mask 0x1C03 + // QuadBroadcast: src = (thread_id & ~3) | (lane & 3) — SHFIDX with quad mask 0x1C03 const Register ret{ctx.reg_alloc.Define(inst)}; ctx.Add("AND.U RC.x,{}.threadid,~3;" "AND.U RC.y,{},3;" "OR.U RC.x,RC.x,RC.y;" - "SHFLIDX.U {},{},RC.x,0x1C03;" - "MOV.U {}.x,{}.x;", + "SHFIDX.U {},{},RC.x,0x1C03;" + "MOV.U {}.x,{}.y;", ctx.stage_name, lane, ret, value, ret, ret); } void EmitQuadSwap(EmitContext& ctx, IR::Inst& inst, ScalarU32 value, ScalarU32 direction) { - // QuadSwap: XOR thread_id with (direction+1) within quad — SHFLXOR with quad mask 0x1C03 + // QuadSwap: XOR thread_id with (direction+1) within quad — SHFXOR with quad mask 0x1C03 const Register ret{ctx.reg_alloc.Define(inst)}; ctx.Add("ADD.U RC.x,{},1;" - "SHFLXOR.U {},{},RC.x,0x1C03;" - "MOV.U {}.x,{}.x;", + "SHFXOR.U {},{},RC.x,0x1C03;" + "MOV.U {}.x,{}.y;", direction, ret, value, ret, ret); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index d284c73781..1b301be316 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -322,7 +322,8 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) { if (ctx.runtime_info.force_early_z) { ctx.AddExecutionMode(main, spv::ExecutionMode::EarlyFragmentTests); } - if (ctx.profile.support_shader_quad_control && program.info.uses_derivatives) { + if (ctx.profile.support_shader_quad_control && + (program.info.uses_derivatives || program.info.uses_quad_shuffles)) { ctx.AddExtension("SPV_KHR_quad_control"); ctx.AddCapability(spv::Capability::QuadControlKHR); ctx.AddExecutionMode(main, spv::ExecutionMode::RequireFullQuadsKHR);