From b3ecbb815b510878c5957f628c232f8199bb3ca4 Mon Sep 17 00:00:00 2001 From: SDK Chan Date: Wed, 30 Jul 2025 09:42:01 +0000 Subject: [PATCH] [shader_recompiler/Maxwell] Fix ISBERD shift operation --- .../service/nvnflinger/hos_binder_driver_server.cpp | 2 +- .../impl/internal_stage_buffer_entry_read.cpp | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp index b85f1a4fa4..34cee47e76 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp @@ -34,7 +34,7 @@ void HosBinderDriverServer::AdjustRefcount(s32 binder_id, s32 delta, bool is_wea auto search_rc = refcounts.find(binder_id); if (search_rc == refcounts.end()) { - LOG_WARNING(Service_VI, "AdjustRefcount called for unknown binder id {}", binder_id); +// LOG_WARNING(Service_VI, "AdjustRefcount called for unknown binder id {}", binder_id); return; } 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..1e56a9e18d 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 @@ -46,7 +46,18 @@ void TranslatorVisitor::ISBERD(u64 insn) { throw NotImplementedException("Mode {}", isberd.mode.Value()); } if (isberd.shift != Shift::Default) { - throw NotImplementedException("Shift {}", isberd.shift.Value()); + IR::U32 offset{}; + IR::U32 result{}; + switch(static_cast(isberd.shift.Value())) { + case static_cast(Shift::U16): + offset = static_cast(ir.ShiftLeftLogical(X(isberd.src_reg), ir.Imm32(1))); + break; + case static_cast(Shift::B32): + offset = static_cast(ir.ShiftLeftLogical(X(isberd.src_reg), ir.Imm32(2))); + break; + } + result = ir.IAdd(X(isberd.src_reg), offset); + X(isberd.dest_reg, result); } //LOG_DEBUG(Shader, "(STUBBED) called {}", insn); if (isberd.src_reg_num == 0xFF) {