gl-renderer: don't move memory in output_rotate_damage

output_rotate_damage shifted an array of pixman regions with a loop.  Now
it uses an index into that array.

This currently only saves 1 pixman_region32_copy, but we can now raise
BUFFER_DAMAGE_COUNT without a performance impact if we run into a
configuration where this is useful.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
dev
Derek Foreman 10 years ago committed by Jason Ekstrand
parent 32d9ea1c8a
commit 4c582666dd
  1. 19
      src/gl-renderer.c

@ -70,6 +70,7 @@ struct gl_border_image {
struct gl_output_state { struct gl_output_state {
EGLSurface egl_surface; EGLSurface egl_surface;
pixman_region32_t buffer_damage[BUFFER_DAMAGE_COUNT]; pixman_region32_t buffer_damage[BUFFER_DAMAGE_COUNT];
int buffer_damage_index;
enum gl_border_status border_damage[BUFFER_DAMAGE_COUNT]; enum gl_border_status border_damage[BUFFER_DAMAGE_COUNT];
struct gl_border_image borders[4]; struct gl_border_image borders[4];
enum gl_border_status border_status; enum gl_border_status border_status;
@ -815,7 +816,7 @@ output_get_damage(struct weston_output *output,
*border_damage = BORDER_ALL_DIRTY; *border_damage = BORDER_ALL_DIRTY;
} else { } else {
for (i = 0; i < buffer_age - 1; i++) for (i = 0; i < buffer_age - 1; i++)
*border_damage |= go->border_damage[i]; *border_damage |= go->border_damage[(go->buffer_damage_index + i) % BUFFER_DAMAGE_COUNT];
if (*border_damage & BORDER_SIZE_CHANGED) { if (*border_damage & BORDER_SIZE_CHANGED) {
/* If we've had a resize, we have to do a full /* If we've had a resize, we have to do a full
@ -826,7 +827,7 @@ output_get_damage(struct weston_output *output,
for (i = 0; i < buffer_age - 1; i++) for (i = 0; i < buffer_age - 1; i++)
pixman_region32_union(buffer_damage, pixman_region32_union(buffer_damage,
buffer_damage, buffer_damage,
&go->buffer_damage[i]); &go->buffer_damage[(go->buffer_damage_index + i) % BUFFER_DAMAGE_COUNT]);
} }
} }
} }
@ -838,19 +839,15 @@ output_rotate_damage(struct weston_output *output,
{ {
struct gl_output_state *go = get_output_state(output); struct gl_output_state *go = get_output_state(output);
struct gl_renderer *gr = get_renderer(output->compositor); struct gl_renderer *gr = get_renderer(output->compositor);
int i;
if (!gr->has_egl_buffer_age) if (!gr->has_egl_buffer_age)
return; return;
for (i = BUFFER_DAMAGE_COUNT - 1; i >= 1; i--) { go->buffer_damage_index += BUFFER_DAMAGE_COUNT - 1;
go->border_damage[i] = go->border_damage[i - 1]; go->buffer_damage_index %= BUFFER_DAMAGE_COUNT;
pixman_region32_copy(&go->buffer_damage[i],
&go->buffer_damage[i - 1]);
}
go->border_damage[0] = border_status; pixman_region32_copy(&go->buffer_damage[go->buffer_damage_index], output_damage);
pixman_region32_copy(&go->buffer_damage[0], output_damage); go->border_damage[go->buffer_damage_index] = border_status;
} }
static void static void
@ -1783,6 +1780,8 @@ gl_renderer_output_create(struct weston_output *output,
for (i = 0; i < BUFFER_DAMAGE_COUNT; i++) for (i = 0; i < BUFFER_DAMAGE_COUNT; i++)
pixman_region32_init(&go->buffer_damage[i]); pixman_region32_init(&go->buffer_damage[i]);
go->buffer_damage_index = 0;
output->renderer_state = go; output->renderer_state = go;
log_egl_config_info(gr->egl_display, egl_config); log_egl_config_info(gr->egl_display, egl_config);

Loading…
Cancel
Save