From: Jason Ekstrand <ja...@jlekstrand.net>

Previously, weston_output.matrix was in GL coordinates and therefore only
really useful for the GL backend.
---
 src/compositor.c  | 106 ++++++++++++++++++++----------------------------------
 src/gl-renderer.c |  14 +++++++-
 2 files changed, 52 insertions(+), 68 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index c85cf2e..5d8bd5e 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -3480,88 +3480,60 @@ weston_output_destroy(struct weston_output *output)
        wl_global_destroy(output->global);
 }
 
-static void
-weston_output_compute_transform(struct weston_output *output)
-{
-       struct weston_matrix transform;
-       int flip;
-
-       weston_matrix_init(&transform);
-       transform.type = WESTON_MATRIX_TRANSFORM_ROTATE;
-
-       switch(output->transform) {
-       case WL_OUTPUT_TRANSFORM_FLIPPED:
-       case WL_OUTPUT_TRANSFORM_FLIPPED_90:
-       case WL_OUTPUT_TRANSFORM_FLIPPED_180:
-       case WL_OUTPUT_TRANSFORM_FLIPPED_270:
-               transform.type |= WESTON_MATRIX_TRANSFORM_OTHER;
-               flip = -1;
-               break;
-       default:
-               flip = 1;
-               break;
-       }
-
-        switch(output->transform) {
-        case WL_OUTPUT_TRANSFORM_NORMAL:
-        case WL_OUTPUT_TRANSFORM_FLIPPED:
-                transform.d[0] = flip;
-                transform.d[1] = 0;
-                transform.d[4] = 0;
-                transform.d[5] = 1;
-                break;
-        case WL_OUTPUT_TRANSFORM_90:
-        case WL_OUTPUT_TRANSFORM_FLIPPED_90:
-                transform.d[0] = 0;
-                transform.d[1] = -flip;
-                transform.d[4] = 1;
-                transform.d[5] = 0;
-                break;
-        case WL_OUTPUT_TRANSFORM_180:
-        case WL_OUTPUT_TRANSFORM_FLIPPED_180:
-                transform.d[0] = -flip;
-                transform.d[1] = 0;
-                transform.d[4] = 0;
-                transform.d[5] = -1;
-                break;
-        case WL_OUTPUT_TRANSFORM_270:
-        case WL_OUTPUT_TRANSFORM_FLIPPED_270:
-                transform.d[0] = 0;
-                transform.d[1] = flip;
-                transform.d[4] = -1;
-                transform.d[5] = 0;
-                break;
-        default:
-                break;
-        }
-
-       weston_matrix_multiply(&output->matrix, &transform);
-}
-
 WL_EXPORT void
 weston_output_update_matrix(struct weston_output *output)
 {
        float magnification;
 
        weston_matrix_init(&output->matrix);
-       weston_matrix_translate(&output->matrix,
-                               -(output->x + output->width / 2.0),
-                               -(output->y + output->height / 2.0), 0);
-
-       weston_matrix_scale(&output->matrix,
-                           2.0 / output->width,
-                           -2.0 / output->height, 1);
+       weston_matrix_translate(&output->matrix, -output->x, -output->y, 0);
 
        if (output->zoom.active) {
                magnification = 1 / (1 - output->zoom.spring_z.current);
                weston_output_update_zoom(output);
                weston_matrix_translate(&output->matrix, -output->zoom.trans_x,
-                                       output->zoom.trans_y, 0);
+                                       -output->zoom.trans_y, 0);
                weston_matrix_scale(&output->matrix, magnification,
                                    magnification, 1.0);
        }
 
-       weston_output_compute_transform(output);
+       switch (output->transform) {
+       case WL_OUTPUT_TRANSFORM_FLIPPED:
+       case WL_OUTPUT_TRANSFORM_FLIPPED_90:
+       case WL_OUTPUT_TRANSFORM_FLIPPED_180:
+       case WL_OUTPUT_TRANSFORM_FLIPPED_270:
+               weston_matrix_translate(&output->matrix, -output->width, 0, 0);
+               weston_matrix_scale(&output->matrix, -1, 1, 1);
+               break;
+       }
+
+       switch (output->transform) {
+       default:
+       case WL_OUTPUT_TRANSFORM_NORMAL:
+       case WL_OUTPUT_TRANSFORM_FLIPPED:
+               break;
+       case WL_OUTPUT_TRANSFORM_90:
+       case WL_OUTPUT_TRANSFORM_FLIPPED_90:
+               weston_matrix_translate(&output->matrix, 0, -output->height, 0);
+               weston_matrix_rotate_xy(&output->matrix, 0, 1);
+               break;
+       case WL_OUTPUT_TRANSFORM_180:
+       case WL_OUTPUT_TRANSFORM_FLIPPED_180:
+               weston_matrix_translate(&output->matrix,
+                                       -output->width, -output->height, 0);
+               weston_matrix_rotate_xy(&output->matrix, -1, 0);
+               break;
+       case WL_OUTPUT_TRANSFORM_270:
+       case WL_OUTPUT_TRANSFORM_FLIPPED_270:
+               weston_matrix_translate(&output->matrix, -output->width, 0, 0);
+               weston_matrix_rotate_xy(&output->matrix, 0, -1);
+               break;
+       }
+
+       if (output->current_scale != 1)
+               weston_matrix_scale(&output->matrix,
+                                   output->current_scale,
+                                   output->current_scale, 1);
 
        output->dirty = 0;
 }
diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index d54928b..28b3b75 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -74,6 +74,8 @@ struct gl_output_state {
        enum gl_border_status border_damage[BUFFER_DAMAGE_COUNT];
        struct gl_border_image borders[4];
        enum gl_border_status border_status;
+
+       struct weston_matrix output_matrix;
 };
 
 enum buffer_type {
@@ -511,9 +513,10 @@ shader_uniforms(struct gl_shader *shader,
 {
        int i;
        struct gl_surface_state *gs = get_surface_state(view->surface);
+       struct gl_output_state *go = get_output_state(output);
 
        glUniformMatrix4fv(shader->proj_uniform,
-                          1, GL_FALSE, output->matrix.d);
+                          1, GL_FALSE, go->output_matrix.d);
        glUniform4fv(shader->color_uniform, 1, gs->color);
        glUniform1f(shader->alpha_uniform, view->alpha);
 
@@ -876,6 +879,15 @@ gl_renderer_repaint_output(struct weston_output *output,
                   output->current_mode->width,
                   output->current_mode->height);
 
+       /* Calculate the global GL matrix */
+       go->output_matrix = output->matrix;
+       weston_matrix_translate(&go->output_matrix,
+                               -(output->current_mode->width / 2.0),
+                               -(output->current_mode->height / 2.0), 0);
+       weston_matrix_scale(&go->output_matrix,
+                           2.0 / output->current_mode->width,
+                           -2.0 / output->current_mode->height, 1);
+
        /* if debugging, redraw everything outside the damage to clean up
         * debug lines from the previous draw on this buffer:
         */
-- 
2.1.1

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to