From 63b87e3a1e6d43dc7b71b6f69941a19759d59875 Mon Sep 17 00:00:00 2001 From: SDK Chan Date: Wed, 30 Jul 2025 11:50:01 +0000 Subject: [PATCH] [shader_recompiler/Maxwell] Implement ISBERD offset --- .../impl/internal_stage_buffer_entry_read.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp index 59ca4b15a3..36b0d6ffc5 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp @@ -40,7 +40,17 @@ void TranslatorVisitor::ISBERD(u64 insn) { throw NotImplementedException("SKEW"); } if (isberd.o != 0) { - throw NotImplementedException("O"); + IR::U32 address{}; + IR::F32 result{}; + if (isberd.src_reg_num == 0xFF) { + address = ir.Imm32(isberd.imm); + result = ir.GetAttributeIndexed(address); + } else { + IR::U32 offset = ir.Imm32(isberd.imm); + address = ir.IAdd(X(isberd.src_reg), offset); + result = ir.GetAttributeIndexed(address); + } + X(isberd.dest_reg, ir.BitCast(result)); } if (isberd.mode != Mode::Default) { throw NotImplementedException("Mode {}", isberd.mode.Value());