[mutter] wayland: Move some buffer manipulation functions to meta-wayland-buffer
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] wayland: Move some buffer manipulation functions to meta-wayland-buffer
- Date: Wed, 8 Oct 2014 03:57:39 +0000 (UTC)
commit f658740043e43340b5a92bd95022ed2cb5af8896
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Tue Oct 7 19:48:49 2014 -0700
wayland: Move some buffer manipulation functions to meta-wayland-buffer
src/wayland/meta-wayland-buffer.c | 55 ++++++++++++++++++++++++++++++++++++
src/wayland/meta-wayland-buffer.h | 4 ++
src/wayland/meta-wayland-surface.c | 47 ++++++------------------------
3 files changed, 68 insertions(+), 38 deletions(-)
---
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index 1c1e76e..40db3b0 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -26,6 +26,10 @@
#include "meta-wayland-buffer.h"
+#include <clutter/clutter.h>
+#include <cogl/cogl-wayland-server.h>
+#include <meta/util.h>
+
static void
meta_wayland_buffer_destroy_handler (struct wl_listener *listener,
void *data)
@@ -80,3 +84,54 @@ meta_wayland_buffer_from_resource (struct wl_resource *resource)
return buffer;
}
+
+CoglTexture *
+meta_wayland_buffer_ensure_texture (MetaWaylandBuffer *buffer)
+{
+ CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
+ CoglError *catch_error = NULL;
+ CoglTexture *texture;
+
+ if (buffer->texture)
+ goto out;
+
+ texture = COGL_TEXTURE (cogl_wayland_texture_2d_new_from_buffer (ctx,
+ buffer->resource,
+ &catch_error));
+ if (!texture)
+ {
+ cogl_error_free (catch_error);
+ meta_fatal ("Could not import pending buffer, ignoring commit\n");
+ }
+
+ buffer->texture = texture;
+
+ out:
+ return buffer->texture;
+}
+
+void
+meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
+ cairo_region_t *region)
+{
+ struct wl_shm_buffer *shm_buffer;
+
+ shm_buffer = wl_shm_buffer_get (buffer->resource);
+
+ if (shm_buffer)
+ {
+ int i, n_rectangles;
+
+ n_rectangles = cairo_region_num_rectangles (region);
+
+ for (i = 0; i < n_rectangles; i++)
+ {
+ cairo_rectangle_int_t rect;
+ cairo_region_get_rectangle (region, i, &rect);
+ cogl_wayland_texture_set_region_from_shm_buffer (buffer->texture,
+ rect.x, rect.y, rect.width, rect.height,
+ shm_buffer,
+ rect.x, rect.y, 0, NULL);
+ }
+ }
+}
diff --git a/src/wayland/meta-wayland-buffer.h b/src/wayland/meta-wayland-buffer.h
index 1b08333..8d81c72 100644
--- a/src/wayland/meta-wayland-buffer.h
+++ b/src/wayland/meta-wayland-buffer.h
@@ -26,6 +26,7 @@
#define META_WAYLAND_BUFFER_H
#include <cogl/cogl.h>
+#include <cairo.h>
#include <wayland-server.h>
#include "meta-wayland-types.h"
@@ -43,5 +44,8 @@ struct _MetaWaylandBuffer
MetaWaylandBuffer * meta_wayland_buffer_from_resource (struct wl_resource *resource);
void meta_wayland_buffer_ref (MetaWaylandBuffer *buffer);
void meta_wayland_buffer_unref (MetaWaylandBuffer *buffer);
+CoglTexture * meta_wayland_buffer_ensure_texture (MetaWaylandBuffer *buffer);
+void meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
+ cairo_region_t *region);
#endif /* META_WAYLAND_BUFFER_H */
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index e178889..d7cc8a6 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -107,68 +107,39 @@ static void
surface_process_damage (MetaWaylandSurface *surface,
cairo_region_t *region)
{
- int i, n_rectangles;
cairo_rectangle_int_t buffer_rect;
int scale = surface->scale;
- CoglTexture *texture;
- struct wl_shm_buffer *shm_buffer;
+ int i, n_rectangles;
- /* Damage without a buffer makes no sense so ignore that, otherwise we would crash */
if (!surface->buffer)
return;
- texture = surface->buffer->texture;
-
buffer_rect.x = 0;
buffer_rect.y = 0;
buffer_rect.width = cogl_texture_get_width (surface->buffer->texture);
buffer_rect.height = cogl_texture_get_height (surface->buffer->texture);
/* The region will get destroyed after this call anyway so we can
- just modify it here to avoid a copy */
+ * just modify it here to avoid a copy. */
cairo_region_intersect_rectangle (region, &buffer_rect);
- n_rectangles = cairo_region_num_rectangles (region);
-
- shm_buffer = wl_shm_buffer_get (surface->buffer->resource);
+ /* First update the buffer. */
+ meta_wayland_buffer_process_damage (surface->buffer, region);
+ /* Now damage the actor. */
+ /* XXX: Should this be a signal / callback on MetaWaylandBuffer instead? */
+ n_rectangles = cairo_region_num_rectangles (region);
for (i = 0; i < n_rectangles; i++)
{
cairo_rectangle_int_t rect;
cairo_region_get_rectangle (region, i, &rect);
- if (shm_buffer)
- cogl_wayland_texture_set_region_from_shm_buffer (texture, rect.x, rect.y, rect.width, rect.height,
shm_buffer, rect.x, rect.y, 0, NULL);
-
meta_surface_actor_process_damage (surface->surface_actor,
rect.x * scale, rect.y * scale, rect.width * scale, rect.height *
scale);
}
}
static void
-ensure_buffer_texture (MetaWaylandBuffer *buffer)
-{
- CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
- CoglError *catch_error = NULL;
- CoglTexture *texture;
-
- if (buffer->texture)
- return;
-
- texture = COGL_TEXTURE (cogl_wayland_texture_2d_new_from_buffer (ctx,
- buffer->resource,
- &catch_error));
- if (!texture)
- {
- cogl_error_free (catch_error);
- meta_warning ("Could not import pending buffer, ignoring commit\n");
- return;
- }
-
- buffer->texture = texture;
-}
-
-static void
cursor_surface_commit (MetaWaylandSurface *surface,
MetaWaylandPendingState *pending)
{
@@ -426,8 +397,8 @@ commit_pending_state (MetaWaylandSurface *surface,
if (pending->buffer)
{
- ensure_buffer_texture (pending->buffer);
- meta_surface_actor_wayland_set_texture (META_SURFACE_ACTOR_WAYLAND (surface->surface_actor),
pending->buffer->texture);
+ CoglTexture *texture = meta_wayland_buffer_ensure_texture (pending->buffer);
+ meta_surface_actor_wayland_set_texture (META_SURFACE_ACTOR_WAYLAND (surface->surface_actor),
texture);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]