From 8473c3955cb8469c5f999410f68a3b3d3e6bee18 Mon Sep 17 00:00:00 2001 From: nyorain Date: Wed, 9 Aug 2017 15:33:30 +0200 Subject: Add first wlr_surface example implementation --- examples/compositor/main.c | 9 +-- examples/compositor/wl_compositor.c | 91 ++------------------------- examples/compositor/wlr_surface.c | 120 ++++++++++++++++++++++++++++++++++++ examples/compositor/wlr_surface.h | 24 ++++++++ 4 files changed, 154 insertions(+), 90 deletions(-) create mode 100644 examples/compositor/wlr_surface.c create mode 100644 examples/compositor/wlr_surface.h (limited to 'examples/compositor') diff --git a/examples/compositor/main.c b/examples/compositor/main.c index 6afdb391..01292f51 100644 --- a/examples/compositor/main.c +++ b/examples/compositor/main.c @@ -14,6 +14,7 @@ #include #include "shared.h" #include "compositor.h" +#include "wlr_surface.h" struct sample_state { struct wlr_renderer *renderer; @@ -32,11 +33,11 @@ void handle_output_frame(struct output_state *output, struct timespec *ts) { struct wl_resource *_res; float matrix[16]; wl_list_for_each(_res, &sample->compositor.surfaces, link) { - struct wlr_texture *texture = wl_resource_get_user_data(_res); - if (texture->valid) { - wlr_texture_get_matrix(texture, &matrix, + struct wlr_surface *surface = wl_resource_get_user_data(_res); + if (surface->texture->valid) { + wlr_texture_get_matrix(surface->texture, &matrix, &wlr_output->transform_matrix, 200, 200); - wlr_render_with_matrix(sample->renderer, texture, &matrix); + wlr_render_with_matrix(sample->renderer, surface->texture, &matrix); } } diff --git a/examples/compositor/wl_compositor.c b/examples/compositor/wl_compositor.c index 03a1aa7e..8c8ee3b6 100644 --- a/examples/compositor/wl_compositor.c +++ b/examples/compositor/wl_compositor.c @@ -1,90 +1,13 @@ #include +#include #include #include #include "compositor.h" - -static void surface_destroy(struct wl_client *client, struct wl_resource *resource) { - wl_resource_destroy(resource); -} - -static void surface_attach(struct wl_client *client, - struct wl_resource *resource, - struct wl_resource *buffer_resource, int32_t sx, int32_t sy) { - struct wlr_texture *texture = wl_resource_get_user_data(resource); - struct wl_shm_buffer *buffer = wl_shm_buffer_get(buffer_resource); - uint32_t format = wl_shm_buffer_get_format(buffer); - wlr_texture_upload_shm(texture, format, buffer); -} - -static void surface_damage(struct wl_client *client, - struct wl_resource *resource, - int32_t x, int32_t y, int32_t width, int32_t height) { - wlr_log(L_DEBUG, "TODO: surface damage"); -} - -static void surface_frame(struct wl_client *client, - struct wl_resource *resource, uint32_t callback) { - wlr_log(L_DEBUG, "TODO: surface frame"); -} - -static void surface_set_opaque_region(struct wl_client *client, - struct wl_resource *resource, - struct wl_resource *region_resource) { - wlr_log(L_DEBUG, "TODO: surface opaque region"); -} - -static void surface_set_input_region(struct wl_client *client, - struct wl_resource *resource, - struct wl_resource *region_resource) { - - wlr_log(L_DEBUG, "TODO: surface input region"); -} - -static void surface_commit(struct wl_client *client, - struct wl_resource *resource) { - wlr_log(L_DEBUG, "TODO: surface surface commit"); -} - -static void surface_set_buffer_transform(struct wl_client *client, - struct wl_resource *resource, int transform) { - wlr_log(L_DEBUG, "TODO: surface surface buffer transform"); -} - -static void surface_set_buffer_scale(struct wl_client *client, - struct wl_resource *resource, - int32_t scale) { - wlr_log(L_DEBUG, "TODO: surface set buffer scale"); -} - - -static void surface_damage_buffer(struct wl_client *client, - struct wl_resource *resource, - int32_t x, int32_t y, int32_t width, - int32_t height) { - wlr_log(L_DEBUG, "TODO: surface damage buffer"); -} - -struct wl_surface_interface surface_interface = { - surface_destroy, - surface_attach, - surface_damage, - surface_frame, - surface_set_opaque_region, - surface_set_input_region, - surface_commit, - surface_set_buffer_transform, - surface_set_buffer_scale, - surface_damage_buffer -}; - -static void destroy_surface(struct wl_resource *resource) { - struct wlr_texture *surface = wl_resource_get_user_data(resource); - wlr_texture_destroy(surface); -} +#include "compositor/wlr_surface.h" static void destroy_surface_listener(struct wl_listener *listener, void *data) { struct wl_compositor_state *state; - struct wlr_texture *surface = data; + struct wlr_surface *surface = data; state = wl_container_of(listener, state, destroy_surface_listener); struct wl_resource *res = NULL; @@ -101,13 +24,9 @@ static void wl_compositor_create_surface(struct wl_client *client, struct wl_compositor_state *state = wl_resource_get_user_data(resource); struct wl_resource *surface_resource = wl_resource_create(client, &wl_surface_interface, wl_resource_get_version(resource), id); - struct wlr_texture *texture = wlr_render_texture_init(state->renderer); - texture->resource = surface_resource; - wl_resource_set_implementation(surface_resource, &surface_interface, - texture, destroy_surface); - wl_resource_set_user_data(surface_resource, texture); + struct wlr_surface *surface = wlr_surface_create(surface_resource, state->renderer); wl_list_insert(&state->surfaces, wl_resource_get_link(surface_resource)); - wl_signal_add(&texture->destroy_signal, &state->destroy_surface_listener); + wl_signal_add(&surface->signals.destroy, &state->destroy_surface_listener); } static void wl_compositor_create_region(struct wl_client *client, diff --git a/examples/compositor/wlr_surface.c b/examples/compositor/wlr_surface.c new file mode 100644 index 00000000..5a5c3e0d --- /dev/null +++ b/examples/compositor/wlr_surface.c @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include +#include "wlr_surface.h" + +static void surface_destroy(struct wl_client *client, struct wl_resource *resource) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + wl_signal_emit(&surface->signals.destroy, surface); + wl_resource_destroy(resource); +} + +static void surface_attach(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *buffer, int32_t sx, int32_t sy) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + surface->pending_buffer = buffer; + surface->pending_attached = true; +} + +static void surface_damage(struct wl_client *client, + struct wl_resource *resource, + int32_t x, int32_t y, int32_t width, int32_t height) { + wlr_log(L_DEBUG, "TODO: surface damage"); +} + +static void surface_frame(struct wl_client *client, + struct wl_resource *resource, uint32_t callback) { + wlr_log(L_DEBUG, "TODO: surface frame"); +} + +static void surface_set_opaque_region(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region_resource) { + wlr_log(L_DEBUG, "TODO: surface opaque region"); +} + +static void surface_set_input_region(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region_resource) { + + wlr_log(L_DEBUG, "TODO: surface input region"); +} + +static void surface_commit(struct wl_client *client, + struct wl_resource *resource) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + + // apply pending state + if (surface->pending_attached) { + surface->attached = surface->pending_buffer; + if (surface->pending_buffer) { + struct wl_shm_buffer *buffer = wl_shm_buffer_get(surface->pending_buffer); + if (!buffer) { + wlr_log(L_INFO, "Unknown buffer handle attached"); + } else { + uint32_t format = wl_shm_buffer_get_format(buffer); + wlr_texture_upload_shm(surface->texture, format, buffer); + } + } + } + + // reset pending state + surface->pending_buffer = NULL; + surface->pending_attached = false; + + wl_signal_emit(&surface->signals.commit, surface); +} + +static void surface_set_buffer_transform(struct wl_client *client, + struct wl_resource *resource, int transform) { + wlr_log(L_DEBUG, "TODO: surface surface buffer transform"); +} + +static void surface_set_buffer_scale(struct wl_client *client, + struct wl_resource *resource, + int32_t scale) { + wlr_log(L_DEBUG, "TODO: surface set buffer scale"); +} + + +static void surface_damage_buffer(struct wl_client *client, + struct wl_resource *resource, + int32_t x, int32_t y, int32_t width, + int32_t height) { + wlr_log(L_DEBUG, "TODO: surface damage buffer"); +} + +const struct wl_surface_interface surface_interface = { + surface_destroy, + surface_attach, + surface_damage, + surface_frame, + surface_set_opaque_region, + surface_set_input_region, + surface_commit, + surface_set_buffer_transform, + surface_set_buffer_scale, + surface_damage_buffer +}; + +static void destroy_surface(struct wl_resource *resource) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + wl_signal_emit(&surface->signals.destroy, surface); + wlr_texture_destroy(surface->texture); +} + +struct wlr_surface *wlr_surface_create(struct wl_resource *res, + struct wlr_renderer *renderer) { + struct wlr_surface *surface = calloc(1, sizeof(struct wlr_surface)); + surface->texture = wlr_render_texture_init(renderer); + surface->resource = res; + wl_signal_init(&surface->signals.commit); + wl_signal_init(&surface->signals.destroy); + wl_resource_set_implementation(res, &surface_interface, + surface, destroy_surface); + + return surface; +} diff --git a/examples/compositor/wlr_surface.h b/examples/compositor/wlr_surface.h new file mode 100644 index 00000000..d294bdef --- /dev/null +++ b/examples/compositor/wlr_surface.h @@ -0,0 +1,24 @@ +#ifndef _EXAMPLES_COMPOSITOR_SURFACE_H +#define _EXAMPLES_COMPOSITOR_SURFACE_H + +#include + +struct wlr_surface { + struct wl_resource *pending_buffer; + bool pending_attached; + bool attached; // whether the surface currently has a buffer attached + + struct wlr_texture *texture; + const char *role; // the lifetime-bound role or null + struct wl_resource *resource; + + struct { + struct wl_signal destroy; + struct wl_signal commit; + } signals; +}; + +struct wlr_surface *wlr_surface_create(struct wl_resource *res, + struct wlr_renderer *renderer); + +#endif -- cgit v1.2.3 From cf9ee6ce3fe6d9b35f5c737c3fefa6759f8095c0 Mon Sep 17 00:00:00 2001 From: nyorain Date: Wed, 9 Aug 2017 15:58:10 +0200 Subject: Move wlr_surface into wlr --- examples/compositor/main.c | 2 +- examples/compositor/wl_compositor.c | 2 +- examples/compositor/wlr_surface.c | 120 ------------------------------------ examples/compositor/wlr_surface.h | 24 -------- examples/meson.build | 3 +- include/wlr/types/wlr_surface.h | 25 ++++++++ types/meson.build | 1 + types/wlr_surface.c | 120 ++++++++++++++++++++++++++++++++++++ 8 files changed, 149 insertions(+), 148 deletions(-) delete mode 100644 examples/compositor/wlr_surface.c delete mode 100644 examples/compositor/wlr_surface.h create mode 100644 include/wlr/types/wlr_surface.h create mode 100644 types/wlr_surface.c (limited to 'examples/compositor') diff --git a/examples/compositor/main.c b/examples/compositor/main.c index 01292f51..8e5fcc34 100644 --- a/examples/compositor/main.c +++ b/examples/compositor/main.c @@ -10,11 +10,11 @@ #include #include #include +#include #include #include #include "shared.h" #include "compositor.h" -#include "wlr_surface.h" struct sample_state { struct wlr_renderer *renderer; diff --git a/examples/compositor/wl_compositor.c b/examples/compositor/wl_compositor.c index 8c8ee3b6..89d23d6a 100644 --- a/examples/compositor/wl_compositor.c +++ b/examples/compositor/wl_compositor.c @@ -2,8 +2,8 @@ #include #include #include +#include #include "compositor.h" -#include "compositor/wlr_surface.h" static void destroy_surface_listener(struct wl_listener *listener, void *data) { struct wl_compositor_state *state; diff --git a/examples/compositor/wlr_surface.c b/examples/compositor/wlr_surface.c deleted file mode 100644 index 5a5c3e0d..00000000 --- a/examples/compositor/wlr_surface.c +++ /dev/null @@ -1,120 +0,0 @@ -#include -#include -#include -#include -#include -#include "wlr_surface.h" - -static void surface_destroy(struct wl_client *client, struct wl_resource *resource) { - struct wlr_surface *surface = wl_resource_get_user_data(resource); - wl_signal_emit(&surface->signals.destroy, surface); - wl_resource_destroy(resource); -} - -static void surface_attach(struct wl_client *client, - struct wl_resource *resource, - struct wl_resource *buffer, int32_t sx, int32_t sy) { - struct wlr_surface *surface = wl_resource_get_user_data(resource); - surface->pending_buffer = buffer; - surface->pending_attached = true; -} - -static void surface_damage(struct wl_client *client, - struct wl_resource *resource, - int32_t x, int32_t y, int32_t width, int32_t height) { - wlr_log(L_DEBUG, "TODO: surface damage"); -} - -static void surface_frame(struct wl_client *client, - struct wl_resource *resource, uint32_t callback) { - wlr_log(L_DEBUG, "TODO: surface frame"); -} - -static void surface_set_opaque_region(struct wl_client *client, - struct wl_resource *resource, - struct wl_resource *region_resource) { - wlr_log(L_DEBUG, "TODO: surface opaque region"); -} - -static void surface_set_input_region(struct wl_client *client, - struct wl_resource *resource, - struct wl_resource *region_resource) { - - wlr_log(L_DEBUG, "TODO: surface input region"); -} - -static void surface_commit(struct wl_client *client, - struct wl_resource *resource) { - struct wlr_surface *surface = wl_resource_get_user_data(resource); - - // apply pending state - if (surface->pending_attached) { - surface->attached = surface->pending_buffer; - if (surface->pending_buffer) { - struct wl_shm_buffer *buffer = wl_shm_buffer_get(surface->pending_buffer); - if (!buffer) { - wlr_log(L_INFO, "Unknown buffer handle attached"); - } else { - uint32_t format = wl_shm_buffer_get_format(buffer); - wlr_texture_upload_shm(surface->texture, format, buffer); - } - } - } - - // reset pending state - surface->pending_buffer = NULL; - surface->pending_attached = false; - - wl_signal_emit(&surface->signals.commit, surface); -} - -static void surface_set_buffer_transform(struct wl_client *client, - struct wl_resource *resource, int transform) { - wlr_log(L_DEBUG, "TODO: surface surface buffer transform"); -} - -static void surface_set_buffer_scale(struct wl_client *client, - struct wl_resource *resource, - int32_t scale) { - wlr_log(L_DEBUG, "TODO: surface set buffer scale"); -} - - -static void surface_damage_buffer(struct wl_client *client, - struct wl_resource *resource, - int32_t x, int32_t y, int32_t width, - int32_t height) { - wlr_log(L_DEBUG, "TODO: surface damage buffer"); -} - -const struct wl_surface_interface surface_interface = { - surface_destroy, - surface_attach, - surface_damage, - surface_frame, - surface_set_opaque_region, - surface_set_input_region, - surface_commit, - surface_set_buffer_transform, - surface_set_buffer_scale, - surface_damage_buffer -}; - -static void destroy_surface(struct wl_resource *resource) { - struct wlr_surface *surface = wl_resource_get_user_data(resource); - wl_signal_emit(&surface->signals.destroy, surface); - wlr_texture_destroy(surface->texture); -} - -struct wlr_surface *wlr_surface_create(struct wl_resource *res, - struct wlr_renderer *renderer) { - struct wlr_surface *surface = calloc(1, sizeof(struct wlr_surface)); - surface->texture = wlr_render_texture_init(renderer); - surface->resource = res; - wl_signal_init(&surface->signals.commit); - wl_signal_init(&surface->signals.destroy); - wl_resource_set_implementation(res, &surface_interface, - surface, destroy_surface); - - return surface; -} diff --git a/examples/compositor/wlr_surface.h b/examples/compositor/wlr_surface.h deleted file mode 100644 index d294bdef..00000000 --- a/examples/compositor/wlr_surface.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _EXAMPLES_COMPOSITOR_SURFACE_H -#define _EXAMPLES_COMPOSITOR_SURFACE_H - -#include - -struct wlr_surface { - struct wl_resource *pending_buffer; - bool pending_attached; - bool attached; // whether the surface currently has a buffer attached - - struct wlr_texture *texture; - const char *role; // the lifetime-bound role or null - struct wl_resource *resource; - - struct { - struct wl_signal destroy; - struct wl_signal commit; - } signals; -}; - -struct wlr_surface *wlr_surface_create(struct wl_resource *res, - struct wlr_renderer *renderer); - -#endif diff --git a/examples/meson.build b/examples/meson.build index 6e52a920..a44a4946 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -11,8 +11,7 @@ executable('tablet', 'tablet.c', dependencies: dep_wlr, link_with: lib_shared) compositor_src = [ 'compositor/main.c', 'compositor/wl_compositor.c', - 'compositor/wl_shell.c', - 'compositor/wlr_surface.c', + 'compositor/wl_shell.c' ] executable('compositor', compositor_src, dependencies: dep_wlr, link_with: lib_shared) diff --git a/include/wlr/types/wlr_surface.h b/include/wlr/types/wlr_surface.h new file mode 100644 index 00000000..88a9a4d8 --- /dev/null +++ b/include/wlr/types/wlr_surface.h @@ -0,0 +1,25 @@ +#ifndef _WLR_TYPES_WLR_SURFACE_H +#define _WLR_TYPES_WLR_SURFACE_H + +#include + +struct wlr_surface { + struct wl_resource *pending_buffer; + bool pending_attached; + bool attached; // whether the surface currently has a buffer attached + + struct wlr_texture *texture; + const char *role; // the lifetime-bound role or null + struct wl_resource *resource; + + struct { + struct wl_signal destroy; + struct wl_signal commit; + } signals; +}; + +struct wlr_renderer; +struct wlr_surface *wlr_surface_create(struct wl_resource *res, + struct wlr_renderer *renderer); + +#endif diff --git a/types/meson.build b/types/meson.build index 89e36ac0..a07daf85 100644 --- a/types/meson.build +++ b/types/meson.build @@ -4,6 +4,7 @@ wlr_files += files( 'wlr_output.c', 'wlr_pointer.c', 'wlr_region.c', + 'wlr_surface.c', 'wlr_tablet_pad.c', 'wlr_tablet_tool.c', 'wlr_touch.c', diff --git a/types/wlr_surface.c b/types/wlr_surface.c new file mode 100644 index 00000000..4a72159c --- /dev/null +++ b/types/wlr_surface.c @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include +#include + +static void surface_destroy(struct wl_client *client, struct wl_resource *resource) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + wl_signal_emit(&surface->signals.destroy, surface); + wl_resource_destroy(resource); +} + +static void surface_attach(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *buffer, int32_t sx, int32_t sy) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + surface->pending_buffer = buffer; + surface->pending_attached = true; +} + +static void surface_damage(struct wl_client *client, + struct wl_resource *resource, + int32_t x, int32_t y, int32_t width, int32_t height) { + wlr_log(L_DEBUG, "TODO: surface damage"); +} + +static void surface_frame(struct wl_client *client, + struct wl_resource *resource, uint32_t callback) { + wlr_log(L_DEBUG, "TODO: surface frame"); +} + +static void surface_set_opaque_region(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region_resource) { + wlr_log(L_DEBUG, "TODO: surface opaque region"); +} + +static void surface_set_input_region(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region_resource) { + + wlr_log(L_DEBUG, "TODO: surface input region"); +} + +static void surface_commit(struct wl_client *client, + struct wl_resource *resource) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + + // apply pending state + if (surface->pending_attached) { + surface->attached = surface->pending_buffer; + if (surface->pending_buffer) { + struct wl_shm_buffer *buffer = wl_shm_buffer_get(surface->pending_buffer); + if (!buffer) { + wlr_log(L_INFO, "Unknown buffer handle attached"); + } else { + uint32_t format = wl_shm_buffer_get_format(buffer); + wlr_texture_upload_shm(surface->texture, format, buffer); + } + } + } + + // reset pending state + surface->pending_buffer = NULL; + surface->pending_attached = false; + + wl_signal_emit(&surface->signals.commit, surface); +} + +static void surface_set_buffer_transform(struct wl_client *client, + struct wl_resource *resource, int transform) { + wlr_log(L_DEBUG, "TODO: surface surface buffer transform"); +} + +static void surface_set_buffer_scale(struct wl_client *client, + struct wl_resource *resource, + int32_t scale) { + wlr_log(L_DEBUG, "TODO: surface set buffer scale"); +} + + +static void surface_damage_buffer(struct wl_client *client, + struct wl_resource *resource, + int32_t x, int32_t y, int32_t width, + int32_t height) { + wlr_log(L_DEBUG, "TODO: surface damage buffer"); +} + +const struct wl_surface_interface surface_interface = { + surface_destroy, + surface_attach, + surface_damage, + surface_frame, + surface_set_opaque_region, + surface_set_input_region, + surface_commit, + surface_set_buffer_transform, + surface_set_buffer_scale, + surface_damage_buffer +}; + +static void destroy_surface(struct wl_resource *resource) { + struct wlr_surface *surface = wl_resource_get_user_data(resource); + wl_signal_emit(&surface->signals.destroy, surface); + wlr_texture_destroy(surface->texture); +} + +struct wlr_surface *wlr_surface_create(struct wl_resource *res, + struct wlr_renderer *renderer) { + struct wlr_surface *surface = calloc(1, sizeof(struct wlr_surface)); + surface->texture = wlr_render_texture_init(renderer); + surface->resource = res; + wl_signal_init(&surface->signals.commit); + wl_signal_init(&surface->signals.destroy); + wl_resource_set_implementation(res, &surface_interface, + surface, destroy_surface); + + return surface; +} -- cgit v1.2.3