(Overlay) Back to the drawing board

This commit is contained in:
twinaphex 2015-02-27 01:25:08 +01:00
parent bb682d1ed4
commit 34622f63ed
3 changed files with 66 additions and 51 deletions

View File

@ -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:

View File

@ -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

View File

@ -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);