diff --git a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp index ab52624184..98756e8f96 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp @@ -491,7 +491,7 @@ void _spurs::handler_wait_ready(ppu_thread& ppu, vm::ptr spurs) { if (spurs->handlerExiting) { - CHECK_SUCCESS(CALL_FUNC(ppu, sys_lwmutex_unlock, ppu, spurs.ptr(&CellSpurs::mutex))); + CHECK_SUCCESS(ppu_execute<&sys_lwmutex_unlock>(ppu, spurs.ptr(&CellSpurs::mutex))); return sys_ppu_thread_exit(ppu, 0); } diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 34df4f764d..cb90cbed31 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -451,7 +451,7 @@ s32 cellVdecOpen(ppu_thread& ppu, vm::cptr type, vm::cptrid; vm::var _tid; - CALL_FUNC(ppu, sys_ppu_thread_create, ppu, +_tid, 1148, 0, 900, 0x4000, SYS_PPU_THREAD_CREATE_INTERRUPT, vm::null); + ppu_execute<&sys_ppu_thread_create>(ppu, +_tid, 1148, 0, 900, 0x4000, SYS_PPU_THREAD_CREATE_INTERRUPT, vm::null); vdec->gpr[13] = idm::get(*_tid)->gpr[13]; vdec->ppu_tid = *_tid; @@ -471,7 +471,7 @@ s32 cellVdecOpenEx(ppu_thread& ppu, vm::cptr type, vm::cptrid; vm::var _tid; - CALL_FUNC(ppu, sys_ppu_thread_create, ppu, +_tid, 1148, 0, 900, 0x4000, SYS_PPU_THREAD_CREATE_INTERRUPT, vm::null); + ppu_execute<&sys_ppu_thread_create>(ppu, +_tid, 1148, 0, 900, 0x4000, SYS_PPU_THREAD_CREATE_INTERRUPT, vm::null); vdec->gpr[13] = idm::get(*_tid)->gpr[13]; vdec->ppu_tid = *_tid; @@ -501,8 +501,7 @@ s32 cellVdecClose(ppu_thread& ppu, u32 handle) vdec->notify(); vdec->join(); - CALL_FUNC(ppu, sys_interrupt_thread_disestablish, ppu, vdec->ppu_tid); - idm::remove(handle); + ppu_execute<&sys_interrupt_thread_disestablish>(ppu, vdec->ppu_tid); return CELL_OK; } diff --git a/rpcs3/Emu/Cell/PPUModule.h b/rpcs3/Emu/Cell/PPUModule.h index ee18c2fb2e..d3c434513b 100644 --- a/rpcs3/Emu/Cell/PPUModule.h +++ b/rpcs3/Emu/Cell/PPUModule.h @@ -112,7 +112,7 @@ class ppu_module_manager final static ppu_static_variable& access_static_variable(const char* module, u32 vnid); // Global variable for each registered function - template + template struct registered { static ppu_static_function* info; @@ -121,40 +121,42 @@ class ppu_module_manager final public: static const ppu_static_module* get_module(const std::string& name); - template + template static auto& register_static_function(const char* module, const char* name, ppu_function_t func, u32 fnid) { auto& info = access_static_function(module, fnid); info.name = name; - info.index = ppu_function_manager::register_function(func); + info.index = ppu_function_manager::register_function(func); info.flags = 0; - info.type = typeid(T).name(); + info.type = typeid(*Func).name(); - registered::info = &info; + registered::info = &info; return info; } - template + template static auto& find_static_function() { - return *registered::info; + return *registered::info; } - template + template static auto& register_static_variable(const char* module, const char* name, u32 vnid) { - static_assert(std::is_same>::value, "Static variable registration: vm::gvar expected"); + using gvar = std::decay_t; + + static_assert(std::is_same::value, "Static variable registration: vm::gvar expected"); auto& info = access_static_variable(module, vnid); info.name = name; info.var = reinterpret_cast*>(Var); info.init = [] {}; - info.size = sizeof(typename T::type); - info.align = alignof(typename T::type); - info.type = typeid(T).name(); + info.size = sizeof(typename gvar::type); + info.align = alignof(typename gvar::type); + info.type = typeid(*Var).name(); info.flags = 0; info.addr = 0; @@ -267,24 +269,22 @@ public: static const ppu_static_module sys_lv2dbg; }; -template -ppu_static_function* ppu_module_manager::registered::info = nullptr; +template +ppu_static_function* ppu_module_manager::registered::info = nullptr; // Call specified function directly if LLE is not available, call LLE equivalent in callback style otherwise -template> -inline RT ppu_execute_function_or_callback(ppu_thread& ppu, Args&&... args) +template > +inline RT ppu_execute(ppu_thread& ppu, Args... args) { - vm::ptr func = vm::cast(*ppu_module_manager::find_static_function().export_addr); - return func(ppu, std::forward(args)...); + vm::ptr func = vm::cast(*ppu_module_manager::find_static_function().export_addr); + return func(ppu, args...); } -#define CALL_FUNC(ppu, func, ...) ppu_execute_function_or_callback(ppu, __VA_ARGS__) - -#define REG_FNID(module, nid, func) ppu_module_manager::register_static_function(#module, ppu_select_name(#func, nid), BIND_FUNC(func, ppu.cia = (u32)ppu.lr & ~3), ppu_generate_id(nid)) +#define REG_FNID(module, nid, func) ppu_module_manager::register_static_function<&func>(#module, ppu_select_name(#func, nid), BIND_FUNC(func, ppu.cia = (u32)ppu.lr & ~3), ppu_generate_id(nid)) #define REG_FUNC(module, func) REG_FNID(module, #func, func) -#define REG_VNID(module, nid, var) ppu_module_manager::register_static_variable(#module, ppu_select_name(#var, nid), ppu_generate_id(nid)) +#define REG_VNID(module, nid, var) ppu_module_manager::register_static_variable<&var>(#module, ppu_select_name(#var, nid), ppu_generate_id(nid)) #define REG_VAR(module, var) REG_VNID(module, #var, var)