examples/output-layers: relay feedback events

This commit is contained in:
Simon Ser 2023-02-06 18:41:09 +01:00
parent 849c362ffb
commit 9a425841b0

View file

@ -10,6 +10,8 @@
#include <wlr/render/allocator.h> #include <wlr/render/allocator.h>
#include <wlr/render/wlr_renderer.h> #include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.h> #include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_drm.h>
#include <wlr/types/wlr_linux_dmabuf_v1.h>
#include <wlr/types/wlr_output.h> #include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_layer.h> #include <wlr/types/wlr_output_layer.h>
#include <wlr/types/wlr_xdg_shell.h> #include <wlr/types/wlr_xdg_shell.h>
@ -27,6 +29,7 @@ struct server {
struct wlr_backend *backend; struct wlr_backend *backend;
struct wlr_renderer *renderer; struct wlr_renderer *renderer;
struct wlr_allocator *allocator; struct wlr_allocator *allocator;
struct wlr_linux_dmabuf_v1 *linux_dmabuf_v1;
struct wl_list outputs; struct wl_list outputs;
@ -37,6 +40,7 @@ struct server {
struct output_surface { struct output_surface {
struct wlr_surface *wlr_surface; struct wlr_surface *wlr_surface;
struct wlr_output_layer *layer; struct wlr_output_layer *layer;
struct server *server;
struct wl_list link; struct wl_list link;
int x, y; int x, y;
@ -46,6 +50,7 @@ struct output_surface {
struct wl_listener destroy; struct wl_listener destroy;
struct wl_listener commit; struct wl_listener commit;
struct wl_listener layer_feedback;
}; };
struct output { struct output {
@ -174,10 +179,11 @@ static void output_surface_handle_destroy(struct wl_listener *listener,
struct output_surface *output_surface = struct output_surface *output_surface =
wl_container_of(listener, output_surface, destroy); wl_container_of(listener, output_surface, destroy);
wlr_buffer_unlock(output_surface->buffer); wlr_buffer_unlock(output_surface->buffer);
wlr_output_layer_destroy(output_surface->layer);
wl_list_remove(&output_surface->destroy.link); wl_list_remove(&output_surface->destroy.link);
wl_list_remove(&output_surface->commit.link); wl_list_remove(&output_surface->commit.link);
wl_list_remove(&output_surface->layer_feedback.link);
wl_list_remove(&output_surface->link); wl_list_remove(&output_surface->link);
wlr_output_layer_destroy(output_surface->layer);
free(output_surface); free(output_surface);
} }
@ -195,6 +201,26 @@ static void output_surface_handle_commit(struct wl_listener *listener,
output_surface->buffer = buffer; output_surface->buffer = buffer;
} }
static void output_surface_handle_layer_feedback(struct wl_listener *listener,
void *data) {
struct output_surface *output_surface =
wl_container_of(listener, output_surface, layer_feedback);
const struct wlr_output_layer_feedback_event *event = data;
wlr_log(WLR_DEBUG, "Sending linux-dmabuf feedback to surface %p",
output_surface->wlr_surface);
struct wlr_linux_dmabuf_feedback_v1 feedback = {0};
const struct wlr_linux_dmabuf_feedback_v1_init_options options = {
.main_renderer = output_surface->server->renderer,
.output_layer_feedback_event = event,
};
wlr_linux_dmabuf_feedback_v1_init_with_options(&feedback, &options);
wlr_linux_dmabuf_v1_set_surface_feedback(output_surface->server->linux_dmabuf_v1,
output_surface->wlr_surface, &feedback);
wlr_linux_dmabuf_feedback_v1_finish(&feedback);
}
static void server_handle_new_surface(struct wl_listener *listener, static void server_handle_new_surface(struct wl_listener *listener,
void *data) { void *data) {
struct server *server = wl_container_of(listener, server, new_surface); struct server *server = wl_container_of(listener, server, new_surface);
@ -204,12 +230,16 @@ static void server_handle_new_surface(struct wl_listener *listener,
wl_list_for_each(output, &server->outputs, link) { wl_list_for_each(output, &server->outputs, link) {
struct output_surface *output_surface = calloc(1, sizeof(*output_surface)); struct output_surface *output_surface = calloc(1, sizeof(*output_surface));
output_surface->wlr_surface = wlr_surface; output_surface->wlr_surface = wlr_surface;
output_surface->server = server;
output_surface->destroy.notify = output_surface_handle_destroy; output_surface->destroy.notify = output_surface_handle_destroy;
wl_signal_add(&wlr_surface->events.destroy, &output_surface->destroy); wl_signal_add(&wlr_surface->events.destroy, &output_surface->destroy);
output_surface->commit.notify = output_surface_handle_commit; output_surface->commit.notify = output_surface_handle_commit;
wl_signal_add(&wlr_surface->events.commit, &output_surface->commit); wl_signal_add(&wlr_surface->events.commit, &output_surface->commit);
output_surface->layer = wlr_output_layer_create(output->wlr_output); output_surface->layer = wlr_output_layer_create(output->wlr_output);
output_surface->layer_feedback.notify = output_surface_handle_layer_feedback;
wl_signal_add(&output_surface->layer->events.feedback,
&output_surface->layer_feedback);
int pos = 50 * wl_list_length(&output->surfaces); int pos = 50 * wl_list_length(&output->surfaces);
@ -246,7 +276,13 @@ int main(int argc, char *argv[]) {
server.backend = wlr_backend_autocreate(server.wl_display, NULL); server.backend = wlr_backend_autocreate(server.wl_display, NULL);
server.renderer = wlr_renderer_autocreate(server.backend); server.renderer = wlr_renderer_autocreate(server.backend);
wlr_renderer_init_wl_display(server.renderer, server.wl_display); wlr_renderer_init_wl_shm(server.renderer, server.wl_display);
if (wlr_renderer_get_dmabuf_texture_formats(server.renderer) != NULL) {
wlr_drm_create(server.wl_display, server.renderer);
server.linux_dmabuf_v1 = wlr_linux_dmabuf_v1_create_with_renderer(
server.wl_display, 4, server.renderer);
}
server.allocator = wlr_allocator_autocreate(server.backend, server.allocator = wlr_allocator_autocreate(server.backend,
server.renderer); server.renderer);