From 56dc6ecb70e6fc76d32d6a7194acb273b76bfe0e Mon Sep 17 00:00:00 2001 From: David Guillen Fandos Date: Mon, 8 Mar 2021 18:44:03 +0100 Subject: Remove libco This removes libco and all the usages of it (+pthreads). Rewired all dynarecs and interpreter to return after every frame so that libretro can process events. This required to make dynarec re-entrant. Dynarecs were updated to check for new frame on every update (IRQ, cycle exhaustion, I/O write, etc). The performance impact of doing so should be minimal (and definitely outweight the libco gains). While at it, fixed small issues to get a bit more perf: arm dynarec was not idling correctly, mips was using stack when not needed, etc. Tested on PSP (mips), OGA (armv7), Linux (x86 and interpreter). Not tested on Android though. --- libco/scefiber.c | 96 -------------------------------------------------------- 1 file changed, 96 deletions(-) delete mode 100644 libco/scefiber.c (limited to 'libco/scefiber.c') diff --git a/libco/scefiber.c b/libco/scefiber.c deleted file mode 100644 index a233bec..0000000 --- a/libco/scefiber.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - libco.win (2016-09-06) - authors: frangarcj - license: public domain -*/ - -#define LIBCO_C -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static thread_local cothread_t co_active_ = 0; - -typedef struct SceFiber { - char reserved[128]; -} SceFiber __attribute__( ( aligned ( 8 ) ) ) ; - -int32_t _sceFiberInitializeImpl(SceFiber* fiber, char* name, void* entry, uint32_t argOnInitialize, void* addrContext, int32_t sizeContext, void* params); - -int32_t sceFiberFinalize(SceFiber* fiber); - -int32_t sceFiberRun(SceFiber* fiber, uint32_t argOnRunTo, uint32_t* argOnRun); - -int32_t sceFiberSwitch(SceFiber* fiber, uint32_t argOnRunTo, uint32_t* argOnRun); - -int32_t sceFiberReturnToThread(uint32_t argOnReturn, uint32_t* argOnRun); - -void co_thunk(uint32_t argOnInitialize, uint32_t argOnRun) -{ - ((void (*)(void))argOnInitialize)(); -} - -cothread_t co_active(void) -{ - if(!co_active_) - { - sceSysmoduleLoadModule(SCE_SYSMODULE_FIBER); - co_active_ = (cothread_t)1; - } - return co_active_; -} - -cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) -{ - SceFiber* tailFiber = malloc(sizeof(SceFiber)); - char * m_contextBuffer = malloc(sizeof(char)*heapsize); - if(!co_active_) - { - sceSysmoduleLoadModule(SCE_SYSMODULE_FIBER); - co_active_ = (cothread_t)1; - } - - //_sceFiberInitializeImpl - int ret = _sceFiberInitializeImpl(tailFiber, "tailFiber", co_thunk, (uint32_t)coentry, (void*) m_contextBuffer, heapsize, NULL); - if(ret==0){ - return (cothread_t)tailFiber; - }else{ - return (cothread_t)ret; - } - -} - -void co_delete(cothread_t cothread) -{ - if(cothread == (cothread_t)1){ - return; - } - sceFiberFinalize((SceFiber*)cothread); -} - -void co_switch(cothread_t cothread) -{ - - uint32_t argOnReturn = 0; - if(cothread == (cothread_t)1){ - co_active_ = cothread; - sceFiberReturnToThread(0, NULL); - }else{ - SceFiber* theFiber = (SceFiber*)cothread; - if(co_active_ == (cothread_t)1){ - co_active_ = cothread; - sceFiberRun(theFiber, 0, &argOnReturn); - }else{ - co_active_ = cothread; - sceFiberSwitch(theFiber, 0, &argOnReturn); - } - } -} - -#ifdef __cplusplus -} -#endif -- cgit v1.2.3