From 55b05e5631aa47a9ef727259af3565e292f86f7d Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Wed, 9 Sep 2020 22:16:25 -0300 Subject: [PATCH] Don't access CoglMatrix struct fields Instead, use the new cogl_matrix_get_value() API. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1439 --- clutter/clutter/clutter-stage.c | 7 +++- src/compositor/meta-texture-tower.c | 37 +++++++++++++------ .../clutter/interactive/test-cogl-offscreen.c | 2 +- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 10ce401de..88141377d 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -673,6 +673,7 @@ _cogl_util_get_eye_planes_for_screen_poly (float *polygon, Vector4 *poly; graphene_vec3_t b; graphene_vec3_t c; + float wz, ww; int count; tmp_poly = g_alloca (sizeof (Vector4) * n_vertices * 2); @@ -693,7 +694,9 @@ _cogl_util_get_eye_planes_for_screen_poly (float *polygon, * frustum; coordinates range from [-Wc,Wc] left to right on the * x-axis and [Wc,-Wc] top to bottom on the y-axis. */ - Wc = DEPTH * projection->wz + projection->ww; + wz = cogl_matrix_get_value (projection, 3, 2); + ww = cogl_matrix_get_value (projection, 3, 3); + Wc = DEPTH * wz + ww; #define CLIP_X(X) ((((float)X - viewport[0]) * (2.0 / viewport[2])) - 1) * Wc #define CLIP_Y(Y) ((((float)Y - viewport[1]) * (2.0 / viewport[3])) - 1) * -Wc @@ -706,7 +709,7 @@ _cogl_util_get_eye_planes_for_screen_poly (float *polygon, tmp_poly[i].w = Wc; } - Wc = DEPTH * 2 * projection->wz + projection->ww; + Wc = DEPTH * 2 * wz + ww; /* FIXME: technically we don't need to project all of the points * twice, it would be enough project every other point since diff --git a/src/compositor/meta-texture-tower.c b/src/compositor/meta-texture-tower.c index b0df9ed06..408c0c2e9 100644 --- a/src/compositor/meta-texture-tower.c +++ b/src/compositor/meta-texture-tower.c @@ -249,6 +249,9 @@ get_paint_level (ClutterPaintContext *paint_context, { CoglFramebuffer *framebuffer; CoglMatrix projection, modelview, pm; + float xx, xy, xw; + float yx, yy, yw; + float wx, wy, ww; float v[4]; double viewport_width, viewport_height; double u0, v0; @@ -280,6 +283,16 @@ get_paint_level (ClutterPaintContext *paint_context, cogl_matrix_multiply (&pm, &projection, &modelview); + xx = cogl_matrix_get_value (&pm, 0, 0); + xy = cogl_matrix_get_value (&pm, 0, 1); + xw = cogl_matrix_get_value (&pm, 0, 3); + yx = cogl_matrix_get_value (&pm, 1, 0); + yy = cogl_matrix_get_value (&pm, 1, 1); + yw = cogl_matrix_get_value (&pm, 1, 3); + wx = cogl_matrix_get_value (&pm, 3, 0); + wy = cogl_matrix_get_value (&pm, 3, 1); + ww = cogl_matrix_get_value (&pm, 3, 3); + cogl_framebuffer_get_viewport4fv (framebuffer, v); viewport_width = v[2]; viewport_height = v[3]; @@ -287,9 +300,9 @@ get_paint_level (ClutterPaintContext *paint_context, u0 = width / 2.; v0 = height / 2.; - xc = pm.xx * u0 + pm.xy * v0 + pm.xw; - yc = pm.yx * u0 + pm.yy * v0 + pm.yw; - wc = pm.wx * u0 + pm.wy * v0 + pm.ww; + xc = xx * u0 + xy * v0 + xw; + yc = yx * u0 + yy * v0 + yw; + wc = wx * u0 + wy * v0 + ww; /* We'll simplify the equations below for a bit of micro-optimization. * The commented out code is the unsimplified version. @@ -302,10 +315,10 @@ get_paint_level (ClutterPaintContext *paint_context, // with respect to u, v, using // d(a/b)/dx = da/dx * (1/b) - a * db/dx / (b^2) - dxdu = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc)) / wc; - dxdv = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc)) / wc; - dydu = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc)) / wc; - dydv = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc)) / wc; + dxdu = 0.5 * viewport_width * (xx - wx * (xc/wc)) / wc; + dxdv = 0.5 * viewport_width * (xy - wy * (xc/wc)) / wc; + dydu = 0.5 * viewport_height * (yx - wx * (yc/wc)) / wc; + dydv = 0.5 * viewport_height * (yy - wy * (yc/wc)) / wc; // Compute the inverse partials as the matrix inverse det = dxdu * dydv - dxdv * dydu; @@ -324,10 +337,10 @@ get_paint_level (ClutterPaintContext *paint_context, */ /* dxdu * wc, etc */ - dxdu_ = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc)); - dxdv_ = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc)); - dydu_ = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc)); - dydv_ = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc)); + dxdu_ = 0.5 * viewport_width * (xx - wx * (xc/wc)); + dxdv_ = 0.5 * viewport_width * (xy - wy * (xc/wc)); + dydu_ = 0.5 * viewport_height * (yx - wx * (yc/wc)); + dydv_ = 0.5 * viewport_height * (yy - wy * (yc/wc)); /* det * wc^2 */ det_ = dxdu_ * dydv_ - dxdv_ * dydu_; @@ -340,7 +353,7 @@ get_paint_level (ClutterPaintContext *paint_context, lambda = 0.5 * M_LOG2E * log (rho_sq * wc * wc / det_sq) + LOD_BIAS; #if 0 - g_print ("%g %g %g\n", 0.5 * viewport_width * pm.xx / pm.ww, 0.5 * viewport_height * pm.yy / pm.ww, lambda); + g_print ("%g %g %g\n", 0.5 * viewport_width * xx / ww, 0.5 * viewport_height * yy / ww, lambda); #endif if (lambda <= 0.) diff --git a/src/tests/clutter/interactive/test-cogl-offscreen.c b/src/tests/clutter/interactive/test-cogl-offscreen.c index 8580fb45a..d8c3f9299 100644 --- a/src/tests/clutter/interactive/test-cogl-offscreen.c +++ b/src/tests/clutter/interactive/test-cogl-offscreen.c @@ -232,7 +232,7 @@ setup_viewport (CoglFramebuffer *framebuffer, */ cogl_framebuffer_get_projection_matrix (framebuffer, &projection_matrix); - z_camera = 0.5 * projection_matrix.xx; + z_camera = 0.5 * cogl_matrix_get_value (&projection_matrix, 0, 0); cogl_matrix_init_identity (&mv_matrix); cogl_matrix_translate (&mv_matrix, -0.5f, -0.5f, -z_camera);