From d3d976c92ba4a52b74e59c982d966f9b3cd3efe1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
Date: Wed, 25 Mar 2015 11:44:54 -0300
Subject: [PATCH] (GLUI) Only update text vertices when needed

---
 gfx/drivers_font/gl_raster_font.c |  2 +-
 menu/drivers/glui.c               | 60 +++++++++++++++++++++----------
 menu/drivers/xmb.c                |  6 ++++
 3 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c
index d07a984e1a..53912fbec9 100644
--- a/gfx/drivers_font/gl_raster_font.c
+++ b/gfx/drivers_font/gl_raster_font.c
@@ -366,7 +366,7 @@ static void gl_flush_block(void *data)
       restore_viewport(font->gl);
    }
 
-   block->carr.coords.vertices = 0;
+   /* block->carr.coords.vertices = 0; */
 }
 
 static void gl_bind_block(void *data, gl_font_raster_block_t *block)
diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c
index aa54887742..04b10d4c2a 100644
--- a/menu/drivers/glui.c
+++ b/menu/drivers/glui.c
@@ -56,10 +56,18 @@ static int glui_entry_iterate(unsigned action)
    const char *label = NULL;
    menu_file_list_cbs_t *cbs = NULL;
    menu_handle_t *menu = menu_driver_get_ptr();
+   runloop_t *runloop   = rarch_main_get_ptr();
 
-   if (!menu)
+   if (!menu || !runloop)
       return -1;
 
+   if (action != MENU_ACTION_NOOP || menu->need_refresh ||
+       runloop->frames.video.current.menu.label.is_updated ||
+       runloop->frames.video.current.menu.animation.is_active)
+   {
+      runloop->frames.video.current.menu.framebuf.dirty   = true;
+   }
+
    cbs = (menu_file_list_cbs_t*)menu_list_get_actiondata_at_offset(
          menu->menu_list->selection_buf, menu->navigation.selection_ptr);
 
@@ -291,10 +299,6 @@ static void glui_render(void)
    menu->frame_buf.width  = gl->win_width;
    menu->frame_buf.height = gl->win_height;
 
-   runloop->frames.video.current.menu.animation.is_active = false;
-   runloop->frames.video.current.menu.label.is_updated    = false;
-   runloop->frames.video.current.menu.framebuf.dirty      = false;
-
    menu->mouse.ptr = (menu->mouse.y - glui->margin) /
          glui->line_height - 2 + menu->begin;
 
@@ -353,12 +357,22 @@ static void glui_frame(void)
 
    glViewport(0, 0, gl->win_width, gl->win_height);
 
+   glui_render_background(settings, gl, glui, false);
+
+   if (!menu_display_update_pending())
+      goto draw_text;
+
+   glui->raster_block.carr.coords.vertices = 0;
+
+   runloop->frames.video.current.menu.animation.is_active = false;
+   runloop->frames.video.current.menu.label.is_updated    = false;
+   runloop->frames.video.current.menu.framebuf.dirty      = false;
+
    end = (menu->begin + glui->term_height <=
          menu_list_get_size(menu->menu_list)) ?
       menu->begin + glui->term_height :
       menu_list_get_size(menu->menu_list);
 
-   glui_render_background(settings, gl, glui, false);
 
    menu_list_get_last_stack(menu->menu_list, &dir, &label, &menu_type);
 
@@ -407,40 +421,40 @@ static void glui_frame(void)
    for (i = menu->begin; i < end; i++, y += glui->line_height)
    {
       char message[PATH_MAX_LENGTH], type_str[PATH_MAX_LENGTH],
-           entry_title_buf[PATH_MAX_LENGTH], type_str_buf[PATH_MAX_LENGTH],
-           path_buf[PATH_MAX_LENGTH];
+            entry_title_buf[PATH_MAX_LENGTH], type_str_buf[PATH_MAX_LENGTH],
+            path_buf[PATH_MAX_LENGTH];
       const char *path = NULL, *entry_label = NULL;
       unsigned type = 0, w = 0;
       bool selected = false;
       menu_file_list_cbs_t *cbs = NULL;
 
       menu_list_get_at_offset(menu->menu_list->selection_buf, i, &path,
-            &entry_label, &type);
+                              &entry_label, &type);
 
       cbs = (menu_file_list_cbs_t*)
-         menu_list_get_actiondata_at_offset(menu->menu_list->selection_buf,
-               i);
+            menu_list_get_actiondata_at_offset(menu->menu_list->selection_buf,
+                                               i);
 
       if (cbs && cbs->action_get_representation)
          cbs->action_get_representation(menu->menu_list->selection_buf,
-               &w, type, i, label,
-               type_str, sizeof(type_str), 
-               entry_label, path,
-               path_buf, sizeof(path_buf));
+                                        &w, type, i, label,
+                                        type_str, sizeof(type_str),
+                                        entry_label, path,
+                                        path_buf, sizeof(path_buf));
 
       selected = (i == menu->navigation.selection_ptr);
 
       menu_animation_ticker_line(entry_title_buf, glui->term_width - (w + 1 + 2),
-            runloop->frames.video.count / glui->margin, path_buf, selected);
-      menu_animation_ticker_line(type_str_buf, w, 
-            runloop->frames.video.count / glui->margin, type_str, selected);
+                                 runloop->frames.video.count / glui->margin, path_buf, selected);
+      menu_animation_ticker_line(type_str_buf, w,
+                                 runloop->frames.video.count / glui->margin, type_str, selected);
 
       strlcpy(message, entry_title_buf, sizeof(message));
 
       glui_blit_line(gl, x, y, message, selected ? hover_color : normal_color);
 
       glui_blit_line(gl, gl->win_width - glui->glyph_width * w - glui->margin ,
-         y, type_str_buf, selected ? hover_color : normal_color);
+                     y, type_str_buf, selected ? hover_color : normal_color);
    }
 
    if (menu->keyboard.display)
@@ -464,6 +478,7 @@ static void glui_frame(void)
    if (settings->menu.mouse.enable)
       glui_draw_cursor(gl, menu->mouse.x, menu->mouse.y);
 
+draw_text:
    if (gl->font_driver->flush)
       gl->font_driver->flush(gl->font_handle);
 
@@ -515,6 +530,9 @@ static void glui_free(void *data)
 
    gl_coord_array_release(&glui->raster_block.carr);
 
+   if (gl->font_driver->bind_block)
+      gl->font_driver->bind_block(gl->font_handle, NULL);
+
    if (menu->alloc_font)
       free((uint8_t*)menu->font);
 
@@ -569,6 +587,7 @@ static void glui_context_reset(void)
    glui_handle_t *glui = NULL;
    menu_handle_t *menu  = menu_driver_get_ptr();
    settings_t *settings = config_get_ptr();
+   gl_t *gl = (gl_t*)video_driver_get_ptr(NULL);
     
    if (!menu)
       return;
@@ -602,6 +621,9 @@ static void glui_context_reset(void)
 
       texture_image_free(&ti);
    }
+
+   if (gl->font_driver->bind_block)
+      gl->font_driver->bind_block(gl->font_handle, &glui->raster_block);
 }
 
 static void glui_navigation_clear(bool pending_push)
diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c
index 51244d2160..eb9f76926c 100644
--- a/menu/drivers/xmb.c
+++ b/menu/drivers/xmb.c
@@ -1515,6 +1515,9 @@ static void xmb_free(void *data)
    xmb = (xmb_handle_t*)menu->userdata;
 
    gl_coord_array_release(&xmb->raster_block.carr);
+
+   if (gl->font_driver->bind_block)
+      gl->font_driver->bind_block(gl->font_handle, NULL);
 }
 
 static bool xmb_font_init_first(const gl_font_renderer_t **font_driver,
@@ -1782,6 +1785,9 @@ static void xmb_context_reset(void)
       else if (xmb->depth <= 1)
          node->alpha = xmb->categories.passive.alpha;
    }
+
+   if (gl->font_driver->bind_block)
+      gl->font_driver->bind_block(gl->font_handle, &xmb->raster_block);
 }
 
 static void xmb_navigation_clear(bool pending_push)