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.
This commit is contained in:
Kristian Høgsberg
2012-09-05 22:13:58 -04:00
parent 25894fc920
commit b1fd2d6dd8
3 changed files with 41 additions and 42 deletions
+2 -42
View File
@@ -180,9 +180,6 @@ weston_client_launch(struct weston_compositor *compositor,
return client; return client;
} }
static void
update_shm_texture(struct weston_surface *surface);
static void static void
surface_handle_buffer_destroy(struct wl_listener *listener, void *data) surface_handle_buffer_destroy(struct wl_listener *listener, void *data)
{ {
@@ -191,7 +188,7 @@ surface_handle_buffer_destroy(struct wl_listener *listener, void *data)
buffer_destroy_listener); buffer_destroy_listener);
if (es->buffer && wl_buffer_is_shm(es->buffer)) if (es->buffer && wl_buffer_is_shm(es->buffer))
update_shm_texture(es); gles2_renderer_flush_damage(es);
es->buffer = NULL; es->buffer = NULL;
} }
@@ -934,49 +931,12 @@ fade_frame(struct weston_animation *animation,
} }
} }
static void
update_shm_texture(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 void static void
surface_accumulate_damage(struct weston_surface *surface, surface_accumulate_damage(struct weston_surface *surface,
pixman_region32_t *opaque) pixman_region32_t *opaque)
{ {
if (surface->buffer && wl_buffer_is_shm(surface->buffer)) if (surface->buffer && wl_buffer_is_shm(surface->buffer))
update_shm_texture(surface); gles2_renderer_flush_damage(surface);
if (surface->transform.enabled) { if (surface->transform.enabled) {
pixman_box32_t *extents; pixman_box32_t *extents;
+2
View File
@@ -797,5 +797,7 @@ gles2_renderer_init(struct weston_compositor *ec);
void void
gles2_renderer_repaint_output(struct weston_output *output, gles2_renderer_repaint_output(struct weston_output *output,
pixman_region32_t *output_damage); pixman_region32_t *output_damage);
void
gles2_renderer_flush_damage(struct weston_surface *surface);
#endif #endif
+37
View File
@@ -674,6 +674,43 @@ gles2_renderer_repaint_output(struct weston_output *output,
} }
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[] = static const char vertex_shader[] =
"uniform mat4 proj;\n" "uniform mat4 proj;\n"
"attribute vec2 position;\n" "attribute vec2 position;\n"