wayland/surface: Track committed and applied scale separately

Preparation for next commit, no functional change intended.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3463>
This commit is contained in:
Michel Dänzer 2023-12-18 18:05:21 +01:00 committed by Marge Bot
parent 4081d409c6
commit 0a0d1e2066
4 changed files with 34 additions and 22 deletions

View File

@ -199,7 +199,7 @@ meta_wayland_actor_surface_real_sync_actor_state (MetaWaylandActorSurface *actor
meta_shaped_texture_set_texture (stex, texture); meta_shaped_texture_set_texture (stex, texture);
meta_shaped_texture_set_snippet (stex, snippet); meta_shaped_texture_set_snippet (stex, snippet);
meta_shaped_texture_set_is_y_inverted (stex, is_y_inverted); meta_shaped_texture_set_is_y_inverted (stex, is_y_inverted);
meta_shaped_texture_set_buffer_scale (stex, surface->scale); meta_shaped_texture_set_buffer_scale (stex, surface->applied_state.scale);
g_clear_object (&snippet); g_clear_object (&snippet);
} }
else else

View File

@ -68,10 +68,12 @@ update_cursor_sprite_texture (MetaWaylandCursorSurface *cursor_surface)
if (texture && meta_multi_texture_is_simple (texture)) if (texture && meta_multi_texture_is_simple (texture))
{ {
int surface_scale = surface->applied_state.scale;
meta_cursor_sprite_set_texture (cursor_sprite, meta_cursor_sprite_set_texture (cursor_sprite,
meta_multi_texture_get_plane (texture, 0), meta_multi_texture_get_plane (texture, 0),
priv->hot_x * surface->scale, priv->hot_x * surface_scale,
priv->hot_y * surface->scale); priv->hot_y * surface_scale);
} }
else else
{ {
@ -108,13 +110,14 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite,
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y); meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
if (logical_monitor) if (logical_monitor)
{ {
int surface_scale = surface->applied_state.scale;
float texture_scale; float texture_scale;
if (meta_backend_is_stage_views_scaled (backend)) if (meta_backend_is_stage_views_scaled (backend))
texture_scale = 1.0 / surface->scale; texture_scale = 1.0 / surface_scale;
else else
texture_scale = (meta_logical_monitor_get_scale (logical_monitor) / texture_scale = (meta_logical_monitor_get_scale (logical_monitor) /
surface->scale); surface_scale);
meta_cursor_sprite_set_texture_scale (cursor_sprite, texture_scale); meta_cursor_sprite_set_texture_scale (cursor_sprite, texture_scale);
meta_cursor_sprite_set_texture_transform (cursor_sprite, meta_cursor_sprite_set_texture_transform (cursor_sprite,

View File

@ -158,7 +158,6 @@ struct _MetaWaylandSurface
MetaWaylandSurfaceRole *role; MetaWaylandSurfaceRole *role;
MtkRegion *input_region; MtkRegion *input_region;
MtkRegion *opaque_region; MtkRegion *opaque_region;
int scale;
int32_t offset_x, offset_y; int32_t offset_x, offset_y;
GHashTable *outputs; GHashTable *outputs;
MetaMonitorTransform buffer_transform; MetaMonitorTransform buffer_transform;
@ -187,6 +186,7 @@ struct _MetaWaylandSurface
GNode *subsurface_branch_node; GNode *subsurface_branch_node;
GNode *subsurface_leaf_node; GNode *subsurface_leaf_node;
MetaMultiTexture *texture; MetaMultiTexture *texture;
int scale;
} applied_state, committed_state; } applied_state, committed_state;
/* Extension resources. */ /* Extension resources. */

View File

@ -284,6 +284,7 @@ surface_process_damage (MetaWaylandSurface *surface,
if (!mtk_region_is_empty (surface_region)) if (!mtk_region_is_empty (surface_region))
{ {
int surface_scale = surface->applied_state.scale;
MtkRectangle surface_rect; MtkRectangle surface_rect;
g_autoptr (MtkRegion) scaled_region = NULL; g_autoptr (MtkRegion) scaled_region = NULL;
g_autoptr (MtkRegion) transformed_region = NULL; g_autoptr (MtkRegion) transformed_region = NULL;
@ -300,7 +301,7 @@ surface_process_damage (MetaWaylandSurface *surface,
mtk_region_intersect_rectangle (surface_region, &surface_rect); mtk_region_intersect_rectangle (surface_region, &surface_rect);
/* The damage region must be in the same coordinate space as the buffer, /* The damage region must be in the same coordinate space as the buffer,
* i.e. scaled with surface->scale. */ * i.e. scaled with surface->applied_state.scale. */
if (surface->viewport.has_src_rect) if (surface->viewport.has_src_rect)
{ {
src_rect = (graphene_rect_t) { src_rect = (graphene_rect_t) {
@ -326,15 +327,15 @@ surface_process_damage (MetaWaylandSurface *surface,
} }
src_rect = (graphene_rect_t) { src_rect = (graphene_rect_t) {
.size.width = width / surface->scale, .size.width = width / surface_scale,
.size.height = height / surface->scale .size.height = height / surface_scale
}; };
} }
viewport_region = meta_region_crop_and_scale (surface_region, viewport_region = meta_region_crop_and_scale (surface_region,
&src_rect, &src_rect,
surface_rect.width, surface_rect.width,
surface_rect.height); surface_rect.height);
scaled_region = meta_region_scale (viewport_region, surface->scale); scaled_region = meta_region_scale (viewport_region, surface_scale);
transformed_region = meta_region_transform (scaled_region, transformed_region = meta_region_transform (scaled_region,
surface->buffer_transform, surface->buffer_transform,
buffer_rect.width, buffer_rect.width,
@ -697,6 +698,7 @@ meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
{ {
gboolean had_damage = FALSE; gboolean had_damage = FALSE;
int old_width, old_height; int old_width, old_height;
int surface_scale;
old_width = meta_wayland_surface_get_width (surface); old_width = meta_wayland_surface_get_width (surface);
old_height = meta_wayland_surface_get_height (surface); old_height = meta_wayland_surface_get_height (surface);
@ -742,10 +744,11 @@ meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
} }
if (state->scale > 0) if (state->scale > 0)
surface->scale = state->scale; surface->applied_state.scale = state->scale;
if ((meta_wayland_surface_get_buffer_width (surface) % surface->scale != 0) || surface_scale = surface->applied_state.scale;
(meta_wayland_surface_get_buffer_height (surface) % surface->scale != 0)) if ((meta_wayland_surface_get_buffer_width (surface) % surface_scale != 0) ||
(meta_wayland_surface_get_buffer_height (surface) % surface_scale != 0))
{ {
if (surface->role && !META_IS_WAYLAND_CURSOR_SURFACE (surface->role)) if (surface->role && !META_IS_WAYLAND_CURSOR_SURFACE (surface->role))
{ {
@ -754,7 +757,7 @@ meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
"of the buffer_scale (%d).", "of the buffer_scale (%d).",
meta_wayland_surface_get_buffer_width (surface), meta_wayland_surface_get_buffer_width (surface),
meta_wayland_surface_get_buffer_height (surface), meta_wayland_surface_get_buffer_height (surface),
surface->scale); surface_scale);
} }
else else
{ {
@ -769,7 +772,7 @@ meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
(long) pid, (long) pid,
meta_wayland_surface_get_buffer_width (surface), meta_wayland_surface_get_buffer_width (surface),
meta_wayland_surface_get_buffer_height (surface), meta_wayland_surface_get_buffer_height (surface),
surface->scale); surface_scale);
} }
} }
@ -918,6 +921,9 @@ meta_wayland_surface_commit (MetaWaylandSurface *surface)
COGL_TRACE_BEGIN_SCOPED (MetaWaylandSurfaceCommit, COGL_TRACE_BEGIN_SCOPED (MetaWaylandSurfaceCommit,
"Meta::WaylandSurface::commit()"); "Meta::WaylandSurface::commit()");
if (pending->scale > 0)
surface->committed_state.scale = pending->scale;
if (buffer) if (buffer)
{ {
g_autoptr (GError) error = NULL; g_autoptr (GError) error = NULL;
@ -1526,7 +1532,8 @@ meta_wayland_surface_create (MetaWaylandCompositor *compositor,
int surface_version; int surface_version;
surface->compositor = compositor; surface->compositor = compositor;
surface->scale = 1; surface->applied_state.scale = 1;
surface->committed_state.scale = 1;
surface_version = wl_resource_get_version (compositor_resource); surface_version = wl_resource_get_version (compositor_resource);
surface->resource = wl_resource_create (client, surface->resource = wl_resource_create (client,
@ -2160,7 +2167,7 @@ meta_wayland_surface_get_width (MetaWaylandSurface *surface)
else else
width = meta_wayland_surface_get_buffer_width (surface); width = meta_wayland_surface_get_buffer_width (surface);
return width / surface->scale; return width / surface->applied_state.scale;
} }
} }
@ -2184,7 +2191,7 @@ meta_wayland_surface_get_height (MetaWaylandSurface *surface)
else else
height = meta_wayland_surface_get_buffer_height (surface); height = meta_wayland_surface_get_buffer_height (surface);
return height / surface->scale; return height / surface->applied_state.scale;
} }
} }
@ -2268,6 +2275,8 @@ meta_wayland_surface_can_scanout_untransformed (MetaWaylandSurface *surface,
MetaRendererView *view, MetaRendererView *view,
int geometry_scale) int geometry_scale)
{ {
int surface_scale = surface->applied_state.scale;
if (meta_renderer_view_get_transform (view) != surface->buffer_transform) if (meta_renderer_view_get_transform (view) != surface->buffer_transform)
{ {
meta_topic (META_DEBUG_RENDER, meta_topic (META_DEBUG_RENDER,
@ -2330,7 +2339,7 @@ meta_wayland_surface_can_scanout_untransformed (MetaWaylandSurface *surface,
float view_scale; float view_scale;
view_scale = clutter_stage_view_get_scale (CLUTTER_STAGE_VIEW (view)); view_scale = clutter_stage_view_get_scale (CLUTTER_STAGE_VIEW (view));
if (!G_APPROX_VALUE (view_scale, surface->scale, FLT_EPSILON)) if (!G_APPROX_VALUE (view_scale, surface_scale, FLT_EPSILON))
{ {
meta_topic (META_DEBUG_RENDER, meta_topic (META_DEBUG_RENDER,
"Surface can not be scanned out untransformed: " "Surface can not be scanned out untransformed: "
@ -2340,7 +2349,7 @@ meta_wayland_surface_can_scanout_untransformed (MetaWaylandSurface *surface,
} }
else else
{ {
if (geometry_scale != surface->scale) if (geometry_scale != surface_scale)
{ {
meta_topic (META_DEBUG_RENDER, meta_topic (META_DEBUG_RENDER,
"Surface can not be scanned out untransformed: " "Surface can not be scanned out untransformed: "
@ -2357,11 +2366,11 @@ meta_wayland_surface_can_scanout_untransformed (MetaWaylandSurface *surface,
!G_APPROX_VALUE (surface->viewport.src_rect.origin.y, 0.0, !G_APPROX_VALUE (surface->viewport.src_rect.origin.y, 0.0,
FLT_EPSILON) || FLT_EPSILON) ||
!G_APPROX_VALUE (surface->viewport.src_rect.size.width * !G_APPROX_VALUE (surface->viewport.src_rect.size.width *
surface->scale, surface_scale,
meta_wayland_surface_get_buffer_width (surface), meta_wayland_surface_get_buffer_width (surface),
FLT_EPSILON) || FLT_EPSILON) ||
!G_APPROX_VALUE (surface->viewport.src_rect.size.height * !G_APPROX_VALUE (surface->viewport.src_rect.size.height *
surface->scale, surface_scale,
meta_wayland_surface_get_buffer_height (surface), meta_wayland_surface_get_buffer_height (surface),
FLT_EPSILON)) FLT_EPSILON))
{ {