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
This commit is contained in:
Jonas Ådahl 2017-03-17 17:21:10 +08:00
parent 8a29c51b73
commit afcc1bf512
5 changed files with 153 additions and 55 deletions

View File

@ -117,6 +117,7 @@ assign_monitor_crtc (MetaMonitor *monitor,
MonitorAssignmentData *data = user_data; MonitorAssignmentData *data = user_data;
MetaOutput *output; MetaOutput *output;
MetaCrtc *crtc; MetaCrtc *crtc;
int crtc_x, crtc_y;
MetaCrtcInfo *crtc_info; MetaCrtcInfo *crtc_info;
MetaOutputInfo *output_info; MetaOutputInfo *output_info;
MetaMonitorConfig *first_monitor_config; MetaMonitorConfig *first_monitor_config;
@ -136,12 +137,15 @@ assign_monitor_crtc (MetaMonitor *monitor,
return FALSE; return FALSE;
} }
meta_monitor_calculate_crtc_pos (monitor, mode, output,
&crtc_x, &crtc_y);
crtc_info = g_slice_new0 (MetaCrtcInfo); crtc_info = g_slice_new0 (MetaCrtcInfo);
*crtc_info = (MetaCrtcInfo) { *crtc_info = (MetaCrtcInfo) {
.crtc = crtc, .crtc = crtc,
.mode = monitor_crtc_mode->crtc_mode, .mode = monitor_crtc_mode->crtc_mode,
.x = monitor_crtc_mode->x, .x = crtc_x,
.y = monitor_crtc_mode->y, .y = crtc_y,
.transform = META_MONITOR_TRANSFORM_NORMAL, .transform = META_MONITOR_TRANSFORM_NORMAL,
.outputs = g_ptr_array_new () .outputs = g_ptr_array_new ()
}; };

View File

@ -32,6 +32,13 @@ typedef struct _MetaMonitorMode
MetaMonitorCrtcMode *crtc_modes; MetaMonitorCrtcMode *crtc_modes;
} MetaMonitorMode; } MetaMonitorMode;
typedef struct _MetaMonitorModeTiled
{
MetaMonitorMode parent;
gboolean is_tiled;
} MetaMonitorModeTiled;
typedef struct _MetaMonitorPrivate typedef struct _MetaMonitorPrivate
{ {
GList *outputs; GList *outputs;
@ -347,8 +354,6 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
}, },
mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1); mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1);
mode->crtc_modes[0] = (MetaMonitorCrtcMode) { mode->crtc_modes[0] = (MetaMonitorCrtcMode) {
.x = 0,
.y = 0,
.output = output, .output = output,
.crtc_mode = crtc_mode .crtc_mode = crtc_mode
}; };
@ -403,6 +408,17 @@ meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
*height = output->crtc->rect.height; *height = output->crtc->rect.height;
} }
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 static void
meta_monitor_normal_init (MetaMonitorNormal *monitor) 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->get_main_output = meta_monitor_normal_get_main_output;
monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions; monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos;
} }
uint32_t uint32_t
@ -463,10 +480,10 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
} }
static void static void
calculate_tile_coordinate (MetaMonitor *monitor, calculate_tile_coordinate (MetaMonitor *monitor,
MetaOutput *output, MetaOutput *output,
int *out_x, int *out_x,
int *out_y) int *out_y)
{ {
MetaMonitorPrivate *monitor_priv = MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor); meta_monitor_get_instance_private (monitor);
@ -548,40 +565,35 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled)
MetaMonitor *monitor = META_MONITOR (monitor_tiled); MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv = MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor); meta_monitor_get_instance_private (monitor);
MetaMonitorMode *mode; MetaMonitorModeTiled *mode;
GList *l; GList *l;
int i; int i;
mode = g_new0 (MetaMonitorMode, 1); mode = g_new0 (MetaMonitorModeTiled, 1);
mode->is_tiled = TRUE;
meta_monitor_tiled_calculate_tiled_size (monitor, meta_monitor_tiled_calculate_tiled_size (monitor,
&mode->spec.width, &mode->parent.spec.width,
&mode->spec.height); &mode->parent.spec.height);
mode->crtc_modes = g_new0 (MetaMonitorCrtcMode, mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
g_list_length (monitor_priv->outputs)); g_list_length (monitor_priv->outputs));
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
{ {
MetaOutput *output = l->data; MetaOutput *output = l->data;
MetaCrtcMode *preferred_crtc_mode = output->preferred_mode; MetaCrtcMode *preferred_crtc_mode = output->preferred_mode;
int x;
int y;
calculate_tile_coordinate (monitor, output, &x, &y); mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
.x = x,
.y = y,
.output = output, .output = output,
.crtc_mode = preferred_crtc_mode .crtc_mode = preferred_crtc_mode
}; };
g_warn_if_fail (mode->spec.refresh_rate == 0.0f || g_warn_if_fail (mode->parent.spec.refresh_rate == 0.0f ||
(mode->spec.refresh_rate == (mode->parent.spec.refresh_rate ==
preferred_crtc_mode->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 * static MetaMonitorMode *
@ -592,7 +604,7 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
MetaMonitor *monitor = META_MONITOR (monitor_tiled); MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv = MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor); meta_monitor_get_instance_private (monitor);
MetaMonitorMode *mode; MetaMonitorModeTiled *mode;
GList *l; GList *l;
int i; int i;
@ -604,14 +616,15 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
crtc_mode->height == (int) main_output->tile_info.tile_h) crtc_mode->height == (int) main_output->tile_info.tile_h)
return NULL; 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, .width = crtc_mode->width,
.height = crtc_mode->height, .height = crtc_mode->height,
.refresh_rate = crtc_mode->refresh_rate .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)); g_list_length (monitor_priv->outputs));
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) 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) if (output == main_output)
{ {
mode->crtc_modes[i] = (MetaMonitorCrtcMode) { mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
.x = 0,
.y = 0,
.output = output, .output = output,
.crtc_mode = crtc_mode .crtc_mode = crtc_mode
}; };
} }
else else
{ {
mode->crtc_modes[i] = (MetaMonitorCrtcMode) { mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
.output = output, .output = output,
.crtc_mode = NULL .crtc_mode = NULL
}; };
} }
} }
return mode; return &mode->parent;
} }
static void static void
@ -744,6 +755,27 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
*out_height = max_y - min_y; *out_height = max_y - min_y;
} }
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 static void
meta_monitor_tiled_finalize (GObject *object) meta_monitor_tiled_finalize (GObject *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->get_main_output = meta_monitor_tiled_get_main_output;
monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions; monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
} }
static void static void
@ -882,6 +915,20 @@ meta_monitor_get_modes (MetaMonitor *monitor)
return priv->modes; 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 * MetaMonitorModeSpec *
meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode) meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode)
{ {

View File

@ -43,8 +43,6 @@ typedef struct _MetaMonitorModeSpec
typedef struct _MetaMonitorCrtcMode typedef struct _MetaMonitorCrtcMode
{ {
int x;
int y;
MetaOutput *output; MetaOutput *output;
MetaCrtcMode *crtc_mode; MetaCrtcMode *crtc_mode;
} MetaMonitorCrtcMode; } MetaMonitorCrtcMode;
@ -66,6 +64,11 @@ struct _MetaMonitorClass
void (* derive_dimensions) (MetaMonitor *monitor, void (* derive_dimensions) (MetaMonitor *monitor,
int *width, int *width,
int *height); 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 ()) #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); 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); MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode);
void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode, void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,

View File

@ -240,15 +240,20 @@ update_monitor_crtc_cursor (MetaMonitor *monitor,
meta_cursor_renderer_native_get_instance_private (cursor_renderer_native); meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
MetaRectangle scaled_crtc_rect; MetaRectangle scaled_crtc_rect;
int scale; int scale;
int crtc_x, crtc_y;
if (meta_is_stage_views_scaled ()) if (meta_is_stage_views_scaled ())
scale = meta_logical_monitor_get_scale (data->in_logical_monitor); scale = meta_logical_monitor_get_scale (data->in_logical_monitor);
else else
scale = 1; scale = 1;
meta_monitor_calculate_crtc_pos (monitor, monitor_mode,
monitor_crtc_mode->output,
&crtc_x, &crtc_y);
scaled_crtc_rect = (MetaRectangle) { scaled_crtc_rect = (MetaRectangle) {
.x = monitor_crtc_mode->x / scale, .x = crtc_x / scale,
.y = monitor_crtc_mode->y / scale, .y = crtc_y / scale,
.width = monitor_crtc_mode->crtc_mode->width / scale, .width = monitor_crtc_mode->crtc_mode->width / scale,
.height = monitor_crtc_mode->crtc_mode->height / scale .height = monitor_crtc_mode->crtc_mode->height / scale
}; };

View File

@ -128,8 +128,6 @@ typedef struct _MonitorTestCaseMonitorCrtcMode
{ {
int output; int output;
int crtc_mode; int crtc_mode;
int x;
int y;
} MetaTestCaseMonitorCrtcMode; } MetaTestCaseMonitorCrtcMode;
typedef struct _MonitorTestCaseMonitorMode typedef struct _MonitorTestCaseMonitorMode
@ -162,6 +160,8 @@ typedef struct _MonitorTestCaseLogicalMonitor
typedef struct _MonitorTestCaseCrtcExpect typedef struct _MonitorTestCaseCrtcExpect
{ {
int current_mode; int current_mode;
int x;
int y;
} MonitorTestCaseCrtcExpect; } MonitorTestCaseCrtcExpect;
typedef struct _MonitorTestCaseExpect typedef struct _MonitorTestCaseExpect
@ -351,9 +351,6 @@ check_monitor_mode (MetaMonitor *monitor,
g_assert (monitor_crtc_mode->output == output); g_assert (monitor_crtc_mode->output == output);
g_assert (monitor_crtc_mode->crtc_mode == crtc_mode); 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++; data->expect_crtc_mode_iter++;
return TRUE; return TRUE;
@ -489,6 +486,42 @@ check_logical_monitor (MonitorTestCase *test_case,
g_assert_nonnull (primary_output); g_assert_nonnull (primary_output);
} }
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 static void
check_monitor_configuration (MonitorTestCase *test_case) check_monitor_configuration (MonitorTestCase *test_case)
{ {
@ -671,8 +704,14 @@ check_monitor_configuration (MonitorTestCase *test_case)
MetaCrtc *crtc = &monitor_manager->crtcs[i]; MetaCrtc *crtc = &monitor_manager->crtcs[i];
MetaCrtcMode *expected_current_mode = MetaCrtcMode *expected_current_mode =
&monitor_manager->modes[test_case->expect.crtcs[i].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); 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, .output = 1,
.crtc_mode = 0, .crtc_mode = 0,
.x = 400,
.y = 0
} }
} }
}, },
@ -1254,6 +1291,8 @@ meta_test_monitor_tiled_linear_config (void)
}, },
{ {
.current_mode = 0, .current_mode = 0,
.x = 400,
.y = 0
} }
}, },
.n_crtcs = 2, .n_crtcs = 2,
@ -2826,14 +2865,10 @@ meta_test_monitor_custom_tiled_config (void)
{ {
.output = 0, .output = 0,
.crtc_mode = 0, .crtc_mode = 0,
.x = 0,
.y = 0,
}, },
{ {
.output = 1, .output = 1,
.crtc_mode = 0, .crtc_mode = 0,
.x = 400,
.y = 0,
} }
} }
} }
@ -2862,6 +2897,8 @@ meta_test_monitor_custom_tiled_config (void)
}, },
{ {
.current_mode = 0, .current_mode = 0,
.x = 400,
.y = 0
} }
}, },
.n_crtcs = 2, .n_crtcs = 2,
@ -2969,14 +3006,10 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
{ {
.output = 0, .output = 0,
.crtc_mode = 0, .crtc_mode = 0,
.x = 0,
.y = 0,
}, },
{ {
.output = 1, .output = 1,
.crtc_mode = 0, .crtc_mode = 0,
.x = 400,
.y = 0,
} }
} }
}, },
@ -2987,8 +3020,6 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
{ {
.output = 0, .output = 0,
.crtc_mode = 1, .crtc_mode = 1,
.x = 0,
.y = 0,
}, },
{ {
.output = 1, .output = 1,
@ -3021,6 +3052,8 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
}, },
{ {
.current_mode = -1, .current_mode = -1,
.x = 400,
.y = 0,
} }
}, },
.n_crtcs = 2, .n_crtcs = 2,