[weston,05/13] compositor: Display the correct default buffer.

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

Details

Message ID 20171114150600.1763-6-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:05 p.m.
When a backend isn’t stereoscopy-aware, the compositor itself will
calculate the correct offset.

Backends which are aware of stereoscopy should do this computation
themselves, in the correct place.

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

Patch hide | download patch | download mbox

diff --git a/libweston/compositor.c b/libweston/compositor.c
index dc2b563a..a2f624f6 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -788,6 +788,53 @@  viewport_surface_to_buffer(struct weston_surface *surface,
 	*by = sy * src_height / surface->height + src_y;
 }
 
+static void
+stereo_surface_to_buffer(struct weston_surface *surface,
+			 float sx, float sy, float *bx, float *by)
+{
+	struct weston_buffer_viewport *vp = &surface->buffer_viewport;
+	uint32_t default_side = vp->surface.default_side;
+
+	if (surface->compositor->capabilities & WESTON_CAP_STEREOSCOPY) {
+		/* The backend supports stereoscopy natively, we don’t have to
+		 * do anything here. */
+		*bx = sx;
+		*by = sy;
+	} else {
+		switch (vp->buffer.stereoscopy_layout) {
+		case ZWP_STEREOSCOPY_V1_LAYOUT_NONE:
+			*bx = sx;
+			*by = sy;
+			break;
+		case ZWP_STEREOSCOPY_V1_LAYOUT_FRAME_PACKING:
+			/* TODO: Frame-packing support for clients doesn’t work
+			 * currently, since the buffer size needs to be bigger
+			 * than the surface size, and we have no provision for
+			 * that currently. */
+			*bx = sx;
+			*by = sy;
+			if (default_side == ZWP_STEREOSCOPY_DESCRIPTION_V1_SIDE_RIGHT)
+				*by += surface->height * 25.0 / 24.0;
+			break;
+		case ZWP_STEREOSCOPY_V1_LAYOUT_TOP_AND_BOTTOM:
+			*bx = sx;
+			*by = sy / 2.0;
+			if (default_side == ZWP_STEREOSCOPY_DESCRIPTION_V1_SIDE_RIGHT)
+				*by += surface->height / 2.0;
+			break;
+		case ZWP_STEREOSCOPY_V1_LAYOUT_SIDE_BY_SIDE:
+			*bx = sx / 2.0;
+			*by = sy;
+			if (default_side == ZWP_STEREOSCOPY_DESCRIPTION_V1_SIDE_RIGHT)
+				*bx += surface->width / 2.0;
+			break;
+		default:
+			// TODO: add support for the other layouts.
+			assert(0);
+		}
+	}
+}
+
 WL_EXPORT void
 weston_surface_to_buffer_float(struct weston_surface *surface,
 			       float sx, float sy, float *bx, float *by)
@@ -795,7 +842,8 @@  weston_surface_to_buffer_float(struct weston_surface *surface,
 	struct weston_buffer_viewport *vp = &surface->buffer_viewport;
 
 	/* first transform coordinates if the viewport is set */
-	viewport_surface_to_buffer(surface, sx, sy, bx, by);
+	stereo_surface_to_buffer(surface, sx, sy, bx, by);
+	viewport_surface_to_buffer(surface, *bx, *by, bx, by);
 
 	weston_transformed_coord(surface->width_from_buffer,
 				 surface->height_from_buffer,
@@ -829,11 +877,13 @@  weston_surface_to_buffer_rect(struct weston_surface *surface,
 	float xf, yf;
 
 	/* first transform box coordinates if the viewport is set */
-	viewport_surface_to_buffer(surface, rect.x1, rect.y1, &xf, &yf);
+	stereo_surface_to_buffer(surface, rect.x1, rect.y1, &xf, &yf);
+	viewport_surface_to_buffer(surface, xf, yf, &xf, &yf);
 	rect.x1 = floorf(xf);
 	rect.y1 = floorf(yf);
 
-	viewport_surface_to_buffer(surface, rect.x2, rect.y2, &xf, &yf);
+	stereo_surface_to_buffer(surface, rect.x2, rect.y2, &xf, &yf);
+	viewport_surface_to_buffer(surface, xf, yf, &xf, &yf);
 	rect.x2 = ceilf(xf);
 	rect.y2 = ceilf(yf);