summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2014-10-09 18:39:44 -0500
committerJason Ekstrand <jason.ekstrand@intel.com>2014-10-10 05:18:27 -0700
commit4c582666dda2f824757c6a3f8019a9c830b4b7de (patch)
treeebd6bbe63dbe7bf59bb1e3286a27fb61bdc32a0b
parent32d9ea1c8acbbc401efc18081a7e912302de9c2d (diff)
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>
-rw-r--r--src/gl-renderer.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index f7f29b3d..076c2423 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -70,6 +70,7 @@ struct gl_border_image {
struct gl_output_state {
EGLSurface egl_surface;
pixman_region32_t buffer_damage[BUFFER_DAMAGE_COUNT];
+ int buffer_damage_index;
enum gl_border_status border_damage[BUFFER_DAMAGE_COUNT];
struct gl_border_image borders[4];
enum gl_border_status border_status;
@@ -815,7 +816,7 @@ output_get_damage(struct weston_output *output,
*border_damage = BORDER_ALL_DIRTY;
} else {
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 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++)
pixman_region32_union(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_renderer *gr = get_renderer(output->compositor);
- int i;
if (!gr->has_egl_buffer_age)
return;
- for (i = BUFFER_DAMAGE_COUNT - 1; i >= 1; i--) {
- go->border_damage[i] = go->border_damage[i - 1];
- pixman_region32_copy(&go->buffer_damage[i],
- &go->buffer_damage[i - 1]);
- }
+ go->buffer_damage_index += BUFFER_DAMAGE_COUNT - 1;
+ go->buffer_damage_index %= BUFFER_DAMAGE_COUNT;
- go->border_damage[0] = border_status;
- pixman_region32_copy(&go->buffer_damage[0], output_damage);
+ pixman_region32_copy(&go->buffer_damage[go->buffer_damage_index], output_damage);
+ go->border_damage[go->buffer_damage_index] = border_status;
}
static void
@@ -1783,6 +1780,8 @@ gl_renderer_output_create(struct weston_output *output,
for (i = 0; i < BUFFER_DAMAGE_COUNT; i++)
pixman_region32_init(&go->buffer_damage[i]);
+ go->buffer_damage_index = 0;
+
output->renderer_state = go;
log_egl_config_info(gr->egl_display, egl_config);