From 7dc3b7a9bed9697ef00fb9f5388ddfcedb865f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Tue, 24 Mar 2015 15:00:46 -0300 Subject: [PATCH 1/7] (gl_raster) Extract some functions to improve clarity --- gfx/drivers_font/gl_raster_font.c | 67 +++++++++++++++++++------------ 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 6c96ef9cb7..2293eb1c9f 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -152,6 +152,13 @@ static int get_message_width(gl_raster_t *font, const char *msg) return delta_x; } +static void draw_vertices(gl_t *gl, const struct gl_coords *coords) +{ + gl->shader->set_coords(coords); + gl->shader->set_mvp(gl, &gl->mvp_no_rot); + glDrawArrays(GL_TRIANGLES, 0, coords->vertices); +} + static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, bool align_right) { @@ -162,8 +169,7 @@ static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, GLfloat font_vertex[2 * 6 * MAX_MSG_LEN_CHUNK]; GLfloat font_color[4 * 6 * MAX_MSG_LEN_CHUNK]; gl_t *gl = font->gl; - - glBindTexture(GL_TEXTURE_2D, font->tex); + struct gl_coords coords; msg_len_full = strlen(msg); msg_len = min(msg_len_full, MAX_MSG_LEN_CHUNK); @@ -183,10 +189,6 @@ static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, while (msg_len_full) { - /* Rebind shaders so attrib cache gets reset. */ - if (gl->shader && gl->shader->use) - gl->shader->use(gl, GL_SHADER_STOCK_BLEND); - for (i = 0; i < msg_len; i++) { int off_x, off_y, tex_x, tex_y, width, height; @@ -217,25 +219,42 @@ static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, delta_y -= glyph->advance_y; } - gl->coords.tex_coord = font_tex_coords; - gl->coords.vertex = font_vertex; - gl->coords.color = font_color; - gl->coords.vertices = 6 * msg_len; - gl->shader->set_coords(&gl->coords); - gl->shader->set_mvp(gl, &gl->mvp_no_rot); - glDrawArrays(GL_TRIANGLES, 0, 6 * msg_len); + coords.tex_coord = font_tex_coords; + coords.vertex = font_vertex; + coords.color = font_color; + coords.vertices = 6 * msg_len; + coords.lut_tex_coord = gl->coords.lut_tex_coord; + + draw_vertices(gl, &coords); msg_len_full -= msg_len; msg += msg_len; msg_len = min(msg_len_full, MAX_MSG_LEN_CHUNK); } +} - /* Post - Go back to old rendering path. */ - gl->coords.vertex = gl->vertex_ptr; - gl->coords.tex_coord = gl->tex_info.coord; - gl->coords.color = gl->white_color_ptr; - gl->coords.vertices = 4; +static void setup_viewport(gl_raster_t *font, bool full_screen) +{ + gl_t *gl = font->gl; + + gl_set_viewport(gl, gl->win_width, gl->win_height, full_screen, false); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + glBindTexture(GL_TEXTURE_2D, font->tex); + + if (gl->shader && gl->shader->use) + gl->shader->use(gl, GL_SHADER_STOCK_BLEND); +} + +static void restore_viewport(gl_t *gl) +{ glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); + + glDisable(GL_BLEND); + gl_set_viewport(gl, gl->win_width, gl->win_height, false, true); } static void gl_raster_font_render_msg(void *data, const char *msg, @@ -293,11 +312,7 @@ static void gl_raster_font_render_msg(void *data, const char *msg, drop_mod = 0.3f; } - gl_set_viewport(gl, gl->win_width, gl->win_height, - full_screen, false); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_ADD); + setup_viewport(font, full_screen); if (drop_x || drop_y) { @@ -310,10 +325,10 @@ static void gl_raster_font_render_msg(void *data, const char *msg, x + scale * drop_x / gl->vp.width, y + scale * drop_y / gl->vp.height, align_right); } + render_message(font, msg, scale, color, x, y, align_right); - glDisable(GL_BLEND); - gl_set_viewport(gl, gl->win_width, gl->win_height, false, true); + restore_viewport(gl); } static const struct font_glyph *gl_raster_font_get_glyph( @@ -331,5 +346,5 @@ gl_font_renderer_t gl_raster_font = { gl_raster_font_free_font, gl_raster_font_render_msg, "GL raster", - gl_raster_font_get_glyph, + gl_raster_font_get_glyph }; From 8f0302c5194ed3ac4fe77a50d10c03cf79b1acc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Tue, 24 Mar 2015 16:43:53 -0300 Subject: [PATCH 2/7] (gl_font_renderer_t) Implement basic text block rendering --- gfx/drivers_font/gl_raster_font.c | 148 +++++++++++++++++++++++++++++- gfx/font_gl_driver.h | 2 + menu/drivers/glui.c | 15 ++- 3 files changed, 156 insertions(+), 9 deletions(-) diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 2293eb1c9f..432e2491aa 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -30,6 +30,14 @@ #define MAX_MSG_LEN_CHUNK 64 +typedef struct gl_raster_block { + bool active; + bool reuse; + bool fullscreen; + unsigned allocated; + struct gl_coords coords; +} gl_raster_block_t; + typedef struct { gl_t *gl; @@ -38,6 +46,8 @@ typedef struct const font_renderer_driver_t *font_driver; void *font_data; + + gl_raster_block_t block; } gl_raster_t; static void *gl_raster_font_init_font(void *gl_data, @@ -156,9 +166,81 @@ static void draw_vertices(gl_t *gl, const struct gl_coords *coords) { gl->shader->set_coords(coords); gl->shader->set_mvp(gl, &gl->mvp_no_rot); + glDrawArrays(GL_TRIANGLES, 0, coords->vertices); } +static bool realloc_checked(void **ptr, size_t size) +{ + void *nptr; + + if (size == 0) + { + if (*ptr) + free(*ptr); + *ptr = NULL; + return true; + } + + if (*ptr == NULL) + nptr = malloc(size); + else + nptr = realloc(*ptr, size); + + if (nptr) + *ptr = nptr; + + return nptr != NULL; +} + +static bool resize_block(gl_raster_t *font, unsigned new_size) +{ + gl_raster_block_t *block = &font->block; + bool success = false; + + if (!font->block.allocated || new_size > font->block.allocated - 1) + { + unsigned actual_new_size = next_pow2(new_size); + + bool vsucceeded = realloc_checked((void**)&block->coords.vertex, sizeof(GLfloat) * 2 * actual_new_size); + bool csuccceeded = realloc_checked((void**)&block->coords.color, sizeof(GLfloat) * 4 * actual_new_size); + bool tsuccceeded = realloc_checked((void**)&block->coords.tex_coord, sizeof(GLfloat) * 2 * actual_new_size); + bool lsuccceeded = realloc_checked((void**)&block->coords.lut_tex_coord, sizeof(GLfloat) * 2 * actual_new_size); + + if (vsucceeded && csuccceeded && tsuccceeded && lsuccceeded) + { + font->block.allocated = actual_new_size; + block->coords.vertices = new_size; + success = true; + } + } + else + { + block->coords.vertices = new_size; + success = true; + } + + return success; +} + +static bool append_vertices(gl_raster_t *font, const struct gl_coords *coords) +{ + gl_raster_block_t *block = &font->block; + unsigned old_size = block->coords.vertices; + if (resize_block(font, block->coords.vertices + coords->vertices)) + { + const size_t base_size = coords->vertices * sizeof(GLfloat); + memcpy((void*)(block->coords.vertex+old_size*2), coords->vertex, base_size * 2); + memcpy((void*)(block->coords.color+old_size*4), coords->color, base_size * 4); + memcpy((void*)(block->coords.tex_coord+old_size*2), coords->tex_coord, base_size * 2); + memcpy((void*)(block->coords.lut_tex_coord+old_size*2), coords->lut_tex_coord, base_size * 2); + } + else + RARCH_WARN("Allocation failed."); + + return true; +} + static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, bool align_right) { @@ -225,7 +307,10 @@ static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, coords.vertices = 6 * msg_len; coords.lut_tex_coord = gl->coords.lut_tex_coord; - draw_vertices(gl, &coords); + if (font->block.active) + append_vertices(font, &coords); + else + draw_vertices(gl, &coords); msg_len_full -= msg_len; msg += msg_len; @@ -312,7 +397,10 @@ static void gl_raster_font_render_msg(void *data, const char *msg, drop_mod = 0.3f; } - setup_viewport(font, full_screen); + if (font->block.active) + font->block.fullscreen = true; + else + setup_viewport(font, full_screen); if (drop_x || drop_y) { @@ -328,7 +416,8 @@ static void gl_raster_font_render_msg(void *data, const char *msg, render_message(font, msg, scale, color, x, y, align_right); - restore_viewport(gl); + if (!font->block.active) + restore_viewport(gl); } static const struct font_glyph *gl_raster_font_get_glyph( @@ -341,10 +430,61 @@ static const struct font_glyph *gl_raster_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } +static void gl_end_block(void *data) +{ + gl_raster_t *font = (gl_raster_t*)data; + gl_raster_block_t *block = &font->block; + gl_t *gl = font->gl; + + if (block->coords.vertices) + { + setup_viewport(font, block->fullscreen); + + draw_vertices(gl, &block->coords); + + restore_viewport(gl); + } + + if (block->reuse && block->coords.vertices) + block->coords.vertices = 0; + else + { + block->active = false; + block->allocated = 0; + resize_block(font, 0); + memset(&block->coords, 0, sizeof(block->coords)); + } +} + +static void gl_begin_block(void *data) +{ + gl_raster_t *font = (gl_raster_t*)data; + gl_raster_block_t *block = &font->block; + unsigned i = 0; + + if (block->active) + { + block->reuse = true; + gl_end_block(data); + } + + block->reuse = false; + block->active = true; + block->coords.vertices = 0; + + if (!block->allocated) + { + block->coords.color = block->coords.tex_coord = NULL; + block->coords.vertex = block->coords.lut_tex_coord = NULL; + } +} + gl_font_renderer_t gl_raster_font = { gl_raster_font_init_font, gl_raster_font_free_font, gl_raster_font_render_msg, "GL raster", - gl_raster_font_get_glyph + gl_raster_font_get_glyph, + gl_begin_block, + gl_end_block }; diff --git a/gfx/font_gl_driver.h b/gfx/font_gl_driver.h index c710dd2132..42611a7363 100644 --- a/gfx/font_gl_driver.h +++ b/gfx/font_gl_driver.h @@ -31,6 +31,8 @@ typedef struct gl_font_renderer const char *ident; const struct font_glyph *(*get_glyph)(void *data, uint32_t code); + void (*begin_block)(void *data); + void (*end_block)(void *data); } gl_font_renderer_t; extern gl_font_renderer_t gl_raster_font; diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index ae2852f804..2b850dbd52 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -72,7 +72,7 @@ static void glui_blit_line(gl_t *gl, float x, float y, const char *message, uint { struct font_params params = {0}; - gl_set_viewport(gl, gl->win_width, gl->win_height, false, false); + /* gl_set_viewport(gl, gl->win_width, gl->win_height, false, false); */ params.x = x / gl->win_width; params.y = 1.0f - y / gl->win_height; @@ -356,6 +356,9 @@ static void glui_frame(void) glui_render_background(settings, gl, glui, false); + if (gl->font_driver->begin_block) + gl->font_driver->begin_block(gl->font_handle); + menu_list_get_last_stack(menu->menu_list, &dir, &label, &menu_type); get_title(label, dir, menu_type, title, sizeof(title)); @@ -384,17 +387,16 @@ static void glui_frame(void) glui_blit_line(gl, glui->margin * 2, - glui->margin + glui->term_height * glui->line_height + glui->margin + glui->term_height * glui->line_height + glui->line_height * 2, title_msg, FONT_COLOR_ARGB_TO_RGBA(settings->menu.title_color)); } - if (settings->menu.timedate_enable) { disp_timedate_set_label(timedate, sizeof(timedate), 0); glui_blit_line(gl, glui->margin * 14, - glui->margin + glui->term_height * glui->line_height + glui->margin + glui->term_height * glui->line_height + glui->line_height * 2, timedate, hover_color); } @@ -436,7 +438,7 @@ static void glui_frame(void) 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 , + glui_blit_line(gl, gl->win_width - glui->glyph_width * w - glui->margin , y, type_str_buf, selected ? hover_color : normal_color); } @@ -458,6 +460,9 @@ static void glui_frame(void) glui->box_message[0] = '\0'; } + if (gl->font_driver->end_block) + gl->font_driver->end_block(gl->font_handle); + if (settings->menu.mouse.enable) glui_draw_cursor(gl, menu->mouse.x, menu->mouse.y); From 7d1bffc350db01d99e062fcaccc97942c4c323ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Tue, 24 Mar 2015 17:28:53 -0300 Subject: [PATCH 3/7] (gl_font_renderer_t) Implement block flushing --- gfx/drivers_font/gl_raster_font.c | 51 ++++++++++++++++++------------- gfx/font_gl_driver.h | 1 + menu/drivers/glui.c | 22 ++++++++----- menu/drivers/xmb.c | 13 +++++++- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 432e2491aa..c9f2c2aa88 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -32,7 +32,6 @@ typedef struct gl_raster_block { bool active; - bool reuse; bool fullscreen; unsigned allocated; struct gl_coords coords; @@ -430,30 +429,43 @@ static const struct font_glyph *gl_raster_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } +static void gl_flush_block(void *data) +{ + gl_raster_t *font = (gl_raster_t*)data; + gl_raster_block_t *block = &font->block; + + if (block->coords.vertices) + { + setup_viewport(font, block->fullscreen); + + draw_vertices(font->gl, &block->coords); + + restore_viewport(font->gl); + } + + block->coords.vertices = 0; +} + static void gl_end_block(void *data) { gl_raster_t *font = (gl_raster_t*)data; gl_raster_block_t *block = &font->block; gl_t *gl = font->gl; - if (block->coords.vertices) + gl_flush_block(data); + + block->active = false; + + if (block->allocated) { - setup_viewport(font, block->fullscreen); - - draw_vertices(gl, &block->coords); - - restore_viewport(gl); + free((void*)block->coords.color); + free((void*)block->coords.lut_tex_coord); + free((void*)block->coords.tex_coord); + free((void*)block->coords.vertex); } - if (block->reuse && block->coords.vertices) - block->coords.vertices = 0; - else - { - block->active = false; - block->allocated = 0; - resize_block(font, 0); - memset(&block->coords, 0, sizeof(block->coords)); - } + block->coords.vertices = 0; + block->allocated = 0; } static void gl_begin_block(void *data) @@ -463,12 +475,8 @@ static void gl_begin_block(void *data) unsigned i = 0; if (block->active) - { - block->reuse = true; - gl_end_block(data); - } + gl_flush_block(data); - block->reuse = false; block->active = true; block->coords.vertices = 0; @@ -486,5 +494,6 @@ gl_font_renderer_t gl_raster_font = { "GL raster", gl_raster_font_get_glyph, gl_begin_block, + gl_flush_block, gl_end_block }; diff --git a/gfx/font_gl_driver.h b/gfx/font_gl_driver.h index 42611a7363..a6c8a72418 100644 --- a/gfx/font_gl_driver.h +++ b/gfx/font_gl_driver.h @@ -32,6 +32,7 @@ typedef struct gl_font_renderer const struct font_glyph *(*get_glyph)(void *data, uint32_t code); void (*begin_block)(void *data); + void (*flush_block)(void *data); void (*end_block)(void *data); } gl_font_renderer_t; diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index 2b850dbd52..e421863a14 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -326,6 +326,7 @@ static void glui_frame(void) settings_t *settings = config_get_ptr(); const uint32_t normal_color = FONT_COLOR_ARGB_TO_RGBA(settings->menu.entry_normal_color); const uint32_t hover_color = FONT_COLOR_ARGB_TO_RGBA(settings->menu.entry_hover_color); + const uint32_t title_color = FONT_COLOR_ARGB_TO_RGBA(settings->menu.title_color); runloop_t *runloop = rarch_main_get_ptr(); global_t *global = global_get_ptr(); @@ -356,9 +357,6 @@ static void glui_frame(void) glui_render_background(settings, gl, glui, false); - if (gl->font_driver->begin_block) - gl->font_driver->begin_block(gl->font_handle); - menu_list_get_last_stack(menu->menu_list, &dir, &label, &menu_type); get_title(label, dir, menu_type, title, sizeof(title)); @@ -366,7 +364,7 @@ static void glui_frame(void) menu_animation_ticker_line(title_buf, glui->term_width - 3, runloop->frames.video.count / glui->margin, title, true); glui_blit_line(gl, glui->margin * 2, glui->margin + glui->line_height, - title_buf, FONT_COLOR_ARGB_TO_RGBA(settings->menu.title_color)); + title_buf, title_color); core_name = global->menu.info.library_name; if (!core_name) @@ -388,7 +386,7 @@ static void glui_frame(void) glui_blit_line(gl, glui->margin * 2, glui->margin + glui->term_height * glui->line_height - + glui->line_height * 2, title_msg, FONT_COLOR_ARGB_TO_RGBA(settings->menu.title_color)); + + glui->line_height * 2, title_msg, title_color); } if (settings->menu.timedate_enable) @@ -460,12 +458,12 @@ static void glui_frame(void) glui->box_message[0] = '\0'; } - if (gl->font_driver->end_block) - gl->font_driver->end_block(gl->font_handle); - if (settings->menu.mouse.enable) glui_draw_cursor(gl, menu->mouse.x, menu->mouse.y); + if (gl->font_driver->flush_block) + gl->font_driver->flush_block(gl->font_handle); + gl_set_viewport(gl, gl->win_width, gl->win_height, false, true); } @@ -495,6 +493,9 @@ static void *glui_init(void) glui = (glui_handle_t*)menu->userdata; glui->textures.bg.id = 0; + if (gl->font_driver->begin_block) + gl->font_driver->begin_block(gl->font_handle); + return menu; error: if (menu) @@ -504,8 +505,13 @@ error: static void glui_free(void *data) { + gl_t *gl = (gl_t*)video_driver_get_ptr(NULL); + menu_handle_t *menu = (menu_handle_t*)data; + if (gl->font_driver->end_block) + gl->font_driver->end_block(gl->font_handle); + if (menu->alloc_font) free((uint8_t*)menu->font); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index d2ad33de4d..89edd668c3 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -397,7 +397,7 @@ static void xmb_draw_text(gl_t *gl, xmb_handle_t *xmb, const char *str, float x, || y < -xmb->icon.size || y > gl->win_height + xmb->icon.size) return; - gl_set_viewport(gl, gl->win_width, gl->win_height, false, false); + /* gl_set_viewport(gl, gl->win_width, gl->win_height, false, false); */ params.x = x / gl->win_width; params.y = 1.0f - y / gl->win_height; @@ -1165,6 +1165,7 @@ static void xmb_draw_items(xmb_handle_t *xmb, gl_t *gl, xmb_draw_icon_end(gl, xmb); } + } static void xmb_draw_cursor(gl_t *gl, xmb_handle_t *xmb, float x, float y) @@ -1377,6 +1378,9 @@ static void xmb_frame(void) xmb_frame_messagebox(msg); } + if (gl->font_driver->flush_block) + gl->font_driver->flush_block(gl->font_handle); + if (settings->menu.mouse.enable) xmb_draw_cursor(gl, xmb, menu->mouse.x, menu->mouse.y); @@ -1482,6 +1486,9 @@ static void *xmb_init(void) if (global->core_info) menu->categories.size = global->core_info->count + 1; + if (gl->font_driver->begin_block) + gl->font_driver->begin_block(gl->font_handle); + return menu; error: @@ -1497,9 +1504,13 @@ error: static void xmb_free(void *data) { menu_handle_t *menu = (menu_handle_t*)data; + gl_t *gl = (gl_t*)video_driver_get_ptr(NULL); if (menu && menu->userdata) free(menu->userdata); + + if (gl->font_driver->begin_block) + gl->font_driver->begin_block(gl->font_handle); } static bool xmb_font_init_first(const gl_font_renderer_t **font_driver, From 539e77b122e091d0a79c9f1a16d659b4dfd93ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 25 Mar 2015 09:48:09 -0300 Subject: [PATCH 4/7] (gl) Add gl_coord_array_t --- gfx/gl_common.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ gfx/gl_common.h | 22 +++++++++++++-- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/gfx/gl_common.c b/gfx/gl_common.c index 8a0ae3c111..1f63fedd1b 100644 --- a/gfx/gl_common.c +++ b/gfx/gl_common.c @@ -125,3 +125,77 @@ bool gl_load_luts(const struct video_shader *shader, glBindTexture(GL_TEXTURE_2D, 0); return true; } + +static INLINE bool realloc_checked(void **ptr, size_t size) +{ + void *nptr; + + if (*ptr) + nptr = realloc(*ptr, size); + else + nptr = malloc(size); + + if (nptr) + *ptr = nptr; + + return *ptr == nptr; +} + +bool gl_coord_array_add(gl_coord_array_t *ca, const gl_coords_t *coords, unsigned count) +{ + bool success = false; + count = min(count, coords->vertices); + + if (ca->coords.vertices + count >= ca->allocated) + { + unsigned alloc_size = next_pow2(ca->coords.vertices + count); + size_t base_size = sizeof(GLfloat) * alloc_size; + + bool vert_ok = realloc_checked((void**)&ca->coords.vertex, 2 * base_size); + bool color_ok = realloc_checked((void**)&ca->coords.color, 4 * base_size); + bool tex_ok = realloc_checked((void**)&ca->coords.tex_coord, 2 * base_size); + bool lut_ok = realloc_checked((void**)&ca->coords.lut_tex_coord, 2 * base_size); + + if (vert_ok && color_ok && tex_ok && lut_ok) + { + ca->allocated = alloc_size; + success = true; + } + } + else + success = true; + + if (success) + { + size_t base_size = coords->vertices * sizeof(GLfloat); + size_t offset = ca->coords.vertices; + + /* XXX: i wish we used interlaced arrays so we could call memcpy only once */ + memcpy(ca->coords.vertex + offset * 2, coords->vertex, base_size * 2); + memcpy(ca->coords.color + offset * 4, coords->color, base_size * 4); + memcpy(ca->coords.tex_coord + offset * 2, coords->tex_coord, base_size * 2); + memcpy(ca->coords.lut_tex_coord + offset * 2, coords->lut_tex_coord, base_size * 2); + + ca->coords.vertices += count; + } + else + RARCH_WARN("Allocation failed."); + + return success; +} + +void gl_coord_array_release(gl_coord_array_t *ca) +{ + free(ca->coords.vertex); + free(ca->coords.color); + free(ca->coords.tex_coord); + free(ca->coords.lut_tex_coord); + + ca->coords.vertex = NULL; + ca->coords.color = NULL; + ca->coords.tex_coord = NULL; + ca->coords.lut_tex_coord = NULL; + + ca->coords.vertices = 0; + ca->allocated = 0; +} diff --git a/gfx/gl_common.h b/gfx/gl_common.h index 30ed555f62..0589670899 100644 --- a/gfx/gl_common.h +++ b/gfx/gl_common.h @@ -231,14 +231,29 @@ struct gl_tex_info GLfloat coord[8]; }; -struct gl_coords +typedef struct gl_coords { const GLfloat *vertex; const GLfloat *color; const GLfloat *tex_coord; const GLfloat *lut_tex_coord; unsigned vertices; -}; +} gl_coords_t; + +typedef struct gl_mut_coords +{ + GLfloat *vertex; + GLfloat *color; + GLfloat *tex_coord; + GLfloat *lut_tex_coord; + unsigned vertices; +} gl_mut_coords_t; + +typedef struct gl_coord_array +{ + gl_mut_coords_t coords; + unsigned allocated; +} gl_coord_array_t; typedef struct gl { @@ -422,4 +437,7 @@ static INLINE unsigned gl_wrap_type_to_enum(enum gfx_wrap_type type) return 0; } +bool gl_coord_array_add(gl_coord_array_t *ca, const gl_coords_t *coords, unsigned count); +void gl_coord_array_release(gl_coord_array_t *ca); + #endif From ed6f1cfdd31f2d388d316f9cb970bb86db233adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 25 Mar 2015 09:48:47 -0300 Subject: [PATCH 5/7] (gl_raster_font) Make use of gl_coord_array_t --- gfx/drivers_font/gl_raster_font.c | 131 +++++------------------------- menu/drivers/xmb.c | 4 +- 2 files changed, 22 insertions(+), 113 deletions(-) diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index c9f2c2aa88..6a2defd87b 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -31,10 +31,8 @@ #define MAX_MSG_LEN_CHUNK 64 typedef struct gl_raster_block { - bool active; bool fullscreen; - unsigned allocated; - struct gl_coords coords; + gl_coord_array_t carr; } gl_raster_block_t; typedef struct @@ -46,7 +44,7 @@ typedef struct const font_renderer_driver_t *font_driver; void *font_data; - gl_raster_block_t block; + gl_raster_block_t *block; } gl_raster_t; static void *gl_raster_font_init_font(void *gl_data, @@ -161,7 +159,7 @@ static int get_message_width(gl_raster_t *font, const char *msg) return delta_x; } -static void draw_vertices(gl_t *gl, const struct gl_coords *coords) +static void draw_vertices(gl_t *gl, const gl_coords_t *coords) { gl->shader->set_coords(coords); gl->shader->set_mvp(gl, &gl->mvp_no_rot); @@ -169,77 +167,6 @@ static void draw_vertices(gl_t *gl, const struct gl_coords *coords) glDrawArrays(GL_TRIANGLES, 0, coords->vertices); } -static bool realloc_checked(void **ptr, size_t size) -{ - void *nptr; - - if (size == 0) - { - if (*ptr) - free(*ptr); - *ptr = NULL; - return true; - } - - if (*ptr == NULL) - nptr = malloc(size); - else - nptr = realloc(*ptr, size); - - if (nptr) - *ptr = nptr; - - return nptr != NULL; -} - -static bool resize_block(gl_raster_t *font, unsigned new_size) -{ - gl_raster_block_t *block = &font->block; - bool success = false; - - if (!font->block.allocated || new_size > font->block.allocated - 1) - { - unsigned actual_new_size = next_pow2(new_size); - - bool vsucceeded = realloc_checked((void**)&block->coords.vertex, sizeof(GLfloat) * 2 * actual_new_size); - bool csuccceeded = realloc_checked((void**)&block->coords.color, sizeof(GLfloat) * 4 * actual_new_size); - bool tsuccceeded = realloc_checked((void**)&block->coords.tex_coord, sizeof(GLfloat) * 2 * actual_new_size); - bool lsuccceeded = realloc_checked((void**)&block->coords.lut_tex_coord, sizeof(GLfloat) * 2 * actual_new_size); - - if (vsucceeded && csuccceeded && tsuccceeded && lsuccceeded) - { - font->block.allocated = actual_new_size; - block->coords.vertices = new_size; - success = true; - } - } - else - { - block->coords.vertices = new_size; - success = true; - } - - return success; -} - -static bool append_vertices(gl_raster_t *font, const struct gl_coords *coords) -{ - gl_raster_block_t *block = &font->block; - unsigned old_size = block->coords.vertices; - if (resize_block(font, block->coords.vertices + coords->vertices)) - { - const size_t base_size = coords->vertices * sizeof(GLfloat); - memcpy((void*)(block->coords.vertex+old_size*2), coords->vertex, base_size * 2); - memcpy((void*)(block->coords.color+old_size*4), coords->color, base_size * 4); - memcpy((void*)(block->coords.tex_coord+old_size*2), coords->tex_coord, base_size * 2); - memcpy((void*)(block->coords.lut_tex_coord+old_size*2), coords->lut_tex_coord, base_size * 2); - } - else - RARCH_WARN("Allocation failed."); - - return true; -} - static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, bool align_right) { @@ -273,7 +200,7 @@ static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, for (i = 0; i < msg_len; i++) { int off_x, off_y, tex_x, tex_y, width, height; - const struct font_glyph *glyph = + const struct font_glyph *glyph = font->font_driver->get_glyph(font->font_data, (uint8_t)msg[i]); if (!glyph) glyph = font->font_driver->get_glyph(font->font_data, '?'); /* Do something smarter here ... */ @@ -306,8 +233,8 @@ static void render_message(gl_raster_t *font, const char *msg, GLfloat scale, coords.vertices = 6 * msg_len; coords.lut_tex_coord = gl->coords.lut_tex_coord; - if (font->block.active) - append_vertices(font, &coords); + if (font->block) + gl_coord_array_add(&font->block->carr, &coords, coords.vertices); else draw_vertices(gl, &coords); @@ -396,8 +323,8 @@ static void gl_raster_font_render_msg(void *data, const char *msg, drop_mod = 0.3f; } - if (font->block.active) - font->block.fullscreen = true; + if (font->block) + font->block->fullscreen = true; else setup_viewport(font, full_screen); @@ -415,7 +342,7 @@ static void gl_raster_font_render_msg(void *data, const char *msg, render_message(font, msg, scale, color, x, y, align_right); - if (!font->block.active) + if (!font->block) restore_viewport(gl); } @@ -431,60 +358,42 @@ static const struct font_glyph *gl_raster_font_get_glyph( static void gl_flush_block(void *data) { - gl_raster_t *font = (gl_raster_t*)data; - gl_raster_block_t *block = &font->block; + gl_raster_t *font = (gl_raster_t*)data; + gl_raster_block_t *block = font->block; - if (block->coords.vertices) + if (block->carr.coords.vertices) { setup_viewport(font, block->fullscreen); - draw_vertices(font->gl, &block->coords); + draw_vertices(font->gl, (gl_coords_t*)&block->carr.coords); restore_viewport(font->gl); } - block->coords.vertices = 0; + block->carr.coords.vertices = 0; } static void gl_end_block(void *data) { gl_raster_t *font = (gl_raster_t*)data; - gl_raster_block_t *block = &font->block; gl_t *gl = font->gl; gl_flush_block(data); - block->active = false; - - if (block->allocated) - { - free((void*)block->coords.color); - free((void*)block->coords.lut_tex_coord); - free((void*)block->coords.tex_coord); - free((void*)block->coords.vertex); - } - - block->coords.vertices = 0; - block->allocated = 0; + gl_coord_array_release(&font->block->carr); + free(font->block); + font->block = NULL; } static void gl_begin_block(void *data) { gl_raster_t *font = (gl_raster_t*)data; - gl_raster_block_t *block = &font->block; unsigned i = 0; - if (block->active) - gl_flush_block(data); + if (font->block) + return; - block->active = true; - block->coords.vertices = 0; - - if (!block->allocated) - { - block->coords.color = block->coords.tex_coord = NULL; - block->coords.vertex = block->coords.lut_tex_coord = NULL; - } + font->block = calloc(1, sizeof(gl_raster_block_t)); } gl_font_renderer_t gl_raster_font = { diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 89edd668c3..685c9cc20a 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1509,8 +1509,8 @@ static void xmb_free(void *data) if (menu && menu->userdata) free(menu->userdata); - if (gl->font_driver->begin_block) - gl->font_driver->begin_block(gl->font_handle); + if (gl->font_driver->end_block) + gl->font_driver->end_block(gl->font_handle); } static bool xmb_font_init_first(const gl_font_renderer_t **font_driver, From 8b7bbc7975a579c3bd39e42b328c39875bafde47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 25 Mar 2015 11:04:53 -0300 Subject: [PATCH 6/7] (gl_font_renderer_t) Implement swappable blocks and remove end_block pointer --- gfx/drivers/gl.c | 1 + gfx/drivers_font/gl_raster_font.c | 34 +++++++------------------------ gfx/drivers_font/ps_libdbgfont.c | 1 + gfx/font_gl_driver.h | 12 ++++++++--- gfx/gl_common.c | 3 +++ gfx/gl_common.h | 6 ++++-- menu/drivers/glui.c | 15 ++++++++------ menu/drivers/xmb.c | 16 +++++++++------ 8 files changed, 44 insertions(+), 44 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 426efad4de..fc99bf59f7 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -39,6 +39,7 @@ #endif #include "../gl_common.h" +#include "../font_gl_driver.h" #include "../video_viewport.h" #include "../video_pixel_converter.h" #include "../video_context_driver.h" diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 6a2defd87b..d07a984e1a 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -15,6 +15,7 @@ */ #include "../gl_common.h" +#include "../font_gl_driver.h" #include "../video_shader_driver.h" #define emit(c, vx, vy) do { \ @@ -30,11 +31,6 @@ #define MAX_MSG_LEN_CHUNK 64 -typedef struct gl_raster_block { - bool fullscreen; - gl_coord_array_t carr; -} gl_raster_block_t; - typedef struct { gl_t *gl; @@ -44,7 +40,7 @@ typedef struct const font_renderer_driver_t *font_driver; void *font_data; - gl_raster_block_t *block; + gl_font_raster_block_t *block; } gl_raster_t; static void *gl_raster_font_init_font(void *gl_data, @@ -359,7 +355,7 @@ static const struct font_glyph *gl_raster_font_get_glyph( static void gl_flush_block(void *data) { gl_raster_t *font = (gl_raster_t*)data; - gl_raster_block_t *block = font->block; + gl_font_raster_block_t *block = font->block; if (block->carr.coords.vertices) { @@ -373,27 +369,12 @@ static void gl_flush_block(void *data) block->carr.coords.vertices = 0; } -static void gl_end_block(void *data) -{ - gl_raster_t *font = (gl_raster_t*)data; - gl_t *gl = font->gl; - - gl_flush_block(data); - - gl_coord_array_release(&font->block->carr); - free(font->block); - font->block = NULL; -} - -static void gl_begin_block(void *data) +static void gl_bind_block(void *data, gl_font_raster_block_t *block) { gl_raster_t *font = (gl_raster_t*)data; unsigned i = 0; - if (font->block) - return; - - font->block = calloc(1, sizeof(gl_raster_block_t)); + font->block = block; } gl_font_renderer_t gl_raster_font = { @@ -402,7 +383,6 @@ gl_font_renderer_t gl_raster_font = { gl_raster_font_render_msg, "GL raster", gl_raster_font_get_glyph, - gl_begin_block, - gl_flush_block, - gl_end_block + gl_bind_block, + gl_flush_block }; diff --git a/gfx/drivers_font/ps_libdbgfont.c b/gfx/drivers_font/ps_libdbgfont.c index 9fb73a95a5..76dd7078a7 100644 --- a/gfx/drivers_font/ps_libdbgfont.c +++ b/gfx/drivers_font/ps_libdbgfont.c @@ -16,6 +16,7 @@ #include "../font_renderer_driver.h" #include "../gl_common.h" +#include "../font_gl_driver.h" #if defined(SN_TARGET_PSP2) #include diff --git a/gfx/font_gl_driver.h b/gfx/font_gl_driver.h index a6c8a72418..27bba314c2 100644 --- a/gfx/font_gl_driver.h +++ b/gfx/font_gl_driver.h @@ -18,10 +18,17 @@ #define __FONT_GL_DRIVER_H__ #include "../driver.h" +#include "gl_common.h" #include struct font_glyph; +/* XXX: please include gl_common.h before this file */ +typedef struct gl_raster_block { + bool fullscreen; + gl_coord_array_t carr; +} gl_font_raster_block_t; + typedef struct gl_font_renderer { void *(*init)(void *data, const char *font_path, float font_size); @@ -31,9 +38,8 @@ typedef struct gl_font_renderer const char *ident; const struct font_glyph *(*get_glyph)(void *data, uint32_t code); - void (*begin_block)(void *data); - void (*flush_block)(void *data); - void (*end_block)(void *data); + void (*bind_block)(void *data, gl_font_raster_block_t *block); + void (*flush)(void *data); } gl_font_renderer_t; extern gl_font_renderer_t gl_raster_font; diff --git a/gfx/gl_common.c b/gfx/gl_common.c index 1f63fedd1b..76d12b9cc3 100644 --- a/gfx/gl_common.c +++ b/gfx/gl_common.c @@ -186,6 +186,9 @@ bool gl_coord_array_add(gl_coord_array_t *ca, const gl_coords_t *coords, unsigne void gl_coord_array_release(gl_coord_array_t *ca) { + if (!ca->allocated) + return; + free(ca->coords.vertex); free(ca->coords.color); free(ca->coords.tex_coord); diff --git a/gfx/gl_common.h b/gfx/gl_common.h index 0589670899..acc0c488b7 100644 --- a/gfx/gl_common.h +++ b/gfx/gl_common.h @@ -21,7 +21,7 @@ #include "font_renderer_driver.h" #include #include -#include "font_gl_driver.h" +//#include "font_gl_driver.h" #include #include "video_shader_driver.h" #include @@ -255,6 +255,8 @@ typedef struct gl_coord_array unsigned allocated; } gl_coord_array_t; +struct gl_font_renderer; + typedef struct gl { const gfx_ctx_driver_t *ctx_driver; @@ -333,7 +335,7 @@ typedef struct gl #endif /* Fonts */ - const gl_font_renderer_t *font_driver; + const struct gl_font_renderer *font_driver; void *font_handle; bool egl_images; diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index e421863a14..aa54887742 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -25,6 +25,7 @@ #include #include "../../gfx/gl_common.h" +#include "../../gfx/font_gl_driver.h" #include "../../gfx/video_texture.h" #include @@ -46,6 +47,8 @@ typedef struct glui_handle char path[PATH_MAX_LENGTH]; } bg; } textures; + + gl_font_raster_block_t raster_block; } glui_handle_t; static int glui_entry_iterate(unsigned action) @@ -461,8 +464,8 @@ static void glui_frame(void) if (settings->menu.mouse.enable) glui_draw_cursor(gl, menu->mouse.x, menu->mouse.y); - if (gl->font_driver->flush_block) - gl->font_driver->flush_block(gl->font_handle); + if (gl->font_driver->flush) + gl->font_driver->flush(gl->font_handle); gl_set_viewport(gl, gl->win_width, gl->win_height, false, true); } @@ -493,8 +496,8 @@ static void *glui_init(void) glui = (glui_handle_t*)menu->userdata; glui->textures.bg.id = 0; - if (gl->font_driver->begin_block) - gl->font_driver->begin_block(gl->font_handle); + if (gl->font_driver->bind_block) + gl->font_driver->bind_block(gl->font_handle, &glui->raster_block); return menu; error: @@ -508,9 +511,9 @@ static void glui_free(void *data) gl_t *gl = (gl_t*)video_driver_get_ptr(NULL); menu_handle_t *menu = (menu_handle_t*)data; + glui_handle_t *glui = (glui_handle_t*)menu->userdata; - if (gl->font_driver->end_block) - gl->font_driver->end_block(gl->font_handle); + gl_coord_array_release(&glui->raster_block.carr); if (menu->alloc_font) free((uint8_t*)menu->font); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 685c9cc20a..51244d2160 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -211,6 +211,8 @@ typedef struct xmb_handle xmb_node_t settings_node; bool prevent_populate; + + gl_font_raster_block_t raster_block; } xmb_handle_t; static const GLfloat rmb_vertex[] = { @@ -1378,8 +1380,8 @@ static void xmb_frame(void) xmb_frame_messagebox(msg); } - if (gl->font_driver->flush_block) - gl->font_driver->flush_block(gl->font_handle); + if (gl->font_driver->flush) + gl->font_driver->flush(gl->font_handle); if (settings->menu.mouse.enable) xmb_draw_cursor(gl, xmb, menu->mouse.x, menu->mouse.y); @@ -1486,8 +1488,8 @@ static void *xmb_init(void) if (global->core_info) menu->categories.size = global->core_info->count + 1; - if (gl->font_driver->begin_block) - gl->font_driver->begin_block(gl->font_handle); + if (gl->font_driver->bind_block) + gl->font_driver->bind_block(gl->font_handle, &xmb->raster_block); return menu; @@ -1504,13 +1506,15 @@ error: static void xmb_free(void *data) { menu_handle_t *menu = (menu_handle_t*)data; + xmb_handle_t *xmb = NULL; gl_t *gl = (gl_t*)video_driver_get_ptr(NULL); if (menu && menu->userdata) free(menu->userdata); - if (gl->font_driver->end_block) - gl->font_driver->end_block(gl->font_handle); + xmb = (xmb_handle_t*)menu->userdata; + + gl_coord_array_release(&xmb->raster_block.carr); } static bool xmb_font_init_first(const gl_font_renderer_t **font_driver, From d3d976c92ba4a52b74e59c982d966f9b3cd3efe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 25 Mar 2015 11:44:54 -0300 Subject: [PATCH 7/7] (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)