swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

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:
Mlibswc/compositor.c | 66++++--------------------------------------------------------------
Mlibswc/surface.c | 27++++++++++++---------------
Mlibswc/surface.h | 2+-
Mlibswc/view.h | 4++--
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);