1
0
Fork 0

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;
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 ()
};

View file

@ -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
};
@ -403,6 +408,17 @@ meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
*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
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
@ -744,6 +755,27 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
*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
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->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)
{

View file

@ -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,

View file

@ -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
};

View file

@ -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;
@ -489,6 +486,42 @@ check_logical_monitor (MonitorTestCase *test_case,
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
check_monitor_configuration (MonitorTestCase *test_case)
{
@ -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,