From f992ccdcad958b68e5fa73612c504c9840dbbe19 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 1 Nov 2025 07:50:33 +0200 Subject: [PATCH] cellGam/celCamera: Add more wait flags --- rpcs3/Emu/Cell/Modules/cellCamera.cpp | 14 +++++++++++--- rpcs3/Emu/Cell/Modules/cellGem.cpp | 12 +++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellCamera.cpp b/rpcs3/Emu/Cell/Modules/cellCamera.cpp index 6fd923ad51..096f9330f4 100644 --- a/rpcs3/Emu/Cell/Modules/cellCamera.cpp +++ b/rpcs3/Emu/Cell/Modules/cellCamera.cpp @@ -1139,8 +1139,10 @@ error_code cellCameraGetBufferInfo(s32 dev_num, vm::ptr info) return CELL_OK; } -error_code cellCameraGetBufferInfoEx(s32 dev_num, vm::ptr info) +error_code cellCameraGetBufferInfoEx(ppu_thread& ppu, s32 dev_num, vm::ptr info) { + ppu.state += cpu_flag::wait; + cellCamera.notice("cellCameraGetBufferInfoEx(dev_num=%d, info=0x%x)", dev_num, info); // calls cellCameraGetBufferInfo @@ -1151,10 +1153,16 @@ error_code cellCameraGetBufferInfoEx(s32 dev_num, vm::ptr info } auto& g_camera = g_fxo->get(); - std::lock_guard lock(g_camera.mutex); - *info = g_camera.info; + CellCameraInfoEx info_out; + { + std::lock_guard lock(g_camera.mutex); + + info_out = g_camera.info; + } + + *info = info_out; return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index f7fbf90fae..7f02a0eabe 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -2308,8 +2308,10 @@ error_code cellGemConvertVideoFinish(ppu_thread& ppu) return CELL_OK; } -error_code cellGemConvertVideoStart(vm::cptr video_frame) +error_code cellGemConvertVideoStart(ppu_thread& ppu, vm::cptr video_frame) { + ppu.state += cpu_flag::wait; + cellGem.warning("cellGemConvertVideoStart(video_frame=*0x%x)", video_frame); auto& gem = g_fxo->get(); @@ -2461,6 +2463,8 @@ error_code cellGemEnableMagnetometer2(u32 gem_num, u32 enable) error_code cellGemEnd(ppu_thread& ppu) { + ppu.state += cpu_flag::wait; + cellGem.warning("cellGemEnd()"); auto& gem = g_fxo->get(); @@ -3265,7 +3269,7 @@ error_code cellGemPrepareCamera(s32 max_exposure, f32 image_quality) extern error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm::ptr arg2); extern error_code cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2); - extern error_code cellCameraGetBufferInfoEx(s32 dev_num, vm::ptr info); + extern error_code cellCameraGetBufferInfoEx(ppu_thread&, s32 dev_num, vm::ptr info); vm::var info = vm::make_var({}); vm::var arg1 = vm::make_var({}); @@ -3273,7 +3277,7 @@ error_code cellGemPrepareCamera(s32 max_exposure, f32 image_quality) cellCameraGetAttribute(0, 0x3e6, arg1, arg2); cellCameraSetAttribute(0, 0x3e6, 0x3e, *arg2 | 0x80); - cellCameraGetBufferInfoEx(0, info); + cellCameraGetBufferInfoEx(*cpu_thread::get_current(), 0, info); if (info->width == 640) { @@ -3605,6 +3609,8 @@ error_code cellGemTrackHues(vm::cptr req_hues, vm::ptr res_hues) error_code cellGemUpdateFinish(ppu_thread& ppu) { + ppu.state += cpu_flag::wait; + cellGem.warning("cellGemUpdateFinish()"); auto& gem = g_fxo->get();