#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>
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;
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,
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);
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));
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;
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 =
*/
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);