From: Emmanuel Gil Peyrot <emmanuel.pey...@collabora.com> It can take the values "", "frame-packing", "top-and-bottom" and "side-by-side". Any mode not corresponding to one of these will be discarded.
Signed-off-by: Emmanuel Gil Peyrot <linkma...@linkmauve.fr> --- Makefile.am | 4 +++- compositor/main.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ libweston/compositor.c | 24 ++++++++++++++++++++ libweston/compositor.h | 7 ++++++ man/weston-drm.man | 6 ++++- 5 files changed, 99 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index e1cdb289..39b71b88 100644 --- a/Makefile.am +++ b/Makefile.am @@ -691,7 +691,9 @@ nodist_libtoytoolkit_la_SOURCES = \ protocol/pointer-constraints-unstable-v1-protocol.c \ protocol/pointer-constraints-unstable-v1-client-protocol.h \ protocol/relative-pointer-unstable-v1-protocol.c \ - protocol/relative-pointer-unstable-v1-client-protocol.h + protocol/relative-pointer-unstable-v1-client-protocol.h \ + protocol/stereoscopy-unstable-v1-protocol.c \ + protocol/stereoscopy-unstable-v1-client-protocol.h BUILT_SOURCES += $(nodist_libtoytoolkit_la_SOURCES) diff --git a/compositor/main.c b/compositor/main.c index 9e4451e5..ffbfeb95 100644 --- a/compositor/main.c +++ b/compositor/main.c @@ -65,6 +65,8 @@ #include "compositor-wayland.h" #include "windowed-output-api.h" +#include "stereoscopy-unstable-v1-server-protocol.h" + #define WINDOW_TITLE "Weston Compositor" struct wet_output_config { @@ -978,6 +980,28 @@ weston_transform_to_string(uint32_t output_transform) return "<illegal value>"; } +static const struct { const char *name; uint32_t token; } stereoscopy_layouts[] = { + { "", ZWP_STEREOSCOPY_V1_LAYOUT_NONE }, + { "frame-packing", ZWP_STEREOSCOPY_V1_LAYOUT_FRAME_PACKING }, + { "top-and-bottom", ZWP_STEREOSCOPY_V1_LAYOUT_TOP_AND_BOTTOM }, + { "side-by-side", ZWP_STEREOSCOPY_V1_LAYOUT_SIDE_BY_SIDE }, +}; + +WL_EXPORT int +weston_parse_stereoscopy_layout(const char *layout, uint32_t *out) +{ + unsigned int i; + + for (i = 0; i < ARRAY_LENGTH(stereoscopy_layouts); i++) + if (strcmp(stereoscopy_layouts[i].name, layout) == 0) { + *out = stereoscopy_layouts[i].token; + return 0; + } + + *out = ZWP_STEREOSCOPY_V1_LAYOUT_NONE; + return -1; +} + static int load_configuration(struct weston_config **config, int32_t noconfig, const char *config_file) @@ -1068,6 +1092,36 @@ wet_output_set_transform(struct weston_output *output, weston_output_set_transform(output, transform); } +/* UINT32_MAX is treated as invalid because 0 is a valid + * enumeration value and the parameter is unsigned + */ +static void +wet_output_set_stereoscopy_layout(struct weston_output *output, + struct weston_config_section *section, + uint32_t default_layout, + uint32_t parsed_layout) +{ + char *t; + uint32_t layout = default_layout; + + if (section) { + weston_config_section_get_string(section, + "stereoscopy", &t, ""); + + if (weston_parse_stereoscopy_layout(t, &layout) < 0) { + weston_log("Invalid stereoscopy layout \"%s\" for output %s\n", + t, output->name); + layout = default_layout; + } + free(t); + } + + if (parsed_layout != UINT32_MAX) + layout = parsed_layout; + + weston_output_set_stereoscopy_layout(output, layout); +} + static int wet_configure_windowed_output_from_config(struct weston_output *output, struct wet_output_config *defaults) @@ -1185,6 +1239,12 @@ drm_backend_output_configure(struct wl_listener *listener, void *data) } free(s); + /* This must be parsed before setting the mode, otherwise we will + * always choose a mono mode. */ + wet_output_set_stereoscopy_layout(output, section, + ZWP_STEREOSCOPY_V1_LAYOUT_NONE, + UINT32_MAX); + if (api->set_mode(output, mode, modeline) < 0) { weston_log("Cannot configure an output using weston_drm_output_api.\n"); free(modeline); diff --git a/libweston/compositor.c b/libweston/compositor.c index 723dec02..7766e8c4 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -4758,6 +4758,30 @@ weston_output_set_transform(struct weston_output *output, output->transform = transform; } +/** Sets the stereoscopy layout for a given output. + * + * \param output The weston_output object that the layout is set for. + * \param layout Layout value for the given output. + * + * It only supports setting the layout for an output that is + * not enabled. + * + * Refer to wp_stereoscopy::layout section located at + * https://cgit.freedesktop.org/wayland/wayland-protocols/tree/unstable/stereoscopy/stereoscopy-unstable-v1.xml + * for list of values that can be passed to this function. + * + * \memberof weston_output + */ +WL_EXPORT void +weston_output_set_stereoscopy_layout(struct weston_output *output, + uint32_t layout) +{ + /* We can only set the layout on a disabled output */ + assert(!output->enabled); + + output->stereoscopy_layout = layout; +} + /** Initializes a weston_output object with enough data so ** an output can be configured. * diff --git a/libweston/compositor.h b/libweston/compositor.h index 165f257c..09585d15 100644 --- a/libweston/compositor.h +++ b/libweston/compositor.h @@ -1915,6 +1915,9 @@ weston_parse_transform(const char *transform, uint32_t *out); const char * weston_transform_to_string(uint32_t output_transform); +int +weston_parse_stereoscopy_layout(const char *layout, uint32_t *out); + struct weston_keyboard * weston_seat_get_keyboard(struct weston_seat *seat); @@ -1939,6 +1942,10 @@ void weston_output_set_transform(struct weston_output *output, uint32_t transform); +void +weston_output_set_stereoscopy_layout(struct weston_output *output, + uint32_t transform); + void weston_output_init(struct weston_output *output, struct weston_compositor *compositor, diff --git a/man/weston-drm.man b/man/weston-drm.man index d7fd5614..9fdbaf8f 100644 --- a/man/weston-drm.man +++ b/man/weston-drm.man @@ -78,7 +78,11 @@ can generate detailed mode lines. Transform for the output, which can be rotated in 90-degree steps and possibly flipped. Possible values are .BR normal ", " 90 ", " 180 ", " 270 ", " -.BR flipped ", " flipped-90 ", " flipped-180 ", and " flipped-270 . +.BR flipped ", " flipped-90 ", " flipped-180 ", and " flipped-270 " . +\fBstereoscopy\fR=\fIlayout\fR +Stereoscopy layout for the output, which is currently only supported on +monitors exposing HDMI 3D modes. Possible values are nothing, +.BR frame-packing ", " top-and-bottom ", and " side-by-side ". . .\" *************************************************************** .SH OPTIONS -- 2.15.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel