aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorTony Crisci <tony@dubstepdish.com>2017-08-03 14:20:51 -0400
committerTony Crisci <tony@dubstepdish.com>2017-08-04 11:41:13 -0400
commit6610aa7ca7d170c43705c86db65f7a1f8fc8681a (patch)
tree468fb40d7833194f48e88cbcdc40afc24670faeb /examples
parent555914a13bec2d6f9ea5c48dc9a955bd397e4ea1 (diff)
Implement shm buffer surface attach interface
Implement surface_attach method. This is called when a client attaches an shm buffer with wl_surface_attach(). Implement the GLES2 interface for attaching shm buffers. This creates an opengl texture with the shm buffer contents for the surface. This commit also includes some working code to render the surfaces onto the screen for demonstration purposes.
Diffstat (limited to 'examples')
-rw-r--r--examples/compositor.h1
-rw-r--r--examples/compositor/main.c13
-rw-r--r--examples/compositor/wl_compositor.c8
3 files changed, 19 insertions, 3 deletions
diff --git a/examples/compositor.h b/examples/compositor.h
index 0f2716fe..b04093ca 100644
--- a/examples/compositor.h
+++ b/examples/compositor.h
@@ -7,6 +7,7 @@ struct wl_compositor_state {
struct wl_global *wl_global;
struct wl_list wl_resources;
struct wlr_renderer *renderer;
+ struct wl_list surfaces;
};
void wl_compositor_init(struct wl_display *display,
diff --git a/examples/compositor/main.c b/examples/compositor/main.c
index 689269d0..e13fda24 100644
--- a/examples/compositor/main.c
+++ b/examples/compositor/main.c
@@ -28,7 +28,18 @@ void handle_output_frame(struct output_state *output, struct timespec *ts) {
wlr_output_make_current(wlr_output);
wlr_renderer_begin(sample->renderer, wlr_output);
- // TODO: render surfaces
+
+ struct wl_resource *_res;
+ float matrix[16];
+ wl_list_for_each(_res, &sample->compositor.surfaces, link) {
+ struct wlr_surface *surface = wl_resource_get_user_data(_res);
+ if (surface->valid) {
+ wlr_surface_get_matrix(surface, &matrix,
+ &wlr_output->transform_matrix, 200, 200);
+ wlr_render_with_matrix(sample->renderer, surface, &matrix);
+ }
+ }
+
wlr_renderer_end(sample->renderer);
wlr_output_swap_buffers(wlr_output);
}
diff --git a/examples/compositor/wl_compositor.c b/examples/compositor/wl_compositor.c
index 4c49861c..8fbf4a93 100644
--- a/examples/compositor/wl_compositor.c
+++ b/examples/compositor/wl_compositor.c
@@ -10,7 +10,10 @@ static void surface_destroy(struct wl_client *client, struct wl_resource *resour
static void surface_attach(struct wl_client *client,
struct wl_resource *resource,
struct wl_resource *buffer_resource, int32_t sx, int32_t sy) {
- wlr_log(L_DEBUG, "TODO: surface attach");
+ struct wlr_surface *surface = 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_surface_attach_shm(surface, format, buffer);
}
static void surface_damage(struct wl_client *client,
@@ -87,7 +90,7 @@ static void wl_compositor_create_surface(struct wl_client *client,
wl_resource_set_implementation(surface_resource, &surface_interface,
surface, destroy_surface);
wl_resource_set_user_data(surface_resource, surface);
-
+ wl_list_insert(&state->surfaces, wl_resource_get_link(surface_resource));
}
static void wl_compositor_create_region(struct wl_client *client,
@@ -135,4 +138,5 @@ void wl_compositor_init(struct wl_display *display,
state->wl_global = wl_global;
state->renderer = renderer;
wl_list_init(&state->wl_resources);
+ wl_list_init(&state->surfaces);
}