cursor-renderer-native: Don't use HW cursor on transformed logical monitor

The HW cursor plane can't do any transformations, and as we still don't
pre-transform any buffer before uploading to the cursor plane, we must
disable the HW cursor when a logical monitor is transformed.

This worked previously because the transform of a MetaCrtc did not
correspond to the transform of a CRTC, but the transform of the logical
monitor the CRTC was assigned to.

https://bugzilla.gnome.org/show_bug.cgi?id=786023
This commit is contained in:
Jonas Ådahl 2017-08-11 15:02:43 +08:00
parent 6584d06bb5
commit 14fe6e9c95
3 changed files with 42 additions and 17 deletions

View File

@ -181,6 +181,18 @@ meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor)
return logical_monitor->scale; return logical_monitor->scale;
} }
MetaMonitorTransform
meta_logical_monitor_get_transform (MetaLogicalMonitor *logical_monitor)
{
return logical_monitor->transform;
}
MetaRectangle
meta_logical_monitor_get_layout (MetaLogicalMonitor *logical_monitor)
{
return logical_monitor->rect;
}
GList * GList *
meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor) meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor)
{ {

View File

@ -80,6 +80,10 @@ void meta_logical_monitor_make_primary (MetaLogicalMonitor *logical_monitor);
float meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor); float meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor);
MetaMonitorTransform meta_logical_monitor_get_transform (MetaLogicalMonitor *logical_monitor);
MetaRectangle meta_logical_monitor_get_layout (MetaLogicalMonitor *logical_monitor);
GList * meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor); GList * meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor);
gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor, gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor,

View File

@ -383,28 +383,37 @@ has_valid_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite)
} }
static gboolean static gboolean
cursor_over_transformed_crtc (MetaCursorRenderer *renderer, cursor_over_transformed_logical_monitor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaMonitorManager *monitors; MetaBackend *backend = meta_get_backend ();
MetaCrtc *crtcs; MetaMonitorManager *monitor_manager =
unsigned int i, n_crtcs; meta_backend_get_monitor_manager (backend);
ClutterRect rect; GList *logical_monitors;
GList *l;
ClutterRect cursor_rect;
monitors = meta_monitor_manager_get (); cursor_rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
meta_monitor_manager_get_resources (monitors, NULL, NULL, logical_monitors =
&crtcs, &n_crtcs, NULL, NULL); meta_monitor_manager_get_logical_monitors (monitor_manager);
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite); for (l = logical_monitors; l; l = l->next)
for (i = 0; i < n_crtcs; i++)
{ {
MetaCrtc *crtc = &crtcs[i]; MetaLogicalMonitor *logical_monitor = l->data;
ClutterRect crtc_rect = meta_rectangle_to_clutter_rect (&crtc->rect); MetaRectangle logical_monitor_layout;
ClutterRect logical_monitor_rect;
MetaMonitorTransform transform;
if (!clutter_rect_intersection (&rect, &crtc_rect, NULL)) logical_monitor_layout =
meta_logical_monitor_get_layout (logical_monitor);
logical_monitor_rect =
meta_rectangle_to_clutter_rect (&logical_monitor_layout);
if (!clutter_rect_intersection (&cursor_rect, &logical_monitor_rect,
NULL))
continue; continue;
if (crtc->transform != META_MONITOR_TRANSFORM_NORMAL) transform = meta_logical_monitor_get_transform (logical_monitor);
if (transform != META_MONITOR_TRANSFORM_NORMAL)
return TRUE; return TRUE;
} }
@ -478,7 +487,7 @@ should_have_hw_cursor (MetaCursorRenderer *renderer,
if (!cursor_sprite) if (!cursor_sprite)
return FALSE; return FALSE;
if (cursor_over_transformed_crtc (renderer, cursor_sprite)) if (cursor_over_transformed_logical_monitor (renderer, cursor_sprite))
return FALSE; return FALSE;
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);