Skip to content
This repository has been archived by the owner on Nov 1, 2021. It is now read-only.

Commit

Permalink
Update x11 and multi backend to new renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
ascent12 committed Nov 10, 2018
1 parent 1b1024f commit 8eaba28
Show file tree
Hide file tree
Showing 16 changed files with 704 additions and 320 deletions.
21 changes: 12 additions & 9 deletions backend/backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@
//#include <wlr/backend/headless.h>
#include <wlr/backend/interface.h>
//#include <wlr/backend/libinput.h>
//#include <wlr/backend/multi.h>
#include <wlr/backend/multi.h>
//#include <wlr/backend/session.h>
#include <wlr/backend/wayland.h>
#include <wlr/util/log.h>

#include "backend/multi.h"

/* WLR_HAS_X11_BACKEND needs to be after wlr/config.h */
//#ifdef WLR_HAS_X11_BACKEND
//#include <wlr/backend/x11.h>
//#endif
#ifdef WLR_HAS_X11_BACKEND
#include <wlr/backend/x11.h>
#endif

void wlr_backend_init(struct wlr_backend *backend,
const struct wlr_backend_impl *impl) {
Expand Down Expand Up @@ -107,7 +107,6 @@ void wlr_backend_detach_gbm(struct wlr_backend *backend, struct wlr_gbm_image *i
}
}

#if 0
static size_t parse_outputs_env(const char *name) {
const char *outputs_str = getenv(name);
if (!outputs_str) {
Expand Down Expand Up @@ -157,6 +156,7 @@ static struct wlr_backend *attempt_x11_backend(struct wl_display *display,
}
#endif

#if 0
static struct wlr_backend *attempt_headless_backend(struct wl_display *display) {
struct wlr_backend *backend = wlr_headless_backend_create(display);
if (!backend) {
Expand Down Expand Up @@ -195,6 +195,7 @@ static struct wlr_backend *attempt_drm_backend(struct wl_display *display,

return primary_drm;
}
#endif

static struct wlr_backend *attempt_backend_by_name(struct wl_display *display,
struct wlr_backend *backend, struct wlr_session **session,
Expand All @@ -205,6 +206,7 @@ static struct wlr_backend *attempt_backend_by_name(struct wl_display *display,
} else if (strcmp(name, "x11") == 0) {
return attempt_x11_backend(display, NULL);
#endif
#if 0
} else if (strcmp(name, "headless") == 0) {
return attempt_headless_backend(display);
} else if (strcmp(name, "drm") == 0 || strcmp(name, "libinput") == 0) {
Expand All @@ -222,6 +224,7 @@ static struct wlr_backend *attempt_backend_by_name(struct wl_display *display,
} else {
return attempt_drm_backend(display, backend, *session);
}
#endif
}

wlr_log(WLR_ERROR, "unrecognized backend '%s'", name);
Expand Down Expand Up @@ -275,8 +278,7 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {

if (getenv("WAYLAND_DISPLAY") || getenv("_WAYLAND_DISPLAY") ||
getenv("WAYLAND_SOCKET")) {
struct wlr_backend *wl_backend = attempt_wl_backend(display,
create_renderer_func);
struct wlr_backend *wl_backend = attempt_wl_backend(display);
if (wl_backend) {
wlr_multi_backend_add(backend, wl_backend);
return backend;
Expand All @@ -287,14 +289,15 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
const char *x11_display = getenv("DISPLAY");
if (x11_display) {
struct wlr_backend *x11_backend =
attempt_x11_backend(display, x11_display, create_renderer_func);
attempt_x11_backend(display, x11_display);
if (x11_backend) {
wlr_multi_backend_add(backend, x11_backend);
return backend;
}
}
#endif

#if 0
// Attempt DRM+libinput
multi->session = wlr_session_create(display);
if (!multi->session) {
Expand Down Expand Up @@ -322,7 +325,7 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
wlr_backend_destroy(backend);
return NULL;
}
#endif

return backend;
}
#endif
26 changes: 13 additions & 13 deletions backend/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ backend_files = files(
#'libinput/tablet_pad.c',
#'libinput/tablet_tool.c',
#'libinput/touch.c',
#'multi/backend.c',
#'session/direct-ipc.c',
#'session/session.c',
'multi/backend.c',
'session/direct-ipc.c',
'session/session.c',
'wayland/backend.c',
'wayland/output.c',
'wayland/wl_seat.c',
Expand All @@ -38,18 +38,18 @@ backend_deps = [
wlr_render,
]

#if host_machine.system().startswith('freebsd')
# backend_files += files('session/direct-freebsd.c')
#else
# backend_files += files('session/direct.c')
#endif
if host_machine.system().startswith('freebsd')
backend_files += files('session/direct-freebsd.c')
else
backend_files += files('session/direct.c')
endif

#if logind.found()
# backend_files += files('session/logind.c')
# backend_deps += logind
#endif
if logind.found()
backend_files += files('session/logind.c')
backend_deps += logind
endif

#subdir('x11')
subdir('x11')

lib_wlr_backend = static_library(
'wlr_backend',
Expand Down
70 changes: 60 additions & 10 deletions backend/multi/backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,60 @@ static void multi_backend_destroy(struct wlr_backend *wlr_backend) {
free(backend);
}

static struct wlr_renderer *multi_backend_get_renderer(
struct wlr_backend *backend) {
static int multi_backend_get_render_fd(struct wlr_backend *backend) {
struct wlr_multi_backend *multi = multi_backend_from_backend(backend);

struct subbackend_state *sub;
wl_list_for_each(sub, &multi->backends, link) {
int fd = wlr_backend_get_render_fd(sub->backend);
if (fd >= 0) {
return fd;
}
}
return -1;
}

/*
* XXX: This function is broken.
*/
static bool multi_backend_attach_gbm(struct wlr_backend *backend,
struct wlr_gbm_image *img) {
struct wlr_multi_backend *multi = multi_backend_from_backend(backend);

struct subbackend_state *sub;
wl_list_for_each(sub, &multi->backends, link) {
if (wlr_backend_attach_gbm(sub->backend, img)) {
return true;
}
}
return false;
}

/*
* XXX: This function is broken.
*/
static void multi_backend_detach_gbm(struct wlr_backend *backend,
struct wlr_gbm_image *img) {
struct wlr_multi_backend *multi = multi_backend_from_backend(backend);

struct subbackend_state *sub;
wl_list_for_each(sub, &multi->backends, link) {
wlr_backend_attach_gbm(sub->backend, img);
return;
}
}

/*
* XXX: This function is broken.
*/
static struct wlr_format_set *multi_backend_get_formats(struct wlr_backend *backend) {
struct wlr_multi_backend *multi = multi_backend_from_backend(backend);

struct subbackend_state *sub;
wl_list_for_each(sub, &multi->backends, link) {
struct wlr_renderer *rend = wlr_backend_get_renderer(sub->backend);
if (rend != NULL) {
return rend;
struct wlr_format_set *formats = wlr_backend_get_formats(sub->backend);
if (formats) {
return formats;
}
}
return NULL;
Expand Down Expand Up @@ -96,7 +141,10 @@ static clockid_t multi_backend_get_presentation_clock(
struct wlr_backend_impl backend_impl = {
.start = multi_backend_start,
.destroy = multi_backend_destroy,
.get_renderer = multi_backend_get_renderer,
.get_render_fd = multi_backend_get_render_fd,
.attach_gbm = multi_backend_attach_gbm,
.detach_gbm = multi_backend_detach_gbm,
.get_formats = multi_backend_get_formats,
.get_session = multi_backend_get_session,
.get_presentation_clock = multi_backend_get_presentation_clock,
};
Expand Down Expand Up @@ -169,10 +217,12 @@ bool wlr_multi_backend_add(struct wlr_backend *_multi,
return true;
}

struct wlr_renderer *multi_renderer =
multi_backend_get_renderer(&multi->backend);
struct wlr_renderer *backend_renderer = wlr_backend_get_renderer(backend);
if (multi_renderer != NULL && backend_renderer != NULL && multi_renderer != backend_renderer) {
/*
* TODO: Check for equivilent devices by major:minor etc.
*/
int multi_fd = multi_backend_get_render_fd(&multi->backend);
int fd = wlr_backend_get_render_fd(backend);
if (multi_fd >= 0 && fd >= 0 && multi_fd != fd) {
wlr_log(WLR_ERROR, "Could not add backend: multiple renderers at the "
"same time aren't supported");
return false;
Expand Down
13 changes: 12 additions & 1 deletion backend/wayland/backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,24 @@ static int backend_get_render_fd(struct wlr_backend *backend) {
return wl->render_fd;
}

extern struct wl_callback_listener frame_listener;

static void buffer_handle_release(void *data, struct wl_buffer *wl_buffer) {
struct wlr_wl_buffer_data *info = wl_buffer_get_user_data(wl_buffer);
struct wlr_wl_output *output = info->output;

assert(info);

wl_buffer_set_user_data(wl_buffer, NULL);
wlr_output_send_release_image(&info->output->wlr_output, info->img, info->data);
wl_signal_emit(&info->img->release, info->img);

if (!output->frame_callback) {
output->wlr_output.frame_pending = true;
output->frame_callback = wl_surface_frame(output->surface);
wl_callback_add_listener(output->frame_callback, &frame_listener,
output);
wl_surface_commit(output->surface);
}

free(info);
}
Expand Down
4 changes: 2 additions & 2 deletions backend/wayland/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ static struct wlr_wl_output *get_wl_output_from_output(
return (struct wlr_wl_output *)wlr_output;
}

static struct wl_callback_listener frame_listener;
struct wl_callback_listener frame_listener;

static void surface_frame_callback(void *data, struct wl_callback *cb,
uint32_t time) {
Expand All @@ -41,7 +41,7 @@ static void surface_frame_callback(void *data, struct wl_callback *cb,
wlr_output_send_frame(&output->wlr_output);
}

static struct wl_callback_listener frame_listener = {
struct wl_callback_listener frame_listener = {
.done = surface_frame_callback
};

Expand Down
Loading

0 comments on commit 8eaba28

Please sign in to comment.