[mutter] monitor: Don't keep CRTC position in MetaMonitorCrtcMode
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] monitor: Don't keep CRTC position in MetaMonitorCrtcMode
- Date: Fri, 7 Apr 2017 14:35:35 +0000 (UTC)
commit afcc1bf512c96b9d39d0db000f77728b6dab9bdd
Author: Jonas Ådahl <jadahl gmail com>
Date: Fri Mar 17 17:21:10 2017 +0800
monitor: Don't keep CRTC position in MetaMonitorCrtcMode
The CRTC position depends on the transform and how the transform is
implemented. The function calculating the positions still doesn't
support anything but the non-transformed case; this commit is in
preparation of adding support for transforms.
https://bugzilla.gnome.org/show_bug.cgi?id=777732
src/backends/meta-monitor-config-manager.c | 8 +-
src/backends/meta-monitor.c | 111 +++++++++++++++------
src/backends/meta-monitor.h | 13 ++-
src/backends/native/meta-cursor-renderer-native.c | 9 ++-
src/tests/monitor-unit-tests.c | 67 +++++++++---
5 files changed, 153 insertions(+), 55 deletions(-)
---
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 7165296..bd65625 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -117,6 +117,7 @@ assign_monitor_crtc (MetaMonitor *monitor,
MonitorAssignmentData *data = user_data;
MetaOutput *output;
MetaCrtc *crtc;
+ int crtc_x, crtc_y;
MetaCrtcInfo *crtc_info;
MetaOutputInfo *output_info;
MetaMonitorConfig *first_monitor_config;
@@ -136,12 +137,15 @@ assign_monitor_crtc (MetaMonitor *monitor,
return FALSE;
}
+ meta_monitor_calculate_crtc_pos (monitor, mode, output,
+ &crtc_x, &crtc_y);
+
crtc_info = g_slice_new0 (MetaCrtcInfo);
*crtc_info = (MetaCrtcInfo) {
.crtc = crtc,
.mode = monitor_crtc_mode->crtc_mode,
- .x = monitor_crtc_mode->x,
- .y = monitor_crtc_mode->y,
+ .x = crtc_x,
+ .y = crtc_y,
.transform = META_MONITOR_TRANSFORM_NORMAL,
.outputs = g_ptr_array_new ()
};
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 9a242cd..dfc3c41 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -32,6 +32,13 @@ typedef struct _MetaMonitorMode
MetaMonitorCrtcMode *crtc_modes;
} MetaMonitorMode;
+typedef struct _MetaMonitorModeTiled
+{
+ MetaMonitorMode parent;
+
+ gboolean is_tiled;
+} MetaMonitorModeTiled;
+
typedef struct _MetaMonitorPrivate
{
GList *outputs;
@@ -347,8 +354,6 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
},
mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1);
mode->crtc_modes[0] = (MetaMonitorCrtcMode) {
- .x = 0,
- .y = 0,
.output = output,
.crtc_mode = crtc_mode
};
@@ -404,6 +409,17 @@ meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
}
static void
+meta_monitor_normal_calculate_crtc_pos (MetaMonitor *monitor,
+ MetaMonitorMode *monitor_mode,
+ MetaOutput *output,
+ int *out_x,
+ int *out_y)
+{
+ *out_x = 0;
+ *out_y = 0;
+}
+
+static void
meta_monitor_normal_init (MetaMonitorNormal *monitor)
{
}
@@ -415,6 +431,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
monitor_class->get_main_output = meta_monitor_normal_get_main_output;
monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
+ monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos;
}
uint32_t
@@ -463,10 +480,10 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
}
static void
-calculate_tile_coordinate (MetaMonitor *monitor,
- MetaOutput *output,
- int *out_x,
- int *out_y)
+calculate_tile_coordinate (MetaMonitor *monitor,
+ MetaOutput *output,
+ int *out_x,
+ int *out_y)
{
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
@@ -548,40 +565,35 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled)
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
- MetaMonitorMode *mode;
+ MetaMonitorModeTiled *mode;
GList *l;
int i;
- mode = g_new0 (MetaMonitorMode, 1);
+ mode = g_new0 (MetaMonitorModeTiled, 1);
+ mode->is_tiled = TRUE;
meta_monitor_tiled_calculate_tiled_size (monitor,
- &mode->spec.width,
- &mode->spec.height);
- mode->crtc_modes = g_new0 (MetaMonitorCrtcMode,
- g_list_length (monitor_priv->outputs));
+ &mode->parent.spec.width,
+ &mode->parent.spec.height);
+ mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
+ g_list_length (monitor_priv->outputs));
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
{
MetaOutput *output = l->data;
MetaCrtcMode *preferred_crtc_mode = output->preferred_mode;
- int x;
- int y;
- calculate_tile_coordinate (monitor, output, &x, &y);
-
- mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
- .x = x,
- .y = y,
+ mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
.output = output,
.crtc_mode = preferred_crtc_mode
};
- g_warn_if_fail (mode->spec.refresh_rate == 0.0f ||
- (mode->spec.refresh_rate ==
+ g_warn_if_fail (mode->parent.spec.refresh_rate == 0.0f ||
+ (mode->parent.spec.refresh_rate ==
preferred_crtc_mode->refresh_rate));
- mode->spec.refresh_rate = preferred_crtc_mode->refresh_rate;
+ mode->parent.spec.refresh_rate = preferred_crtc_mode->refresh_rate;
}
- return mode;
+ return &mode->parent;
}
static MetaMonitorMode *
@@ -592,7 +604,7 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
- MetaMonitorMode *mode;
+ MetaMonitorModeTiled *mode;
GList *l;
int i;
@@ -604,14 +616,15 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
crtc_mode->height == (int) main_output->tile_info.tile_h)
return NULL;
- mode = g_new0 (MetaMonitorMode, 1);
+ mode = g_new0 (MetaMonitorModeTiled, 1);
- mode->spec = (MetaMonitorModeSpec) {
+ mode->is_tiled = FALSE;
+ mode->parent.spec = (MetaMonitorModeSpec) {
.width = crtc_mode->width,
.height = crtc_mode->height,
.refresh_rate = crtc_mode->refresh_rate
};
- mode->crtc_modes = g_new0 (MetaMonitorCrtcMode,
+ mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
g_list_length (monitor_priv->outputs));
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
@@ -620,23 +633,21 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
if (output == main_output)
{
- mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
- .x = 0,
- .y = 0,
+ mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
.output = output,
.crtc_mode = crtc_mode
};
}
else
{
- mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
+ mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
.output = output,
.crtc_mode = NULL
};
}
}
- return mode;
+ return &mode->parent;
}
static void
@@ -745,6 +756,27 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
}
static void
+meta_monitor_tiled_calculate_crtc_pos (MetaMonitor *monitor,
+ MetaMonitorMode *monitor_mode,
+ MetaOutput *output,
+ int *out_x,
+ int *out_y)
+{
+ MetaMonitorModeTiled *mode_tiled = (MetaMonitorModeTiled *) monitor_mode;
+
+ if (mode_tiled->is_tiled)
+ {
+ calculate_tile_coordinate (monitor, output,
+ out_x, out_y);
+ }
+ else
+ {
+ *out_x = 0;
+ *out_y = 0;
+ }
+}
+
+static void
meta_monitor_tiled_finalize (GObject *object)
{
MetaMonitorTiled *monitor_tiled = META_MONITOR_TILED (object);
@@ -771,6 +803,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
+ monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
}
static void
@@ -882,6 +915,20 @@ meta_monitor_get_modes (MetaMonitor *monitor)
return priv->modes;
}
+void
+meta_monitor_calculate_crtc_pos (MetaMonitor *monitor,
+ MetaMonitorMode *monitor_mode,
+ MetaOutput *output,
+ int *out_x,
+ int *out_y)
+{
+ META_MONITOR_GET_CLASS (monitor)->calculate_crtc_pos (monitor,
+ monitor_mode,
+ output,
+ out_x,
+ out_y);
+}
+
MetaMonitorModeSpec *
meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode)
{
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index fc75c8c..36149d0 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -43,8 +43,6 @@ typedef struct _MetaMonitorModeSpec
typedef struct _MetaMonitorCrtcMode
{
- int x;
- int y;
MetaOutput *output;
MetaCrtcMode *crtc_mode;
} MetaMonitorCrtcMode;
@@ -66,6 +64,11 @@ struct _MetaMonitorClass
void (* derive_dimensions) (MetaMonitor *monitor,
int *width,
int *height);
+ void (* calculate_crtc_pos) (MetaMonitor *monitor,
+ MetaMonitorMode *monitor_mode,
+ MetaOutput *output,
+ int *out_x,
+ int *out_y);
};
#define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ())
@@ -143,6 +146,12 @@ void meta_monitor_set_current_mode (MetaMonitor *monitor,
GList * meta_monitor_get_modes (MetaMonitor *monitor);
+void meta_monitor_calculate_crtc_pos (MetaMonitor *monitor,
+ MetaMonitorMode *monitor_mode,
+ MetaOutput *output,
+ int *out_x,
+ int *out_y);
+
MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode);
void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
diff --git a/src/backends/native/meta-cursor-renderer-native.c
b/src/backends/native/meta-cursor-renderer-native.c
index 5dbfadb..471106f 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -240,15 +240,20 @@ update_monitor_crtc_cursor (MetaMonitor *monitor,
meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
MetaRectangle scaled_crtc_rect;
int scale;
+ int crtc_x, crtc_y;
if (meta_is_stage_views_scaled ())
scale = meta_logical_monitor_get_scale (data->in_logical_monitor);
else
scale = 1;
+ meta_monitor_calculate_crtc_pos (monitor, monitor_mode,
+ monitor_crtc_mode->output,
+ &crtc_x, &crtc_y);
+
scaled_crtc_rect = (MetaRectangle) {
- .x = monitor_crtc_mode->x / scale,
- .y = monitor_crtc_mode->y / scale,
+ .x = crtc_x / scale,
+ .y = crtc_y / scale,
.width = monitor_crtc_mode->crtc_mode->width / scale,
.height = monitor_crtc_mode->crtc_mode->height / scale
};
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index b3f458c..5f354c2 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -128,8 +128,6 @@ typedef struct _MonitorTestCaseMonitorCrtcMode
{
int output;
int crtc_mode;
- int x;
- int y;
} MetaTestCaseMonitorCrtcMode;
typedef struct _MonitorTestCaseMonitorMode
@@ -162,6 +160,8 @@ typedef struct _MonitorTestCaseLogicalMonitor
typedef struct _MonitorTestCaseCrtcExpect
{
int current_mode;
+ int x;
+ int y;
} MonitorTestCaseCrtcExpect;
typedef struct _MonitorTestCaseExpect
@@ -351,9 +351,6 @@ check_monitor_mode (MetaMonitor *monitor,
g_assert (monitor_crtc_mode->output == output);
g_assert (monitor_crtc_mode->crtc_mode == crtc_mode);
- g_assert_cmpint (monitor_crtc_mode->x, ==, data->expect_crtc_mode_iter->x);
- g_assert_cmpint (monitor_crtc_mode->y, ==, data->expect_crtc_mode_iter->y);
-
data->expect_crtc_mode_iter++;
return TRUE;
@@ -490,6 +487,42 @@ check_logical_monitor (MonitorTestCase *test_case,
}
static void
+get_compensated_crtc_position (MetaCrtc *crtc,
+ int *x,
+ int *y)
+{
+ MetaLogicalMonitor *logical_monitor;
+ MetaBackend *backend = meta_get_backend ();
+ MetaRenderer *renderer = meta_backend_get_renderer (backend);
+ GList *views;
+ GList *l;
+
+ logical_monitor = crtc->logical_monitor;
+ g_assert_nonnull (logical_monitor);
+
+ views = meta_renderer_get_views (renderer);
+ for (l = views; l; l = l->next)
+ {
+ MetaRendererView *view = l->data;
+ MetaRectangle view_layout;
+
+ clutter_stage_view_get_layout (CLUTTER_STAGE_VIEW (view),
+ &view_layout);
+
+ if (meta_rectangle_equal (&view_layout,
+ &logical_monitor->rect))
+ {
+ *x = crtc->rect.x - view_layout.x;
+ *y = crtc->rect.y - view_layout.y;
+ return;
+ }
+ }
+
+ *x = crtc->rect.x;
+ *y = crtc->rect.y;
+}
+
+static void
check_monitor_configuration (MonitorTestCase *test_case)
{
MetaBackend *backend = meta_get_backend ();
@@ -671,8 +704,14 @@ check_monitor_configuration (MonitorTestCase *test_case)
MetaCrtc *crtc = &monitor_manager->crtcs[i];
MetaCrtcMode *expected_current_mode =
&monitor_manager->modes[test_case->expect.crtcs[i].current_mode];
+ int crtc_x, crtc_y;
g_assert (crtc->current_mode == expected_current_mode);
+
+ get_compensated_crtc_position (crtc, &crtc_x, &crtc_y);
+
+ g_assert_cmpint (crtc_x, ==, test_case->expect.crtcs[i].x);
+ g_assert_cmpint (crtc_y, ==, test_case->expect.crtcs[i].y);
}
}
}
@@ -1224,8 +1263,6 @@ meta_test_monitor_tiled_linear_config (void)
{
.output = 1,
.crtc_mode = 0,
- .x = 400,
- .y = 0
}
}
},
@@ -1254,6 +1291,8 @@ meta_test_monitor_tiled_linear_config (void)
},
{
.current_mode = 0,
+ .x = 400,
+ .y = 0
}
},
.n_crtcs = 2,
@@ -2826,14 +2865,10 @@ meta_test_monitor_custom_tiled_config (void)
{
.output = 0,
.crtc_mode = 0,
- .x = 0,
- .y = 0,
},
{
.output = 1,
.crtc_mode = 0,
- .x = 400,
- .y = 0,
}
}
}
@@ -2862,6 +2897,8 @@ meta_test_monitor_custom_tiled_config (void)
},
{
.current_mode = 0,
+ .x = 400,
+ .y = 0
}
},
.n_crtcs = 2,
@@ -2969,14 +3006,10 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
{
.output = 0,
.crtc_mode = 0,
- .x = 0,
- .y = 0,
},
{
.output = 1,
.crtc_mode = 0,
- .x = 400,
- .y = 0,
}
}
},
@@ -2987,8 +3020,6 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
{
.output = 0,
.crtc_mode = 1,
- .x = 0,
- .y = 0,
},
{
.output = 1,
@@ -3021,6 +3052,8 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
},
{
.current_mode = -1,
+ .x = 400,
+ .y = 0,
}
},
.n_crtcs = 2,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]