X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=4294c646d1bce2669001dad81029ca8f4817d6a4;hb=b3c4f205c94e55d574483160f5d38b0bfc7c1d16;hp=cad8a42703f1a7bac0f88298a138e012af8f6b47;hpb=226f4ca4f760ddbbc7566630a9e21c457d70a4eb;p=src%2Fagl-compositor.git diff --git a/src/main.c b/src/main.c index cad8a42..4294c64 100644 --- a/src/main.c +++ b/src/main.c @@ -46,12 +46,17 @@ #include #include #include +#include #include "shared/os-compatibility.h" #include "shared/helpers.h" #include "agl-shell-server-protocol.h" +#ifdef HAVE_REMOTING +#include "remote.h" +#endif + static int cached_tm_mday = -1; static struct weston_log_scope *log_scope; @@ -85,6 +90,20 @@ to_ivi_output(struct weston_output *o) return output; } +static void +ivi_output_configure_app_id(struct ivi_output *ivi_output) +{ + if (ivi_output->config) { + if (ivi_output->app_id != NULL) + return; + + weston_config_section_get_string(ivi_output->config, + "agl-shell-app-id", + &ivi_output->app_id, + NULL); + } +} + static struct ivi_output * ivi_ensure_output(struct ivi_compositor *ivi, char *name, struct weston_config_section *config) @@ -119,6 +138,7 @@ ivi_ensure_output(struct ivi_compositor *ivi, char *name, &output->output_destroy); wl_list_insert(&ivi->outputs, &output->link); + ivi_output_configure_app_id(output); return output; } @@ -532,6 +552,151 @@ heads_changed(struct wl_listener *listener, void *arg) } } +#ifdef HAVE_REMOTING +static int +drm_backend_remoted_output_configure(struct weston_output *output, + struct weston_config_section *section, + char *modeline, + const struct weston_remoting_api *api) +{ + char *gbm_format = NULL; + char *seat = NULL; + char *host = NULL; + char *pipeline = NULL; + int port, ret; + + ret = api->set_mode(output, modeline); + if (ret < 0) { + weston_log("Cannot configure an output \"%s\" using " + "weston_remoting_api. Invalid mode\n", + output->name); + return -1; + } + + /* FIXME: retrieve the scale and the transform from config file */ + weston_output_set_scale(output, 1); + weston_output_set_transform(output, WL_OUTPUT_TRANSFORM_NORMAL); + + weston_config_section_get_string(section, "gbm-format", + &gbm_format, NULL); + api->set_gbm_format(output, gbm_format); + free(gbm_format); + + weston_config_section_get_string(section, "seat", &seat, ""); + + api->set_seat(output, seat); + free(seat); + + weston_config_section_get_string(section, "gst-pipeline", &pipeline, + NULL); + if (pipeline) { + api->set_gst_pipeline(output, pipeline); + free(pipeline); + return 0; + } + + weston_config_section_get_string(section, "host", &host, NULL); + weston_config_section_get_int(section, "port", &port, 0); + if (!host || port <= 0 || 65533 < port) { + weston_log("Cannot configure an output \"%s\". " + "Need to specify gst-pipeline or " + "host and port (1-65533).\n", output->name); + } + api->set_host(output, host); + free(host); + api->set_port(output, port); + + return 0; +} + + +static void +remote_output_init(struct weston_compositor *compositor, + struct weston_config_section *section, + const struct weston_remoting_api *api) +{ + struct weston_output *output = NULL; + char *output_name, *modeline = NULL; + int ret; + + weston_config_section_get_string(section, "name", &output_name, NULL); + if (!output_name) + return; + + weston_config_section_get_string(section, "mode", &modeline, "off"); + if (strcmp(modeline, "off") == 0) + goto err; + + output = api->create_output(compositor, output_name); + if (!output) { + weston_log("Cannot create remoted output \"%s\".\n", + output_name); + goto err; + } + + ret = drm_backend_remoted_output_configure(output, section, + modeline, api); + if (ret < 0) { + weston_log("Cannot configure remoted output \"%s\".\n", + output_name); + goto err; + } + + if (weston_output_enable(output) < 0) { + weston_log("Enabling remoted output \"%s\" failed.\n", + output_name); + goto err; + } + + free(modeline); + free(output_name); + weston_log("remoted output '%s' enabled\n", output->name); + return; + +err: + free(modeline); + free(output_name); + if (output) + weston_output_destroy(output); + +} + +static int +load_remoting(struct weston_compositor *compositor, struct weston_config *config) +{ + const struct weston_remoting_api *api = NULL; + int (*module_init)(struct weston_compositor *wc); + struct weston_config_section *remote_section = NULL; + const char *section_name; + + module_init = weston_load_module("remoting-plugin.so", + "weston_module_init"); + if (!module_init) + return -1; + + if (module_init(compositor) < 0) + return -1; + + api = weston_remoting_get_api(compositor); + if (!api) + return -1; + + while (weston_config_next_section(config, &remote_section, §ion_name)) { + if (strcmp(section_name, "remote-output")) + continue; + remote_output_init(compositor, remote_section, api); + } + + return 0; +} +#else +static int +load_remoting(struct weston_compositor *compositor, struct weston_config *config) +{ + return -1; +} +#endif + static int load_drm_backend(struct ivi_compositor *ivi, int *argc, char *argv[]) { @@ -579,6 +744,8 @@ load_drm_backend(struct ivi_compositor *ivi, int *argc, char *argv[]) goto error; } + load_remoting(ivi->compositor, ivi->config); + error: free(config.gbm_format); free(config.seat_id);