compositor: Move buffer damage fields from weston_output to gl-renderer
Move fields current_buffer and buffer_damage out of weston_output into
gl_output_state, since they are actually specific to the renderer.
Also bring back the previous_damage field so that the screenshooter
can get the damage for the previous frame in a renderer independent
way.
diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index 45b60dd..249efbc 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -48,6 +48,8 @@
struct gl_output_state {
EGLSurface egl_surface;
+ int current_buffer;
+ pixman_region32_t buffer_damage[2];
};
struct gl_surface_state {
@@ -723,6 +725,7 @@
struct weston_compositor *ec = es->compositor;
struct gl_renderer *gr = get_renderer(ec);
struct gl_surface_state *gs = get_surface_state(es);
+ struct gl_output_state *go = get_output_state(output);
/* repaint bounding region in global coordinates: */
pixman_region32_t repaint;
/* non-opaque region in surface coordinates: */
@@ -739,7 +742,7 @@
if (!pixman_region32_not_empty(&repaint))
goto out;
- buffer_damage = &output->buffer_damage[output->current_buffer];
+ buffer_damage = &go->buffer_damage[go->current_buffer];
pixman_region32_subtract(buffer_damage, buffer_damage, &repaint);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
@@ -963,18 +966,19 @@
}
for (i = 0; i < 2; i++)
- pixman_region32_union(&output->buffer_damage[i],
- &output->buffer_damage[i],
+ pixman_region32_union(&go->buffer_damage[i],
+ &go->buffer_damage[i],
output_damage);
pixman_region32_union(output_damage, output_damage,
- &output->buffer_damage[output->current_buffer]);
+ &go->buffer_damage[go->current_buffer]);
repaint_surfaces(output, output_damage);
if (gr->border.texture)
draw_border(output);
+ pixman_region32_copy(&output->previous_damage, output_damage);
wl_signal_emit(&output->frame_signal, output);
ret = eglSwapBuffers(gr->egl_display, go->egl_surface);
@@ -984,7 +988,7 @@
print_egl_error_state();
}
- output->current_buffer ^= 1;
+ go->current_buffer ^= 1;
}
@@ -1552,6 +1556,7 @@
struct weston_compositor *ec = output->compositor;
struct gl_renderer *gr = get_renderer(ec);
struct gl_output_state *go = calloc(1, sizeof *go);
+ int i;
if (!go)
return -1;
@@ -1573,6 +1578,10 @@
return -1;
}
+ go->current_buffer = 0;
+ for (i = 0; i < 2; i++)
+ pixman_region32_init(&go->buffer_damage[i]);
+
output->renderer_state = go;
output_apply_border(output, gr);
@@ -1585,6 +1594,10 @@
{
struct gl_renderer *gr = get_renderer(output->compositor);
struct gl_output_state *go = get_output_state(output);
+ int i;
+
+ for (i = 0; i < 2; i++)
+ pixman_region32_fini(&go->buffer_damage[i]);
eglDestroySurface(gr->egl_display, go->egl_surface);