]> git.mdlowis.com Git - proto/labwc.git/commitdiff
server: chase swaywm/wlroots@fdf3169b4185
authorJan Beich <jbeich@FreeBSD.org>
Sun, 21 Nov 2021 07:01:16 +0000 (07:01 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 21 Nov 2021 07:52:19 +0000 (07:52 +0000)
ld: error: undefined symbol: wlr_backend_get_renderer
>>> referenced by output.c
>>>               labwc.p/src_output.c.o:(render_rect)
>>> referenced by output.c
>>>               labwc.p/src_output.c.o:(render_rect)
>>> referenced by output.c
>>>               labwc.p/src_output.c.o:(render_texture)
>>> referenced 5 more times

Based on https://github.com/swaywm/sway/commit/5865af75cf80
Based on https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/a6538ced3587

include/labwc.h
src/output.c
src/server.c

index b45b53e74d547332b69fcca06df7680eef0e5adc..2285b4082b3aa9146f1a55e0e73e9b719812320d 100644 (file)
@@ -9,6 +9,7 @@
 #include <unistd.h>
 #include <wayland-server-core.h>
 #include <wlr/backend.h>
+#include <wlr/render/allocator.h>
 #include <wlr/render/wlr_renderer.h>
 #include <wlr/types/wlr_compositor.h>
 #include <wlr/types/wlr_cursor.h>
@@ -105,6 +106,7 @@ struct seat {
 struct server {
        struct wl_display *wl_display;
        struct wlr_renderer *renderer;
+       struct wlr_allocator *allocator;
        struct wlr_backend *backend;
 
        struct wlr_xdg_shell *xdg_shell;
index e70fd47855f146ba4f8c9861be422f78854188be..73b1549799aed6940e573dc0edbf2eeee38e47d3 100644 (file)
@@ -110,7 +110,7 @@ scale_box(struct wlr_box *box, float scale)
 static void
 scissor_output(struct wlr_output *output, pixman_box32_t *rect)
 {
-       struct wlr_renderer *renderer = wlr_backend_get_renderer(output->backend);
+       struct wlr_renderer *renderer = output->renderer;
 
        struct wlr_box box = {
                .x = rect->x1,
@@ -134,8 +134,7 @@ render_texture(struct wlr_output *wlr_output,
                const struct wlr_fbox *src_box, const struct wlr_box *dst_box,
                const float matrix[static 9])
 {
-       struct wlr_renderer *renderer =
-               wlr_backend_get_renderer(wlr_output->backend);
+       struct wlr_renderer *renderer = wlr_output->renderer;
 
        pixman_region32_t damage;
        pixman_region32_init(&damage);
@@ -364,8 +363,7 @@ render_rect(struct output *output, pixman_region32_t *output_damage,
                const struct wlr_box *_box, float color[static 4])
 {
        struct wlr_output *wlr_output = output->wlr_output;
-       struct wlr_renderer *renderer =
-               wlr_backend_get_renderer(wlr_output->backend);
+       struct wlr_renderer *renderer = wlr_output->renderer;
 
        struct wlr_box box;
        memcpy(&box, _box, sizeof(struct wlr_box));
@@ -748,8 +746,7 @@ output_render(struct output *output, pixman_region32_t *damage)
        struct server *server = output->server;
        struct wlr_output *wlr_output = output->wlr_output;
 
-       struct wlr_renderer *renderer =
-               wlr_backend_get_renderer(wlr_output->backend);
+       struct wlr_renderer *renderer = wlr_output->renderer;
        if (!renderer) {
                wlr_log(WLR_DEBUG, "no renderer");
                return;
@@ -945,6 +942,13 @@ new_output_notify(struct wl_listener *listener, void *data)
        struct server *server = wl_container_of(listener, server, new_output);
        struct wlr_output *wlr_output = data;
 
+       /* Configures the output created by the backend to use our allocator
+        * and our renderer. Must be done once, before commiting the output */
+       if (!wlr_output_init_render(wlr_output, server->allocator, server->renderer)) {
+               wlr_log(WLR_ERROR, "unable to init output renderer");
+               return;
+       }
+
        /* The mode is a tuple of (width, height, refresh rate). */
        wlr_log(WLR_DEBUG, "set preferred mode");
        struct wlr_output_mode *preferred_mode =
index 167640fbad4a7882f3b8f8dd7d234ab12aa37677..b84c7cafb826169d0f63869da5bb1bd6123eaee9 100644 (file)
@@ -185,15 +185,28 @@ server_init(struct server *server)
         */
        drop_permissions();
 
-       /*
-        * If we don't provide a renderer, autocreate makes a GLES2 renderer
-        * for us. The renderer is responsible for defining the various pixel
-        * formats it supports for shared memory, this configures that for
-        * clients.
-        */
-       server->renderer = wlr_backend_get_renderer(server->backend);
+       /* Autocreates a renderer, either Pixman, GLES2 or Vulkan for us. The user
+        * can also specify a renderer using the WLR_RENDERER env var.
+        * The renderer is responsible for defining the various pixel formats it
+        * supports for shared memory, this configures that for clients. */
+       server->renderer = wlr_renderer_autocreate(server->backend);
+       if (!server->renderer) {
+               wlr_log(WLR_ERROR, "unable to create renderer");
+               exit(EXIT_FAILURE);
+       }
+
        wlr_renderer_init_wl_display(server->renderer, server->wl_display);
 
+       /* Autocreates an allocator for us.
+        * The allocator is the bridge between the renderer and the backend. It
+        * handles the buffer creation, allowing wlroots to render onto the
+        * screen */
+       server->allocator = wlr_allocator_autocreate(server->backend, server->renderer);
+       if (!server->allocator) {
+               wlr_log(WLR_ERROR, "unable to create allocator");
+               exit(EXIT_FAILURE);
+       }
+
        wl_list_init(&server->views);
        wl_list_init(&server->unmanaged_surfaces);