static bool event_init_core(void) { global_t *global = global_get_ptr(); driver_t *driver = driver_get_ptr(); settings_t *settings = config_get_ptr(); /* per-core saves: save the original path */ if(orig_savefile_dir[0] == '\0') strlcpy(orig_savefile_dir, global->dir.savefile, sizeof(orig_savefile_dir)); if(orig_savestate_dir[0] == '\0') strlcpy(orig_savestate_dir, global->dir.savestate, sizeof(orig_savestate_dir)); /* auto overrides: apply overrides */ if(settings->auto_overrides_enable) { if (config_load_override()) global->overrides_active = true; else global->overrides_active = false; } /* reset video format to libretro's default */ video_driver_set_pixel_format(RETRO_PIXEL_FORMAT_0RGB1555); pretro_set_environment(rarch_environment_cb); /* auto-remap: apply remap files */ if(settings->auto_remaps_enable) config_load_remap(); /* per-core saves: reset redirection paths */ if((settings->sort_savestates_enable || settings->sort_savefiles_enable) && !global->inited.core.no_content) set_paths_redirect(global->name.base); rarch_verify_api_version(); pretro_init(); global->sram.use = (global->inited.core.type == CORE_TYPE_PLAIN) && !global->inited.core.no_content; if (!event_init_content()) return false; retro_init_libretro_cbs(&driver->retro_ctx); rarch_init_system_av_info(); return true; }
static bool event_init_core(void) { global_t *global = global_get_ptr(); driver_t *driver = driver_get_ptr(); settings_t *settings = config_get_ptr(); /* per-core saves: save the original path */ if(orig_savefile_dir[0] == '\0') strlcpy(orig_savefile_dir,global->savefile_dir,sizeof(orig_savefile_dir)); if(orig_savestate_dir[0] == '\0') strlcpy(orig_savestate_dir,global->savestate_dir,sizeof(orig_savestate_dir)); /* auto overrides: apply overrides */ if(settings->auto_overrides_enable) { if (config_load_override()) global->overrides_active = true; else global->overrides_active = false; } pretro_set_environment(rarch_environment_cb); /* auto-remap: apply remap files */ if(settings->auto_remaps_enable) config_load_remap(); /* per-core saves: reset redirection paths */ if(settings->sort_savestates_enable || settings->sort_savefiles_enable) set_paths_redirect(global->basename); rarch_verify_api_version(); pretro_init(); global->use_sram = (global->core_type == CORE_TYPE_PLAIN) && !global->libretro_no_content; if (!event_init_content()) return false; retro_init_libretro_cbs(&driver->retro_ctx); rarch_init_system_av_info(); return true; }
static bool event_init_core(void) { global_t *global = global_get_ptr(); driver_t *driver = driver_get_ptr(); settings_t *settings = config_get_ptr(); /* auto overrides: apply overrides */ if(settings->auto_overrides_enable) { if (config_load_override()) global->overrides_active = true; else global->overrides_active = false; } /* reset video format to libretro's default */ video_driver_set_pixel_format(RETRO_PIXEL_FORMAT_0RGB1555); core.retro_set_environment(rarch_environment_cb); /* auto-remap: apply remap files */ if(settings->auto_remaps_enable) config_load_remap(); /* per-core saves: reset redirection paths */ if((settings->sort_savestates_enable || settings->sort_savefiles_enable) && !global->inited.core.no_content) set_paths_redirect(global->name.base); rarch_ctl(RARCH_ACTION_STATE_VERIFY_API_VERSION, NULL); core.retro_init(); global->sram.use = (global->inited.core.type == CORE_TYPE_PLAIN) && !global->inited.core.no_content; if (!event_init_content()) return false; retro_init_libretro_cbs(&driver->retro_ctx); rarch_init_system_av_info(); return true; }
static bool event_init_core(void) { global_t *global = global_get_ptr(); settings_t *settings = config_get_ptr(); /* auto overrides: apply overrides */ if(settings->auto_overrides_enable) { if (config_load_override()) runloop_ctl(RUNLOOP_CTL_SET_OVERRIDES_ACTIVE, NULL); else runloop_ctl(RUNLOOP_CTL_UNSET_OVERRIDES_ACTIVE, NULL); } /* reset video format to libretro's default */ video_driver_set_pixel_format(RETRO_PIXEL_FORMAT_0RGB1555); core.retro_set_environment(rarch_environment_cb); /* auto-remap: apply remap files */ if(settings->auto_remaps_enable) config_load_remap(); /* per-core saves: reset redirection paths */ if((settings->sort_savestates_enable || settings->sort_savefiles_enable) && !content_ctl(CONTENT_CTL_DOES_NOT_NEED_CONTENT, NULL)) rarch_ctl(RARCH_CTL_SET_PATHS_REDIRECT, NULL); rarch_ctl(RARCH_CTL_VERIFY_API_VERSION, NULL); core.retro_init(); global->sram.use = rarch_ctl(RARCH_CTL_IS_PLAIN_CORE, NULL) && !content_ctl(CONTENT_CTL_DOES_NOT_NEED_CONTENT, NULL); if (!event_init_content()) return false; retro_init_libretro_cbs(&retro_ctx); rarch_ctl(RARCH_CTL_INIT_SYSTEM_AV_INFO, NULL); return true; }
bool core_ctl(enum core_ctl_state state, void *data) { static bool has_set_input_descriptors = false; static struct retro_callbacks retro_ctx; switch (state) { case CORE_CTL_RETRO_CHEAT_SET: { retro_ctx_cheat_info_t *info = (retro_ctx_cheat_info_t*)data; core.retro_cheat_set(info->index, info->enabled, info->code); } break; case CORE_CTL_RETRO_CHEAT_RESET: core.retro_cheat_reset(); break; case CORE_CTL_RETRO_API_VERSION: { retro_ctx_api_info_t *api = (retro_ctx_api_info_t*)data; api->version = core.retro_api_version(); } break; case CORE_CTL_SET_POLL_TYPE: { unsigned *poll_type = (unsigned*)data; core_poll_type = *poll_type; } break; case CORE_CTL_RETRO_SYMBOLS_INIT: { enum rarch_core_type *core_type = (enum rarch_core_type*)data; if (!core_type) return false; init_libretro_sym(*core_type, &core); } break; case CORE_CTL_RETRO_SET_CONTROLLER_PORT_DEVICE: { retro_ctx_controller_info_t *pad = (retro_ctx_controller_info_t*)data; if (!pad) return false; core.retro_set_controller_port_device(pad->port, pad->device); } break; case CORE_CTL_RETRO_GET_MEMORY: { retro_ctx_memory_info_t *info = (retro_ctx_memory_info_t*)data; if (!info) return false; info->size = core.retro_get_memory_size(info->id); info->data = core.retro_get_memory_data(info->id); } break; case CORE_CTL_RETRO_LOAD_GAME: { retro_ctx_load_content_info_t *load_info = (retro_ctx_load_content_info_t*)data; if (!load_info) return false; if (load_info->special) return core.retro_load_game_special(load_info->special->id, load_info->info, load_info->content->size); return core.retro_load_game(*load_info->content->elems[0].data ? load_info->info : NULL); } case CORE_CTL_RETRO_GET_SYSTEM_INFO: { struct retro_system_info *system = (struct retro_system_info*)data; if (!system) return false; core.retro_get_system_info(system); } break; case CORE_CTL_RETRO_UNSERIALIZE: { retro_ctx_serialize_info_t *info = (retro_ctx_serialize_info_t*)data; if (!info) return false; if (!core.retro_unserialize(info->data_const, info->size)) return false; } break; case CORE_CTL_RETRO_SERIALIZE: { retro_ctx_serialize_info_t *info = (retro_ctx_serialize_info_t*)data; if (!info) return false; if (!core.retro_serialize(info->data, info->size)) return false; } break; case CORE_CTL_RETRO_SERIALIZE_SIZE: { retro_ctx_size_info_t *info = (retro_ctx_size_info_t *)data; if (!info) return false; info->size = core.retro_serialize_size(); } break; case CORE_CTL_RETRO_CTX_FRAME_CB: { retro_ctx_frame_info_t *info = (retro_ctx_frame_info_t*)data; if (!info || !retro_ctx.frame_cb) return false; retro_ctx.frame_cb( info->data, info->width, info->height, info->pitch); } break; case CORE_CTL_RETRO_CTX_POLL_CB: if (!retro_ctx.poll_cb) return false; retro_ctx.poll_cb(); break; case CORE_CTL_RETRO_SET_ENVIRONMENT: { retro_ctx_environ_info_t *info = (retro_ctx_environ_info_t*)data; if (!info) return false; core.retro_set_environment(info->env); } break; case CORE_CTL_RETRO_GET_SYSTEM_AV_INFO: { struct retro_system_av_info *av_info = (struct retro_system_av_info*)data; if (!av_info) return false; core.retro_get_system_av_info(av_info); } break; case CORE_CTL_RETRO_RESET: core.retro_reset(); break; case CORE_CTL_RETRO_INIT: core.retro_init(); break; case CORE_CTL_RETRO_DEINIT: core.retro_deinit(); uninit_libretro_sym(&core); break; case CORE_CTL_RETRO_UNLOAD_GAME: video_driver_ctl(RARCH_DISPLAY_CTL_DEINIT_HW_CONTEXT, NULL); audio_driver_ctl(RARCH_AUDIO_CTL_STOP, NULL); core.retro_unload_game(); break; case CORE_CTL_RETRO_RUN: switch (core_poll_type) { case POLL_TYPE_EARLY: input_poll(); break; case POLL_TYPE_LATE: core_input_polled = false; break; } if (core.retro_run) core.retro_run(); if (core_poll_type == POLL_TYPE_LATE && !core_input_polled) input_poll(); break; case CORE_CTL_SET_CBS: return retro_set_default_callbacks(data); case CORE_CTL_SET_CBS_REWIND: retro_set_rewind_callbacks(); break; case CORE_CTL_INIT: { settings_t *settings = config_get_ptr(); core_poll_type = settings->input.poll_type_behavior; if (!core_ctl(CORE_CTL_VERIFY_API_VERSION, NULL)) return false; if (!retro_init_libretro_cbs(&retro_ctx)) return false; core_ctl(CORE_CTL_RETRO_GET_SYSTEM_AV_INFO, video_viewport_get_system_av_info()); runloop_ctl(RUNLOOP_CTL_SET_FRAME_LIMIT, NULL); } break; case CORE_CTL_DEINIT: return retro_uninit_libretro_cbs(&retro_ctx); case CORE_CTL_VERIFY_API_VERSION: { unsigned api_version = core.retro_api_version(); RARCH_LOG("Version of libretro API: %u\n", api_version); RARCH_LOG("Compiled against API: %u\n", RETRO_API_VERSION); if (api_version != RETRO_API_VERSION) { RARCH_WARN("%s\n", msg_hash_to_str(MSG_LIBRETRO_ABI_BREAK)); return false; } } break; case CORE_CTL_HAS_SET_INPUT_DESCRIPTORS: return has_set_input_descriptors; case CORE_CTL_SET_INPUT_DESCRIPTORS: has_set_input_descriptors = true; break; case CORE_CTL_UNSET_INPUT_DESCRIPTORS: has_set_input_descriptors = false; break; case CORE_CTL_NONE: default: break; } return true; }