diff --git a/pkg/worker/emulator/libretro/nanoarch.c b/pkg/worker/emulator/libretro/nanoarch.c index 8a34c273..e0d0d7f5 100644 --- a/pkg/worker/emulator/libretro/nanoarch.c +++ b/pkg/worker/emulator/libretro/nanoarch.c @@ -8,27 +8,14 @@ int initialized = 0; void coreLog(enum retro_log_level level, const char *msg); -static bool on_clear_all_thread_waits_cb(unsigned v, void *data) { - if (v > 0) { - coreLog(RETRO_LOG_DEBUG, "CLEAR_ALL_THREAD_WAITS_CB (1)\n"); - } else { - coreLog(RETRO_LOG_DEBUG, "CLEAR_ALL_THREAD_WAITS_CB (0)\n"); - void signalStop(); - signalStop(); - } - return true; -} - -void clear_all_thread_waits_cb(void *data) { *(retro_environment_t *)data = on_clear_all_thread_waits_cb; } - void bridge_retro_init(void *f) { coreLog(RETRO_LOG_INFO, "Initialization...\n"); - return ((void (*)(void)) f)(); + ((void (*)(void)) f)(); } void bridge_retro_deinit(void *f) { coreLog(RETRO_LOG_INFO, "Deinitialiazation...\n"); - return ((void (*)(void)) f)(); + ((void (*)(void)) f)(); } unsigned bridge_retro_api_version(void *f) { @@ -36,11 +23,11 @@ unsigned bridge_retro_api_version(void *f) { } void bridge_retro_get_system_info(void *f, struct retro_system_info *si) { - return ((void (*)(struct retro_system_info *)) f)(si); + ((void (*)(struct retro_system_info *)) f)(si); } void bridge_retro_get_system_av_info(void *f, struct retro_system_av_info *si) { - return ((void (*)(struct retro_system_av_info *)) f)(si); + ((void (*)(struct retro_system_av_info *)) f)(si); } bool bridge_retro_set_environment(void *f, void *callback) { @@ -74,11 +61,11 @@ bool bridge_retro_load_game(void *f, struct retro_game_info *gi) { void bridge_retro_unload_game(void *f) { coreLog(RETRO_LOG_INFO, "Unloading the game...\n"); - return ((void (*)(void)) f)(); + ((void (*)(void)) f)(); } void bridge_retro_run(void *f) { - return ((void (*)(void)) f)(); + ((void (*)(void)) f)(); } size_t bridge_retro_get_memory_size(void *f, unsigned id) { @@ -90,7 +77,7 @@ void *bridge_retro_get_memory_data(void *f, unsigned id) { } size_t bridge_retro_serialize_size(void *f) { - return ((size_t (*)(void)) f)(); + ((size_t (*)(void)) f)(); } bool bridge_retro_serialize(void *f, void *data, size_t size) { @@ -102,40 +89,53 @@ bool bridge_retro_unserialize(void *f, void *data, size_t size) { } void bridge_retro_set_controller_port_device(void *f, unsigned port, unsigned device) { - return ((void (*)(unsigned, unsigned)) f)(port, device); + ((void (*)(unsigned, unsigned)) f)(port, device); } -bool coreEnvironment_cgo(unsigned cmd, void *data) { +static bool clear_all_thread_waits_cb(unsigned v, void *data) { + if (v > 0) { + coreLog(RETRO_LOG_DEBUG, "CLEAR_ALL_THREAD_WAITS_CB (1)\n"); + } else { + coreLog(RETRO_LOG_DEBUG, "CLEAR_ALL_THREAD_WAITS_CB (0)\n"); + } + return true; +} + +void bridge_clear_all_thread_waits_cb(void *data) { + *(retro_environment_t *)data = clear_all_thread_waits_cb; +} + +bool core_environment_cgo(unsigned cmd, void *data) { bool coreEnvironment(unsigned, void *); return coreEnvironment(cmd, data); } -void coreVideoRefresh_cgo(void *data, unsigned width, unsigned height, size_t pitch) { +void core_video_refresh_cgo(void *data, unsigned width, unsigned height, size_t pitch) { void coreVideoRefresh(void *, unsigned, unsigned, size_t); - return coreVideoRefresh(data, width, height, pitch); + coreVideoRefresh(data, width, height, pitch); } -void coreInputPoll_cgo() { +void core_input_poll_cgo() { void coreInputPoll(); - return coreInputPoll(); + coreInputPoll(); } -int16_t coreInputState_cgo(unsigned port, unsigned device, unsigned index, unsigned id) { +int16_t core_input_state_cgo(unsigned port, unsigned device, unsigned index, unsigned id) { int16_t coreInputState(unsigned, unsigned, unsigned, unsigned); return coreInputState(port, device, index, id); } -void coreAudioSample_cgo(int16_t left, int16_t right) { +void core_audio_sample_cgo(int16_t left, int16_t right) { void coreAudioSample(int16_t, int16_t); coreAudioSample(left, right); } -size_t coreAudioSampleBatch_cgo(const int16_t *data, size_t frames) { +size_t core_audio_sample_batch_cgo(const int16_t *data, size_t frames) { size_t coreAudioSampleBatch(const int16_t *, size_t); return coreAudioSampleBatch(data, frames); } -void coreLog_cgo(enum retro_log_level level, const char *fmt, ...) { +void core_log_cgo(enum retro_log_level level, const char *fmt, ...) { char msg[4096] = {0}; va_list va; va_start(va, fmt); @@ -144,12 +144,12 @@ void coreLog_cgo(enum retro_log_level level, const char *fmt, ...) { coreLog(level, msg); } -uintptr_t coreGetCurrentFramebuffer_cgo() { +uintptr_t core_get_current_framebuffer_cgo() { uintptr_t coreGetCurrentFramebuffer(); return coreGetCurrentFramebuffer(); } -retro_proc_address_t coreGetProcAddress_cgo(const char *sym) { +retro_proc_address_t core_get_proc_address_cgo(const char *sym) { retro_proc_address_t coreGetProcAddress(const char *sym); return coreGetProcAddress(sym); } @@ -158,14 +158,14 @@ void bridge_context_reset(retro_hw_context_reset_t f) { f(); } -void initVideo_cgo() { +void init_video_cgo() { void initVideo(); - return initVideo(); + initVideo(); } -void deinitVideo_cgo() { +void deinit_video_cgo() { void deinitVideo(); - return deinitVideo(); + deinitVideo(); } void *function; @@ -192,13 +192,10 @@ void *run_loop(void *unused) { coreLog(RETRO_LOG_DEBUG, "UnLIBCo run loop stop\n"); } -void stop_run_loop() { - initialized = 0; -} +void stop() { initialized = 0; } -void bridge_execute(void *f) { +void same_thread(void *f) { if (!initialized) { - //signal(SIGINT, sig_handler); initialized = 1; pthread_mutex_init(&run_mutex, NULL); pthread_cond_init(&run_cv, NULL); diff --git a/pkg/worker/emulator/libretro/nanoarch.go b/pkg/worker/emulator/libretro/nanoarch.go index ab43c26e..24f8c375 100644 --- a/pkg/worker/emulator/libretro/nanoarch.go +++ b/pkg/worker/emulator/libretro/nanoarch.go @@ -288,7 +288,7 @@ func coreEnvironment(cmd C.unsigned, data unsafe.Pointer) C.bool { return true case C.RETRO_ENVIRONMENT_GET_LOG_INTERFACE: cb := (*C.struct_retro_log_callback)(data) - cb.log = (C.retro_log_printf_t)(C.coreLog_cgo) + cb.log = (C.retro_log_printf_t)(C.core_log_cgo) return true case C.RETRO_ENVIRONMENT_SET_PIXEL_FORMAT: res, err := videoSetPixelFormat(*(*C.enum_retro_pixel_format)(data)) @@ -333,8 +333,8 @@ func coreEnvironment(cmd C.unsigned, data unsafe.Pointer) C.bool { case C.RETRO_ENVIRONMENT_SET_HW_RENDER: if nano.v.isGl { nano.v.hw = (*C.struct_retro_hw_render_callback)(data) - nano.v.hw.get_current_framebuffer = (C.retro_hw_get_current_framebuffer_t)(C.coreGetCurrentFramebuffer_cgo) - nano.v.hw.get_proc_address = (C.retro_hw_get_proc_address_t)(C.coreGetProcAddress_cgo) + nano.v.hw.get_current_framebuffer = (C.retro_hw_get_current_framebuffer_t)(C.core_get_current_framebuffer_cgo) + nano.v.hw.get_proc_address = (C.retro_hw_get_proc_address_t)(C.core_get_proc_address_cgo) return true } return false @@ -357,7 +357,7 @@ func coreEnvironment(cmd C.unsigned, data unsafe.Pointer) C.bool { } return false case C.RETRO_ENVIRONMENT_GET_CLEAR_ALL_THREAD_WAITS_CB: - C.clear_all_thread_waits_cb(data) + C.bridge_clear_all_thread_waits_cb(data) return true case C.RETRO_ENVIRONMENT_GET_SAVESTATE_CONTEXT: if ctx := (*C.int)(data); ctx != nil { @@ -413,11 +413,6 @@ func initVideo() { } } -//export signalStop -func signalStop() { - libretroLogger.Debug().Msgf("On UnLibCo stop callback") -} - //export deinitVideo func deinitVideo() { C.bridge_context_reset(nano.v.hw.context_destroy) @@ -504,12 +499,12 @@ func coreLoad(meta emulator.Metadata) { retroGetMemorySize = loadFunction(coreLib, "retro_get_memory_size") retroGetMemoryData = loadFunction(coreLib, "retro_get_memory_data") - C.bridge_retro_set_environment(retroSetEnvironment, C.coreEnvironment_cgo) - C.bridge_retro_set_video_refresh(retroSetVideoRefresh, C.coreVideoRefresh_cgo) - C.bridge_retro_set_input_poll(retroSetInputPoll, C.coreInputPoll_cgo) - C.bridge_retro_set_input_state(retroSetInputState, C.coreInputState_cgo) - C.bridge_retro_set_audio_sample(retroSetAudioSample, C.coreAudioSample_cgo) - C.bridge_retro_set_audio_sample_batch(retroSetAudioSampleBatch, C.coreAudioSampleBatch_cgo) + C.bridge_retro_set_environment(retroSetEnvironment, C.core_environment_cgo) + C.bridge_retro_set_video_refresh(retroSetVideoRefresh, C.core_video_refresh_cgo) + C.bridge_retro_set_input_poll(retroSetInputPoll, C.core_input_poll_cgo) + C.bridge_retro_set_input_state(retroSetInputState, C.core_input_state_cgo) + C.bridge_retro_set_audio_sample(retroSetAudioSample, C.core_audio_sample_cgo) + C.bridge_retro_set_audio_sample_batch(retroSetAudioSampleBatch, C.core_audio_sample_batch_cgo) C.bridge_retro_init(retroInit) @@ -567,7 +562,7 @@ func LoadGame(path string) error { graphics.SetBuffer(int(bufS)) libretroLogger.Info().Msgf("Set buffer: %v", byteCountBinary(int64(bufS))) if usesLibCo { - C.bridge_execute(C.initVideo_cgo) + C.same_thread(C.init_video_cgo) } else { runtime.LockOSThread() initVideo() @@ -603,12 +598,12 @@ func toggleMultitap() { func nanoarchShutdown() { if usesLibCo { thread.Main(func() { - C.bridge_execute(retroUnloadGame) - C.bridge_execute(retroDeinit) + C.same_thread(retroUnloadGame) + C.same_thread(retroDeinit) if nano.v.isGl { - C.bridge_execute(C.deinitVideo_cgo) + C.same_thread(C.deinit_video_cgo) } - C.bridge_execute(C.stop_run_loop) + C.same_thread(C.stop) }) } else { if nano.v.isGl { @@ -639,7 +634,7 @@ func nanoarchShutdown() { func run() { if usesLibCo { - C.bridge_execute(retroRun) + C.same_thread(retroRun) } else { if nano.v.isGl { // running inside a go routine, lock the thread to make sure the OpenGL context stays current @@ -747,13 +742,13 @@ func restoreSaveRAM(st state) { } // getMemorySize returns memory region size. -func getMemorySize(id uint) uint { - return uint(C.bridge_retro_get_memory_size(retroGetMemorySize, C.uint(id))) +func getMemorySize(id C.uint) uint { + return uint(C.bridge_retro_get_memory_size(retroGetMemorySize, id)) } // getMemoryData returns a pointer to memory data. -func getMemoryData(id uint) unsafe.Pointer { - return C.bridge_retro_get_memory_data(retroGetMemoryData, C.uint(id)) +func getMemoryData(id C.uint) unsafe.Pointer { + return C.bridge_retro_get_memory_data(retroGetMemoryData, id) } // ptSaveRam return SRAM memory pointer if core supports it or nil. diff --git a/pkg/worker/emulator/libretro/nanoarch.h b/pkg/worker/emulator/libretro/nanoarch.h index ffa6394b..8597fa01 100644 --- a/pkg/worker/emulator/libretro/nanoarch.h +++ b/pkg/worker/emulator/libretro/nanoarch.h @@ -1,24 +1,16 @@ #ifndef FRONTEND_H__ #define FRONTEND_H__ -void clear_all_thread_waits_cb(void *data); -void stop_run_loop(); - bool bridge_retro_load_game(void *f, struct retro_game_info *gi); +void bridge_retro_unload_game(void *f); bool bridge_retro_serialize(void *f, void *data, size_t size); -bool bridge_retro_set_environment(void *f, void *callback); -bool bridge_retro_unserialize(void *f, void *data, size_t size); -bool coreEnvironment_cgo(unsigned cmd, void *data); -int16_t coreInputState_cgo(unsigned port, unsigned device, unsigned index, unsigned id); -retro_proc_address_t coreGetProcAddress_cgo(const char *sym); -size_t bridge_retro_get_memory_size(void *f, unsigned id); size_t bridge_retro_serialize_size(void *f); -size_t coreAudioSampleBatch_cgo(const int16_t *data, size_t frames); -uintptr_t coreGetCurrentFramebuffer_cgo(); +bool bridge_retro_unserialize(void *f, void *data, size_t size); +bool bridge_retro_set_environment(void *f, void *callback); unsigned bridge_retro_api_version(void *f); +size_t bridge_retro_get_memory_size(void *f, unsigned id); void *bridge_retro_get_memory_data(void *f, unsigned id); void bridge_context_reset(retro_hw_context_reset_t f); -void bridge_execute(void *f); void bridge_retro_deinit(void *f); void bridge_retro_get_system_av_info(void *f, struct retro_system_av_info *si); void bridge_retro_get_system_info(void *f, struct retro_system_info *si); @@ -30,12 +22,21 @@ void bridge_retro_set_controller_port_device(void *f, unsigned port, unsigned de void bridge_retro_set_input_poll(void *f, void *callback); void bridge_retro_set_input_state(void *f, void *callback); void bridge_retro_set_video_refresh(void *f, void *callback); -void bridge_retro_unload_game(void *f); -void coreAudioSample_cgo(int16_t left, int16_t right); -void coreInputPoll_cgo(); -void coreLog_cgo(int level, const char *msg); -void coreVideoRefresh_cgo(void *data, unsigned width, unsigned height, size_t pitch); -void deinitVideo_cgo(); -void initVideo_cgo(); +void bridge_clear_all_thread_waits_cb(void *f); + +bool core_environment_cgo(unsigned cmd, void *data); +int16_t core_input_state_cgo(unsigned port, unsigned device, unsigned index, unsigned id); +retro_proc_address_t core_get_proc_address_cgo(const char *sym); +size_t core_audio_sample_batch_cgo(const int16_t *data, size_t frames); +uintptr_t core_get_current_framebuffer_cgo(); +void core_audio_sample_cgo(int16_t left, int16_t right); +void core_input_poll_cgo(); +void core_log_cgo(int level, const char *msg); +void core_video_refresh_cgo(void *data, unsigned width, unsigned height, size_t pitch); +void init_video_cgo(); +void deinit_video_cgo(); + +void same_thread(void *f); +void stop(); #endif