logical-monitor: Track whether the logical monitor is transformed

Keep track of the logical monitor transform. When a logical monitor is
transformed, all of its monitors are also transformed in the same way.
A logical monitor can either be transformed on the CRTC level, or using
an offscreen intermediate buffer. In both cases will the logical
monitor be transformed, but only in the latter will the view be
transformed.

MetaCrtcs::transform currently does not represent whether the CRTC is
configured to be transformed or not; only when the backend can handle
it does it correctly correspond to the actual CRTC configuration. This
is intended to change with MetaMonitorConfigManager.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
This commit is contained in:
Jonas Ådahl 2017-03-17 16:33:18 +08:00
parent 2091df3856
commit d38c4c1f2d
5 changed files with 20 additions and 9 deletions

View File

@ -92,6 +92,16 @@ meta_logical_monitor_new (MetaMonitorManager *monitor_manager,
return logical_monitor; return logical_monitor;
} }
static MetaMonitorTransform
derive_monitor_transform (MetaMonitor *monitor)
{
MetaOutput *main_output;
main_output = meta_monitor_get_main_output (monitor);
return main_output->crtc->transform;
}
MetaLogicalMonitor * MetaLogicalMonitor *
meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager, meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
MetaMonitor *monitor, MetaMonitor *monitor,
@ -102,6 +112,7 @@ meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
MetaOutput *main_output; MetaOutput *main_output;
MetaMonitorMode *monitor_mode; MetaMonitorMode *monitor_mode;
int scale; int scale;
MetaMonitorTransform transform;
logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL); logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL);
@ -110,10 +121,13 @@ meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
monitor, monitor,
monitor_mode); monitor_mode);
transform = derive_monitor_transform (monitor);
main_output = meta_monitor_get_main_output (monitor); main_output = meta_monitor_get_main_output (monitor);
logical_monitor->number = monitor_number; logical_monitor->number = monitor_number;
logical_monitor->winsys_id = main_output->winsys_id; logical_monitor->winsys_id = main_output->winsys_id;
logical_monitor->scale = scale; logical_monitor->scale = scale;
logical_monitor->transform = transform;
logical_monitor->in_fullscreen = -1; logical_monitor->in_fullscreen = -1;
logical_monitor->rect = *layout; logical_monitor->rect = *layout;

View File

@ -41,6 +41,7 @@ struct _MetaLogicalMonitor
gboolean is_presentation; /* XXX: not yet used */ gboolean is_presentation; /* XXX: not yet used */
gboolean in_fullscreen; gboolean in_fullscreen;
int scale; int scale;
MetaMonitorTransform transform;
/* The primary or first output for this monitor, 0 if we can't figure out. /* The primary or first output for this monitor, 0 if we can't figure out.
It can be matched to a winsys_id of a MetaOutput. It can be matched to a winsys_id of a MetaOutput.

View File

@ -2734,17 +2734,13 @@ meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
MetaLogicalMonitor *logical_monitor, MetaLogicalMonitor *logical_monitor,
gfloat matrix[6]) gfloat matrix[6])
{ {
MetaMonitor *main_monitor;
MetaOutput *main_output;
MetaMonitorTransform transform; MetaMonitorTransform transform;
gfloat viewport[9]; gfloat viewport[9];
if (!calculate_viewport_matrix (manager, logical_monitor, viewport)) if (!calculate_viewport_matrix (manager, logical_monitor, viewport))
return FALSE; return FALSE;
main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data; transform = logical_monitor->transform;
main_output = meta_monitor_get_main_output (main_monitor);
transform = main_output->crtc->transform;
multiply_matrix (viewport, transform_matrices[transform], multiply_matrix (viewport, transform_matrices[transform],
matrix); matrix);
return TRUE; return TRUE;

View File

@ -1686,10 +1686,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
if (meta_monitor_manager_is_transform_handled (monitor_manager, if (meta_monitor_manager_is_transform_handled (monitor_manager,
main_output->crtc, main_output->crtc,
main_output->crtc->transform)) logical_monitor->transform))
return META_MONITOR_TRANSFORM_NORMAL; return META_MONITOR_TRANSFORM_NORMAL;
else else
return main_output->crtc->transform; return logical_monitor->transform;
} }
static MetaRendererView * static MetaRendererView *

View File

@ -59,10 +59,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
if (meta_monitor_manager_is_transform_handled (monitor_manager, if (meta_monitor_manager_is_transform_handled (monitor_manager,
main_output->crtc, main_output->crtc,
main_output->crtc->transform)) logical_monitor->transform))
return META_MONITOR_TRANSFORM_NORMAL; return META_MONITOR_TRANSFORM_NORMAL;
else else
return main_output->crtc->transform; return logical_monitor->transform;
} }
static MetaRendererView * static MetaRendererView *