cogl/onscreen: Pass damage regions unflipped
The other similar API all operate with the assumptions that (0,0) is at the top left, so lets make damage regions behave this way too. Add a helper to flip the rectangles, to make it a bit more convenient. It'll be used in more places in a follow up. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4103>
This commit is contained in:
@@ -80,3 +80,23 @@ _cogl_util_one_at_a_time_mix (unsigned int hash)
|
|||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
cogl_rectangles_to_flipped_array (const int *rectangles,
|
||||||
|
int n_rectangles,
|
||||||
|
int height,
|
||||||
|
int *rectangles_array)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_rectangles; i++)
|
||||||
|
{
|
||||||
|
const int *rect = rectangles + 4 * i;
|
||||||
|
int *flip_rect = rectangles_array + 4 * i;
|
||||||
|
|
||||||
|
flip_rect[0] = rect[0];
|
||||||
|
flip_rect[1] = height - rect[1] - rect[3];
|
||||||
|
flip_rect[2] = rect[2];
|
||||||
|
flip_rect[3] = rect[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -256,15 +256,21 @@ cogl_onscreen_egl_queue_damage_region (CoglOnscreen *onscreen,
|
|||||||
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
|
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
|
||||||
CoglRenderer *renderer = context->display->renderer;
|
CoglRenderer *renderer = context->display->renderer;
|
||||||
CoglRendererEGL *egl_renderer = renderer->winsys;
|
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||||
|
int *egl_rectangles;
|
||||||
|
|
||||||
g_return_if_fail (n_rectangles > 0);
|
g_return_if_fail (n_rectangles > 0);
|
||||||
|
|
||||||
if (!egl_renderer->pf_eglSetDamageRegion)
|
if (!egl_renderer->pf_eglSetDamageRegion)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
egl_rectangles = g_alloca (n_rectangles * sizeof (int) * 4);
|
||||||
|
cogl_rectangles_to_flipped_array (rectangles, n_rectangles,
|
||||||
|
cogl_framebuffer_get_height (framebuffer),
|
||||||
|
egl_rectangles);
|
||||||
|
|
||||||
if (egl_renderer->pf_eglSetDamageRegion (egl_renderer->edpy,
|
if (egl_renderer->pf_eglSetDamageRegion (egl_renderer->edpy,
|
||||||
priv->egl_surface,
|
priv->egl_surface,
|
||||||
rectangles,
|
egl_rectangles,
|
||||||
n_rectangles) == EGL_FALSE)
|
n_rectangles) == EGL_FALSE)
|
||||||
g_warning ("Error reported by eglSetDamageRegion");
|
g_warning ("Error reported by eglSetDamageRegion");
|
||||||
}
|
}
|
||||||
|
@@ -232,8 +232,7 @@ queue_damage_region (ClutterStageWindow *stage_window,
|
|||||||
&rect);
|
&rect);
|
||||||
|
|
||||||
damage[i * 4] = rect.x;
|
damage[i * 4] = rect.x;
|
||||||
/* y coordinate needs to be flipped for OpenGL */
|
damage[i * 4 + 1] = rect.y;
|
||||||
damage[i * 4 + 1] = fb_height - rect.y - rect.height;
|
|
||||||
damage[i * 4 + 2] = rect.width;
|
damage[i * 4 + 2] = rect.width;
|
||||||
damage[i * 4 + 3] = rect.height;
|
damage[i * 4 + 3] = rect.height;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user