mirror of
https://github.com/brl/mutter.git
synced 2025-02-16 21:34:09 +00:00
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:
parent
8a29c51b73
commit
afcc1bf512
@ -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 ()
|
||||
};
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user