diff --git a/command.c b/command.c index 983bd8aae2..dcc37f7575 100644 --- a/command.c +++ b/command.c @@ -1901,7 +1901,7 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_LOAD_CORE: { bool success = false; - subsystem_size = 0; + subsystem_current_count = 0; content_clear_subsystem(); success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL); (void)success; @@ -2045,7 +2045,7 @@ bool command_event(enum event_command cmd, void *data) #endif if (is_inited) { - subsystem_size = 0; + subsystem_current_count = 0; content_clear_subsystem(); } } diff --git a/dynamic.c b/dynamic.c index a3092dd8cd..274d5c61a5 100644 --- a/dynamic.c +++ b/dynamic.c @@ -188,7 +188,7 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) unsigned size = i; const struct retro_subsystem_info *info = (const struct retro_subsystem_info*)data; - subsystem_size = 0; + subsystem_current_count = 0; RARCH_LOG("Environ SET_SUBSYSTEM_INFO.\n"); for (i = 0; info[i].ident; i++) @@ -207,18 +207,24 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) } RARCH_LOG("Subsystems: %d\n", i); - size = i; + size = i; + + if (size > SUBSYSTEM_MAX_SUBSYSTEMS) + RARCH_WARN("Subsystems exceed subsystem max, clamping to %d\n", SUBSYSTEM_MAX_SUBSYSTEMS); if (system) { - for (i = 0; i < size; i++) + for (i = 0; i < size && i < SUBSYSTEM_MAX_SUBSYSTEMS; i++) { subsystem_data[i].desc = strdup(info[i].desc); subsystem_data[i].ident = strdup(info[i].ident); subsystem_data[i].id = info[i].id; subsystem_data[i].num_roms = info[i].num_roms; - for (j = 0; j < subsystem_data[i].num_roms; j++) + if (subsystem_data[i].num_roms > SUBSYSTEM_MAX_SUBSYSTEM_ROMS) + RARCH_WARN("Subsystems exceed subsystem max roms, clamping to %d\n", SUBSYSTEM_MAX_SUBSYSTEM_ROMS); + + for (j = 0; j < subsystem_data[i].num_roms && j < SUBSYSTEM_MAX_SUBSYSTEM_ROMS; j++) { subsystem_data_roms[i][j].desc = strdup(info[i].roms[j].desc); subsystem_data_roms[i][j].valid_extensions = strdup(info[i].roms[j].valid_extensions); @@ -229,15 +235,19 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) subsystem_data[i].roms = subsystem_data_roms[i]; } - for (i = 0; i < size; i++) + + subsystem_current_count = size <= SUBSYSTEM_MAX_SUBSYSTEMS ? size : SUBSYSTEM_MAX_SUBSYSTEMS; +#if 0 + RARCH_LOG("Subsystems: %d\n", subsystem_current_count); + + for (i = 0; i < subsystem_current_count; i++) { -#if 1 RARCH_LOG("Subsystem ID: %d\n", i); RARCH_LOG("Special game type: %s\n", subsystem_data[i].desc); RARCH_LOG(" Ident: %s\n", subsystem_data[i].ident); RARCH_LOG(" ID: %u\n", subsystem_data[i].id); RARCH_LOG(" Content:\n"); -#endif + for (j = 0; j < subsystem_data[i].num_roms; j++) { RARCH_LOG(" %s (%s)\n", @@ -245,9 +255,7 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) "required" : "optional"); } } - RARCH_LOG("Subsystems: %d\n", subsystem_size); - subsystem_size = size; - RARCH_LOG("Subsystems: %d\n", subsystem_size); +#endif } break; } @@ -1461,7 +1469,6 @@ bool rarch_environment_cb(unsigned cmd, void *data) cb, offsetof(struct retro_hw_render_callback, stencil)); memset(hwr + offsetof(struct retro_hw_render_callback, stencil), 0, sizeof(*cb) - offsetof(struct retro_hw_render_callback, stencil)); - } else memcpy(hwr, cb, sizeof(*cb)); diff --git a/dynamic.h b/dynamic.h index 505082bc97..79b7d50fff 100644 --- a/dynamic.h +++ b/dynamic.h @@ -146,9 +146,14 @@ bool init_libretro_sym_custom(enum rarch_core_type type, struct retro_core_t *cu **/ void uninit_libretro_sym(struct retro_core_t *core); -struct retro_subsystem_info subsystem_data[20]; -struct retro_subsystem_rom_info subsystem_data_roms[10][10]; -unsigned subsystem_size; +/* Arbitrary twenty subsystems limite */ +#define SUBSYSTEM_MAX_SUBSYSTEMS 20 +/* Arbitrary 10 roms for each subsystem limit */ +#define SUBSYSTEM_MAX_SUBSYSTEM_ROMS 10 + +struct retro_subsystem_info subsystem_data[SUBSYSTEM_MAX_SUBSYSTEMS]; +struct retro_subsystem_rom_info subsystem_data_roms[SUBSYSTEM_MAX_SUBSYSTEMS][SUBSYSTEM_MAX_SUBSYSTEM_ROMS]; +unsigned subsystem_current_count; RETRO_END_DECLS diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 1079c997cf..defe0e2dd6 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -521,14 +521,23 @@ static int action_bind_sublabel_subsystem_add( char *s, size_t len) { rarch_system_info_t *system = runloop_get_system_info(); - const struct retro_subsystem_info *subsystem = (system && subsystem_size > 0) ? - subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL; + const struct retro_subsystem_info *subsystem; - if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) - snprintf(s, len, " Current Content: %s", - content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD - ? subsystem->roms[content_get_subsystem_rom_id()].desc - : subsystem->roms[0].desc); + /* Core fully loaded, use the subsystem data */ + if (system->subsystem.data) + subsystem = system->subsystem.data + (type - MENU_SETTINGS_SUBSYSTEM_ADD); + /* Core not loaded completely, use the data we peeked on load core */ + else + subsystem = subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD); + + if (subsystem && subsystem_current_count > 0) + { + if (content_get_subsystem_rom_id() < subsystem->num_roms) + snprintf(s, len, " Current Content: %s", + content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD + ? subsystem->roms[content_get_subsystem_rom_id()].desc + : subsystem->roms[0].desc); + } return 0; } diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 909d293a67..c3a8324c55 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -502,6 +502,7 @@ static int ozone_list_push(void *data, void *userdata, unsigned i = 0; core_info_list_t *list = NULL; menu_handle_t *menu = (menu_handle_t*)data; + const struct retro_subsystem_info* subsystem; switch (type) { @@ -596,56 +597,14 @@ static int ozone_list_push(void *data, void *userdata, entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_setting(&entry); - if (subsystem_size > 0) - { - const struct retro_subsystem_info* subsystem = subsystem_data; - for (i = 0; i < subsystem_size; i++, subsystem++) - { - char s[PATH_MAX_LENGTH]; - if (content_get_subsystem() == i) - { - if (content_get_subsystem_rom_id() < subsystem->num_roms) - { - snprintf(s, sizeof(s), - "Load %s %s", - subsystem->desc, - i == content_get_subsystem() - ? "\u2605" : " "); - menu_entries_append_enum(info->list, - s, - msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_ADD), - MENU_ENUM_LABEL_SUBSYSTEM_ADD, - MENU_SETTINGS_SUBSYSTEM_ADD + i, 0, 0); - } - else - { - snprintf(s, sizeof(s), - "Start %s %s", - subsystem->desc, - i == content_get_subsystem() - ? "\u2605" : " "); - menu_entries_append_enum(info->list, - s, - msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_LOAD), - MENU_ENUM_LABEL_SUBSYSTEM_LOAD, - MENU_SETTINGS_SUBSYSTEM_LOAD, 0, 0); - } - } - else - { - snprintf(s, sizeof(s), - "Load %s %s", - subsystem->desc, - i == content_get_subsystem() - ? "\u2605" : " "); - menu_entries_append_enum(info->list, - s, - msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_ADD), - MENU_ENUM_LABEL_SUBSYSTEM_ADD, - MENU_SETTINGS_SUBSYSTEM_ADD + i, 0, 0); - } - } - } + /* Core fully loaded, use the subsystem data */ + if (system->subsystem.data) + subsystem = system->subsystem.data; + /* Core not loaded completely, use the data we peeked on load core */ + else + subsystem = subsystem_data; + + menu_subsystem_populate(subsystem, info); } entry.enum_idx = MENU_ENUM_LABEL_ADD_CONTENT_LIST; diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index ea131d5342..4b0fd88e60 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -5453,6 +5453,7 @@ static int xmb_list_push(void *data, void *userdata, unsigned i = 0; core_info_list_t *list = NULL; menu_handle_t *menu = (menu_handle_t*)data; + const struct retro_subsystem_info* subsystem; switch (type) { @@ -5548,56 +5549,14 @@ static int xmb_list_push(void *data, void *userdata, entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_setting(&entry); - if (subsystem_size > 0) - { - const struct retro_subsystem_info* subsystem = subsystem_data; - for (i = 0; i < subsystem_size; i++, subsystem++) - { - char s[PATH_MAX_LENGTH]; - if (content_get_subsystem() == i) - { - if (content_get_subsystem_rom_id() < subsystem->num_roms) - { - snprintf(s, sizeof(s), - "Load %s %s", - subsystem->desc, - i == content_get_subsystem() - ? "\u2605" : " "); - menu_entries_append_enum(info->list, - s, - msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_ADD), - MENU_ENUM_LABEL_SUBSYSTEM_ADD, - MENU_SETTINGS_SUBSYSTEM_ADD + i, 0, 0); - } - else - { - snprintf(s, sizeof(s), - "Start %s %s", - subsystem->desc, - i == content_get_subsystem() - ? "\u2605" : " "); - menu_entries_append_enum(info->list, - s, - msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_LOAD), - MENU_ENUM_LABEL_SUBSYSTEM_LOAD, - MENU_SETTINGS_SUBSYSTEM_LOAD, 0, 0); - } - } - else - { - snprintf(s, sizeof(s), - "Load %s %s", - subsystem->desc, - i == content_get_subsystem() - ? "\u2605" : " "); - menu_entries_append_enum(info->list, - s, - msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_ADD), - MENU_ENUM_LABEL_SUBSYSTEM_ADD, - MENU_SETTINGS_SUBSYSTEM_ADD + i, 0, 0); - } - } - } + /* Core fully loaded, use the subsystem data */ + if (system->subsystem.data) + subsystem = system->subsystem.data; + /* Core not loaded completely, use the data we peeked on load core */ + else + subsystem = subsystem_data; + + menu_subsystem_populate(subsystem, info); } entry.enum_idx = MENU_ENUM_LABEL_ADD_CONTENT_LIST; diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 8ca72c132e..fbbfe10227 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -2654,3 +2654,57 @@ void hex32_to_rgba_normalized(uint32_t hex, float* rgba, float alpha) rgba[2] = rgba[6] = rgba[10] = rgba[14] = ((hex >> 0 ) & 0xFF) * (1.0f / 255.0f); /* b */ rgba[3] = rgba[7] = rgba[11] = rgba[15] = alpha; } + +void menu_subsystem_populate(const struct retro_subsystem_info* subsystem, menu_displaylist_info_t *info) +{ + int i = 0; + if (subsystem && subsystem_current_count > 0) + { + for (i = 0; i < subsystem_current_count; i++, subsystem++) + { + char s[PATH_MAX_LENGTH]; + if (content_get_subsystem() == i) + { + if (content_get_subsystem_rom_id() < subsystem->num_roms) + { + snprintf(s, sizeof(s), + "Load %s %s", + subsystem->desc, + i == content_get_subsystem() + ? "\u2605" : " "); + menu_entries_append_enum(info->list, + s, + msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_ADD), + MENU_ENUM_LABEL_SUBSYSTEM_ADD, + MENU_SETTINGS_SUBSYSTEM_ADD + i, 0, 0); + } + else + { + snprintf(s, sizeof(s), + "Start %s %s", + subsystem->desc, + i == content_get_subsystem() + ? "\u2605" : " "); + menu_entries_append_enum(info->list, + s, + msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_LOAD), + MENU_ENUM_LABEL_SUBSYSTEM_LOAD, + MENU_SETTINGS_SUBSYSTEM_LOAD, 0, 0); + } + } + else + { + snprintf(s, sizeof(s), + "Load %s %s", + subsystem->desc, + i == content_get_subsystem() + ? "\u2605" : " "); + menu_entries_append_enum(info->list, + s, + msg_hash_to_str(MENU_ENUM_LABEL_SUBSYSTEM_ADD), + MENU_ENUM_LABEL_SUBSYSTEM_ADD, + MENU_SETTINGS_SUBSYSTEM_ADD + i, 0, 0); + } + } + } +} \ No newline at end of file diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 6487d37248..33f111a8ca 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -844,6 +844,8 @@ void menu_driver_destroy(void); void hex32_to_rgba_normalized(uint32_t hex, float* rgba, float alpha); +void menu_subsystem_populate(const struct retro_subsystem_info* subsystem, menu_displaylist_info_t *info); + extern uintptr_t menu_display_white_texture; extern menu_display_ctx_driver_t menu_display_ctx_gl; diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c index ee19acefbe..4999bcca5e 100644 --- a/menu/widgets/menu_filebrowser.c +++ b/menu/widgets/menu_filebrowser.c @@ -74,6 +74,16 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data) bool filter_ext = settings->bools.menu_navigation_browser_filter_supported_extensions_enable; + rarch_system_info_t *system = runloop_get_system_info(); + const struct retro_subsystem_info *subsystem; + + /* Core fully loaded, use the subsystem data */ + if (system->subsystem.data) + subsystem = system->subsystem.data + content_get_subsystem(); + /* Core not loaded completely, use the data we peeked on load core */ + else + subsystem = subsystem_data + content_get_subsystem(); + if (info && string_is_equal(info->label, msg_hash_to_str(MENU_ENUM_LABEL_SCAN_FILE))) filter_ext = false; @@ -82,21 +92,14 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data) { if (filebrowser_types != FILEBROWSER_SELECT_FILE_SUBSYSTEM) str_list = file_archive_get_file_list(path, info->exts); - else - { - const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; - - if (subsystem_size > 0) - str_list = file_archive_get_file_list(path, subsystem->roms[content_get_subsystem_rom_id()].valid_extensions); - } + else if (subsystem && subsystem_current_count > 0) + str_list = file_archive_get_file_list(path, subsystem->roms[content_get_subsystem_rom_id()].valid_extensions); } else if (!string_is_empty(path)) { if (filebrowser_types == FILEBROWSER_SELECT_FILE_SUBSYSTEM) { - const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; - - if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) + if (subsystem && subsystem_current_count > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) str_list = dir_list_new(path, (filter_ext && info) ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL, true, settings->bools.show_hidden_files, true, false); diff --git a/tasks/task_content.c b/tasks/task_content.c index 3db8f943b0..36883c1adb 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -663,7 +663,7 @@ error: static const struct retro_subsystem_info *content_file_init_subsystem( const struct retro_subsystem_info *subsystem_data, - size_t subsystem_size, + size_t subsystem_current_count, char **error_string, bool *ret) { @@ -671,7 +671,7 @@ retro_subsystem_info *content_file_init_subsystem( char *msg = (char*)malloc(path_size); struct string_list *subsystem = path_get_subsystem_list(); const struct retro_subsystem_info *special = libretro_find_subsystem_info( - subsystem_data, subsystem_size, + subsystem_data, subsystem_current_count, path_get(RARCH_PATH_SUBSYSTEM)); msg[0] = '\0'; @@ -1781,12 +1781,18 @@ int content_get_subsystem() void content_set_subsystem(unsigned idx) { rarch_system_info_t *system = runloop_get_system_info(); - const struct retro_subsystem_info *subsystem = system ? - subsystem_data + idx : NULL; + const struct retro_subsystem_info *subsystem; - pending_subsystem_id = idx; + /* Core fully loaded, use the subsystem data */ + if (system->subsystem.data) + subsystem = system->subsystem.data + idx; + /* Core not loaded completely, use the data we peeked on load core */ + else + subsystem = subsystem_data + idx; - if (subsystem_size > 0) + pending_subsystem_id = idx; + + if (subsystem && subsystem_current_count > 0) { strlcpy(pending_subsystem_ident, subsystem->ident, sizeof(pending_subsystem_ident));