[PATCH weston 05/13] compositor: Display the correct default buffer.
Emmanuel Gil Peyrot
linkmauve at linkmauve.fr
Tue Nov 14 15:05:52 UTC 2017
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 at linkmauve.fr>
---
libweston/compositor.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 53 insertions(+), 3 deletions(-)
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);
--
2.15.0
More information about the wayland-devel
mailing list