commit b7805fb9334c8725467c13573aa630cc751af1bc
parent cbef704d166bea3ef8884990928593dcbd712bfe
Author: Michael Forney <mforney@mforney.org>
Date: Thu, 16 Jan 2014 03:18:23 -0800
surface: Use swc_buffer instead of wl_resource in state
Diffstat:
4 files changed, 19 insertions(+), 80 deletions(-)
diff --git a/libswc/compositor.c b/libswc/compositor.c
@@ -11,7 +11,6 @@
#include "surface.h"
#include "util.h"
#include "view.h"
-#include "wayland_buffer.h"
#include <stdlib.h>
#include <stdio.h>
@@ -46,37 +45,12 @@ struct view
/* Rendering {{{ */
-struct buffer_state
-{
- struct wld_buffer * buffer;
- struct wl_listener destroy_listener;
-};
-
struct render_target
{
struct wld_buffer * buffer;
pixman_rectangle32_t geometry;
};
-static void handle_buffer_destroy(struct wl_listener * listener, void * data)
-{
- struct buffer_state * state
- = CONTAINER_OF(listener, typeof(*state), destroy_listener);
-
- wld_destroy_buffer(state->buffer);
- free(state);
-}
-
-static inline struct buffer_state * buffer_state(struct wl_resource * resource)
-{
- struct wl_listener * listener
- = wl_resource_get_destroy_listener(resource, &handle_buffer_destroy);
-
- return listener ? CONTAINER_OF(listener, struct buffer_state,
- destroy_listener)
- : NULL;
-}
-
static void repaint_surface(struct render_target * target,
struct swc_surface * surface,
pixman_region32_t * damage)
@@ -84,15 +58,11 @@ static void repaint_surface(struct render_target * target,
pixman_region32_t surface_damage;
pixman_region32_t border_damage;
pixman_region32_t surface_region;
- struct buffer_state * state;
struct view * view = (void *) surface->view;
if (!surface->state.buffer)
return;
- state = buffer_state(surface->state.buffer);
- assert(state);
-
pixman_region32_init_with_extents(&surface_damage, &view->extents);
pixman_region32_init(&border_damage);
pixman_region32_init_rect
@@ -116,7 +86,7 @@ static void repaint_surface(struct render_target * target,
pixman_region32_translate(&surface_damage,
-surface->geometry.x, -surface->geometry.y);
- wld_copy_region(swc.drm->renderer, state->buffer,
+ wld_copy_region(swc.drm->renderer, surface->state.buffer->wld,
surface->geometry.x - target->geometry.x,
surface->geometry.y - target->geometry.y,
&surface_damage);
@@ -166,36 +136,8 @@ static void renderer_repaint(struct render_target * target,
}
static void renderer_attach(struct swc_surface * surface,
- struct wl_resource * resource)
+ struct swc_buffer * buffer)
{
- struct buffer_state * state;
- struct swc_buffer * drm_buffer;
-
- if (!resource)
- return;
-
- /* Check if we have already seen this buffer. */
- if ((state = buffer_state(resource)))
- return;
-
- if (!(state = malloc(sizeof *state)))
- return;
-
- if ((drm_buffer = swc_wayland_buffer_get(resource)))
- {
- if (!(state = malloc(sizeof *state)))
- return;
-
- state->buffer = drm_buffer->wld;
- }
- else
- {
- ERROR("Unsupported buffer type\n");
- return;
- }
-
- state->destroy_listener.notify = &handle_buffer_destroy;
- wl_resource_add_destroy_listener(resource, &state->destroy_listener);
}
static void renderer_flush_surface(struct swc_surface * surface)
@@ -334,9 +276,9 @@ static void remove_(struct swc_surface * surface)
free(view);
}
-static void attach(struct swc_surface * surface, struct wl_resource * resource)
+static void attach(struct swc_surface * surface, struct swc_buffer * buffer)
{
- renderer_attach(surface, resource);
+ renderer_attach(surface, buffer);
}
static void update(struct swc_surface * surface)
diff --git a/libswc/surface.c b/libswc/surface.c
@@ -122,7 +122,7 @@ static void state_finish(struct swc_surface_state * state)
* @return: Whether or not the buffer was changed.
*/
static bool state_set_buffer(struct swc_surface_state * state,
- struct wl_resource * buffer)
+ struct swc_buffer * buffer)
{
if (buffer == state->buffer)
return false;
@@ -137,8 +137,7 @@ static bool state_set_buffer(struct swc_surface_state * state,
{
/* Need to watch the new buffer for destruction so we can remove it
* from state. */
- wl_resource_add_destroy_listener(buffer,
- &state->buffer_destroy_listener);
+ wl_signal_add(&buffer->destroy_signal, &state->buffer_destroy_listener);
}
state->buffer = buffer;
@@ -155,10 +154,12 @@ static void attach(struct wl_client * client, struct wl_resource * resource,
struct wl_resource * buffer_resource, int32_t x, int32_t y)
{
struct swc_surface * surface = wl_resource_get_user_data(resource);
+ struct swc_buffer * buffer
+ = buffer_resource ? swc_wayland_buffer_get(buffer_resource) : NULL;
surface->pending.commit |= SWC_SURFACE_COMMIT_ATTACH;
- state_set_buffer(&surface->pending.state, buffer_resource);
+ state_set_buffer(&surface->pending.state, buffer);
surface->pending.x = x;
surface->pending.y = y;
@@ -235,23 +236,19 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
/* Attach */
if (surface->pending.commit & SWC_SURFACE_COMMIT_ATTACH)
{
- struct swc_buffer * buffer;
+ struct swc_buffer * current_buffer = surface->state.buffer,
+ * pending_buffer = surface->pending.state.buffer;
- if (surface->state.buffer
- && surface->state.buffer != surface->pending.state.buffer)
- {
- wl_buffer_send_release(surface->state.buffer);
- }
+ if (current_buffer && current_buffer != pending_buffer)
+ swc_wayland_buffer_release(current_buffer);
state_set_buffer(&surface->state, surface->pending.state.buffer);
/* Determine size of buffer. */
- if (surface->state.buffer)
+ if (current_buffer)
{
- if ((buffer = swc_wayland_buffer_get(surface->state.buffer)))
- set_size(surface, buffer->wld->width, buffer->wld->height);
- else
- WARNING("Unknown buffer type attached\n");
+ set_size(surface,
+ current_buffer->wld->width, current_buffer->wld->height);
}
else
set_size(surface, 0, 0);
diff --git a/libswc/surface.h b/libswc/surface.h
@@ -55,7 +55,7 @@ enum swc_surface_commit_info
struct swc_surface_state
{
- struct wl_resource * buffer;
+ struct swc_buffer * buffer;
struct wl_listener buffer_destroy_listener;
bool current;
diff --git a/libswc/view.h b/libswc/view.h
@@ -27,6 +27,7 @@
#include <stdbool.h>
#include <stdint.h>
+struct swc_buffer;
struct swc_surface;
struct wl_resource;
@@ -46,8 +47,7 @@ struct swc_view_impl
void (* remove)(struct swc_surface * surface);
/* Called when a new buffer is attached to a surface. */
- void (* attach)(struct swc_surface * surface,
- struct wl_resource * resource);
+ void (* attach)(struct swc_surface * surface, struct swc_buffer * buffer);
/* Called after a surface requests a commit. */
void (* update)(struct swc_surface * surface);