From dc6ef99dc7e33bdd0d06393672bebf3df22285f0 Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:02:08 +0300 Subject: [PATCH] vector_memory: Handle immediate but non zero offset too Signed-off-by: georgemoralis --- .../frontend/translate/vector_memory.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index 68b619c0a..df20f7f73 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -192,8 +192,9 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_ const IR::VectorReg vaddr{inst.src[0].code}; const IR::ScalarReg sharp{inst.src[2].code * 4}; const IR::Value soffset{GetSrc(inst.src[3])}; + const bool has_soffset = !soffset.IsImmediate() || soffset.U32() != 0; if (info.stage != Stage::Geometry) { - ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0 || !mubuf.offen, + ASSERT_MSG(!has_soffset || !mubuf.offen, "Having both scalar and vector offsets is not supported"); } @@ -204,13 +205,13 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_ if (mubuf.idxen && mubuf.offen) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); } - if (mubuf.idxen && !soffset.IsImmediate()) { + if (mubuf.idxen && has_soffset) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), soffset); } if (mubuf.idxen || mubuf.offen) { return ir.GetVectorReg(vaddr); } - if (!soffset.IsImmediate()) { + if (has_soffset) { return soffset; } return {}; @@ -218,7 +219,7 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_ IR::BufferInstInfo buffer_info{}; buffer_info.index_enable.Assign(mubuf.idxen); - buffer_info.offset_enable.Assign(mubuf.offen || !soffset.IsImmediate()); + buffer_info.offset_enable.Assign(mubuf.offen || has_soffset); buffer_info.inst_offset.Assign(mubuf.offset); buffer_info.globally_coherent.Assign(mubuf.glc); buffer_info.system_coherent.Assign(mubuf.slc);