compositor: Move update_shm_texture() to gles2-renderer.c
We rename it flush_damage() as it's the point where we update our rendering
API source (eg, the gles2 texture) according to the accumulated damage,
if necessary.
diff --git a/src/gles2-renderer.c b/src/gles2-renderer.c
index fb70375..f2a0461 100644
--- a/src/gles2-renderer.c
+++ b/src/gles2-renderer.c
@@ -674,6 +674,43 @@
}
+WL_EXPORT void
+gles2_renderer_flush_damage(struct weston_surface *surface)
+{
+#ifdef GL_UNPACK_ROW_LENGTH
+ pixman_box32_t *rectangles;
+ void *data;
+ int i, n;
+#endif
+
+ glBindTexture(GL_TEXTURE_2D, surface->textures[0]);
+
+ if (!surface->compositor->has_unpack_subimage) {
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
+ surface->pitch, surface->buffer->height, 0,
+ GL_BGRA_EXT, GL_UNSIGNED_BYTE,
+ wl_shm_buffer_get_data(surface->buffer));
+
+ return;
+ }
+
+#ifdef GL_UNPACK_ROW_LENGTH
+ /* Mesa does not define GL_EXT_unpack_subimage */
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, surface->pitch);
+ data = wl_shm_buffer_get_data(surface->buffer);
+ rectangles = pixman_region32_rectangles(&surface->damage, &n);
+ for (i = 0; i < n; i++) {
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, rectangles[i].x1);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, rectangles[i].y1);
+ glTexSubImage2D(GL_TEXTURE_2D, 0,
+ rectangles[i].x1, rectangles[i].y1,
+ rectangles[i].x2 - rectangles[i].x1,
+ rectangles[i].y2 - rectangles[i].y1,
+ GL_BGRA_EXT, GL_UNSIGNED_BYTE, data);
+ }
+#endif
+}
+
static const char vertex_shader[] =
"uniform mat4 proj;\n"
"attribute vec2 position;\n"