diff --git a/Makefile.common b/Makefile.common
index 3c7042fb53..e12f861fc9 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -138,6 +138,7 @@ OBJ += frontend/frontend.o \
input/input_remapping.o \
input/input_sensor.o \
input/keyboard_line.o \
+ tasks/task_overlay.o \
input/input_overlay.o \
patch.o \
libretro-common/queues/fifo_buffer.o \
diff --git a/griffin/griffin.c b/griffin/griffin.c
index c0facf33e7..4a68920f73 100644
--- a/griffin/griffin.c
+++ b/griffin/griffin.c
@@ -287,6 +287,7 @@ INPUT
#ifdef HAVE_OVERLAY
#include "../input/input_overlay.c"
+#include "../tasks/task_overlay.c"
#endif
#if defined(__CELLOS_LV2__)
diff --git a/runloop_data.c b/runloop_data.c
index fcef21a36a..d2c2de7bc2 100644
--- a/runloop_data.c
+++ b/runloop_data.c
@@ -39,81 +39,6 @@ static void *rarch_main_data_get_ptr(void)
return g_data_runloop;
}
-#ifdef HAVE_OVERLAY
-static void rarch_main_data_overlay_image_upload_iterate(bool is_thread, data_runloop_t *runloop)
-{
- driver_t *driver = driver_get_ptr();
-
- if (rarch_main_is_idle())
- return;
- if (!driver->overlay)
- return;
-
-#ifdef HAVE_THREADS
- if (is_thread)
- slock_lock(runloop->overlay_lock);
-#endif
-
- switch (driver->overlay->state)
- {
- case OVERLAY_STATUS_DEFERRED_LOADING:
- input_overlay_load_overlays_iterate(driver->overlay);
- break;
- default:
- break;
- }
-
-#ifdef HAVE_THREADS
- if (is_thread)
- slock_unlock(runloop->overlay_lock);
-#endif
-}
-static void rarch_main_data_overlay_iterate(bool is_thread, data_runloop_t *runloop)
-{
- driver_t *driver = NULL;
-
- if (rarch_main_is_idle())
- return;
-
-#ifdef HAVE_THREADS
- if (is_thread)
- slock_lock(runloop->overlay_lock);
-#endif
-
- driver = driver_get_ptr();
-
- if (!driver || !driver->overlay)
- goto end;
-
- switch (driver->overlay->state)
- {
- case OVERLAY_STATUS_DEFERRED_LOAD:
- input_overlay_load_overlays(driver->overlay);
- break;
- case OVERLAY_STATUS_NONE:
- case OVERLAY_STATUS_ALIVE:
- break;
- case OVERLAY_STATUS_DEFERRED_LOADING_RESOLVE:
- input_overlay_load_overlays_resolve_iterate(driver->overlay);
- break;
- case OVERLAY_STATUS_DEFERRED_DONE:
- input_overlay_new_done(driver->overlay);
- break;
- case OVERLAY_STATUS_DEFERRED_ERROR:
- input_overlay_free(driver->overlay);
- break;
- default:
- break;
- }
-
-end:
-#ifdef HAVE_THREADS
- if (is_thread)
- slock_unlock(runloop->overlay_lock);
-#endif
-}
-#endif
-
#ifdef HAVE_THREADS
static void data_runloop_thread_deinit(data_runloop_t *runloop)
{
diff --git a/tasks/task_overlay.c b/tasks/task_overlay.c
new file mode 100644
index 0000000000..ede90d2ac3
--- /dev/null
+++ b/tasks/task_overlay.c
@@ -0,0 +1,97 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2011-2015 - Daniel De Matteis
+ *
+ * RetroArch is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#include
+
+#include "../driver.h"
+#include "../runloop.h"
+#include "../runloop_data.h"
+#include "tasks.h"
+
+void rarch_main_data_overlay_image_upload_iterate(bool is_thread, void *data)
+{
+ data_runloop_t *runloop = (data_runloop_t*)data;
+ driver_t *driver = driver_get_ptr();
+
+ if (rarch_main_is_idle())
+ return;
+ if (!driver->overlay || !runloop)
+ return;
+
+#ifdef HAVE_THREADS
+ if (is_thread)
+ slock_lock(runloop->overlay_lock);
+#endif
+
+ switch (driver->overlay->state)
+ {
+ case OVERLAY_STATUS_DEFERRED_LOADING:
+ input_overlay_load_overlays_iterate(driver->overlay);
+ break;
+ default:
+ break;
+ }
+
+#ifdef HAVE_THREADS
+ if (is_thread)
+ slock_unlock(runloop->overlay_lock);
+#endif
+}
+
+void rarch_main_data_overlay_iterate(bool is_thread, void *data)
+{
+ data_runloop_t *runloop = (data_runloop_t*)data;
+ driver_t *driver = NULL;
+
+ if (rarch_main_is_idle())
+ return;
+
+#ifdef HAVE_THREADS
+ if (is_thread)
+ slock_lock(runloop->overlay_lock);
+#endif
+
+ driver = driver_get_ptr();
+
+ if (!driver || !driver->overlay)
+ goto end;
+
+ switch (driver->overlay->state)
+ {
+ case OVERLAY_STATUS_DEFERRED_LOAD:
+ input_overlay_load_overlays(driver->overlay);
+ break;
+ case OVERLAY_STATUS_NONE:
+ case OVERLAY_STATUS_ALIVE:
+ break;
+ case OVERLAY_STATUS_DEFERRED_LOADING_RESOLVE:
+ input_overlay_load_overlays_resolve_iterate(driver->overlay);
+ break;
+ case OVERLAY_STATUS_DEFERRED_DONE:
+ input_overlay_new_done(driver->overlay);
+ break;
+ case OVERLAY_STATUS_DEFERRED_ERROR:
+ input_overlay_free(driver->overlay);
+ break;
+ default:
+ break;
+ }
+
+end:
+#ifdef HAVE_THREADS
+ if (is_thread)
+ slock_unlock(runloop->overlay_lock);
+#endif
+}
diff --git a/tasks/tasks.h b/tasks/tasks.h
index d90cb1914b..c2840f50dd 100644
--- a/tasks/tasks.h
+++ b/tasks/tasks.h
@@ -50,6 +50,13 @@ void rarch_main_data_db_iterate(bool is_thread, void *data);
#endif
#endif
+#ifdef HAVE_OVERLAY
+void rarch_main_data_overlay_image_upload_iterate(bool is_thread,
+ void *data);
+
+void rarch_main_data_overlay_iterate(bool is_thread, void *data);
+#endif
+
void rarch_main_data_nbio_iterate(bool is_thread,
void *runloop);