backends: Split out CRTC/output management to MetaGpu

In order to eventually support multilpe GPUs with their own connectors,
split out related meta data management (i.e. outputs, CRTCs and CRTC
modes) into a new MetaGpu GObject.

The Xrandr backend always assumes there is always only a single "GPU" as
the GPU is abstracted by the X server; only the native backend (aside
from the test backend) will eventually see more than one GPU.

The Xrandr backend still moves some management to MetaGpuXrandr, in
order to behave more similarly to the KMS counterparts.

https://bugzilla.gnome.org/show_bug.cgi?id=785381
This commit is contained in:
Jonas Ådahl
2017-07-10 18:19:32 +08:00
parent 18ec86bd90
commit c1683073f1
36 changed files with 2397 additions and 1414 deletions

View File

@ -57,10 +57,16 @@ meta_test_headless_start (void)
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
GList *gpus;
MetaGpu *gpu;
g_assert_null (monitor_manager->modes);
g_assert_null (monitor_manager->outputs);
g_assert_null (monitor_manager->crtcs);
gpus = meta_monitor_manager_get_gpus (monitor_manager);
g_assert_cmpint ((int) g_list_length (gpus), ==, 1);
gpu = gpus->data;
g_assert_null (meta_gpu_get_modes (gpu));
g_assert_null (meta_gpu_get_outputs (gpu));
g_assert_null (meta_gpu_get_crtcs (gpu));
g_assert_null (monitor_manager->monitors);
g_assert_null (monitor_manager->logical_monitors);

View File

@ -23,6 +23,7 @@
#include "backends/meta-backend-private.h"
#include "backends/meta-crtc.h"
#include "backends/meta-gpu.h"
#include "backends/meta-monitor-config-manager.h"
#include "backends/meta-output.h"
@ -30,6 +31,8 @@ struct _MetaMonitorManagerTest
{
MetaMonitorManager parent;
MetaGpu *gpu;
gboolean is_lid_closed;
gboolean handles_transforms;
@ -41,6 +44,13 @@ struct _MetaMonitorManagerTest
G_DEFINE_TYPE (MetaMonitorManagerTest, meta_monitor_manager_test,
META_TYPE_MONITOR_MANAGER)
struct _MetaGpuTest
{
MetaGpu parent;
};
G_DEFINE_TYPE (MetaGpuTest, meta_gpu_test, META_TYPE_GPU)
static MetaMonitorTestSetup *_initial_test_setup = NULL;
void
@ -49,6 +59,12 @@ meta_monitor_manager_test_init_test_setup (MetaMonitorTestSetup *test_setup)
_initial_test_setup = test_setup;
}
MetaGpu *
meta_monitor_manager_test_get_gpu (MetaMonitorManagerTest *manager_test)
{
return manager_test->gpu;
}
void
meta_monitor_manager_test_emulate_hotplug (MetaMonitorManagerTest *manager_test,
MetaMonitorTestSetup *test_setup)
@ -91,20 +107,24 @@ static void
meta_monitor_manager_test_read_current (MetaMonitorManager *manager)
{
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
MetaGpu *gpu = manager_test->gpu;
GList *l;
g_assert (manager_test->test_setup);
for (l = manager_test->test_setup->outputs; l; l = l->next)
META_OUTPUT (l->data)->monitor_manager = manager;
META_OUTPUT (l->data)->gpu = gpu;
for (l = manager_test->test_setup->crtcs; l; l = l->next)
META_CRTC (l->data)->monitor_manager = manager;
META_CRTC (l->data)->gpu = gpu;
manager->modes = manager_test->test_setup->modes;
meta_gpu_take_modes (manager_test->gpu,
manager_test->test_setup->modes);
manager->crtcs = manager_test->test_setup->crtcs;
meta_gpu_take_crtcs (manager_test->gpu,
manager_test->test_setup->crtcs);
manager->outputs = manager_test->test_setup->outputs;
meta_gpu_take_outputs (manager_test->gpu,
manager_test->test_setup->outputs);
}
static gboolean
@ -139,6 +159,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
MetaOutputInfo **outputs,
unsigned int n_outputs)
{
MetaMonitorManagerTest *manager_test = META_MONITOR_MANAGER_TEST (manager);
GList *l;
unsigned int i;
@ -204,7 +225,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
}
/* Disable CRTCs not mentioned in the list */
for (l = manager->crtcs; l; l = l->next)
for (l = meta_gpu_get_crtcs (manager_test->gpu); l; l = l->next)
{
MetaCrtc *crtc = l->data;
@ -224,7 +245,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
}
/* Disable outputs not mentioned in the list */
for (l = manager->outputs; l; l = l->next)
for (l = meta_gpu_get_outputs (manager_test->gpu); l; l = l->next)
{
MetaOutput *output = l->data;
@ -453,11 +474,18 @@ meta_monitor_manager_test_dispose (GObject *object)
static void
meta_monitor_manager_test_init (MetaMonitorManagerTest *manager_test)
{
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_test);
g_assert (_initial_test_setup);
manager_test->handles_transforms = TRUE;
manager_test->test_setup = _initial_test_setup;
manager_test->gpu = g_object_new (META_TYPE_GPU_TEST,
"monitor-manager", manager,
NULL);
meta_monitor_manager_add_gpu (manager, manager_test->gpu);
}
static void
@ -468,7 +496,6 @@ meta_monitor_manager_test_class_init (MetaMonitorManagerTestClass *klass)
object_class->dispose = meta_monitor_manager_test_dispose;
manager_class->read_current = meta_monitor_manager_test_read_current;
manager_class->is_lid_closed = meta_monitor_manager_test_is_lid_closed;
manager_class->ensure_initial_config = meta_monitor_manager_test_ensure_initial_config;
manager_class->apply_monitors_config = meta_monitor_manager_test_apply_monitors_config;
@ -481,3 +508,27 @@ meta_monitor_manager_test_class_init (MetaMonitorManagerTestClass *klass)
manager_class->get_max_screen_size = meta_monitor_manager_test_get_max_screen_size;
manager_class->get_default_layout_mode = meta_monitor_manager_test_get_default_layout_mode;
}
static gboolean
meta_gpu_test_read_current (MetaGpu *gpu,
GError **error)
{
MetaMonitorManager *manager = meta_gpu_get_monitor_manager (gpu);
meta_monitor_manager_test_read_current (manager);
return TRUE;
}
static void
meta_gpu_test_init (MetaGpuTest *gpu_test)
{
}
static void
meta_gpu_test_class_init (MetaGpuTestClass *klass)
{
MetaGpuClass *gpu_class = META_GPU_CLASS (klass);
gpu_class->read_current = meta_gpu_test_read_current;
}

View File

@ -20,6 +20,7 @@
#ifndef META_MONITOR_MANAGER_TEST_H
#define META_MONITOR_MANAGER_TEST_H
#include "backends/meta-gpu.h"
#include "backends/meta-monitor-manager-private.h"
typedef struct _MetaMonitorTestSetup
@ -38,8 +39,13 @@ typedef struct _MetaOutputTest
G_DECLARE_FINAL_TYPE (MetaMonitorManagerTest, meta_monitor_manager_test,
META, MONITOR_MANAGER_TEST, MetaMonitorManager)
#define META_TYPE_GPU_TEST (meta_gpu_test_get_type ())
G_DECLARE_FINAL_TYPE (MetaGpuTest, meta_gpu_test, META, GPU_TEST, MetaGpu)
void meta_monitor_manager_test_init_test_setup (MetaMonitorTestSetup *test_setup);
MetaGpu * meta_monitor_manager_test_get_gpu (MetaMonitorManagerTest *manager_test);
void meta_monitor_manager_test_emulate_hotplug (MetaMonitorManagerTest *manager_test,
MetaMonitorTestSetup *test_setup);

View File

@ -368,9 +368,12 @@ static MetaOutput *
output_from_winsys_id (MetaMonitorManager *monitor_manager,
long winsys_id)
{
MetaMonitorManagerTest *monitor_manager_test =
META_MONITOR_MANAGER_TEST (monitor_manager);
MetaGpu *gpu = meta_monitor_manager_test_get_gpu (monitor_manager_test);
GList *l;
for (l = monitor_manager->outputs; l; l = l->next)
for (l = meta_gpu_get_outputs (gpu); l; l = l->next)
{
MetaOutput *output = l->data;
@ -402,17 +405,22 @@ check_monitor_mode (MetaMonitor *monitor,
output = output_from_winsys_id (monitor_manager,
data->expect_crtc_mode_iter->output);
g_assert (monitor_crtc_mode->output == output);
expect_crtc_mode_index = data->expect_crtc_mode_iter->crtc_mode;
if (expect_crtc_mode_index == -1)
crtc_mode = NULL;
{
crtc_mode = NULL;
}
else
crtc_mode = g_list_nth_data (monitor_manager->modes,
expect_crtc_mode_index);
{
MetaGpu *gpu = meta_output_get_gpu (output);
g_assert (monitor_crtc_mode->output == output);
crtc_mode = g_list_nth_data (meta_gpu_get_modes (gpu),
expect_crtc_mode_index);
}
g_assert (monitor_crtc_mode->crtc_mode == crtc_mode);
if (crtc_mode)
{
float refresh_rate;
@ -607,6 +615,7 @@ check_monitor_configuration (MonitorTestCase *test_case)
meta_backend_get_monitor_manager (backend);
MetaMonitorManagerTest *monitor_manager_test =
META_MONITOR_MANAGER_TEST (monitor_manager);
MetaGpu *gpu = meta_monitor_manager_test_get_gpu (monitor_manager_test);
int tiled_monitor_count;
GList *monitors;
GList *crtcs;
@ -620,10 +629,10 @@ check_monitor_configuration (MonitorTestCase *test_case)
g_assert_cmpint (monitor_manager->screen_height,
==,
test_case->expect.screen_height);
g_assert_cmpint ((int) g_list_length (monitor_manager->outputs),
g_assert_cmpint ((int) g_list_length (meta_gpu_get_outputs (gpu)),
==,
test_case->expect.n_outputs);
g_assert_cmpint ((int) g_list_length (monitor_manager->crtcs),
g_assert_cmpint ((int) g_list_length (meta_gpu_get_crtcs (gpu)),
==,
test_case->expect.n_crtcs);
@ -789,7 +798,7 @@ check_monitor_configuration (MonitorTestCase *test_case)
}
g_assert_cmpint (n_logical_monitors, ==, i);
crtcs = meta_monitor_manager_get_crtcs (monitor_manager);
crtcs = meta_gpu_get_crtcs (gpu);
for (l = crtcs, i = 0; l; l = l->next, i++)
{
MetaCrtc *crtc = l->data;
@ -805,7 +814,7 @@ check_monitor_configuration (MonitorTestCase *test_case)
int crtc_x, crtc_y;
expected_current_mode =
g_list_nth_data (monitor_manager->modes,
g_list_nth_data (meta_gpu_get_modes (gpu),
test_case->expect.crtcs[i].current_mode);
g_assert (crtc->current_mode == expected_current_mode);