From cad5ae287f8e5368cc1194ddbf96b85303634fd5 Mon Sep 17 00:00:00 2001
From: radius <andres.430@gmail.com>
Date: Mon, 10 Dec 2018 21:38:30 -0500
Subject: [PATCH 1/4] fix
 https://github.com/libretro/fbalpha/issues/24#issuecomment-445803876

---
 command.c                       |  4 ++--
 dynamic.c                       | 29 ++++++++++++++++++-----------
 dynamic.h                       | 11 ++++++++---
 menu/cbs/menu_cbs_sublabel.c    |  7 ++++---
 menu/drivers/ozone/ozone.c      |  4 ++--
 menu/drivers/xmb.c              |  4 ++--
 menu/widgets/menu_filebrowser.c |  4 ++--
 tasks/task_content.c            |  6 +++---
 8 files changed, 41 insertions(+), 28 deletions(-)

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..31410d59e0 100644
--- a/menu/cbs/menu_cbs_sublabel.c
+++ b/menu/cbs/menu_cbs_sublabel.c
@@ -521,10 +521,11 @@ 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 = (system && subsystem_current_count > 0) ?
+      subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL;
 
-   if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms)
+   /* To-Do: localization & sublabels for pre-init case */
+   if (subsystem_current_count > 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
diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c
index 909d293a67..4ca662b7fe 100644
--- a/menu/drivers/ozone/ozone.c
+++ b/menu/drivers/ozone/ozone.c
@@ -596,10 +596,10 @@ 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)
+               if (subsystem_current_count > 0)
                {
                   const struct retro_subsystem_info* subsystem = subsystem_data;
-                  for (i = 0; i < subsystem_size; i++, subsystem++)
+                  for (i = 0; i < subsystem_current_count; i++, subsystem++)
                   {
                      char s[PATH_MAX_LENGTH];
                      if (content_get_subsystem() == i)
diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c
index ea131d5342..cace669d2e 100755
--- a/menu/drivers/xmb.c
+++ b/menu/drivers/xmb.c
@@ -5548,10 +5548,10 @@ 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)
+               if (subsystem_current_count > 0)
                {
                   const struct retro_subsystem_info* subsystem = subsystem_data;
-                  for (i = 0; i < subsystem_size; i++, subsystem++)
+                  for (i = 0; i < subsystem_current_count; i++, subsystem++)
                   {
                      char s[PATH_MAX_LENGTH];
                      if (content_get_subsystem() == i)
diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c
index ee19acefbe..fbde810143 100644
--- a/menu/widgets/menu_filebrowser.c
+++ b/menu/widgets/menu_filebrowser.c
@@ -86,7 +86,7 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data)
       {
          const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()];
 
-         if (subsystem_size > 0)
+         if (subsystem_current_count > 0)
             str_list  = file_archive_get_file_list(path, subsystem->roms[content_get_subsystem_rom_id()].valid_extensions);
       }
    }
@@ -96,7 +96,7 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data)
       {
          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_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..ceb4bbf173 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';
@@ -1786,7 +1786,7 @@ void content_set_subsystem(unsigned idx)
 
    pending_subsystem_id                         = idx;
 
-   if (subsystem_size > 0)
+   if (subsystem_current_count > 0)
    {
       strlcpy(pending_subsystem_ident,
          subsystem->ident, sizeof(pending_subsystem_ident));

From 45228d030718deed3ecc0eef72f7bef09221cf1f Mon Sep 17 00:00:00 2001
From: radius <andres.430@gmail.com>
Date: Mon, 10 Dec 2018 23:01:21 -0500
Subject: [PATCH 2/4] massive subsystem cleanup & use the proper data in each
 instance

---
 menu/cbs/menu_cbs_sublabel.c | 24 ++++++++++-----
 menu/drivers/ozone/ozone.c   | 59 ++++++------------------------------
 menu/drivers/xmb.c           | 59 ++++++------------------------------
 menu/menu_driver.c           | 54 +++++++++++++++++++++++++++++++++
 menu/menu_driver.h           |  2 ++
 5 files changed, 90 insertions(+), 108 deletions(-)

diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c
index 31410d59e0..defe0e2dd6 100644
--- a/menu/cbs/menu_cbs_sublabel.c
+++ b/menu/cbs/menu_cbs_sublabel.c
@@ -521,15 +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_current_count > 0) ?
-      subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL;
+   const struct retro_subsystem_info *subsystem;
 
-   /* To-Do: localization & sublabels for pre-init case */
-   if (subsystem_current_count > 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 4ca662b7fe..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_current_count > 0)
-               {
-                  const struct retro_subsystem_info* subsystem = subsystem_data;
-                  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);
-                     }
-                  }
-               }
+               /* 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 cace669d2e..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_current_count > 0)
-               {
-                  const struct retro_subsystem_info* subsystem = subsystem_data;
-                  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);
-                     }
-                  }
-               }
+               /* 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;

From 7a36190a0e61d9a4ba4175ed2c92d27b47a9e0ef Mon Sep 17 00:00:00 2001
From: radius <andres.430@gmail.com>
Date: Mon, 10 Dec 2018 23:19:57 -0500
Subject: [PATCH 3/4] cleanup filebrowser too

---
 menu/widgets/menu_filebrowser.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c
index fbde810143..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_current_count > 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_current_count > 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);

From 479104ee05d63a8053168aaf800c0478149978bf Mon Sep 17 00:00:00 2001
From: radius <andres.430@gmail.com>
Date: Mon, 10 Dec 2018 23:27:04 -0500
Subject: [PATCH 4/4] cleanup task_content.c too

---
 tasks/task_content.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/tasks/task_content.c b/tasks/task_content.c
index ceb4bbf173..36883c1adb 100644
--- a/tasks/task_content.c
+++ b/tasks/task_content.c
@@ -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_current_count > 0)
+   pending_subsystem_id = idx;
+
+   if (subsystem && subsystem_current_count > 0)
    {
       strlcpy(pending_subsystem_ident,
          subsystem->ident, sizeof(pending_subsystem_ident));