mirror of
https://github.com/brl/mutter.git
synced 2024-11-22 16:10:41 -05:00
stage-impl: Transform damage region before queuing
In order to queue the right values for transformed `MetaRendererView`s. While on it ensure we query the framebuffers width/height only once, saving some cpu cycles. Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/2557 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2860>
This commit is contained in:
parent
7171a41796
commit
943fcc7c1a
@ -230,6 +230,9 @@ cogl_onscreen_get_buffer_age (CoglOnscreen *onscreen);
|
|||||||
* This immediately queues state to OpenGL that will be used for the
|
* This immediately queues state to OpenGL that will be used for the
|
||||||
* next swap.
|
* next swap.
|
||||||
* This needs to be called every frame.
|
* This needs to be called every frame.
|
||||||
|
*
|
||||||
|
* The expected values are independent of any viewport transforms applied to
|
||||||
|
* the framebuffer.
|
||||||
*/
|
*/
|
||||||
COGL_EXPORT void
|
COGL_EXPORT void
|
||||||
cogl_onscreen_queue_damage_region (CoglOnscreen *onscreen,
|
cogl_onscreen_queue_damage_region (CoglOnscreen *onscreen,
|
||||||
|
@ -214,6 +214,8 @@ queue_damage_region (ClutterStageWindow *stage_window,
|
|||||||
g_autofree int *freeme = NULL;
|
g_autofree int *freeme = NULL;
|
||||||
CoglFramebuffer *framebuffer;
|
CoglFramebuffer *framebuffer;
|
||||||
CoglOnscreen *onscreen;
|
CoglOnscreen *onscreen;
|
||||||
|
int fb_width;
|
||||||
|
int fb_height;
|
||||||
|
|
||||||
if (cairo_region_is_empty (damage_region))
|
if (cairo_region_is_empty (damage_region))
|
||||||
return;
|
return;
|
||||||
@ -223,6 +225,8 @@ queue_damage_region (ClutterStageWindow *stage_window,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
onscreen = COGL_ONSCREEN (framebuffer);
|
onscreen = COGL_ONSCREEN (framebuffer);
|
||||||
|
fb_width = cogl_framebuffer_get_width (framebuffer);
|
||||||
|
fb_height = cogl_framebuffer_get_height (framebuffer);
|
||||||
|
|
||||||
n_rects = cairo_region_num_rectangles (damage_region);
|
n_rects = cairo_region_num_rectangles (damage_region);
|
||||||
|
|
||||||
@ -234,12 +238,18 @@ queue_damage_region (ClutterStageWindow *stage_window,
|
|||||||
for (i = 0; i < n_rects; i++)
|
for (i = 0; i < n_rects; i++)
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t rect;
|
cairo_rectangle_int_t rect;
|
||||||
int height = cogl_framebuffer_get_height (framebuffer);
|
|
||||||
|
|
||||||
cairo_region_get_rectangle (damage_region, i, &rect);
|
cairo_region_get_rectangle (damage_region, i, &rect);
|
||||||
|
|
||||||
|
clutter_stage_view_transform_rect_to_onscreen (stage_view,
|
||||||
|
&rect,
|
||||||
|
fb_width,
|
||||||
|
fb_height,
|
||||||
|
&rect);
|
||||||
|
|
||||||
damage[i * 4] = rect.x;
|
damage[i * 4] = rect.x;
|
||||||
/* y coordinate needs to be flipped for OpenGL */
|
/* y coordinate needs to be flipped for OpenGL */
|
||||||
damage[i * 4 + 1] = height - rect.y - rect.height;
|
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user