diff --git a/src/compositor.c b/src/compositor.c index 3fb5df68..70445ecb 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -180,9 +180,6 @@ weston_client_launch(struct weston_compositor *compositor, return client; } -static void -update_shm_texture(struct weston_surface *surface); - static void 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); if (es->buffer && wl_buffer_is_shm(es->buffer)) - update_shm_texture(es); + gles2_renderer_flush_damage(es); 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 surface_accumulate_damage(struct weston_surface *surface, pixman_region32_t *opaque) { if (surface->buffer && wl_buffer_is_shm(surface->buffer)) - update_shm_texture(surface); + gles2_renderer_flush_damage(surface); if (surface->transform.enabled) { pixman_box32_t *extents; diff --git a/src/compositor.h b/src/compositor.h index 586f8b6b..d80b5b43 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -797,5 +797,7 @@ gles2_renderer_init(struct weston_compositor *ec); void gles2_renderer_repaint_output(struct weston_output *output, pixman_region32_t *output_damage); +void +gles2_renderer_flush_damage(struct weston_surface *surface); #endif diff --git a/src/gles2-renderer.c b/src/gles2-renderer.c index fb70375d..f2a04618 100644 --- a/src/gles2-renderer.c +++ b/src/gles2-renderer.c @@ -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[] = "uniform mat4 proj;\n" "attribute vec2 position;\n"