[weston,13/13] compositor-drm: Select stereo modes based on the configuration.

Submitted by Emmanuel Gil Peyrot on Nov. 14, 2017, 3:06 p.m.

Details

Message ID 20171114150600.1763-14-linkmauve@linkmauve.fr
State New
Headers show
Series "Add stereoscopy support" ( rev: 1 ) in Wayland

Not browsing as part of any series.

Commit Message

Emmanuel Gil Peyrot Nov. 14, 2017, 3:06 p.m.
From: Emmanuel Gil Peyrot <emmanuel.peyrot@collabora.com>

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
---
 libweston/compositor-drm.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 00f85e8b..eaf60132 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -3024,7 +3024,8 @@  drm_output_choose_initial_mode(struct drm_backend *backend,
 			       struct drm_output *output,
 			       enum weston_drm_backend_output_mode mode,
 			       const char *modeline,
-			       const drmModeModeInfo *current_mode)
+			       const drmModeModeInfo *current_mode,
+			       uint32_t stereoscopy_layout)
 {
 	struct drm_mode *preferred = NULL;
 	struct drm_mode *current = NULL;
@@ -3054,6 +3055,28 @@  drm_output_choose_initial_mode(struct drm_backend *backend,
 	}
 
 	wl_list_for_each_reverse(drm_mode, &output->base.mode_list, base.link) {
+		uint32_t stereo_flags = drm_mode->mode_info.flags & DRM_MODE_FLAG_3D_MASK;
+		switch (output->base.stereoscopy_layout) {
+		case ZWP_STEREOSCOPY_V1_LAYOUT_NONE:
+			if (stereo_flags != 0)
+				continue;
+			break;
+		case ZWP_STEREOSCOPY_V1_LAYOUT_FRAME_PACKING:
+			if (stereo_flags != DRM_MODE_FLAG_3D_FRAME_PACKING)
+				continue;
+			break;
+		case ZWP_STEREOSCOPY_V1_LAYOUT_TOP_AND_BOTTOM:
+			if (stereo_flags != DRM_MODE_FLAG_3D_TOP_AND_BOTTOM)
+				continue;
+			break;
+		case ZWP_STEREOSCOPY_V1_LAYOUT_SIDE_BY_SIDE:
+			if (stereo_flags != DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF)
+				continue;
+			break;
+		default:
+			assert(0);
+		}
+
 		if (width == drm_mode->base.width &&
 		    height == drm_mode->base.height &&
 		    (refresh == 0 || refresh == drm_mode->mode_info.vrefresh))
@@ -3132,7 +3155,9 @@  drm_output_set_mode(struct weston_output *base,
 	if (connector_get_current_mode(output->connector, b->drm.fd, &crtc_mode) < 0)
 		return -1;
 
-	current = drm_output_choose_initial_mode(b, output, mode, modeline, &crtc_mode);
+	current = drm_output_choose_initial_mode(b, output, mode, modeline,
+	                                         &crtc_mode,
+	                                         output->base.stereoscopy_layout);
 	if (!current)
 		return -1;