compositor: make renderer optional

This is a first step towards moving texture uploading out of
wlr_compositor.

This commit allows compositors to opt-out of the texture uploading
by passing a NULL wlr_renderer. An immediate user of this is
gamescope, which currently implements a stub wlr_renderer just to
make wlr_compositor happy.
Simon Ser 2 years ago
parent 1978a91717
commit 42016fa262

@ -90,7 +90,7 @@ struct wlr_surface_output {
struct wlr_surface { struct wlr_surface {
struct wl_resource *resource; struct wl_resource *resource;
struct wlr_renderer *renderer; struct wlr_renderer *renderer; // may be NULL
/** /**
* The surface's buffer, if any. A surface has an attached buffer when it * The surface's buffer, if any. A surface has an attached buffer when it
* commits with a non-null buffer in its pending state. A surface will not * commits with a non-null buffer in its pending state. A surface will not
@ -168,7 +168,7 @@ struct wlr_renderer;
struct wlr_compositor { struct wlr_compositor {
struct wl_global *global; struct wl_global *global;
struct wlr_renderer *renderer; struct wlr_renderer *renderer; // may be NULL
struct wl_listener display_destroy; struct wl_listener display_destroy;
@ -305,6 +305,9 @@ void wlr_surface_unlock_cached(struct wlr_surface *surface, uint32_t seq);
/** /**
* Create the wl_compositor global, which can be used by clients to create * Create the wl_compositor global, which can be used by clients to create
* surfaces and regions. * surfaces and regions.
*
* If a renderer is supplied, the compositor will create struct wlr_texture
* objects from client buffers on surface commit.
*/ */
struct wlr_compositor *wlr_compositor_create(struct wl_display *display, struct wlr_compositor *wlr_compositor_create(struct wl_display *display,
struct wlr_renderer *renderer); struct wlr_renderer *renderer);

@ -370,6 +370,10 @@ static void surface_apply_damage(struct wlr_surface *surface) {
} }
} }
if (surface->renderer == NULL) {
return;
}
struct wlr_client_buffer *buffer = wlr_client_buffer_create( struct wlr_client_buffer *buffer = wlr_client_buffer_create(
surface->current.buffer, surface->renderer); surface->current.buffer, surface->renderer);
@ -699,8 +703,12 @@ static struct wlr_surface *surface_create(struct wl_client *client,
pixman_region32_init(&surface->input_region); pixman_region32_init(&surface->input_region);
wlr_addon_set_init(&surface->addons); wlr_addon_set_init(&surface->addons);
wl_signal_add(&renderer->events.destroy, &surface->renderer_destroy); if (renderer != NULL) {
surface->renderer_destroy.notify = surface_handle_renderer_destroy; wl_signal_add(&renderer->events.destroy, &surface->renderer_destroy);
surface->renderer_destroy.notify = surface_handle_renderer_destroy;
} else {
wl_list_init(&surface->renderer_destroy.link);
}
return surface; return surface;
} }

Loading…
Cancel
Save