- section = weston_config_get_section(b->compositor->config,
"output", "name",
- output->base.name);
- weston_config_section_get_string(section, "mode", &s, "preferred");
+ snprintf(section, sizeof section, "output %s", output->base.name);
+
+ s = b->context->backend_config.string_getter(section, "mode",
"preferred", b->context->backend_config.user_data);
if (strcmp(s, "off") == 0)
config = OUTPUT_CONFIG_OFF;
else if (strcmp(s, "preferred") == 0)
@@ -2340,20 +2341,21 @@ create_output_for_connector(struct drm_backend
*b,
}
free(s);
- weston_config_section_get_int(section, "scale", &scale, 1);
- weston_config_section_get_string(section, "transform", &s,
"normal");
+ scale = b->context->backend_config.int_getter(section, "scale",
1, b->context->backend_config.user_data);
+ s = b->context->backend_config.string_getter(section,
"transform", "normal", b->context->backend_config.user_data);
if (weston_parse_transform(s, &transform) < 0)
weston_log("Invalid transform \"%s\" for output %s\n",
s, output->base.name);
free(s);
- if (get_gbm_format_from_section(section,
- b->format,
- &output->format) == -1)
+ if (get_gbm_format_from_config(b->context,
+ section,
+ b->format,
+ &output->format) == -1)
output->format = b->format;
- weston_config_section_get_string(section, "seat", &s, "");
+ s = b->context->backend_config.string_getter(section, "seat", "",
b->context->backend_config.user_data);
setup_output_seat_constraint(b, &output->base, s);
free(s);
@@ -3058,16 +3060,16 @@ renderer_switch_binding(struct weston_keyboard
*keyboard, uint32_t time,
}
static struct drm_backend *
-drm_backend_create(struct weston_compositor *compositor,
- struct drm_parameters *param,
- int *argc, char *argv[],
- struct weston_config *config)
+drm_backend_create(struct libweston_context *context)
{
+ struct weston_compositor *compositor = context->compositor;
struct drm_backend *b;
- struct weston_config_section *section;
struct udev_device *drm_device;
struct wl_event_loop *loop;
const char *path;
+ int tty;
+ uint32_t connector;
+ const char *seat_id = default_seat;
weston_log("initializing drm backend\n");
@@ -3075,6 +3077,8 @@ drm_backend_create(struct weston_compositor
*compositor,
if (b == NULL)
return NULL;
+ b->context = context;
+
/*
* KMS support for hardware planes cannot properly synchronize
* without nuclear page flip. Without nuclear/atomic, hw plane
@@ -3088,17 +3092,19 @@ drm_backend_create(struct weston_compositor
*compositor,
b->sprites_are_broken = 1;
b->compositor = compositor;
- section = weston_config_get_section(config, "core", NULL, NULL);
- if (get_gbm_format_from_section(section,
- GBM_FORMAT_XRGB8888,
- &b->format) == -1)
+ if (get_gbm_format_from_config(context,
+ "core",
+ GBM_FORMAT_XRGB8888,
+ &b->format) == -1)
goto err_base;
- b->use_pixman = param->use_pixman;
+ b->use_pixman = context->backend_config.bool_getter(NULL,
"use-pixman", false, context->backend_config.user_data);
+ tty = context->backend_config.int_getter(NULL, "tty", 0,
context->backend_config.user_data);
+ connector = context->backend_config.int_getter(NULL, "connector",
0, context->backend_config.user_data);
/* Check if we run drm-backend using weston-launch */
- compositor->launcher = weston_launcher_connect(compositor,
param->tty,
- param->seat_id, true);
+ compositor->launcher = weston_launcher_connect(compositor, tty,
+ seat_id, true);
if (compositor->launcher == NULL) {
weston_log("fatal: drm backend should be run "
"using weston-launch binary or as root\n");
@@ -3114,7 +3120,7 @@ drm_backend_create(struct weston_compositor
*compositor,
b->session_listener.notify = session_notify;
wl_signal_add(&compositor->session_signal, &b->session_listener);
- drm_device = find_primary_gpu(b, param->seat_id);
+ drm_device = find_primary_gpu(b, seat_id);
if (drm_device == NULL) {
weston_log("no drm device found\n");
goto err_udev;
@@ -3149,12 +3155,12 @@ drm_backend_create(struct weston_compositor
*compositor,
create_sprites(b);
if (udev_input_init(&b->input,
- compositor, b->udev, param->seat_id) < 0) {
+ compositor, b->udev, seat_id) < 0) {
weston_log("failed to create input devices\n");
goto err_sprite;
}
- if (create_outputs(b, param->connector, drm_device) < 0) {
+ if (create_outputs(b, connector, drm_device) < 0) {
weston_log("failed to create output for %s\n", path);
goto err_udev_input;
}
@@ -3235,26 +3241,11 @@ err_base:
}
WL_EXPORT int
-backend_init(struct weston_compositor *compositor, int *argc, char
*argv[],
- struct weston_config *config,
- struct weston_backend_config *config_base)
+libweston_backend_init(struct libweston_context *context)
{
struct drm_backend *b;
- struct drm_parameters param = { 0, };
-
- const struct weston_option drm_options[] = {
- { WESTON_OPTION_INTEGER, "connector", 0, ¶m.connector },
- { WESTON_OPTION_STRING, "seat", 0, ¶m.seat_id },
- { WESTON_OPTION_INTEGER, "tty", 0, ¶m.tty },
- { WESTON_OPTION_BOOLEAN, "current-mode", 0,
&option_current_mode },
- { WESTON_OPTION_BOOLEAN, "use-pixman", 0, ¶m.use_pixman },
- };
-
- param.seat_id = default_seat;
-
- parse_options(drm_options, ARRAY_LENGTH(drm_options), argc, argv);
- b = drm_backend_create(compositor, ¶m, argc, argv, config);
+ b = drm_backend_create(context);
if (b == NULL)
return -1;
return 0;
diff --git a/src/libbacklight.c b/lib/libbacklight.c
similarity index 100%
rename from src/libbacklight.c
rename to lib/libbacklight.c
diff --git a/src/libbacklight.h b/lib/libbacklight.h
similarity index 100%
rename from src/libbacklight.h
rename to lib/libbacklight.h
diff --git a/lib/libweston.c b/lib/libweston.c
index da21f8e..dd77f6b 100644
--- a/lib/libweston.c
+++ b/lib/libweston.c
@@ -69,8 +69,31 @@ libweston_load_module(const char *name, const char
*entrypoint)
return init;
}
+static enum libweston_backend
+load_backend(struct libweston_context *context, const char *backend)
+{
+ int (*backend_init)(struct libweston_context *context);
+
+ backend_init = libweston_load_module(backend,
"libweston_backend_init");
+ if (!backend_init)
+ return -1;
+
+ return backend_init(context);
+
+}
+
WL_EXPORT int
libweston_load_backend(struct libweston_context *context, enum
libweston_backend preffered)
{
+ if (preffered == LIBWESTON_BACKEND_NONE) {
+ preffered = LIBWESTON_BACKEND_DRM;
+ }
+
+ switch (preffered) {
+ case LIBWESTON_BACKEND_DRM:
+ return load_backend(context, "drm-backend.so");
+ case LIBWESTON_BACKEND_NONE:
+ break;
+ }
return -1;
}
diff --git a/lib/libweston.h b/lib/libweston.h
index 7a995b8..3950316 100644
--- a/lib/libweston.h
+++ b/lib/libweston.h
@@ -14,6 +14,7 @@ void *libweston_load_module(const char *name, const
char *entrypoint);
enum libweston_backend {
LIBWESTON_BACKEND_NONE = 0,
+ LIBWESTON_BACKEND_DRM,
};
int libweston_load_backend(struct libweston_context *context, enum
libweston_backend preffered);
diff --git a/src/main.c b/src/main.c
index 3e52168..c03835a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -660,6 +660,9 @@ load_backend(struct weston_compositor *compositor,
const char *backend,
{
enum libweston_backend libweston_backend = LIBWESTON_BACKEND_NONE;
+ if (strstr(backend, "drm"))
+ libweston_backend = LIBWESTON_BACKEND_DRM;
+
if (libweston_load_backend(compositor->libweston,
libweston_backend) == 0)
return 0;