From 34622f63ed14cb1d0779b911b32b38eb2eebebb2 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 27 Feb 2015 01:25:08 +0100 Subject: [PATCH] (Overlay) Back to the drawing board --- input/input_overlay.c | 107 ++++++++++++++++++++++-------------------- input/input_overlay.h | 6 ++- runloop.c | 4 ++ 3 files changed, 66 insertions(+), 51 deletions(-) diff --git a/input/input_overlay.c b/input/input_overlay.c index 3814325f03..79d7ac51ec 100644 --- a/input/input_overlay.c +++ b/input/input_overlay.c @@ -451,15 +451,34 @@ static bool input_overlay_resolve_targets(struct overlay *ol, return true; } -static bool input_overlay_load_overlays_resolve_iterate(input_overlay_t *ol) +bool input_overlay_load_overlays_resolve_iterate(input_overlay_t *ol) { + bool not_done = true; + if (!ol) return false; + not_done = ol->pos < ol->size; + + if (!not_done) + { + ol->state = OVERLAY_STATUS_DEFERRED_DONE; + return true; + } + if (!input_overlay_resolve_targets(ol->overlays, ol->pos, ol->size)) - return false; + { + RARCH_ERR("[Overlay]: Failed to resolve next targets.\n"); + goto error; + } + + ol->pos += 1; return true; +error: + ol->state = OVERLAY_STATUS_DEFERRED_ERROR; + + return false; } @@ -470,8 +489,8 @@ static bool input_overlay_load_overlay_image_done(struct overlay *overlay) overlay->pos = 0; /* Divide iteration steps by half of total descs if size is even, - * otherwise default to 1. */ - overlay->pos_increment = (overlay->size / 2) ? (overlay->size / 2) : 1; + * otherwise default to 8 (arbitrary value for now to speed things up). */ + overlay->pos_increment = (overlay->size / 2) ? (overlay->size / 2) : 8; #if 0 RARCH_LOG("pos increment: %u\n", overlay->pos_increment); @@ -480,40 +499,6 @@ static bool input_overlay_load_overlay_image_done(struct overlay *overlay) return true; } -static void input_overlay_load_active(input_overlay_t *ol, - float opacity) -{ - if (!ol) - return; - - ol->iface->load(ol->iface_data, ol->active->load_images, - ol->active->load_images_size); - - input_overlay_set_alpha_mod(ol, opacity); - input_overlay_set_vertex_geom(ol); - ol->iface->full_screen(ol->iface_data, ol->active->full_screen); -} - -static bool input_overlay_render_active(input_overlay_t *ol) -{ - if (!ol) - return false; - - ol->active = &ol->overlays[0]; - - input_overlay_load_active(ol, ol->deferred.opacity); - input_overlay_enable(ol, ol->deferred.enable); - - input_overlay_set_alpha_mod(ol, ol->deferred.opacity); - input_overlay_set_scale_factor(ol, ol->deferred.scale_factor); - ol->next_index = (ol->index + 1) % ol->size; - - ol->state = OVERLAY_STATUS_ALIVE; - - - return true; -} - bool input_overlay_load_overlays_iterate(input_overlay_t *ol) { bool not_done = true; @@ -526,8 +511,7 @@ bool input_overlay_load_overlays_iterate(input_overlay_t *ol) if (!not_done) { ol->pos = 0; - ol->state = OVERLAY_STATUS_DEFERRED_DONE; - ol->loading_status = OVERLAY_IMAGE_TRANSFER_NONE; + ol->state = OVERLAY_STATUS_DEFERRED_LOADING_RESOLVE; return true; } @@ -555,17 +539,8 @@ bool input_overlay_load_overlays_iterate(input_overlay_t *ol) } break; case OVERLAY_IMAGE_TRANSFER_DESC_DONE: - if (!input_overlay_load_overlays_resolve_iterate(ol)) - { - RARCH_ERR("[Overlay]: Failed to resolve next targets.\n"); - goto error; - } - if (ol->pos == 0) - { - /* First active overlay, load and render already. */ - input_overlay_render_active(driver.overlay); - } ol->pos += 1; + ol->loading_status = OVERLAY_IMAGE_TRANSFER_NONE; break; case OVERLAY_IMAGE_TRANSFER_ERROR: goto error; @@ -728,7 +703,39 @@ error: return false; } +static void input_overlay_load_active(input_overlay_t *ol, + float opacity) +{ + if (!ol) + return; + ol->iface->load(ol->iface_data, ol->active->load_images, + ol->active->load_images_size); + + input_overlay_set_alpha_mod(ol, opacity); + input_overlay_set_vertex_geom(ol); + ol->iface->full_screen(ol->iface_data, ol->active->full_screen); +} + +bool input_overlay_new_done(input_overlay_t *ol) +{ + if (!ol) + return false; + + ol->active = &ol->overlays[0]; + + input_overlay_load_active(ol, ol->deferred.opacity); + input_overlay_enable(ol, ol->deferred.enable); + + input_overlay_set_alpha_mod(ol, ol->deferred.opacity); + input_overlay_set_scale_factor(ol, ol->deferred.scale_factor); + ol->next_index = (ol->index + 1) % ol->size; + + ol->state = OVERLAY_STATUS_ALIVE; + + + return true; +} /** * input_overlay_new: diff --git a/input/input_overlay.h b/input/input_overlay.h index 952267ec90..588cd925e4 100644 --- a/input/input_overlay.h +++ b/input/input_overlay.h @@ -75,6 +75,7 @@ enum overlay_status OVERLAY_STATUS_DEFERRED_LOADING_IMAGE, OVERLAY_STATUS_DEFERRED_LOADING_IMAGE_PROCESS, OVERLAY_STATUS_DEFERRED_LOADING, + OVERLAY_STATUS_DEFERRED_LOADING_RESOLVE, OVERLAY_STATUS_DEFERRED_DONE, OVERLAY_STATUS_DEFERRED_ERROR, OVERLAY_STATUS_ALIVE, @@ -237,6 +238,10 @@ bool input_overlay_load_overlays_image_iterate(input_overlay_t *ol); bool input_overlay_load_overlays_iterate(input_overlay_t *ol); +bool input_overlay_load_overlays_resolve_iterate(input_overlay_t *ol); + +bool input_overlay_new_done(input_overlay_t *ol); + /** * input_overlay_free: * @ol : Overlay handle. @@ -333,4 +338,3 @@ void input_overlay_next(input_overlay_t *ol, float opacity); #endif #endif - diff --git a/runloop.c b/runloop.c index 9479a949a8..d0f4020ad3 100644 --- a/runloop.c +++ b/runloop.c @@ -888,7 +888,11 @@ void rarch_main_iterate_overlay_state(void) case OVERLAY_STATUS_DEFERRED_LOADING: input_overlay_load_overlays_iterate(driver.overlay); 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);