diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 8fb53caae8..613cb9bc24 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -252,6 +252,7 @@ target_sources(rpcs3_emu PRIVATE Cell/Modules/cellCrossController.cpp Cell/Modules/cellDaisy.cpp Cell/Modules/cellDmux.cpp + Cell/Modules/cellDmuxPamf.cpp Cell/Modules/cellDtcpIpUtility.cpp Cell/Modules/cellFiber.cpp Cell/Modules/cellFont.cpp diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.cpp b/rpcs3/Emu/Cell/Modules/cellDmux.cpp index f50fee1585..7850961aa9 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmux.cpp @@ -1175,7 +1175,7 @@ error_code cellDmuxEnableEs(u32 handle, vm::cptr esFilterId const auto es = idm::make_ptr(dmux.get(), esResourceInfo->memAddr, esResourceInfo->memSize, esFilterId->filterIdMajor, esFilterId->filterIdMinor, esFilterId->supplementalInfo1, esFilterId->supplementalInfo2, - esCb->cbEsMsgFunc, esCb->cbArg, esSpecificInfo); + esCb->cbFunc, esCb->cbArg, esSpecificInfo); *esHandle = es->id; @@ -1359,8 +1359,6 @@ error_code cellDmuxFlushEs(u32 esHandle) DECLARE(ppu_module_manager::cellDmux)("cellDmux", []() { - static ppu_static_module cellDmuxPamf("cellDmuxPamf"); - REG_FUNC(cellDmux, cellDmuxQueryAttr); REG_FUNC(cellDmux, cellDmuxQueryAttr2); REG_FUNC(cellDmux, cellDmuxOpen); diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.h b/rpcs3/Emu/Cell/Modules/cellDmux.h index 7be56a2705..884a3eb050 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.h +++ b/rpcs3/Emu/Cell/Modules/cellDmux.h @@ -195,6 +195,13 @@ struct CellDmuxResourceEx be_t maxContention; }; +struct CellDmuxResourceSpurs +{ + vm::bptr spurs; // CellSpurs* + be_t priority; + be_t maxContention; +}; + /* struct CellDmuxResource2Ex { @@ -221,20 +228,20 @@ struct CellDmuxResource2 using CellDmuxCbMsg = u32(u32 demuxerHandle, vm::ptr demuxerMsg, u32 cbArg); -struct CellDmuxCb -{ - vm::bptr cbMsgFunc; - be_t cbArg; -}; - using CellDmuxCbEsMsg = u32(u32 demuxerHandle, u32 esHandle, vm::ptr esMsg, u32 cbArg); -struct CellDmuxEsCb +// Used for internal callbacks as well +template +struct DmuxCb { - vm::bptr cbEsMsgFunc; + vm::bptr cbFunc; be_t cbArg; }; +using CellDmuxCb = DmuxCb; + +using CellDmuxEsCb = DmuxCb; + struct CellDmuxAttr { be_t memSize; @@ -275,3 +282,46 @@ struct CellDmuxAuInfoEx CellCodecTimeStamp pts; CellCodecTimeStamp dts; }; + +struct CellDmuxPamfAttr; +struct CellDmuxPamfEsAttr; + +using DmuxNotifyDemuxDone = error_code(vm::ptr, u32, vm::ptr); +using DmuxNotifyFatalErr = error_code(vm::ptr, u32, vm::ptr); +using DmuxNotifyProgEndCode = error_code(vm::ptr, vm::ptr); + +using DmuxEsNotifyAuFound = error_code(vm::ptr, vm::cptr, vm::ptr); +using DmuxEsNotifyFlushDone = error_code(vm::ptr, vm::ptr); + +using CellDmuxCoreOpQueryAttr = error_code(vm::cptr, vm::ptr); +using CellDmuxCoreOpOpen = error_code(vm::cptr, vm::cptr, vm::cptr, vm::cptr>, vm::cptr>, vm::cptr>, vm::pptr); +using CellDmuxCoreOpClose = error_code(vm::ptr); +using CellDmuxCoreOpResetStream = error_code(vm::ptr); +using CellDmuxCoreOpCreateThread = error_code(vm::ptr); +using CellDmuxCoreOpJoinThread = error_code(vm::ptr); +using CellDmuxCoreOpSetStream = error_code(vm::ptr, vm::cptr, u32, b8, u64); +using CellDmuxCoreOpFreeMemory = error_code(vm::ptr, vm::ptr, u32); +using CellDmuxCoreOpQueryEsAttr = error_code(vm::cptr, vm::cptr, vm::ptr); +using CellDmuxCoreOpEnableEs = error_code(vm::ptr, vm::cptr, vm::cptr, vm::cptr>, vm::cptr>, vm::cptr, vm::pptr); +using CellDmuxCoreOpDisableEs = u32(vm::ptr); +using CellDmuxCoreOpFlushEs = u32(vm::ptr); +using CellDmuxCoreOpResetEs = u32(vm::ptr); +using CellDmuxCoreOpResetStreamAndWaitDone = u32(vm::ptr); + +struct CellDmuxCoreOps +{ + vm::bptr queryAttr; + vm::bptr open; + vm::bptr close; + vm::bptr resetStream; + vm::bptr createThread; + vm::bptr joinThread; + vm::bptr setStream; + vm::bptr freeMemory; + vm::bptr queryEsAttr; + vm::bptr enableEs; + vm::bptr disableEs; + vm::bptr flushEs; + vm::bptr resetEs; + vm::bptr resetStreamAndWaitDone; +}; diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp new file mode 100644 index 0000000000..a7b24c3973 --- /dev/null +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -0,0 +1,170 @@ +#include "stdafx.h" +#include "Emu/Cell/PPUModule.h" +#include "Emu/IdManager.h" + +#include "cellPamf.h" +#include "cellDmux.h" +#include "cellDmuxPamf.h" + + +vm::gvar g_cell_dmux_core_ops_pamf; +vm::gvar g_cell_dmux_core_ops_raw_es; + +LOG_CHANNEL(cellDmuxPamf) + +error_code _CellDmuxCoreOpQueryAttr(vm::cptr pamfSpecificInfo, vm::ptr pamfAttr) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpQueryAttr(pamfSpecificInfo=*0x%x, pamfAttr=*0x%x)", pamfSpecificInfo, pamfAttr); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpOpen(vm::cptr pamfSpecificInfo, vm::cptr demuxerResource, vm::cptr demuxerResourceSpurs, vm::cptr> notifyDemuxDone, + vm::cptr> notifyProgEndCode, vm::cptr> notifyFatalErr, vm::pptr handle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpOpen(pamfSpecificInfo=*0x%x, demuxerResource=*0x%x, demuxerResourceSpurs=*0x%x, notifyDemuxDone=*0x%x, notifyProgEndCode=*0x%x, notifyFatalErr=*0x%x, handle=**0x%x)", + pamfSpecificInfo, demuxerResource, demuxerResourceSpurs, notifyDemuxDone, notifyProgEndCode, notifyFatalErr, handle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpClose(vm::ptr handle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpClose(handle=*0x%x)", handle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpResetStream(vm::ptr handle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpResetStream(handle=*0x%x)", handle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpCreateThread(vm::ptr handle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpCreateThread(handle=*0x%x)", handle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpJoinThread(vm::ptr handle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpJoinThread(handle=*0x%x)", handle); + + return CELL_OK; +} + +template +error_code _CellDmuxCoreOpSetStream(vm::ptr handle, vm::cptr streamAddress, u32 streamSize, b8 discontinuity, u64 userData) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpSetStream(handle=*0x%x, streamAddress=*0x%x, streamSize=0x%x, discontinuity=%d, userData=0x%llx)", raw_es, handle, streamAddress, streamSize, +discontinuity, userData); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpFreeMemory(vm::ptr esHandle, vm::ptr memAddr, u32 memSize) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpFreeMemory(esHandle=*0x%x, memAddr=*0x%x, memSize=0x%x)", esHandle, memAddr, memSize); + + return CELL_OK; +} + +template +error_code _CellDmuxCoreOpQueryEsAttr(vm::cptr esFilterId, vm::cptr esSpecificInfo, vm::ptr attr) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpQueryEsAttr(esFilterId=*0x%x, esSpecificInfo=*0x%x, attr=*0x%x)", raw_es, esFilterId, esSpecificInfo, attr); + + return CELL_OK; +} + +template +error_code _CellDmuxCoreOpEnableEs(vm::ptr handle, vm::cptr esFilterId, vm::cptr esResource, vm::cptr> notifyAuFound, + vm::cptr> notifyFlushDone, vm::cptr esSpecificInfo, vm::pptr esHandle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpEnableEs(handle=*0x%x, esFilterId=*0x%x, esResource=*0x%x, notifyAuFound=*0x%x, notifyFlushDone=*0x%x, esSpecificInfo=*0x%x, esHandle)", + raw_es, handle, esFilterId, esResource, notifyAuFound, notifyFlushDone, esSpecificInfo, esHandle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpDisableEs(vm::ptr esHandle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpDisableEs(esHandle=*0x%x)", esHandle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpFlushEs(vm::ptr esHandle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpFlushEs(esHandle=*0x%x)", esHandle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpResetEs(vm::ptr esHandle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpResetEs(esHandle=*0x%x)", esHandle); + + return CELL_OK; +} + +error_code _CellDmuxCoreOpResetStreamAndWaitDone(vm::ptr handle) +{ + cellDmuxPamf.todo("_CellDmuxCoreOpResetStreamAndWaitDone(handle=*0x%x)", handle); + + return CELL_OK; +} + +static void init_gvar(const vm::gvar& var) +{ + var->queryAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryAttr))); + var->open.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpOpen))); + var->close.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpClose))); + var->resetStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpResetStream))); + var->createThread.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpCreateThread))); + var->joinThread.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpJoinThread))); + var->freeMemory.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpFreeMemory))); + var->disableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpDisableEs))); + var->flushEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpFlushEs))); + var->resetEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpResetEs))); + var->resetStreamAndWaitDone.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpResetStreamAndWaitDone))); +} + +DECLARE(ppu_module_manager::cellDmuxPamf)("cellDmuxPamf", [] +{ + REG_VNID(cellDmuxPamf, 0x28b2b7b2, g_cell_dmux_core_ops_pamf).init = [] + { + g_cell_dmux_core_ops_pamf->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); + g_cell_dmux_core_ops_pamf->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); + g_cell_dmux_core_ops_pamf->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); + init_gvar(g_cell_dmux_core_ops_pamf); + }; + + REG_VNID(cellDmuxPamf, 0x9728a0e9, g_cell_dmux_core_ops_raw_es).init = [] + { + g_cell_dmux_core_ops_raw_es->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); + g_cell_dmux_core_ops_raw_es->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); + g_cell_dmux_core_ops_raw_es->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); + init_gvar(g_cell_dmux_core_ops_raw_es); + }; + + REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryAttr); + REG_HIDDEN_FUNC(_CellDmuxCoreOpOpen); + REG_HIDDEN_FUNC(_CellDmuxCoreOpClose); + REG_HIDDEN_FUNC(_CellDmuxCoreOpResetStream); + REG_HIDDEN_FUNC(_CellDmuxCoreOpCreateThread); + REG_HIDDEN_FUNC(_CellDmuxCoreOpJoinThread); + REG_HIDDEN_FUNC(_CellDmuxCoreOpSetStream); + REG_HIDDEN_FUNC(_CellDmuxCoreOpSetStream); + REG_HIDDEN_FUNC(_CellDmuxCoreOpFreeMemory); + REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryEsAttr); + REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryEsAttr); + REG_HIDDEN_FUNC(_CellDmuxCoreOpEnableEs); + REG_HIDDEN_FUNC(_CellDmuxCoreOpEnableEs); + REG_HIDDEN_FUNC(_CellDmuxCoreOpDisableEs); + REG_HIDDEN_FUNC(_CellDmuxCoreOpFlushEs); + REG_HIDDEN_FUNC(_CellDmuxCoreOpResetEs); + REG_HIDDEN_FUNC(_CellDmuxCoreOpResetStreamAndWaitDone); +}); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h new file mode 100644 index 0000000000..01983b724a --- /dev/null +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -0,0 +1,15 @@ +#pragma once + +struct CellDmuxPamfAttr +{ + be_t maxEnabledEsNum; + be_t version; + be_t memSize; +}; + +struct CellDmuxPamfEsAttr +{ + be_t auQueueMaxSize; + be_t memSize; + be_t specificInfoSize; +}; diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index b5b5f2796c..ae9b3ef47a 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -199,6 +199,7 @@ static void ppu_initialize_modules(ppu_linkage_info* link, utils::serial* ar = n &ppu_module_manager::cellDaisy, &ppu_module_manager::cellDDPdec, &ppu_module_manager::cellDmux, + &ppu_module_manager::cellDmuxPamf, &ppu_module_manager::cellDtcpIpUtility, &ppu_module_manager::cellDTSdec, &ppu_module_manager::cellDTSHDCOREdec, diff --git a/rpcs3/Emu/Cell/PPUModule.h b/rpcs3/Emu/Cell/PPUModule.h index 5d59e06fd6..fdcd736f38 100644 --- a/rpcs3/Emu/Cell/PPUModule.h +++ b/rpcs3/Emu/Cell/PPUModule.h @@ -184,6 +184,7 @@ public: static const ppu_static_module cellDaisy; static const ppu_static_module cellDDPdec; static const ppu_static_module cellDmux; + static const ppu_static_module cellDmuxPamf; static const ppu_static_module cellDtcpIpUtility; static const ppu_static_module cellDTSdec; static const ppu_static_module cellDTSHDCOREdec; diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 35d5fbed8d..9411c4fde8 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -300,6 +300,7 @@ + @@ -820,6 +821,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 8b661191e5..f090f7ae8f 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -393,6 +393,9 @@ Emu\Cell\Modules + + Emu\Cell\Modules + Emu\Cell\Modules @@ -1641,6 +1644,9 @@ Emu\Cell\Modules + + Emu\Cell\Modules + Emu\Cell\Modules