diff --git a/360/frontend-xdk/menu.cpp b/360/frontend-xdk/menu.cpp
index 5ebf49bb66..4151326cde 100644
--- a/360/frontend-xdk/menu.cpp
+++ b/360/frontend-xdk/menu.cpp
@@ -1160,8 +1160,8 @@ void menu_loop(void)
          rarch_render_cached_frame();
       else
       {
-		 device_ptr->ctx_driver->clear();
-         device_ptr->frame_count++;
+         device_ptr->ctx_driver->clear();
+         g_extern.frame_count++;
       }
 
       XINPUT_STATE state;
diff --git a/360/xenon360_video.c b/360/xenon360_video.c
index db84d1673f..af9b798585 100644
--- a/360/xenon360_video.c
+++ b/360/xenon360_video.c
@@ -89,7 +89,6 @@ typedef struct gl
    struct XenosShader * g_pVertexShader;
    struct XenosShader * g_pPixelTexturedShader;
    struct XenosSurface * g_pTexture;
-   unsigned frame_count;
 } gl_t;
 
 static float ScreenUv[4] = {0.f, 1.0f, 1.0f, 0.f};
@@ -196,8 +195,6 @@ static bool xenon360_gfx_frame(void *data, const void *frame, unsigned width, un
 {
    gl_t *vid = data;
 
-   vid->frame_count++;
-
    ScreenUv[UV_TOP]	= ((float) (width) / (float) XE_W)*2;
    ScreenUv[UV_LEFT]	= ((float) (height) / (float) XE_H)*2;
 
diff --git a/android/native/jni/Android.mk b/android/native/jni/Android.mk
index 2669a8fb28..11e211ed1e 100644
--- a/android/native/jni/Android.mk
+++ b/android/native/jni/Android.mk
@@ -49,7 +49,7 @@ ifeq ($(PERF_TEST), 1)
 LOCAL_CFLAGS += -DPERF_TEST
 endif
 
-LOCAL_CFLAGS += -O3 -fno-stack-protector -funroll-loops -DNDEBUG -DHAVE_GRIFFIN -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_VID_CONTEXT -DHAVE_OPENGLES2 -DGLSL_DEBUG -DHAVE_GLSL -DHAVE_ZLIB -DWANT_RZLIB -DINLINE=inline -DLSB_FIRST -DHAVE_THREAD -D__LIBRETRO__ -DHAVE_CONFIGFILE=1 -DRARCH_PERFORMANCE_MODE -DRARCH_GPU_PERFORMANCE_MODE -DPACKAGE_VERSION=\"$(RARCH_VERSION)\" -std=gnu99 -DHAVE_FREETYPE
+LOCAL_CFLAGS += -O3 -fno-stack-protector -funroll-loops -DNDEBUG -DHAVE_GRIFFIN -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_VID_CONTEXT -DHAVE_OPENGLES2 -DGLSL_DEBUG -DHAVE_GLSL -DHAVE_ZLIB -DWANT_RZLIB -DINLINE=inline -DLSB_FIRST -DHAVE_THREAD -D__LIBRETRO__ -DHAVE_CONFIGFILE=1 -DRARCH_PERFORMANCE_MODE -DRARCH_GPU_PERFORMANCE_MODE -DPACKAGE_VERSION=\"$(RARCH_VERSION)\" -std=gnu99
 
 LOCAL_LDLIBS	:= -L$(SYSROOT)/usr/lib -landroid -lEGL -lGLESv2 -llog -ldl
 LOCAL_C_INCLUDES += $(LIBXML_PATH)
diff --git a/console/griffin/griffin.c b/console/griffin/griffin.c
index a590621180..ddb4b0edb9 100644
--- a/console/griffin/griffin.c
+++ b/console/griffin/griffin.c
@@ -202,9 +202,13 @@ FONTS
 #include "../../gfx/fonts/freetype.c"
 #endif
 
-#if defined(HAVE_FREETYPE) && !defined(ANDROID)
 #include "../../gfx/fonts/fonts.c"
-#elif defined(HAVE_FREETYPE) && defined(ANDROID)
+
+#ifdef HAVE_OPENGL
+#include "../../gfx/fonts/gl_font.c"
+#endif
+
+#if defined(ANDROID)
 #include "../../gfx/fonts/bitmapfont.c"
 #elif defined(HAVE_LIBDBGFONT)
 #include "../../gfx/fonts/ps_libdbgfont.c"
diff --git a/console/rarch_console_video.h b/console/rarch_console_video.h
index e65efdbd52..865b088cb1 100644
--- a/console/rarch_console_video.h
+++ b/console/rarch_console_video.h
@@ -17,9 +17,9 @@
 #ifndef RARCH_CONSOLE_VIDEO_H__
 #define RARCH_CONSOLE_VIDEO_H__
 
-#define IS_TIMER_NOT_EXPIRED(handle, index)        ((handle)->frame_count < g_extern.console.general_timers[(index)].expire_frame)
-#define IS_TIMER_EXPIRED(handle, index)            (!(IS_TIMER_NOT_EXPIRED((handle), (index))))
-#define SET_TIMER_EXPIRATION(handle, index, value) (g_extern.console.general_timers[(index)].expire_frame = (handle)->frame_count + (value))
+#define IS_TIMER_NOT_EXPIRED(index)        (g_extern.frame_count < g_extern.console.general_timers[(index)].expire_frame)
+#define IS_TIMER_EXPIRED(index)            (!(IS_TIMER_NOT_EXPIRED(index)))
+#define SET_TIMER_EXPIRATION(index, value) (g_extern.console.general_timers[(index)].expire_frame = g_extern.frame_count + (value))
 
 #define MIN_SCALING_FACTOR (1.0f)
 
diff --git a/console/rmenu/rmenu.c b/console/rmenu/rmenu.c
index 9e68913c85..c5fddd5f63 100644
--- a/console/rmenu/rmenu.c
+++ b/console/rmenu/rmenu.c
@@ -2260,10 +2260,10 @@ void menu_loop(void)
          if(!first_held)
          {
             first_held = true;
-            SET_TIMER_EXPIRATION(device_ptr, 1, 7);
+            SET_TIMER_EXPIRATION(1, 7);
          }
 
-         if(IS_TIMER_EXPIRED(device_ptr, 1))
+         if(IS_TIMER_EXPIRED(1))
          {
             first_held = false;
             trig_state = input_state; //second input frame set as current frame
@@ -2344,7 +2344,7 @@ void menu_loop(void)
 
       old_state = input_state_first_frame;
 
-      if(IS_TIMER_EXPIRED(device_ptr, 0))
+      if(IS_TIMER_EXPIRED(0))
       {
          // if we want to force goto the emulation loop, skip this
          if(g_extern.console.rmenu.mode != MODE_EMULATION)
@@ -2372,7 +2372,7 @@ void menu_loop(void)
       // press and holding L3 + R3 in the emulation loop (lasts for 30 frame ticks)
       if(g_extern.console.rmenu.mode == MODE_EMULATION && !g_extern.console.screen.state.frame_advance.enable)
       {
-         SET_TIMER_EXPIRATION(device_ptr, 0, 30);
+         SET_TIMER_EXPIRATION(0, 30);
       }
 
       const char * message = msg_queue_pull(g_extern.msg_queue);
diff --git a/general.h b/general.h
index c7e16622e8..a134b7085c 100644
--- a/general.h
+++ b/general.h
@@ -234,9 +234,7 @@ typedef struct rarch_boolean_state
 
 typedef struct rarch_frame_count
 {
-   bool is_expired;
    unsigned expire_frame;
-   unsigned current;
 } rarch_frame_count_t;
 
 typedef struct rarch_resolution
@@ -456,6 +454,7 @@ struct global
       size_t pitch;
    } frame_cache;
 
+   unsigned frame_count;
    char title_buf[64];
 
    struct
diff --git a/gfx/context/androidegl_ctx.c b/gfx/context/androidegl_ctx.c
index 79bf425f5e..6c4e3395b2 100644
--- a/gfx/context/androidegl_ctx.c
+++ b/gfx/context/androidegl_ctx.c
@@ -414,7 +414,7 @@ static void gfx_ctx_rmenu_frame(void *data)
       gl->shader->set_params(gl->win_width, gl->win_height, 
             gl->win_width, gl->win_height, 
             gl->win_width, gl->win_height, 
-            gl->frame_count, NULL, NULL, NULL, 0);
+            g_extern.frame_count, NULL, NULL, NULL, 0);
    }
 
    glActiveTexture(GL_TEXTURE0);
diff --git a/gfx/context/ps3_ctx.c b/gfx/context/ps3_ctx.c
index 43e02bd735..e76000b262 100644
--- a/gfx/context/ps3_ctx.c
+++ b/gfx/context/ps3_ctx.c
@@ -374,7 +374,7 @@ static void gfx_ctx_rmenu_frame(void *data)
       gl->shader->set_params(gl->win_width, gl->win_height, 
             gl->win_width, gl->win_height, 
             gl->win_width, gl->win_height, 
-            gl->frame_count, NULL, NULL, NULL, 0);
+            g_extern.frame_count, NULL, NULL, NULL, 0);
    }
 
    glActiveTexture(GL_TEXTURE0);
diff --git a/gfx/gfx_common.c b/gfx/gfx_common.c
index dd6e195675..7a07783362 100644
--- a/gfx/gfx_common.c
+++ b/gfx/gfx_common.c
@@ -79,8 +79,6 @@ static float tv_to_fps(const struct timeval *tv, const struct timeval *new_tv, i
    return frames/time;
 }
 
-static unsigned gl_frames;
-
 static bool gfx_get_fps(char *buf, size_t size, bool always_write)
 {
    static struct timeval tv;
@@ -88,13 +86,13 @@ static bool gfx_get_fps(char *buf, size_t size, bool always_write)
    struct timeval new_tv;
    bool ret = false;
 
-   if (gl_frames == 0)
+   if (g_extern.frame_count == 0)
    {
       gettimeofday(&tv, NULL);
       snprintf(buf, size, "%s", g_extern.title_buf);
       ret = true;
    }
-   else if ((gl_frames % 180) == 0)
+   else if ((g_extern.frame_count % 180) == 0)
    {
       gettimeofday(&new_tv, NULL);
       struct timeval tmp_tv = tv;
@@ -103,18 +101,18 @@ static bool gfx_get_fps(char *buf, size_t size, bool always_write)
       last_fps = tv_to_fps(&tmp_tv, &new_tv, 180);
 
 #ifdef RARCH_CONSOLE
-      snprintf(buf, size, "FPS: %6.1f || Frames: %d", last_fps, gl_frames);
+      snprintf(buf, size, "FPS: %6.1f || Frames: %d", last_fps, g_extern.frame_count);
 #else
-      snprintf(buf, size, "%s || FPS: %6.1f || Frames: %d", g_extern.title_buf, last_fps, gl_frames);
+      snprintf(buf, size, "%s || FPS: %6.1f || Frames: %d", g_extern.title_buf, last_fps, g_extern.frame_count);
 #endif
       ret = true;
    }
    else if (always_write)
    {
 #ifdef RARCH_CONSOLE
-      snprintf(buf, size, "FPS: %6.1f || Frames: %d", last_fps, gl_frames);
+      snprintf(buf, size, "FPS: %6.1f || Frames: %d", last_fps, g_extern.frame_count);
 #else
-      snprintf(buf, size, "%s || FPS: %6.1f || Frames: %d", g_extern.title_buf, last_fps, gl_frames);
+      snprintf(buf, size, "%s || FPS: %6.1f || Frames: %d", g_extern.title_buf, last_fps, g_extern.frame_count);
 #endif
    }
 
@@ -123,21 +121,17 @@ static bool gfx_get_fps(char *buf, size_t size, bool always_write)
 
 void gfx_window_title_reset(void)
 {
-   gl_frames = 0;
+   g_extern.frame_count = 0;
 }
 
 bool gfx_window_title(char *buf, size_t size)
 {
-   bool ret = gfx_get_fps(buf, size, false);
-
-   gl_frames++;
-   return ret;
+   return gfx_get_fps(buf, size, false);
 }
 
 void gfx_fps_title(char *buf, size_t size)
 {
    gfx_get_fps(buf, size, true);
-   gl_frames++;
 }
 
 #if defined(_WIN32) && !defined(_XBOX)
diff --git a/gfx/gl.c b/gfx/gl.c
index 470f6fa597..3a9b54c917 100644
--- a/gfx/gl.c
+++ b/gfx/gl.c
@@ -791,7 +791,7 @@ static void gl_frame_fbo(gl_t *gl, const struct gl_tex_info *tex_info)
       gl_set_viewport(gl, rect->img_width, rect->img_height, true, false);
       gl_shader_set_params_func(gl, prev_rect->img_width, prev_rect->img_height, 
             prev_rect->width, prev_rect->height, 
-            gl->vp.width, gl->vp.height, gl->frame_count, 
+            gl->vp.width, gl->vp.height, g_extern.frame_count, 
             tex_info, gl->prev_info, fbo_tex_info, fbo_tex_info_cnt);
 
       gl_shader_set_coords_func(gl, &gl->coords, &gl->mvp);
@@ -817,7 +817,7 @@ static void gl_frame_fbo(gl_t *gl, const struct gl_tex_info *tex_info)
    gl_set_viewport(gl, gl->win_width, gl->win_height, false, true);
    gl_shader_set_params_func(gl, prev_rect->img_width, prev_rect->img_height, 
          prev_rect->width, prev_rect->height, 
-         gl->vp.width, gl->vp.height, gl->frame_count, 
+         gl->vp.width, gl->vp.height, g_extern.frame_count, 
          tex_info, gl->prev_info, fbo_tex_info, fbo_tex_info_cnt);
 
    gl->coords.vertex = vertex_ptr;
@@ -1106,7 +1106,6 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
    gl_t *gl = (gl_t*)data;
 
    gl_shader_use_func(gl, 1);
-   gl->frame_count++;
 
 #ifdef HAVE_FBO
    // Render to texture in first pass.
@@ -1156,7 +1155,7 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
    gl_shader_set_params_func(gl, width, height,
          gl->tex_w, gl->tex_h,
          gl->vp.width, gl->vp.height,
-         gl->frame_count, 
+         g_extern.frame_count, 
          &tex_info, gl->prev_info, NULL, 0);
 
    gl_shader_set_coords_func(gl, &gl->coords, &gl->mvp);
@@ -1563,7 +1562,7 @@ static bool gl_alive(void *data)
 
    context_check_window_func(&quit,
          &resize, &gl->win_width, &gl->win_height,
-         gl->frame_count);
+         g_extern.frame_count);
 
    if (quit)
       gl->quitting = true;
@@ -1749,10 +1748,10 @@ static void gl_restart(void)
 #ifdef HAVE_RMENU
    gl->draw_rmenu = should_draw_rmenu;
    gl->block_swap = should_block_swap;
-   SET_TIMER_EXPIRATION(gl, 0, 30);
+   SET_TIMER_EXPIRATION(0, 30);
 #endif
 
-   gl->frame_count = 0;
+   g_extern.frame_count = 0;
 }
 
 static void gl_apply_state_changes(void)
diff --git a/gfx/vg.c b/gfx/vg.c
index 56d11b3b94..1596cf5c6f 100644
--- a/gfx/vg.c
+++ b/gfx/vg.c
@@ -45,7 +45,6 @@ typedef struct
    unsigned mRenderWidth;
    unsigned mRenderHeight;
    unsigned x1, y1, x2, y2;
-   unsigned frame_count;
    VGImageFormat mTexType;
    VGImage mImage;
    math_matrix_3x3 mTransformMatrix;
@@ -357,7 +356,6 @@ static bool vg_frame(void *data, const void *frame, unsigned width, unsigned hei
    RARCH_PERFORMANCE_INIT(vg_fr);
    RARCH_PERFORMANCE_START(vg_fr);
    vg_t *vg = (vg_t*)data;
-   vg->frame_count++;
 
    if (width != vg->mRenderWidth || height != vg->mRenderHeight || vg->should_resize)
    {
@@ -401,7 +399,7 @@ static bool vg_alive(void *data)
 
    vg->driver->check_window(&quit,
          &vg->should_resize, &vg->mScreenWidth, &vg->mScreenHeight,
-         vg->frame_count);
+         g_extern.frame_count);
    return !quit;
 }
 
diff --git a/gx/gx_video.c b/gx/gx_video.c
index cba810be3e..c6074a4996 100644
--- a/gx/gx_video.c
+++ b/gx/gx_video.c
@@ -810,11 +810,7 @@ static bool gx_frame(void *data, const void *frame,
       return true;
 
    if (!frame)
-   {
       width = height = 4; // draw a black square in the background
-   }
-
-   gx->frame_count++;
 
    if(should_resize)
    {
diff --git a/gx/gx_video.h b/gx/gx_video.h
index 6b92a8d724..091fbbe41c 100644
--- a/gx/gx_video.h
+++ b/gx/gx_video.h
@@ -25,7 +25,6 @@ typedef struct gx_video
    bool keep_aspect;
    bool double_strike;
    bool rgb32;
-   uint32_t frame_count;
    uint32_t *menu_data;
    unsigned win_width;
    unsigned win_height;
diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c
index 91e58566d4..1fb07a3b29 100644
--- a/ps3/ps3_input.c
+++ b/ps3/ps3_input.c
@@ -442,9 +442,6 @@ static void ps3_input_post_init(void)
 static bool ps3_input_key_pressed(void *data, int key)
 {
    (void)data;
-#ifdef HAVE_OPENGL
-   gl_t *gl = driver.video_data;
-#endif
 
    if(g_extern.lifecycle_state & (1ULL << key))
       return true;
@@ -460,19 +457,19 @@ static bool ps3_input_key_pressed(void *data, int key)
          }
          return false;
       case RARCH_QUIT_KEY:
-#ifdef HAVE_OPENGL
-         if(IS_TIMER_EXPIRED(gl, 0))
+#ifdef HAVE_RMENU
+         if(IS_TIMER_EXPIRED(0))
          {
             uint32_t r3_pressed = state[0] & (1ULL << RETRO_DEVICE_ID_JOYPAD_R3);
             uint32_t l3_pressed = state[0] & (1ULL << RETRO_DEVICE_ID_JOYPAD_L3);
             bool retval = false;
-            g_extern.console.rmenu.state.rmenu.enable = (r3_pressed && l3_pressed && IS_TIMER_EXPIRED(gl, 0));
+            g_extern.console.rmenu.state.rmenu.enable = (r3_pressed && l3_pressed && IS_TIMER_EXPIRED(0));
             g_extern.console.rmenu.state.ingame_menu.enable = r3_pressed && !l3_pressed;
 
             if(g_extern.console.rmenu.state.rmenu.enable || (g_extern.console.rmenu.state.ingame_menu.enable && !g_extern.console.rmenu.state.rmenu.enable))
             {
                g_extern.console.rmenu.mode = MODE_MENU;
-               SET_TIMER_EXPIRATION(gl, 0, 30);
+               SET_TIMER_EXPIRATION(0, 30);
                retval = g_extern.console.rmenu.state.rmenu.enable;
             }
 
diff --git a/xdk/xdk_d3d.cpp b/xdk/xdk_d3d.cpp
index 4653cffddb..3c33cda800 100644
--- a/xdk/xdk_d3d.cpp
+++ b/xdk/xdk_d3d.cpp
@@ -122,8 +122,7 @@ static void check_window(xdk_d3d_video_t *d3d)
    bool quit, resize;
 
    d3d->ctx_driver->check_window(&quit,
-         &resize, NULL, NULL,
-         d3d->frame_count);
+         &resize, NULL, NULL, g_extern.frame_count);
 
    if (quit)
       d3d->quitting = true;
@@ -693,7 +692,6 @@ static bool xdk_d3d_frame(void *data, const void *frame,
    if (d3d->should_resize)
       xdk_d3d_set_viewport(false);
 
-   d3d->frame_count++;
 #ifdef _XBOX360
    d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET,
          0xff000000, 1.0f, 0);
@@ -710,7 +708,7 @@ static bool xdk_d3d_frame(void *data, const void *frame,
    {
 #ifdef HAVE_HLSL
       hlsl_set_params(width, height, d3d->tex_w, d3d->tex_h, g_settings.video.fbo.scale_x * width,
-            g_settings.video.fbo.scale_y * height, d3d->frame_count);
+            g_settings.video.fbo.scale_y * height, g_extern.frame_count);
 #endif
       D3DVIEWPORT vp = {0};
       vp.Width  = g_settings.video.fbo.scale_x * width;
@@ -726,7 +724,7 @@ static bool xdk_d3d_frame(void *data, const void *frame,
    {
 #ifdef HAVE_HLSL
       hlsl_set_params(width, height, d3d->tex_w, d3d->tex_h, d3d->win_width,
-            d3d->win_height, d3d->frame_count);
+            d3d->win_height, g_extern.frame_count);
 #endif
    }
 
@@ -780,7 +778,7 @@ static bool xdk_d3d_frame(void *data, const void *frame,
 #ifdef HAVE_HLSL
       hlsl_use(2);
       hlsl_set_params(g_settings.video.fbo.scale_x * width, g_settings.video.fbo.scale_y * height, g_settings.video.fbo.scale_x * d3d->tex_w, g_settings.video.fbo.scale_y * d3d->tex_h, d3d->win_width,
-            d3d->win_height, d3d->frame_count);
+            d3d->win_height, g_extern.frame_count);
 #endif
       xdk_d3d_set_viewport(false);
 
diff --git a/xdk/xdk_d3d.h b/xdk/xdk_d3d.h
index 75518b7b1e..cbc960f898 100644
--- a/xdk/xdk_d3d.h
+++ b/xdk/xdk_d3d.h
@@ -59,7 +59,6 @@ typedef struct xdk_d3d_video
    bool should_resize;
    bool quitting;
    bool vsync;
-   unsigned frame_count;
    unsigned last_width;
    unsigned last_height;
    unsigned win_width;
diff --git a/xdk/xdk_xinput_input.c b/xdk/xdk_xinput_input.c
index 93f9dfbca8..d776c2c271 100644
--- a/xdk/xdk_xinput_input.c
+++ b/xdk/xdk_xinput_input.c
@@ -338,18 +338,18 @@ static bool xdk_input_key_pressed(void *data, int key)
       case RARCH_REWIND:
          return ((state[0] & XINPUT1_GAMEPAD_RSTICK_UP_MASK) && !(state[0] & XINPUT1_GAMEPAD_RIGHT_TRIGGER));
       case RARCH_QUIT_KEY:
-         if(IS_TIMER_EXPIRED(d3d, 0))
+         if(IS_TIMER_EXPIRED(0))
          {
             uint32_t left_thumb_pressed = (state[0] & (1 << RETRO_DEVICE_ID_JOYPAD_L3));
             uint32_t right_thumb_pressed = (state[0] & (1 << RETRO_DEVICE_ID_JOYPAD_R3));
 
-            g_extern.console.rmenu.state.rmenu.enable = right_thumb_pressed && left_thumb_pressed && IS_TIMER_EXPIRED(d3d, 0);
+            g_extern.console.rmenu.state.rmenu.enable = right_thumb_pressed && left_thumb_pressed && IS_TIMER_EXPIRED(0);
             g_extern.console.rmenu.state.ingame_menu.enable = right_thumb_pressed && !left_thumb_pressed;
             
             if(g_extern.console.rmenu.state.rmenu.enable || (g_extern.console.rmenu.state.ingame_menu.enable && !g_extern.console.rmenu.state.rmenu.enable))
             {
                g_extern.console.rmenu.mode = MODE_MENU;
-               SET_TIMER_EXPIRATION(d3d, 0, 30);
+               SET_TIMER_EXPIRATION(0, 30);
                retval = g_extern.console.rmenu.state.rmenu.enable;
             }
             retval = g_extern.console.rmenu.state.ingame_menu.enable ? g_extern.console.rmenu.state.ingame_menu.enable : g_extern.console.rmenu.state.rmenu.enable;