wayland: Simply store a MetaWaylandBuffer

There's no need for the MetaWaylandBufferReference abstraction...
This commit is contained in:
Jasper St. Pierre 2014-02-01 17:45:51 -05:00
parent 13651949ed
commit 2f6f0f252c
5 changed files with 46 additions and 59 deletions

View File

@ -102,10 +102,9 @@ gboolean meta_wayland_compositor_handle_event (MetaWaylandComp
MetaLauncher *meta_wayland_compositor_get_launcher (MetaWaylandCompositor *compositor); MetaLauncher *meta_wayland_compositor_get_launcher (MetaWaylandCompositor *compositor);
gboolean meta_wayland_compositor_is_native (MetaWaylandCompositor *compositor); gboolean meta_wayland_compositor_is_native (MetaWaylandCompositor *compositor);
MetaWaylandBuffer * meta_wayland_buffer_from_resource (struct wl_resource *resource); MetaWaylandBuffer * meta_wayland_buffer_from_resource (struct wl_resource *resource);
void meta_wayland_buffer_ref (MetaWaylandBuffer *buffer);
void meta_wayland_buffer_reference (MetaWaylandBufferReference *ref, void meta_wayland_buffer_unref (MetaWaylandBuffer *buffer);
MetaWaylandBuffer *buffer);
void meta_wayland_compositor_update (MetaWaylandCompositor *compositor, void meta_wayland_compositor_update (MetaWaylandCompositor *compositor,
const ClutterEvent *event); const ClutterEvent *event);

View File

@ -72,8 +72,8 @@ meta_wayland_seat_update_cursor_surface (MetaWaylandSeat *seat)
if (seat->cursor_tracker == NULL) if (seat->cursor_tracker == NULL)
return; return;
if (seat->cursor_surface && seat->cursor_surface->buffer_ref.buffer) if (seat->cursor_surface && seat->cursor_surface->buffer)
buffer = seat->cursor_surface->buffer_ref.buffer->resource; buffer = seat->cursor_surface->buffer->resource;
else else
buffer = NULL; buffer = NULL;

View File

@ -71,6 +71,22 @@ typedef struct
struct wl_listener sibling_destroy_listener; struct wl_listener sibling_destroy_listener;
} MetaWaylandSubsurfacePlacementOp; } MetaWaylandSubsurfacePlacementOp;
static void
surface_set_buffer (MetaWaylandSurface *surface,
MetaWaylandBuffer *buffer)
{
if (surface->buffer == buffer)
return;
if (surface->buffer)
meta_wayland_buffer_unref (surface->buffer);
surface->buffer = buffer;
if (surface->buffer)
meta_wayland_buffer_ref (surface->buffer);
}
static void static void
surface_process_damage (MetaWaylandSurface *surface, surface_process_damage (MetaWaylandSurface *surface,
cairo_region_t *region) cairo_region_t *region)
@ -298,8 +314,8 @@ toplevel_surface_commit (MetaWaylandSurface *surface,
int new_width; int new_width;
int new_height; int new_height;
new_width = surface->buffer_ref.buffer->width; new_width = surface->buffer->width;
new_height = surface->buffer_ref.buffer->height; new_height = surface->buffer->height;
if (new_width != window->rect.width || if (new_width != window->rect.width ||
new_height != window->rect.height || new_height != window->rect.height ||
pending->dx != 0 || pending->dx != 0 ||
@ -449,9 +465,9 @@ commit_double_buffered_state (MetaWaylandSurface *surface,
gboolean buffer_changed = FALSE; gboolean buffer_changed = FALSE;
/* wl_surface.attach */ /* wl_surface.attach */
if (pending->newly_attached && pending->buffer != surface->buffer_ref.buffer) if (pending->newly_attached && surface->buffer != pending->buffer)
{ {
meta_wayland_buffer_reference (&surface->buffer_ref, pending->buffer); surface_set_buffer (surface, pending->buffer);
buffer_changed = TRUE; buffer_changed = TRUE;
} }
@ -528,7 +544,7 @@ meta_wayland_surface_free (MetaWaylandSurface *surface)
compositor->surfaces = g_list_remove (compositor->surfaces, surface); compositor->surfaces = g_list_remove (compositor->surfaces, surface);
meta_wayland_buffer_reference (&surface->buffer_ref, NULL); surface_set_buffer (surface, NULL);
double_buffered_state_destroy (&surface->pending); double_buffered_state_destroy (&surface->pending);
g_object_unref (surface->surface_actor); g_object_unref (surface->surface_actor);
if (surface->resource) if (surface->resource)

View File

@ -39,13 +39,7 @@ struct _MetaWaylandBuffer
CoglTexture *texture; CoglTexture *texture;
int32_t width, height; int32_t width, height;
uint32_t busy_count; uint32_t ref_count;
};
struct _MetaWaylandBufferReference
{
MetaWaylandBuffer *buffer;
struct wl_listener destroy_listener;
}; };
typedef struct typedef struct
@ -77,7 +71,7 @@ struct _MetaWaylandSurface
{ {
struct wl_resource *resource; struct wl_resource *resource;
MetaWaylandCompositor *compositor; MetaWaylandCompositor *compositor;
MetaWaylandBufferReference buffer_ref; MetaWaylandBuffer *buffer;
MetaSurfaceActor *surface_actor; MetaSurfaceActor *surface_actor;
MetaWindow *window; MetaWindow *window;
MetaWaylandSurfaceExtension xdg_surface; MetaWaylandSurfaceExtension xdg_surface;

View File

@ -138,6 +138,24 @@ meta_wayland_buffer_destroy_handler (struct wl_listener *listener,
g_slice_free (MetaWaylandBuffer, buffer); g_slice_free (MetaWaylandBuffer, buffer);
} }
void
meta_wayland_buffer_ref (MetaWaylandBuffer *buffer)
{
buffer->ref_count++;
}
void
meta_wayland_buffer_unref (MetaWaylandBuffer *buffer)
{
buffer->ref_count--;
if (buffer->ref_count == 0)
{
g_clear_pointer (&buffer->texture, cogl_object_unref);
g_assert (wl_resource_get_client (buffer->resource));
wl_resource_queue_event (buffer->resource, WL_BUFFER_RELEASE);
}
}
MetaWaylandBuffer * MetaWaylandBuffer *
meta_wayland_buffer_from_resource (struct wl_resource *resource) meta_wayland_buffer_from_resource (struct wl_resource *resource)
{ {
@ -165,46 +183,6 @@ meta_wayland_buffer_from_resource (struct wl_resource *resource)
return buffer; return buffer;
} }
static void
meta_wayland_buffer_reference_handle_destroy (struct wl_listener *listener,
void *data)
{
MetaWaylandBufferReference *ref =
wl_container_of (listener, ref, destroy_listener);
g_assert (data == ref->buffer);
ref->buffer = NULL;
}
void
meta_wayland_buffer_reference (MetaWaylandBufferReference *ref,
MetaWaylandBuffer *buffer)
{
if (ref->buffer && buffer != ref->buffer)
{
ref->buffer->busy_count--;
if (ref->buffer->busy_count == 0)
{
g_clear_pointer (&ref->buffer->texture, cogl_object_unref);
g_assert (wl_resource_get_client (ref->buffer->resource));
wl_resource_queue_event (ref->buffer->resource, WL_BUFFER_RELEASE);
}
wl_list_remove (&ref->destroy_listener.link);
}
if (buffer && buffer != ref->buffer)
{
buffer->busy_count++;
wl_signal_add (&buffer->destroy_signal, &ref->destroy_listener);
}
ref->buffer = buffer;
ref->destroy_listener.notify = meta_wayland_buffer_reference_handle_destroy;
}
void void
meta_wayland_compositor_set_input_focus (MetaWaylandCompositor *compositor, meta_wayland_compositor_set_input_focus (MetaWaylandCompositor *compositor,
MetaWindow *window) MetaWindow *window)