1
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
4
* Copyright (C) 2016 Red Hat, Inc.
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License as
8
* published by the Free Software Foundation; either version 2 of the
9
* License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, see <http://www.gnu.org/licenses/>.
22
#include "tests/meta-monitor-manager-test.h"
24
#include "backends/meta-backend-private.h"
25
#include "backends/meta-crtc.h"
26
#include "backends/meta-gpu.h"
27
#include "backends/meta-monitor-config-manager.h"
28
#include "backends/meta-output.h"
30
struct _MetaMonitorManagerTest
32
MetaMonitorManager parent;
36
gboolean is_lid_closed;
37
gboolean handles_transforms;
39
int tiled_monitor_count;
41
MetaMonitorTestSetup *test_setup;
44
G_DEFINE_TYPE (MetaMonitorManagerTest, meta_monitor_manager_test,
45
META_TYPE_MONITOR_MANAGER)
52
G_DEFINE_TYPE (MetaGpuTest, meta_gpu_test, META_TYPE_GPU)
54
static MetaMonitorTestSetup *_initial_test_setup = NULL;
57
meta_monitor_manager_test_init_test_setup (MetaMonitorTestSetup *test_setup)
59
_initial_test_setup = test_setup;
63
meta_monitor_manager_test_get_gpu (MetaMonitorManagerTest *manager_test)
65
return manager_test->gpu;
69
meta_monitor_manager_test_emulate_hotplug (MetaMonitorManagerTest *manager_test,
70
MetaMonitorTestSetup *test_setup)
72
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_test);
73
MetaMonitorTestSetup *old_test_setup;
75
old_test_setup = manager_test->test_setup;
76
manager_test->test_setup = test_setup;
78
meta_monitor_manager_read_current_state (manager);
79
meta_monitor_manager_on_hotplug (manager);
81
g_free (old_test_setup);
85
meta_monitor_manager_test_set_is_lid_closed (MetaMonitorManagerTest *manager_test,
86
gboolean is_lid_closed)
88
manager_test->is_lid_closed = is_lid_closed;
92
meta_monitor_manager_test_set_handles_transforms (MetaMonitorManagerTest *manager_test,
93
gboolean handles_transforms)
95
g_assert (handles_transforms || meta_is_stage_views_enabled());
97
manager_test->handles_transforms = handles_transforms;
101
meta_monitor_manager_test_get_tiled_monitor_count (MetaMonitorManagerTest *manager_test)
103
return manager_test->tiled_monitor_count;
107
meta_monitor_manager_test_read_current (MetaMonitorManager *manager)
109
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
110
MetaGpu *gpu = manager_test->gpu;
113
g_assert (manager_test->test_setup);
115
for (l = manager_test->test_setup->outputs; l; l = l->next)
116
META_OUTPUT (l->data)->gpu = gpu;
117
for (l = manager_test->test_setup->crtcs; l; l = l->next)
118
META_CRTC (l->data)->gpu = gpu;
120
meta_gpu_take_modes (manager_test->gpu,
121
manager_test->test_setup->modes);
123
meta_gpu_take_crtcs (manager_test->gpu,
124
manager_test->test_setup->crtcs);
126
meta_gpu_take_outputs (manager_test->gpu,
127
manager_test->test_setup->outputs);
131
meta_monitor_manager_test_is_lid_closed (MetaMonitorManager *manager)
133
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
135
return manager_test->is_lid_closed;
139
meta_monitor_manager_test_ensure_initial_config (MetaMonitorManager *manager)
141
MetaMonitorsConfig *config;
143
config = meta_monitor_manager_ensure_configured (manager);
145
if (meta_is_stage_views_enabled ())
147
meta_monitor_manager_update_logical_state (manager, config);
151
meta_monitor_manager_update_logical_state_derived (manager, NULL);
156
apply_crtc_assignments (MetaMonitorManager *manager,
157
MetaCrtcInfo **crtcs,
158
unsigned int n_crtcs,
159
MetaOutputInfo **outputs,
160
unsigned int n_outputs)
162
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
166
for (i = 0; i < n_crtcs; i++)
168
MetaCrtcInfo *crtc_info = crtcs[i];
169
MetaCrtc *crtc = crtc_info->crtc;
170
crtc->is_dirty = TRUE;
172
if (crtc_info->mode == NULL)
176
crtc->rect.width = 0;
177
crtc->rect.height = 0;
178
crtc->current_mode = NULL;
187
mode = crtc_info->mode;
189
if (meta_monitor_transform_is_rotated (crtc_info->transform))
191
width = mode->height;
192
height = mode->width;
197
height = mode->height;
200
crtc->rect.x = crtc_info->x;
201
crtc->rect.y = crtc_info->y;
202
crtc->rect.width = width;
203
crtc->rect.height = height;
204
crtc->current_mode = mode;
205
crtc->transform = crtc_info->transform;
207
for (j = 0; j < crtc_info->outputs->len; j++)
209
output = ((MetaOutput**)crtc_info->outputs->pdata)[j];
211
output->is_dirty = TRUE;
217
for (i = 0; i < n_outputs; i++)
219
MetaOutputInfo *output_info = outputs[i];
220
MetaOutput *output = output_info->output;
222
output->is_primary = output_info->is_primary;
223
output->is_presentation = output_info->is_presentation;
224
output->is_underscanning = output_info->is_underscanning;
227
/* Disable CRTCs not mentioned in the list */
228
for (l = meta_gpu_get_crtcs (manager_test->gpu); l; l = l->next)
230
MetaCrtc *crtc = l->data;
232
crtc->logical_monitor = NULL;
236
crtc->is_dirty = FALSE;
242
crtc->rect.width = 0;
243
crtc->rect.height = 0;
244
crtc->current_mode = NULL;
247
/* Disable outputs not mentioned in the list */
248
for (l = meta_gpu_get_outputs (manager_test->gpu); l; l = l->next)
250
MetaOutput *output = l->data;
252
if (output->is_dirty)
254
output->is_dirty = FALSE;
259
output->is_primary = FALSE;
264
update_screen_size (MetaMonitorManager *manager,
265
MetaMonitorsConfig *config)
268
int screen_width = 0;
269
int screen_height = 0;
271
for (l = config->logical_monitor_configs; l; l = l->next)
273
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
277
right_edge = (logical_monitor_config->layout.width +
278
logical_monitor_config->layout.x);
279
if (right_edge > screen_width)
280
screen_width = right_edge;
282
bottom_edge = (logical_monitor_config->layout.height +
283
logical_monitor_config->layout.y);
284
if (bottom_edge > screen_height)
285
screen_height = bottom_edge;
288
manager->screen_width = screen_width;
289
manager->screen_height = screen_height;
293
meta_monitor_manager_test_apply_monitors_config (MetaMonitorManager *manager,
294
MetaMonitorsConfig *config,
295
MetaMonitorsConfigMethod method,
298
GPtrArray *crtc_infos;
299
GPtrArray *output_infos;
303
manager->screen_width = META_MONITOR_MANAGER_MIN_SCREEN_WIDTH;
304
manager->screen_height = META_MONITOR_MANAGER_MIN_SCREEN_HEIGHT;
306
if (meta_is_stage_views_enabled ())
307
meta_monitor_manager_rebuild (manager, NULL);
309
meta_monitor_manager_rebuild_derived (manager, config);
314
if (!meta_monitor_config_manager_assign (manager, config,
320
if (method == META_MONITORS_CONFIG_METHOD_VERIFY)
322
g_ptr_array_free (crtc_infos, TRUE);
323
g_ptr_array_free (output_infos, TRUE);
327
apply_crtc_assignments (manager,
328
(MetaCrtcInfo **) crtc_infos->pdata,
330
(MetaOutputInfo **) output_infos->pdata,
333
g_ptr_array_free (crtc_infos, TRUE);
334
g_ptr_array_free (output_infos, TRUE);
336
update_screen_size (manager, config);
338
if (meta_is_stage_views_enabled ())
339
meta_monitor_manager_rebuild (manager, config);
341
meta_monitor_manager_rebuild_derived (manager, config);
347
meta_monitor_manager_test_tiled_monitor_added (MetaMonitorManager *manager,
348
MetaMonitor *monitor)
350
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
352
manager_test->tiled_monitor_count++;
356
meta_monitor_manager_test_tiled_monitor_removed (MetaMonitorManager *manager,
357
MetaMonitor *monitor)
359
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
361
manager_test->tiled_monitor_count--;
365
meta_monitor_manager_test_is_transform_handled (MetaMonitorManager *manager,
367
MetaMonitorTransform transform)
369
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
371
return manager_test->handles_transforms;
375
meta_monitor_manager_test_calculate_monitor_mode_scale (MetaMonitorManager *manager,
376
MetaMonitor *monitor,
377
MetaMonitorMode *monitor_mode)
380
MetaOutputTest *output_test;
382
output = meta_monitor_get_main_output (monitor);
383
output_test = output->driver_private;
386
return output_test->scale;
392
meta_monitor_manager_test_calculate_supported_scales (MetaMonitorManager *manager,
393
MetaLogicalMonitorLayoutMode layout_mode,
394
MetaMonitor *monitor,
395
MetaMonitorMode *monitor_mode,
396
int *n_supported_scales)
398
MetaMonitorScalesConstraint constraints =
399
META_MONITOR_SCALES_CONSTRAINT_NONE;
403
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
405
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
406
constraints |= META_MONITOR_SCALES_CONSTRAINT_NO_FRAC;
410
return meta_monitor_calculate_supported_scales (monitor, monitor_mode,
416
is_monitor_framebuffer_scaled (void)
418
MetaBackend *backend = meta_get_backend ();
419
MetaSettings *settings = meta_backend_get_settings (backend);
421
return meta_settings_is_experimental_feature_enabled (
423
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER);
426
static MetaMonitorManagerCapability
427
meta_monitor_manager_test_get_capabilities (MetaMonitorManager *manager)
429
MetaMonitorManagerCapability capabilities =
430
META_MONITOR_MANAGER_CAPABILITY_NONE;
432
capabilities |= META_MONITOR_MANAGER_CAPABILITY_MIRRORING;
434
if (is_monitor_framebuffer_scaled ())
435
capabilities |= META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE;
441
meta_monitor_manager_test_get_max_screen_size (MetaMonitorManager *manager,
445
if (meta_is_stage_views_enabled ())
454
static MetaLogicalMonitorLayoutMode
455
meta_monitor_manager_test_get_default_layout_mode (MetaMonitorManager *manager)
457
if (!meta_is_stage_views_enabled ())
458
return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
460
if (is_monitor_framebuffer_scaled ())
461
return META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL;
463
return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
467
meta_monitor_manager_test_dispose (GObject *object)
469
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (object);
471
g_clear_pointer (&manager_test->test_setup, g_free);
475
meta_monitor_manager_test_init (MetaMonitorManagerTest *manager_test)
477
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_test);
479
g_assert (_initial_test_setup);
481
manager_test->handles_transforms = TRUE;
483
manager_test->test_setup = _initial_test_setup;
485
manager_test->gpu = g_object_new (META_TYPE_GPU_TEST,
486
"monitor-manager", manager,
488
meta_monitor_manager_add_gpu (manager, manager_test->gpu);
492
meta_monitor_manager_test_class_init (MetaMonitorManagerTestClass *klass)
494
GObjectClass *object_class = G_OBJECT_CLASS (klass);
495
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
497
object_class->dispose = meta_monitor_manager_test_dispose;
499
manager_class->is_lid_closed = meta_monitor_manager_test_is_lid_closed;
500
manager_class->ensure_initial_config = meta_monitor_manager_test_ensure_initial_config;
501
manager_class->apply_monitors_config = meta_monitor_manager_test_apply_monitors_config;
502
manager_class->tiled_monitor_added = meta_monitor_manager_test_tiled_monitor_added;
503
manager_class->tiled_monitor_removed = meta_monitor_manager_test_tiled_monitor_removed;
504
manager_class->is_transform_handled = meta_monitor_manager_test_is_transform_handled;
505
manager_class->calculate_monitor_mode_scale = meta_monitor_manager_test_calculate_monitor_mode_scale;
506
manager_class->calculate_supported_scales = meta_monitor_manager_test_calculate_supported_scales;
507
manager_class->get_capabilities = meta_monitor_manager_test_get_capabilities;
508
manager_class->get_max_screen_size = meta_monitor_manager_test_get_max_screen_size;
509
manager_class->get_default_layout_mode = meta_monitor_manager_test_get_default_layout_mode;
513
meta_gpu_test_read_current (MetaGpu *gpu,
516
MetaMonitorManager *manager = meta_gpu_get_monitor_manager (gpu);
518
meta_monitor_manager_test_read_current (manager);
524
meta_gpu_test_init (MetaGpuTest *gpu_test)
529
meta_gpu_test_class_init (MetaGpuTestClass *klass)
531
MetaGpuClass *gpu_class = META_GPU_CLASS (klass);
533
gpu_class->read_current = meta_gpu_test_read_current;