From 7bb6510748522d31fb711257126f2231533d4dd1 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Wed, 22 May 2013 18:03:04 +0300 Subject: [PATCH] compositor: add capability flag for arbitrary surface rotation The upcoming rpi-renderer cannot handle arbitrary rotations. Introduce Weston capability bits, and add a bit for arbitrary rotation. GL and Pixman renderers support it. Shell or any other module must not produce surface transformations with rotation, if the capability bit is not set. Do not register the surface rotation binding in desktop shell, if arbitary rotation is not supported. Signed-off-by: Pekka Paalanen --- src/compositor.c | 24 ++++++++++++++++++++++++ src/compositor.h | 6 ++++++ src/gl-renderer.c | 1 + src/pixman-renderer.c | 1 + src/shell.c | 7 +++++-- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index 99fff6d9..6e5879e0 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -2888,6 +2888,28 @@ weston_version(int *major, int *minor, int *micro) *micro = WESTON_VERSION_MICRO; } +static const struct { + uint32_t bit; + const char *desc; +} capability_strings[] = { + { WESTON_CAP_ROTATION_ANY, "arbitrary surface rotation:" }, +}; + +static void +weston_compositor_log_capabilities(struct weston_compositor *compositor) +{ + unsigned i; + int yes; + + weston_log("Compositor capabilities:\n"); + for (i = 0; i < ARRAY_LENGTH(capability_strings); i++) { + yes = compositor->capabilities & capability_strings[i].bit; + weston_log_continue(STAMP_SPACE "%s %s\n", + capability_strings[i].desc, + yes ? "yes" : "no"); + } +} + static int on_term_signal(int signal_number, void *data) { struct wl_display *display = data; @@ -3282,6 +3304,8 @@ int main(int argc, char *argv[]) goto out; } + weston_compositor_log_capabilities(ec); + if (wl_display_add_socket(display, socket_name)) { weston_log("fatal: failed to add socket: %m\n"); ret = EXIT_FAILURE; diff --git a/src/compositor.h b/src/compositor.h index 9a16ab6c..ea3ff654 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -485,6 +485,11 @@ struct weston_renderer { void (*destroy)(struct weston_compositor *ec); }; +enum weston_capability { + /* backend/renderer supports arbitrary rotation */ + WESTON_CAP_ROTATION_ANY = 0x0001, +}; + struct weston_compositor { struct wl_signal destroy_signal; @@ -526,6 +531,7 @@ struct weston_compositor { /* Repaint state. */ struct weston_plane primary_plane; + uint32_t capabilities; /* combination of enum weston_capability */ uint32_t focus; diff --git a/src/gl-renderer.c b/src/gl-renderer.c index 52d15e08..a3785f84 100644 --- a/src/gl-renderer.c +++ b/src/gl-renderer.c @@ -1830,6 +1830,7 @@ gl_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display, } ec->renderer = &gr->base; + ec->capabilities |= WESTON_CAP_ROTATION_ANY; return 0; diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c index b1bbcd6a..eea32fc0 100644 --- a/src/pixman-renderer.c +++ b/src/pixman-renderer.c @@ -658,6 +658,7 @@ pixman_renderer_init(struct weston_compositor *ec) renderer->base.destroy_surface = pixman_renderer_destroy_surface; renderer->base.destroy = pixman_renderer_destroy; ec->renderer = &renderer->base; + ec->capabilities |= WESTON_CAP_ROTATION_ANY; weston_compositor_add_debug_binding(ec, KEY_R, debug_binding, ec); diff --git a/src/shell.c b/src/shell.c index 72615702..e23c09b5 100644 --- a/src/shell.c +++ b/src/shell.c @@ -4247,8 +4247,11 @@ shell_add_bindings(struct weston_compositor *ec, struct desktop_shell *shell) shell); weston_compositor_add_button_binding(ec, BTN_MIDDLE, mod, resize_binding, shell); - weston_compositor_add_button_binding(ec, BTN_RIGHT, mod, - rotate_binding, NULL); + + if (ec->capabilities & WESTON_CAP_ROTATION_ANY) + weston_compositor_add_button_binding(ec, BTN_RIGHT, mod, + rotate_binding, NULL); + weston_compositor_add_key_binding(ec, KEY_TAB, mod, switcher_binding, shell); weston_compositor_add_key_binding(ec, KEY_F9, mod, backlight_binding,