[PATCH 1/2] matrix: track transform type
Kristian Høgsberg
hoegsberg at gmail.com
Mon Jan 28 13:21:11 PST 2013
On Mon, Jan 28, 2013 at 10:40:28PM +0300, Vasily Khoruzhick wrote:
> Introduce several matrix transform types and track type for matrix.
> Could be usefull for activating some fastpath that depends on some
> transform type.
Look good, both committed. We could simplify the logic in
weston_surface_update_transform() a bit now, by just always
multiplying the transformation_list matrices and then setting enabled
if surface->tranform.matrix.type > TRANSLATE. And of course
weston_matrix_invert() could use the matrix.type now to fast-path
translation matrices, and then we could just move that call to the
generic weston_surface_update_transform() as well.
Kristian
> Signed-off-by: Vasily Khoruzhick <anarsoul at gmail.com>
> ---
> shared/matrix.c | 23 ++++++++++++++++++++---
> shared/matrix.h | 10 ++++++++++
> src/compositor.c | 3 +++
> src/shell.c | 17 +++++------------
> 4 files changed, 38 insertions(+), 15 deletions(-)
>
> diff --git a/shared/matrix.c b/shared/matrix.c
> index 11b5b95..3ff4089 100644
> --- a/shared/matrix.c
> +++ b/shared/matrix.c
> @@ -21,6 +21,7 @@
> * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> */
>
> +#include <float.h>
> #include <string.h>
> #include <stdlib.h>
> #include <math.h>
> @@ -46,7 +47,8 @@ WL_EXPORT void
> weston_matrix_init(struct weston_matrix *matrix)
> {
> static const struct weston_matrix identity = {
> - { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }
> + .d = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
> + .type = 0,
> };
>
> memcpy(matrix, &identity, sizeof identity);
> @@ -69,6 +71,7 @@ weston_matrix_multiply(struct weston_matrix *m, const struct weston_matrix *n)
> for (j = 0; j < 4; j++)
> tmp.d[i] += row[j] * column[j * 4];
> }
> + tmp.type = m->type | n->type;
> memcpy(m, &tmp, sizeof tmp);
> }
>
> @@ -76,7 +79,8 @@ WL_EXPORT void
> weston_matrix_translate(struct weston_matrix *matrix, float x, float y, float z)
> {
> struct weston_matrix translate = {
> - { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 }
> + .d = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 },
> + .type = WESTON_MATRIX_TRANSFORM_TRANSLATE,
> };
>
> weston_matrix_multiply(matrix, &translate);
> @@ -86,12 +90,24 @@ WL_EXPORT void
> weston_matrix_scale(struct weston_matrix *matrix, float x, float y,float z)
> {
> struct weston_matrix scale = {
> - { x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 }
> + .d = { x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 },
> + .type = WESTON_MATRIX_TRANSFORM_SCALE,
> };
>
> weston_matrix_multiply(matrix, &scale);
> }
>
> +WL_EXPORT void
> +weston_matrix_rotate_xy(struct weston_matrix *matrix, float cos, float sin)
> +{
> + struct weston_matrix translate = {
> + .d = { cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
> + .type = WESTON_MATRIX_TRANSFORM_ROTATE,
> + };
> +
> + weston_matrix_multiply(matrix, &translate);
> +}
> +
> /* v <- m * v */
> WL_EXPORT void
> weston_matrix_transform(struct weston_matrix *matrix, struct weston_vector *v)
> @@ -249,6 +265,7 @@ weston_matrix_invert(struct weston_matrix *inverse,
> weston_matrix_init(inverse);
> for (c = 0; c < 4; ++c)
> inverse_transform(LU, perm, &inverse->d[c * 4]);
> + inverse->type = matrix->type;
>
> return 0;
> }
> diff --git a/shared/matrix.h b/shared/matrix.h
> index bacb7bf..47354f6 100644
> --- a/shared/matrix.h
> +++ b/shared/matrix.h
> @@ -24,8 +24,16 @@
> #ifndef WESTON_MATRIX_H
> #define WESTON_MATRIX_H
>
> +enum weston_matrix_transform_type {
> + WESTON_MATRIX_TRANSFORM_TRANSLATE = (1 << 0),
> + WESTON_MATRIX_TRANSFORM_SCALE = (1 << 1),
> + WESTON_MATRIX_TRANSFORM_ROTATE = (1 << 2),
> + WESTON_MATRIX_TRANSFORM_OTHER = (1 << 3),
> +};
> +
> struct weston_matrix {
> float d[16];
> + unsigned int type;
> };
>
> struct weston_vector {
> @@ -42,6 +50,8 @@ void
> weston_matrix_translate(struct weston_matrix *matrix,
> float x, float y, float z);
> void
> +weston_matrix_rotate_xy(struct weston_matrix *matrix, float cos, float sin);
> +void
> weston_matrix_transform(struct weston_matrix *matrix, struct weston_vector *v);
>
> int
> diff --git a/src/compositor.c b/src/compositor.c
> index a2e95c9..5ac43f2 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -539,6 +539,7 @@ weston_surface_update_transform_enable(struct weston_surface *surface)
> surface->transform.enabled = 1;
>
> /* Otherwise identity matrix, but with x and y translation. */
> + surface->transform.position.matrix.type = WESTON_MATRIX_TRANSFORM_TRANSLATE;
> surface->transform.position.matrix.d[12] = surface->geometry.x;
> surface->transform.position.matrix.d[13] = surface->geometry.y;
>
> @@ -2754,12 +2755,14 @@ weston_output_compute_transform(struct weston_output *output)
> 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:
> diff --git a/src/shell.c b/src/shell.c
> index dcbabf3..a99786b 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -1876,6 +1876,8 @@ shell_map_popup(struct shell_surface *shsurf)
> } else {
> /* construct x, y translation matrix */
> weston_matrix_init(&shsurf->popup.parent_transform.matrix);
> + shsurf->popup.parent_transform.matrix.type =
> + WESTON_MATRIX_TRANSFORM_TRANSLATE;
> shsurf->popup.parent_transform.matrix.d[12] =
> parent->geometry.x;
> shsurf->popup.parent_transform.matrix.d[13] =
> @@ -2502,10 +2504,7 @@ rotate_grab_motion(struct wl_pointer_grab *grab,
> &shsurf->rotation.transform.matrix;
>
> weston_matrix_init(&rotate->rotation);
> - rotate->rotation.d[0] = dx / r;
> - rotate->rotation.d[4] = -dy / r;
> - rotate->rotation.d[1] = -rotate->rotation.d[4];
> - rotate->rotation.d[5] = rotate->rotation.d[0];
> + weston_matrix_rotate_xy(&rotate->rotation, dx / r, dy / r);
>
> weston_matrix_init(matrix);
> weston_matrix_translate(matrix, -cx, -cy, 0.0f);
> @@ -2600,17 +2599,11 @@ rotate_binding(struct wl_seat *seat, uint32_t time, uint32_t button,
> struct weston_matrix inverse;
>
> weston_matrix_init(&inverse);
> - inverse.d[0] = dx / r;
> - inverse.d[4] = dy / r;
> - inverse.d[1] = -inverse.d[4];
> - inverse.d[5] = inverse.d[0];
> + weston_matrix_rotate_xy(&inverse, dx / r, -dy / r);
> weston_matrix_multiply(&surface->rotation.rotation, &inverse);
>
> weston_matrix_init(&rotate->rotation);
> - rotate->rotation.d[0] = dx / r;
> - rotate->rotation.d[4] = -dy / r;
> - rotate->rotation.d[1] = -rotate->rotation.d[4];
> - rotate->rotation.d[5] = rotate->rotation.d[0];
> + weston_matrix_rotate_xy(&rotate->rotation, dx / r, dy / r);
> } else {
> weston_matrix_init(&surface->rotation.rotation);
> weston_matrix_init(&rotate->rotation);
> --
> 1.8.1.1
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list