From c82221f292880272d11302ecf1206f81a970a5ab Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 23 Sep 2026 19:02:43 +0200 Subject: [PATCH] cellGem: Allow custom camera_frame buffers TV superstars demo passes its own buffer. If we early out here we never increase the frame count and tracking does not work properly. --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 85a7d91ff8..e1670a39b9 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1572,18 +1572,24 @@ public: return true; } - bool set_image(u32 addr) + bool set_image(vm::cptr buf) { - if (!addr) + if (!buf) return false; auto& g_camera = g_fxo->get(); std::lock_guard lock(g_camera.mutex); m_camera_info = g_camera.info; - if (m_camera_info.buffer.addr() != addr && m_camera_info.pbuf[0].addr() != addr && m_camera_info.pbuf[1].addr() != addr) + if (m_camera_info.buffer.addr() != buf.addr() && m_camera_info.pbuf[0].addr() != buf.addr() && m_camera_info.pbuf[1].addr() != buf.addr()) { - cellGem.error("gem_tracker: unexpected image address: addr=0x%x, expected one of: 0x%x, 0x%x, 0x%x", addr, m_camera_info.buffer.addr(), m_camera_info.pbuf[0].addr(), m_camera_info.pbuf[1].addr()); + // The game passes its own buffer. Let's just ignore this and log a warning. We use our own camera buffer for tracking for now anyway. + cellGem.warning("gem_tracker: unexpected image address: addr=0x%x, expected one of: 0x%x, 0x%x, 0x%x", buf.addr(), m_camera_info.buffer.addr(), m_camera_info.pbuf[0].addr(), m_camera_info.pbuf[1].addr()); + } + + if (!m_camera_info.buffer) + { + cellGem.error("gem_tracker: camer buffer not set"); return false; } @@ -4176,7 +4182,7 @@ error_code cellGemUpdateStart(vm::cptr camera_frame, u64 timestamp) gem.camera_frame = camera_frame.addr(); - const bool image_set = tracker.set_image(gem.camera_frame); + const bool image_set = tracker.set_image(camera_frame); tracker.wake_up_tracker();