summaryrefslogtreecommitdiff
path: root/src/backends
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2017-03-21 14:17:18 +0800
committerJonas Ådahl <jadahl@gmail.com>2017-04-07 22:30:49 +0800
commit472a434212f7f22234c2886eacb0a5d2a6ee85c9 (patch)
tree19d4c2bbf1feaa23e9a49d83222414e519f17efc /src/backends
parent7c226462e048e4b72a613ccb04c22f2aaf1dfd30 (diff)
downloadmutter-472a434212f7f22234c2886eacb0a5d2a6ee85c9.tar.gz
monitor-config-manager: Support logical monitor transforms
Add support for rotated monitors. This is done per logical monitor, as every monitor assigned to a logical monitor must be transformed in the same way. This includes being transformed on the same level; e.g. if the backend does not support transforming any monitor of a logical monitor natively, then all monitors will be transformed using the offscreen intermediate framebuffer. https://bugzilla.gnome.org/show_bug.cgi?id=777732
Diffstat (limited to 'src/backends')
-rw-r--r--src/backends/meta-logical-monitor.c1
-rw-r--r--src/backends/meta-monitor-config-manager.c35
-rw-r--r--src/backends/meta-monitor-config-manager.h1
-rw-r--r--src/backends/meta-monitor-manager.c1
-rw-r--r--src/backends/meta-monitor.c52
-rw-r--r--src/backends/meta-monitor.h2
-rw-r--r--src/backends/native/meta-cursor-renderer-native.c1
7 files changed, 78 insertions, 15 deletions
diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c
index 9a271c74a..4123165df 100644
--- a/src/backends/meta-logical-monitor.c
+++ b/src/backends/meta-logical-monitor.c
@@ -79,6 +79,7 @@ meta_logical_monitor_new (MetaMonitorManager *monitor_manager,
logical_monitor->number = monitor_number;
logical_monitor->winsys_id = main_output->winsys_id;
logical_monitor->scale = logical_monitor_config->scale;
+ logical_monitor->transform = logical_monitor_config->transform;
logical_monitor->in_fullscreen = -1;
logical_monitor->rect = logical_monitor_config->layout;
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index bd65625c0..601d4c36c 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -101,6 +101,7 @@ find_unassigned_crtc (MetaOutput *output,
typedef struct
{
+ MetaMonitorManager *monitor_manager;
MetaLogicalMonitorConfig *logical_monitor_config;
MetaMonitorConfig *monitor_config;
GPtrArray *crtc_infos;
@@ -117,6 +118,8 @@ assign_monitor_crtc (MetaMonitor *monitor,
MonitorAssignmentData *data = user_data;
MetaOutput *output;
MetaCrtc *crtc;
+ MetaMonitorTransform transform;
+ MetaMonitorTransform crtc_transform;
int crtc_x, crtc_y;
MetaCrtcInfo *crtc_info;
MetaOutputInfo *output_info;
@@ -137,7 +140,15 @@ assign_monitor_crtc (MetaMonitor *monitor,
return FALSE;
}
- meta_monitor_calculate_crtc_pos (monitor, mode, output,
+ transform = data->logical_monitor_config->transform;
+ if (meta_monitor_manager_is_transform_handled (data->monitor_manager,
+ crtc,
+ transform))
+ crtc_transform = transform;
+ else
+ crtc_transform = META_MONITOR_TRANSFORM_NORMAL;
+
+ meta_monitor_calculate_crtc_pos (monitor, mode, output, crtc_transform,
&crtc_x, &crtc_y);
crtc_info = g_slice_new0 (MetaCrtcInfo);
@@ -146,7 +157,7 @@ assign_monitor_crtc (MetaMonitor *monitor,
.mode = monitor_crtc_mode->crtc_mode,
.x = crtc_x,
.y = crtc_y,
- .transform = META_MONITOR_TRANSFORM_NORMAL,
+ .transform = crtc_transform,
.outputs = g_ptr_array_new ()
};
g_ptr_array_add (crtc_info->outputs, output);
@@ -229,6 +240,7 @@ assign_monitor_crtcs (MetaMonitorManager *manager,
}
data = (MonitorAssignmentData) {
+ .monitor_manager = manager,
.logical_monitor_config = logical_monitor_config,
.monitor_config = monitor_config,
.crtc_infos = crtc_infos,
@@ -925,17 +937,24 @@ meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor
return FALSE;
}
+ if (meta_monitor_transform_is_rotated (logical_monitor_config->transform))
+ {
+ expected_mode_width = logical_monitor_config->layout.height;
+ expected_mode_height = logical_monitor_config->layout.width;
+ }
+ else
+ {
+ expected_mode_width = logical_monitor_config->layout.width;
+ expected_mode_height = logical_monitor_config->layout.height;
+ }
+
switch (layout_mode)
{
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
- expected_mode_width = (logical_monitor_config->layout.width *
- logical_monitor_config->scale);
- expected_mode_height = (logical_monitor_config->layout.height *
- logical_monitor_config->scale);
+ expected_mode_width *= logical_monitor_config->scale;
+ expected_mode_height *= logical_monitor_config->scale;
break;
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
- expected_mode_width = logical_monitor_config->layout.width;
- expected_mode_height = logical_monitor_config->layout.height;
break;
}
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
index de7911413..6e5c3e2cb 100644
--- a/src/backends/meta-monitor-config-manager.h
+++ b/src/backends/meta-monitor-config-manager.h
@@ -40,6 +40,7 @@ typedef struct _MetaLogicalMonitorConfig
{
MetaRectangle layout;
GList *monitor_configs;
+ MetaMonitorTransform transform;
int scale;
gboolean is_primary;
gboolean is_presentation;
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index e412f37cd..fcdff8fe9 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1736,6 +1736,7 @@ create_logical_monitor_config_from_variant (MetaMonitorManager *manager
.width = width,
.height = height
},
+ .transform = META_MONITOR_TRANSFORM_NORMAL,
.scale = (int) scale,
.is_primary = is_primary,
.monitor_configs = monitor_configs
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index dfc3c4178..05c8e3aa3 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -412,6 +412,7 @@ static void
meta_monitor_normal_calculate_crtc_pos (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaOutput *output,
+ MetaMonitorTransform crtc_transform,
int *out_x,
int *out_y)
{
@@ -482,6 +483,7 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
static void
calculate_tile_coordinate (MetaMonitor *monitor,
MetaOutput *output,
+ MetaMonitorTransform crtc_transform,
int *out_x,
int *out_y)
{
@@ -495,12 +497,45 @@ calculate_tile_coordinate (MetaMonitor *monitor,
{
MetaOutput *other_output = l->data;
- if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
- other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
- x += other_output->tile_info.tile_w;
- if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
- other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
- y += other_output->tile_info.tile_h;
+ switch (crtc_transform)
+ {
+ case META_MONITOR_TRANSFORM_NORMAL:
+ case META_MONITOR_TRANSFORM_FLIPPED:
+ if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+ other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
+ x += other_output->tile_info.tile_w;
+ if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+ other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
+ y += other_output->tile_info.tile_h;
+ break;
+ case META_MONITOR_TRANSFORM_180:
+ case META_MONITOR_TRANSFORM_FLIPPED_180:
+ if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+ other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile)
+ x += other_output->tile_info.tile_w;
+ if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+ other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile)
+ y += other_output->tile_info.tile_h;
+ break;
+ case META_MONITOR_TRANSFORM_270:
+ case META_MONITOR_TRANSFORM_FLIPPED_270:
+ if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+ other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
+ y += other_output->tile_info.tile_w;
+ if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+ other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
+ x += other_output->tile_info.tile_h;
+ break;
+ case META_MONITOR_TRANSFORM_90:
+ case META_MONITOR_TRANSFORM_FLIPPED_90:
+ if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+ other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile)
+ y += other_output->tile_info.tile_w;
+ if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+ other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile)
+ x += other_output->tile_info.tile_h;
+ break;
+ }
}
*out_x = x;
@@ -759,6 +794,7 @@ static void
meta_monitor_tiled_calculate_crtc_pos (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaOutput *output,
+ MetaMonitorTransform crtc_transform,
int *out_x,
int *out_y)
{
@@ -766,7 +802,7 @@ meta_monitor_tiled_calculate_crtc_pos (MetaMonitor *monitor,
if (mode_tiled->is_tiled)
{
- calculate_tile_coordinate (monitor, output,
+ calculate_tile_coordinate (monitor, output, crtc_transform,
out_x, out_y);
}
else
@@ -919,12 +955,14 @@ void
meta_monitor_calculate_crtc_pos (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaOutput *output,
+ MetaMonitorTransform crtc_transform,
int *out_x,
int *out_y)
{
META_MONITOR_GET_CLASS (monitor)->calculate_crtc_pos (monitor,
monitor_mode,
output,
+ crtc_transform,
out_x,
out_y);
}
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index 36149d0c2..09aec21ca 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -67,6 +67,7 @@ struct _MetaMonitorClass
void (* calculate_crtc_pos) (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaOutput *output,
+ MetaMonitorTransform crtc_transform,
int *out_x,
int *out_y);
};
@@ -149,6 +150,7 @@ GList * meta_monitor_get_modes (MetaMonitor *monitor);
void meta_monitor_calculate_crtc_pos (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaOutput *output,
+ MetaMonitorTransform crtc_transform,
int *out_x,
int *out_y);
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index 471106f22..29d104c67 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -249,6 +249,7 @@ update_monitor_crtc_cursor (MetaMonitor *monitor,
meta_monitor_calculate_crtc_pos (monitor, monitor_mode,
monitor_crtc_mode->output,
+ META_MONITOR_TRANSFORM_NORMAL,
&crtc_x, &crtc_y);
scaled_crtc_rect = (MetaRectangle) {