[mutter] tests: Move monitor test functions into common utils
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] tests: Move monitor test functions into common utils
- Date: Wed, 13 May 2020 08:56:17 +0000 (UTC)
commit a51807fc1ee246bb0ffcc5c8dedea000b1616587
Author: Jonas Dreßler <verdre v0yd nl>
Date: Fri May 8 23:05:35 2020 +0200
tests: Move monitor test functions into common utils
It's very useful to have common functions for easily creating a monitor
test setup for all kinds of tests, so move create_monitor_test_setup()
and check_monitor_configuration() and all the structs those are using to
monitor-test-utils.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1243
src/tests/monitor-test-utils.c | 601 ++++++++++++++++++++++++++++++++
src/tests/monitor-test-utils.h | 174 ++++++++++
src/tests/monitor-unit-tests.c | 762 -----------------------------------------
3 files changed, 775 insertions(+), 762 deletions(-)
---
diff --git a/src/tests/monitor-test-utils.c b/src/tests/monitor-test-utils.c
index 548815691..6de2682bb 100644
--- a/src/tests/monitor-test-utils.c
+++ b/src/tests/monitor-test-utils.c
@@ -22,8 +22,12 @@
#include "tests/monitor-test-utils.h"
#include "backends/meta-backend-private.h"
+#include "backends/meta-crtc.h"
+#include "backends/meta-logical-monitor.h"
#include "backends/meta-monitor-config-manager.h"
#include "backends/meta-monitor-config-store.h"
+#include "backends/meta-output.h"
+#include "meta-backend-test.h"
void
set_custom_monitor_config (const char *filename)
@@ -79,3 +83,600 @@ read_file (const char *file_path)
return g_steal_pointer (&buffer);
}
+
+static MetaOutput *
+output_from_winsys_id (MetaBackend *backend,
+ uint64_t winsys_id)
+{
+ MetaGpu *gpu = meta_backend_test_get_gpu (META_BACKEND_TEST (backend));
+ GList *l;
+
+ for (l = meta_gpu_get_outputs (gpu); l; l = l->next)
+ {
+ MetaOutput *output = l->data;
+
+ if (output->winsys_id == winsys_id)
+ return output;
+ }
+
+ return NULL;
+}
+
+typedef struct _CheckMonitorModeData
+{
+ MetaBackend *backend;
+ MetaTestCaseMonitorCrtcMode *expect_crtc_mode_iter;
+} CheckMonitorModeData;
+
+static gboolean
+check_monitor_mode (MetaMonitor *monitor,
+ MetaMonitorMode *mode,
+ MetaMonitorCrtcMode *monitor_crtc_mode,
+ gpointer user_data,
+ GError **error)
+{
+ CheckMonitorModeData *data = user_data;
+ MetaBackend *backend = data->backend;
+ MetaOutput *output;
+ MetaCrtcMode *crtc_mode;
+ int expect_crtc_mode_index;
+
+ output = output_from_winsys_id (backend,
+ 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;
+ }
+ else
+ {
+ MetaGpu *gpu = meta_output_get_gpu (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;
+ MetaCrtcModeFlag flags;
+
+ refresh_rate = meta_monitor_mode_get_refresh_rate (mode);
+ flags = meta_monitor_mode_get_flags (mode);
+
+ g_assert_cmpfloat (refresh_rate, ==, crtc_mode->refresh_rate);
+ g_assert_cmpint (flags, ==, (crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS));
+ }
+
+ data->expect_crtc_mode_iter++;
+
+ return TRUE;
+}
+
+static gboolean
+check_current_monitor_mode (MetaMonitor *monitor,
+ MetaMonitorMode *mode,
+ MetaMonitorCrtcMode *monitor_crtc_mode,
+ gpointer user_data,
+ GError **error)
+{
+ CheckMonitorModeData *data = user_data;
+ MetaBackend *backend = data->backend;
+ MetaOutput *output;
+ MetaCrtc *crtc;
+
+ output = output_from_winsys_id (backend,
+ data->expect_crtc_mode_iter->output);
+ crtc = meta_output_get_assigned_crtc (output);
+
+ if (data->expect_crtc_mode_iter->crtc_mode == -1)
+ {
+ g_assert_null (crtc);
+ }
+ else
+ {
+ MetaCrtcConfig *crtc_config;
+ MetaLogicalMonitor *logical_monitor;
+
+ g_assert_nonnull (crtc);
+
+ crtc_config = crtc->config;
+ g_assert_nonnull (crtc_config);
+
+ g_assert (monitor_crtc_mode->crtc_mode == crtc_config->mode);
+
+ logical_monitor = meta_monitor_get_logical_monitor (monitor);
+ g_assert_nonnull (logical_monitor);
+ }
+
+
+ data->expect_crtc_mode_iter++;
+
+ return TRUE;
+}
+
+static MetaLogicalMonitor *
+logical_monitor_from_layout (MetaMonitorManager *monitor_manager,
+ MetaRectangle *layout)
+{
+ GList *l;
+
+ for (l = monitor_manager->logical_monitors; l; l = l->next)
+ {
+ MetaLogicalMonitor *logical_monitor = l->data;
+
+ if (meta_rectangle_equal (layout, &logical_monitor->rect))
+ return logical_monitor;
+ }
+
+ return NULL;
+}
+
+static void
+check_logical_monitor (MetaMonitorManager *monitor_manager,
+ MonitorTestCaseLogicalMonitor *test_logical_monitor)
+{
+ MetaLogicalMonitor *logical_monitor;
+ MetaOutput *primary_output;
+ GList *monitors;
+ GList *l;
+ int i;
+
+ logical_monitor = logical_monitor_from_layout (monitor_manager,
+ &test_logical_monitor->layout);
+ g_assert_nonnull (logical_monitor);
+
+ g_assert_cmpint (logical_monitor->rect.x,
+ ==,
+ test_logical_monitor->layout.x);
+ g_assert_cmpint (logical_monitor->rect.y,
+ ==,
+ test_logical_monitor->layout.y);
+ g_assert_cmpint (logical_monitor->rect.width,
+ ==,
+ test_logical_monitor->layout.width);
+ g_assert_cmpint (logical_monitor->rect.height,
+ ==,
+ test_logical_monitor->layout.height);
+ g_assert_cmpfloat (logical_monitor->scale,
+ ==,
+ test_logical_monitor->scale);
+ g_assert_cmpuint (logical_monitor->transform,
+ ==,
+ test_logical_monitor->transform);
+
+ if (logical_monitor == monitor_manager->primary_logical_monitor)
+ g_assert (meta_logical_monitor_is_primary (logical_monitor));
+
+ primary_output = NULL;
+ monitors = meta_logical_monitor_get_monitors (logical_monitor);
+ g_assert_cmpint ((int) g_list_length (monitors),
+ ==,
+ test_logical_monitor->n_monitors);
+
+ for (i = 0; i < test_logical_monitor->n_monitors; i++)
+ {
+ MetaMonitor *monitor =
+ g_list_nth (monitor_manager->monitors,
+ test_logical_monitor->monitors[i])->data;
+
+ g_assert_nonnull (g_list_find (monitors, monitor));
+ }
+
+ for (l = monitors; l; l = l->next)
+ {
+ MetaMonitor *monitor = l->data;
+ GList *outputs;
+ GList *l_output;
+
+ outputs = meta_monitor_get_outputs (monitor);
+ for (l_output = outputs; l_output; l_output = l_output->next)
+ {
+ MetaOutput *output = l_output->data;
+ MetaCrtc *crtc;
+
+ if (output->is_primary)
+ {
+ g_assert_null (primary_output);
+ primary_output = output;
+ }
+
+ crtc = meta_output_get_assigned_crtc (output);
+ g_assert (!crtc ||
+ meta_monitor_get_logical_monitor (monitor) == logical_monitor);
+ g_assert_cmpint (logical_monitor->is_presentation,
+ ==,
+ output->is_presentation);
+ }
+ }
+
+ if (logical_monitor == monitor_manager->primary_logical_monitor)
+ g_assert_nonnull (primary_output);
+}
+
+void
+check_monitor_configuration (MonitorTestCaseExpect *expect)
+{
+ MetaBackend *backend = meta_get_backend ();
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+ MetaMonitorManagerTest *monitor_manager_test =
+ META_MONITOR_MANAGER_TEST (monitor_manager);
+ MetaGpu *gpu = meta_backend_test_get_gpu (META_BACKEND_TEST (backend));
+ int tiled_monitor_count;
+ GList *monitors;
+ GList *crtcs;
+ int n_logical_monitors;
+ GList *l;
+ int i;
+
+ g_assert_cmpint (monitor_manager->screen_width,
+ ==,
+ expect->screen_width);
+ g_assert_cmpint (monitor_manager->screen_height,
+ ==,
+ expect->screen_height);
+ g_assert_cmpint ((int) g_list_length (meta_gpu_get_outputs (gpu)),
+ ==,
+ expect->n_outputs);
+ g_assert_cmpint ((int) g_list_length (meta_gpu_get_crtcs (gpu)),
+ ==,
+ expect->n_crtcs);
+
+ tiled_monitor_count =
+ meta_monitor_manager_test_get_tiled_monitor_count (monitor_manager_test);
+ g_assert_cmpint (tiled_monitor_count,
+ ==,
+ expect->n_tiled_monitors);
+
+ monitors = meta_monitor_manager_get_monitors (monitor_manager);
+ g_assert_cmpint ((int) g_list_length (monitors),
+ ==,
+ expect->n_monitors);
+ for (l = monitors, i = 0; l; l = l->next, i++)
+ {
+ MetaMonitor *monitor = l->data;
+ GList *outputs;
+ GList *l_output;
+ int j;
+ int width_mm, height_mm;
+ GList *modes;
+ GList *l_mode;
+ MetaMonitorMode *current_mode;
+ int expected_current_mode_index;
+ MetaMonitorMode *expected_current_mode;
+
+ outputs = meta_monitor_get_outputs (monitor);
+
+ g_assert_cmpint ((int) g_list_length (outputs),
+ ==,
+ expect->monitors[i].n_outputs);
+
+ for (l_output = outputs, j = 0; l_output; l_output = l_output->next, j++)
+ {
+ MetaOutput *output = l_output->data;
+ uint64_t winsys_id = expect->monitors[i].outputs[j];
+
+ g_assert (output == output_from_winsys_id (backend, winsys_id));
+ g_assert_cmpint (expect->monitors[i].is_underscanning,
+ ==,
+ output->is_underscanning);
+ }
+
+ meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm);
+ g_assert_cmpint (width_mm,
+ ==,
+ expect->monitors[i].width_mm);
+ g_assert_cmpint (height_mm,
+ ==,
+ expect->monitors[i].height_mm);
+
+ modes = meta_monitor_get_modes (monitor);
+ g_assert_cmpint (g_list_length (modes),
+ ==,
+ expect->monitors[i].n_modes);
+
+ for (l_mode = modes, j = 0; l_mode; l_mode = l_mode->next, j++)
+ {
+ MetaMonitorMode *mode = l_mode->data;
+ int width;
+ int height;
+ float refresh_rate;
+ MetaCrtcModeFlag flags;
+ CheckMonitorModeData data;
+
+ meta_monitor_mode_get_resolution (mode, &width, &height);
+ refresh_rate = meta_monitor_mode_get_refresh_rate (mode);
+ flags = meta_monitor_mode_get_flags (mode);
+
+ g_assert_cmpint (width,
+ ==,
+ expect->monitors[i].modes[j].width);
+ g_assert_cmpint (height,
+ ==,
+ expect->monitors[i].modes[j].height);
+ g_assert_cmpfloat (refresh_rate,
+ ==,
+ expect->monitors[i].modes[j].refresh_rate);
+ g_assert_cmpint (flags,
+ ==,
+ expect->monitors[i].modes[j].flags);
+
+ data = (CheckMonitorModeData) {
+ .backend = backend,
+ .expect_crtc_mode_iter =
+ expect->monitors[i].modes[j].crtc_modes
+ };
+ meta_monitor_mode_foreach_output (monitor, mode,
+ check_monitor_mode,
+ &data,
+ NULL);
+ }
+
+ current_mode = meta_monitor_get_current_mode (monitor);
+ expected_current_mode_index = expect->monitors[i].current_mode;
+ if (expected_current_mode_index == -1)
+ expected_current_mode = NULL;
+ else
+ expected_current_mode = g_list_nth (modes,
+ expected_current_mode_index)->data;
+
+ g_assert (current_mode == expected_current_mode);
+ if (current_mode)
+ g_assert (meta_monitor_is_active (monitor));
+ else
+ g_assert (!meta_monitor_is_active (monitor));
+
+ if (current_mode)
+ {
+ CheckMonitorModeData data;
+
+ data = (CheckMonitorModeData) {
+ .backend = backend,
+ .expect_crtc_mode_iter =
+ expect->monitors[i].modes[expected_current_mode_index].crtc_modes
+ };
+ meta_monitor_mode_foreach_output (monitor, expected_current_mode,
+ check_current_monitor_mode,
+ &data,
+ NULL);
+ }
+
+ meta_monitor_derive_current_mode (monitor);
+ g_assert (current_mode == meta_monitor_get_current_mode (monitor));
+ }
+
+ n_logical_monitors =
+ meta_monitor_manager_get_num_logical_monitors (monitor_manager);
+ g_assert_cmpint (n_logical_monitors,
+ ==,
+ expect->n_logical_monitors);
+
+ /*
+ * Check that we have a primary logical monitor (except for headless),
+ * and that the main output of the first monitor is the only output
+ * that is marked as primary (further below). Note: outputs being primary or
+ * not only matters on X11.
+ */
+ if (expect->primary_logical_monitor == -1)
+ {
+ g_assert_null (monitor_manager->primary_logical_monitor);
+ g_assert_null (monitor_manager->logical_monitors);
+ }
+ else
+ {
+ MonitorTestCaseLogicalMonitor *test_logical_monitor =
+ &expect->logical_monitors[expect->primary_logical_monitor];
+ MetaLogicalMonitor *logical_monitor;
+
+ logical_monitor =
+ logical_monitor_from_layout (monitor_manager,
+ &test_logical_monitor->layout);
+ g_assert (logical_monitor == monitor_manager->primary_logical_monitor);
+ }
+
+ for (i = 0; i < expect->n_logical_monitors; i++)
+ {
+ MonitorTestCaseLogicalMonitor *test_logical_monitor =
+ &expect->logical_monitors[i];
+
+ check_logical_monitor (monitor_manager, test_logical_monitor);
+ }
+ g_assert_cmpint (n_logical_monitors, ==, i);
+
+ crtcs = meta_gpu_get_crtcs (gpu);
+ for (l = crtcs, i = 0; l; l = l->next, i++)
+ {
+ MetaCrtc *crtc = l->data;
+ MetaCrtcConfig *crtc_config = crtc->config;
+
+ if (expect->crtcs[i].current_mode == -1)
+ {
+ g_assert_null (crtc_config);
+ }
+ else
+ {
+ MetaCrtcMode *expected_current_mode;
+
+ g_assert_nonnull (crtc_config);
+
+ expected_current_mode =
+ g_list_nth_data (meta_gpu_get_modes (gpu),
+ expect->crtcs[i].current_mode);
+ g_assert (crtc_config->mode == expected_current_mode);
+
+ g_assert_cmpuint (crtc_config->transform,
+ ==,
+ expect->crtcs[i].transform);
+
+ g_assert_cmpfloat_with_epsilon (crtc_config->layout.origin.x,
+ expect->crtcs[i].x,
+ FLT_EPSILON);
+ g_assert_cmpfloat_with_epsilon (crtc_config->layout.origin.y,
+ expect->crtcs[i].y,
+ FLT_EPSILON);
+ }
+ }
+}
+
+static void
+meta_output_test_destroy_notify (MetaOutput *output)
+{
+ g_clear_pointer (&output->driver_private, g_free);
+}
+
+MetaMonitorTestSetup *
+create_monitor_test_setup (MonitorTestCaseSetup *setup,
+ MonitorTestFlag flags)
+{
+ MetaMonitorTestSetup *test_setup;
+ int i;
+ int n_laptop_panels = 0;
+ int n_normal_panels = 0;
+ gboolean hotplug_mode_update;
+
+ if (flags & MONITOR_TEST_FLAG_NO_STORED)
+ hotplug_mode_update = TRUE;
+ else
+ hotplug_mode_update = FALSE;
+
+ test_setup = g_new0 (MetaMonitorTestSetup, 1);
+
+ test_setup->modes = NULL;
+ for (i = 0; i < setup->n_modes; i++)
+ {
+ MetaCrtcMode *mode;
+
+ mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
+ mode->mode_id = i;
+ mode->width = setup->modes[i].width;
+ mode->height = setup->modes[i].height;
+ mode->refresh_rate = setup->modes[i].refresh_rate;
+ mode->flags = setup->modes[i].flags;
+
+ test_setup->modes = g_list_append (test_setup->modes, mode);
+ }
+
+ test_setup->crtcs = NULL;
+ for (i = 0; i < setup->n_crtcs; i++)
+ {
+ MetaCrtc *crtc;
+
+ crtc = g_object_new (META_TYPE_CRTC, NULL);
+ crtc->crtc_id = i + 1;
+ crtc->all_transforms = ALL_TRANSFORMS;
+
+ test_setup->crtcs = g_list_append (test_setup->crtcs, crtc);
+ }
+
+ test_setup->outputs = NULL;
+ for (i = 0; i < setup->n_outputs; i++)
+ {
+ MetaOutput *output;
+ MetaOutputTest *output_test;
+ int crtc_index;
+ MetaCrtc *crtc;
+ int preferred_mode_index;
+ MetaCrtcMode *preferred_mode;
+ MetaCrtcMode **modes;
+ int n_modes;
+ int j;
+ MetaCrtc **possible_crtcs;
+ int n_possible_crtcs;
+ int scale;
+ gboolean is_laptop_panel;
+ const char *serial;
+
+ crtc_index = setup->outputs[i].crtc;
+ if (crtc_index == -1)
+ crtc = NULL;
+ else
+ crtc = g_list_nth_data (test_setup->crtcs, crtc_index);
+
+ preferred_mode_index = setup->outputs[i].preferred_mode;
+ if (preferred_mode_index == -1)
+ preferred_mode = NULL;
+ else
+ preferred_mode = g_list_nth_data (test_setup->modes,
+ preferred_mode_index);
+
+ n_modes = setup->outputs[i].n_modes;
+ modes = g_new0 (MetaCrtcMode *, n_modes);
+ for (j = 0; j < n_modes; j++)
+ {
+ int mode_index;
+
+ mode_index = setup->outputs[i].modes[j];
+ modes[j] = g_list_nth_data (test_setup->modes, mode_index);
+ }
+
+ n_possible_crtcs = setup->outputs[i].n_possible_crtcs;
+ possible_crtcs = g_new0 (MetaCrtc *, n_possible_crtcs);
+ for (j = 0; j < n_possible_crtcs; j++)
+ {
+ int possible_crtc_index;
+
+ possible_crtc_index = setup->outputs[i].possible_crtcs[j];
+ possible_crtcs[j] = g_list_nth_data (test_setup->crtcs,
+ possible_crtc_index);
+ }
+
+ output_test = g_new0 (MetaOutputTest, 1);
+
+ scale = setup->outputs[i].scale;
+ if (scale < 1)
+ scale = 1;
+
+ *output_test = (MetaOutputTest) {
+ .scale = scale
+ };
+
+ is_laptop_panel = setup->outputs[i].is_laptop_panel;
+
+ serial = setup->outputs[i].serial;
+ if (!serial)
+ serial = "0x123456";
+
+ output = g_object_new (META_TYPE_OUTPUT, NULL);
+
+ if (crtc)
+ meta_output_assign_crtc (output, crtc);
+ output->winsys_id = i;
+ output->name = (is_laptop_panel ? g_strdup_printf ("eDP-%d",
+ ++n_laptop_panels)
+ : g_strdup_printf ("DP-%d",
+ ++n_normal_panels));
+ output->vendor = g_strdup ("MetaProduct's Inc.");
+ output->product = g_strdup ("MetaMonitor");
+ output->serial = g_strdup (serial);
+ output->suggested_x = -1;
+ output->suggested_y = -1;
+ output->hotplug_mode_update = hotplug_mode_update;
+ output->width_mm = setup->outputs[i].width_mm;
+ output->height_mm = setup->outputs[i].height_mm;
+ output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
+ output->preferred_mode = preferred_mode;
+ output->n_modes = n_modes;
+ output->modes = modes;
+ output->n_possible_crtcs = n_possible_crtcs;
+ output->possible_crtcs = possible_crtcs;
+ output->n_possible_clones = 0;
+ output->possible_clones = NULL;
+ output->backlight = -1;
+ output->connector_type = (is_laptop_panel ? META_CONNECTOR_TYPE_eDP
+ : META_CONNECTOR_TYPE_DisplayPort);
+ output->tile_info = setup->outputs[i].tile_info;
+ output->is_underscanning = setup->outputs[i].is_underscanning;
+ output->panel_orientation_transform =
+ setup->outputs[i].panel_orientation_transform;
+ output->driver_private = output_test;
+ output->driver_notify = (GDestroyNotify) meta_output_test_destroy_notify;
+
+ test_setup->outputs = g_list_append (test_setup->outputs, output);
+ }
+
+ return test_setup;
+}
diff --git a/src/tests/monitor-test-utils.h b/src/tests/monitor-test-utils.h
index 0b0dc6d7d..e99799861 100644
--- a/src/tests/monitor-test-utils.h
+++ b/src/tests/monitor-test-utils.h
@@ -22,8 +22,182 @@
#include <glib.h>
+#include "tests/meta-monitor-manager-test.h"
+#include "backends/meta-crtc.h"
+#include "backends/meta-output.h"
+
+#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
+
+#define MAX_N_MODES 10
+#define MAX_N_OUTPUTS 10
+#define MAX_N_CRTCS 10
+#define MAX_N_MONITORS 10
+#define MAX_N_LOGICAL_MONITORS 10
+
+/*
+ * The following structures are used to define test cases.
+ *
+ * Each test case consists of a test case setup and a test case expectaction.
+ * and a expected result, consisting
+ * of an array of monitors, logical monitors and a screen size.
+ *
+ * TEST CASE SETUP:
+ *
+ * A test case setup consists of an array of modes, an array of outputs and an
+ * array of CRTCs.
+ *
+ * A mode has a width and height in pixels, and a refresh rate in updates per
+ * second.
+ *
+ * An output has an array of available modes, and a preferred mode. Modes are
+ * defined as indices into the modes array of the test case setup.
+ *
+ * It also has CRTc and an array of possible CRTCs. Crtcs are defined as indices
+ * into the CRTC array. The CRTC value -1 means no CRTC.
+ *
+ * It also has various meta data, such as physical dimension, tile info and
+ * scale.
+ *
+ * A CRTC only has a current mode. A mode is defined as an index into the modes
+ * array.
+ *
+ *
+ * TEST CASE EXPECTS:
+ *
+ * A test case expects consists of an array of monitors, an array of logical
+ * monitors, a output and crtc count, and a screen width.
+ *
+ * A monitor represents a physical monitor (such as an external monitor, or a
+ * laptop panel etc). A monitor consists of an array of outputs, defined by
+ * indices into the setup output array, an array of monitor modes, and the
+ * current mode, defined by an index into the monitor modes array, and the
+ * physical dimensions.
+ *
+ * A logical monitor represents a region of the total screen area. It contains
+ * the expected layout and a scale.
+ */
+
+typedef enum _MonitorTestFlag
+{
+ MONITOR_TEST_FLAG_NONE,
+ MONITOR_TEST_FLAG_NO_STORED
+} MonitorTestFlag;
+
+typedef struct _MonitorTestCaseMode
+{
+ int width;
+ int height;
+ float refresh_rate;
+ MetaCrtcModeFlag flags;
+} MonitorTestCaseMode;
+
+typedef struct _MonitorTestCaseOutput
+{
+ int crtc;
+ int modes[MAX_N_MODES];
+ int n_modes;
+ int preferred_mode;
+ int possible_crtcs[MAX_N_CRTCS];
+ int n_possible_crtcs;
+ int width_mm;
+ int height_mm;
+ MetaTileInfo tile_info;
+ float scale;
+ gboolean is_laptop_panel;
+ gboolean is_underscanning;
+ const char *serial;
+ MetaMonitorTransform panel_orientation_transform;
+} MonitorTestCaseOutput;
+
+typedef struct _MonitorTestCaseCrtc
+{
+ int current_mode;
+} MonitorTestCaseCrtc;
+
+typedef struct _MonitorTestCaseSetup
+{
+ MonitorTestCaseMode modes[MAX_N_MODES];
+ int n_modes;
+
+ MonitorTestCaseOutput outputs[MAX_N_OUTPUTS];
+ int n_outputs;
+
+ MonitorTestCaseCrtc crtcs[MAX_N_CRTCS];
+ int n_crtcs;
+} MonitorTestCaseSetup;
+
+typedef struct _MonitorTestCaseMonitorCrtcMode
+{
+ uint64_t output;
+ int crtc_mode;
+} MetaTestCaseMonitorCrtcMode;
+
+typedef struct _MonitorTestCaseMonitorMode
+{
+ int width;
+ int height;
+ float refresh_rate;
+ MetaCrtcModeFlag flags;
+ MetaTestCaseMonitorCrtcMode crtc_modes[MAX_N_CRTCS];
+} MetaMonitorTestCaseMonitorMode;
+
+typedef struct _MonitorTestCaseMonitor
+{
+ uint64_t outputs[MAX_N_OUTPUTS];
+ int n_outputs;
+ MetaMonitorTestCaseMonitorMode modes[MAX_N_MODES];
+ int n_modes;
+ int current_mode;
+ int width_mm;
+ int height_mm;
+ gboolean is_underscanning;
+} MonitorTestCaseMonitor;
+
+typedef struct _MonitorTestCaseLogicalMonitor
+{
+ MetaRectangle layout;
+ float scale;
+ int monitors[MAX_N_MONITORS];
+ int n_monitors;
+ MetaMonitorTransform transform;
+} MonitorTestCaseLogicalMonitor;
+
+typedef struct _MonitorTestCaseCrtcExpect
+{
+ MetaMonitorTransform transform;
+ int current_mode;
+ float x;
+ float y;
+} MonitorTestCaseCrtcExpect;
+
+typedef struct _MonitorTestCaseExpect
+{
+ MonitorTestCaseMonitor monitors[MAX_N_MONITORS];
+ int n_monitors;
+ MonitorTestCaseLogicalMonitor logical_monitors[MAX_N_LOGICAL_MONITORS];
+ int n_logical_monitors;
+ int primary_logical_monitor;
+ int n_outputs;
+ MonitorTestCaseCrtcExpect crtcs[MAX_N_CRTCS];
+ int n_crtcs;
+ int n_tiled_monitors;
+ int screen_width;
+ int screen_height;
+} MonitorTestCaseExpect;
+
+typedef struct _MonitorTestCase
+{
+ MonitorTestCaseSetup setup;
+ MonitorTestCaseExpect expect;
+} MonitorTestCase;
+
void set_custom_monitor_config (const char *filename);
char * read_file (const char *file_path);
+void check_monitor_configuration (MonitorTestCaseExpect *expect);
+
+MetaMonitorTestSetup * create_monitor_test_setup (MonitorTestCaseSetup *setup,
+ MonitorTestFlag flags);
+
#endif /* MONITOR_TEST_UTILS_H */
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index 30f2bba88..975c9970c 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -35,171 +35,6 @@
#include "tests/test-utils.h"
#include "x11/meta-x11-display-private.h"
-#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
-
-#define MAX_N_MODES 10
-#define MAX_N_OUTPUTS 10
-#define MAX_N_CRTCS 10
-#define MAX_N_MONITORS 10
-#define MAX_N_LOGICAL_MONITORS 10
-
-/*
- * The following structures are used to define test cases.
- *
- * Each test case consists of a test case setup and a test case expectaction.
- * and a expected result, consisting
- * of an array of monitors, logical monitors and a screen size.
- *
- * TEST CASE SETUP:
- *
- * A test case setup consists of an array of modes, an array of outputs and an
- * array of CRTCs.
- *
- * A mode has a width and height in pixels, and a refresh rate in updates per
- * second.
- *
- * An output has an array of available modes, and a preferred mode. Modes are
- * defined as indices into the modes array of the test case setup.
- *
- * It also has CRTc and an array of possible CRTCs. Crtcs are defined as indices
- * into the CRTC array. The CRTC value -1 means no CRTC.
- *
- * It also has various meta data, such as physical dimension, tile info and
- * scale.
- *
- * A CRTC only has a current mode. A mode is defined as an index into the modes
- * array.
- *
- *
- * TEST CASE EXPECTS:
- *
- * A test case expects consists of an array of monitors, an array of logical
- * monitors, a output and crtc count, and a screen width.
- *
- * A monitor represents a physical monitor (such as an external monitor, or a
- * laptop panel etc). A monitor consists of an array of outputs, defined by
- * indices into the setup output array, an array of monitor modes, and the
- * current mode, defined by an index into the monitor modes array, and the
- * physical dimensions.
- *
- * A logical monitor represents a region of the total screen area. It contains
- * the expected layout and a scale.
- */
-
-typedef enum _MonitorTestFlag
-{
- MONITOR_TEST_FLAG_NONE,
- MONITOR_TEST_FLAG_NO_STORED
-} MonitorTestFlag;
-
-typedef struct _MonitorTestCaseMode
-{
- int width;
- int height;
- float refresh_rate;
- MetaCrtcModeFlag flags;
-} MonitorTestCaseMode;
-
-typedef struct _MonitorTestCaseOutput
-{
- int crtc;
- int modes[MAX_N_MODES];
- int n_modes;
- int preferred_mode;
- int possible_crtcs[MAX_N_CRTCS];
- int n_possible_crtcs;
- int width_mm;
- int height_mm;
- MetaTileInfo tile_info;
- float scale;
- gboolean is_laptop_panel;
- gboolean is_underscanning;
- const char *serial;
- MetaMonitorTransform panel_orientation_transform;
-} MonitorTestCaseOutput;
-
-typedef struct _MonitorTestCaseCrtc
-{
- int current_mode;
-} MonitorTestCaseCrtc;
-
-typedef struct _MonitorTestCaseSetup
-{
- MonitorTestCaseMode modes[MAX_N_MODES];
- int n_modes;
-
- MonitorTestCaseOutput outputs[MAX_N_OUTPUTS];
- int n_outputs;
-
- MonitorTestCaseCrtc crtcs[MAX_N_CRTCS];
- int n_crtcs;
-} MonitorTestCaseSetup;
-
-typedef struct _MonitorTestCaseMonitorCrtcMode
-{
- uint64_t output;
- int crtc_mode;
-} MetaTestCaseMonitorCrtcMode;
-
-typedef struct _MonitorTestCaseMonitorMode
-{
- int width;
- int height;
- float refresh_rate;
- MetaCrtcModeFlag flags;
- MetaTestCaseMonitorCrtcMode crtc_modes[MAX_N_CRTCS];
-} MetaMonitorTestCaseMonitorMode;
-
-typedef struct _MonitorTestCaseMonitor
-{
- uint64_t outputs[MAX_N_OUTPUTS];
- int n_outputs;
- MetaMonitorTestCaseMonitorMode modes[MAX_N_MODES];
- int n_modes;
- int current_mode;
- int width_mm;
- int height_mm;
- gboolean is_underscanning;
-} MonitorTestCaseMonitor;
-
-typedef struct _MonitorTestCaseLogicalMonitor
-{
- MetaRectangle layout;
- float scale;
- int monitors[MAX_N_MONITORS];
- int n_monitors;
- MetaMonitorTransform transform;
-} MonitorTestCaseLogicalMonitor;
-
-typedef struct _MonitorTestCaseCrtcExpect
-{
- MetaMonitorTransform transform;
- int current_mode;
- float x;
- float y;
-} MonitorTestCaseCrtcExpect;
-
-typedef struct _MonitorTestCaseExpect
-{
- MonitorTestCaseMonitor monitors[MAX_N_MONITORS];
- int n_monitors;
- MonitorTestCaseLogicalMonitor logical_monitors[MAX_N_LOGICAL_MONITORS];
- int n_logical_monitors;
- int primary_logical_monitor;
- int n_outputs;
- MonitorTestCaseCrtcExpect crtcs[MAX_N_CRTCS];
- int n_crtcs;
- int n_tiled_monitors;
- int screen_width;
- int screen_height;
-} MonitorTestCaseExpect;
-
-typedef struct _MonitorTestCase
-{
- MonitorTestCaseSetup setup;
- MonitorTestCaseExpect expect;
-} MonitorTestCase;
-
static MonitorTestCase initial_test_case = {
.setup = {
.modes = {
@@ -418,603 +253,6 @@ destroy_monitor_test_clients (void)
NULL, NULL);
}
-static MetaOutput *
-output_from_winsys_id (MetaBackend *backend,
- uint64_t winsys_id)
-{
- MetaGpu *gpu = meta_backend_test_get_gpu (META_BACKEND_TEST (backend));
- GList *l;
-
- for (l = meta_gpu_get_outputs (gpu); l; l = l->next)
- {
- MetaOutput *output = l->data;
-
- if (output->winsys_id == winsys_id)
- return output;
- }
-
- return NULL;
-}
-
-typedef struct _CheckMonitorModeData
-{
- MetaBackend *backend;
- MetaTestCaseMonitorCrtcMode *expect_crtc_mode_iter;
-} CheckMonitorModeData;
-
-static gboolean
-check_monitor_mode (MetaMonitor *monitor,
- MetaMonitorMode *mode,
- MetaMonitorCrtcMode *monitor_crtc_mode,
- gpointer user_data,
- GError **error)
-{
- CheckMonitorModeData *data = user_data;
- MetaBackend *backend = data->backend;
- MetaOutput *output;
- MetaCrtcMode *crtc_mode;
- int expect_crtc_mode_index;
-
- output = output_from_winsys_id (backend,
- 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;
- }
- else
- {
- MetaGpu *gpu = meta_output_get_gpu (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;
- MetaCrtcModeFlag flags;
-
- refresh_rate = meta_monitor_mode_get_refresh_rate (mode);
- flags = meta_monitor_mode_get_flags (mode);
-
- g_assert_cmpfloat (refresh_rate, ==, crtc_mode->refresh_rate);
- g_assert_cmpint (flags, ==, (crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS));
- }
-
- data->expect_crtc_mode_iter++;
-
- return TRUE;
-}
-
-static gboolean
-check_current_monitor_mode (MetaMonitor *monitor,
- MetaMonitorMode *mode,
- MetaMonitorCrtcMode *monitor_crtc_mode,
- gpointer user_data,
- GError **error)
-{
- CheckMonitorModeData *data = user_data;
- MetaBackend *backend = data->backend;
- MetaOutput *output;
- MetaCrtc *crtc;
-
- output = output_from_winsys_id (backend,
- data->expect_crtc_mode_iter->output);
- crtc = meta_output_get_assigned_crtc (output);
-
- if (data->expect_crtc_mode_iter->crtc_mode == -1)
- {
- g_assert_null (crtc);
- }
- else
- {
- MetaCrtcConfig *crtc_config;
- MetaLogicalMonitor *logical_monitor;
-
- g_assert_nonnull (crtc);
-
- crtc_config = crtc->config;
- g_assert_nonnull (crtc_config);
-
- g_assert (monitor_crtc_mode->crtc_mode == crtc_config->mode);
-
- logical_monitor = meta_monitor_get_logical_monitor (monitor);
- g_assert_nonnull (logical_monitor);
- }
-
-
- data->expect_crtc_mode_iter++;
-
- return TRUE;
-}
-
-static MetaLogicalMonitor *
-logical_monitor_from_layout (MetaMonitorManager *monitor_manager,
- MetaRectangle *layout)
-{
- GList *l;
-
- for (l = monitor_manager->logical_monitors; l; l = l->next)
- {
- MetaLogicalMonitor *logical_monitor = l->data;
-
- if (meta_rectangle_equal (layout, &logical_monitor->rect))
- return logical_monitor;
- }
-
- return NULL;
-}
-
-static void
-check_logical_monitor (MetaMonitorManager *monitor_manager,
- MonitorTestCaseLogicalMonitor *test_logical_monitor)
-{
- MetaLogicalMonitor *logical_monitor;
- MetaOutput *primary_output;
- GList *monitors;
- GList *l;
- int i;
-
- logical_monitor = logical_monitor_from_layout (monitor_manager,
- &test_logical_monitor->layout);
- g_assert_nonnull (logical_monitor);
-
- g_assert_cmpint (logical_monitor->rect.x,
- ==,
- test_logical_monitor->layout.x);
- g_assert_cmpint (logical_monitor->rect.y,
- ==,
- test_logical_monitor->layout.y);
- g_assert_cmpint (logical_monitor->rect.width,
- ==,
- test_logical_monitor->layout.width);
- g_assert_cmpint (logical_monitor->rect.height,
- ==,
- test_logical_monitor->layout.height);
- g_assert_cmpfloat (logical_monitor->scale,
- ==,
- test_logical_monitor->scale);
- g_assert_cmpuint (logical_monitor->transform,
- ==,
- test_logical_monitor->transform);
-
- if (logical_monitor == monitor_manager->primary_logical_monitor)
- g_assert (meta_logical_monitor_is_primary (logical_monitor));
-
- primary_output = NULL;
- monitors = meta_logical_monitor_get_monitors (logical_monitor);
- g_assert_cmpint ((int) g_list_length (monitors),
- ==,
- test_logical_monitor->n_monitors);
-
- for (i = 0; i < test_logical_monitor->n_monitors; i++)
- {
- MetaMonitor *monitor =
- g_list_nth (monitor_manager->monitors,
- test_logical_monitor->monitors[i])->data;
-
- g_assert_nonnull (g_list_find (monitors, monitor));
- }
-
- for (l = monitors; l; l = l->next)
- {
- MetaMonitor *monitor = l->data;
- GList *outputs;
- GList *l_output;
-
- outputs = meta_monitor_get_outputs (monitor);
- for (l_output = outputs; l_output; l_output = l_output->next)
- {
- MetaOutput *output = l_output->data;
- MetaCrtc *crtc;
-
- if (output->is_primary)
- {
- g_assert_null (primary_output);
- primary_output = output;
- }
-
- crtc = meta_output_get_assigned_crtc (output);
- g_assert (!crtc ||
- meta_monitor_get_logical_monitor (monitor) == logical_monitor);
- g_assert_cmpint (logical_monitor->is_presentation,
- ==,
- output->is_presentation);
- }
- }
-
- if (logical_monitor == monitor_manager->primary_logical_monitor)
- g_assert_nonnull (primary_output);
-}
-
-static void
-check_monitor_configuration (MonitorTestCaseExpect *expect)
-{
- MetaBackend *backend = meta_get_backend ();
- MetaMonitorManager *monitor_manager =
- meta_backend_get_monitor_manager (backend);
- MetaMonitorManagerTest *monitor_manager_test =
- META_MONITOR_MANAGER_TEST (monitor_manager);
- MetaGpu *gpu = meta_backend_test_get_gpu (META_BACKEND_TEST (backend));
- int tiled_monitor_count;
- GList *monitors;
- GList *crtcs;
- int n_logical_monitors;
- GList *l;
- int i;
-
- g_assert_cmpint (monitor_manager->screen_width,
- ==,
- expect->screen_width);
- g_assert_cmpint (monitor_manager->screen_height,
- ==,
- expect->screen_height);
- g_assert_cmpint ((int) g_list_length (meta_gpu_get_outputs (gpu)),
- ==,
- expect->n_outputs);
- g_assert_cmpint ((int) g_list_length (meta_gpu_get_crtcs (gpu)),
- ==,
- expect->n_crtcs);
-
- tiled_monitor_count =
- meta_monitor_manager_test_get_tiled_monitor_count (monitor_manager_test);
- g_assert_cmpint (tiled_monitor_count,
- ==,
- expect->n_tiled_monitors);
-
- monitors = meta_monitor_manager_get_monitors (monitor_manager);
- g_assert_cmpint ((int) g_list_length (monitors),
- ==,
- expect->n_monitors);
- for (l = monitors, i = 0; l; l = l->next, i++)
- {
- MetaMonitor *monitor = l->data;
- GList *outputs;
- GList *l_output;
- int j;
- int width_mm, height_mm;
- GList *modes;
- GList *l_mode;
- MetaMonitorMode *current_mode;
- int expected_current_mode_index;
- MetaMonitorMode *expected_current_mode;
-
- outputs = meta_monitor_get_outputs (monitor);
-
- g_assert_cmpint ((int) g_list_length (outputs),
- ==,
- expect->monitors[i].n_outputs);
-
- for (l_output = outputs, j = 0; l_output; l_output = l_output->next, j++)
- {
- MetaOutput *output = l_output->data;
- uint64_t winsys_id = expect->monitors[i].outputs[j];
-
- g_assert (output == output_from_winsys_id (backend, winsys_id));
- g_assert_cmpint (expect->monitors[i].is_underscanning,
- ==,
- output->is_underscanning);
- }
-
- meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm);
- g_assert_cmpint (width_mm,
- ==,
- expect->monitors[i].width_mm);
- g_assert_cmpint (height_mm,
- ==,
- expect->monitors[i].height_mm);
-
- modes = meta_monitor_get_modes (monitor);
- g_assert_cmpint (g_list_length (modes),
- ==,
- expect->monitors[i].n_modes);
-
- for (l_mode = modes, j = 0; l_mode; l_mode = l_mode->next, j++)
- {
- MetaMonitorMode *mode = l_mode->data;
- int width;
- int height;
- float refresh_rate;
- MetaCrtcModeFlag flags;
- CheckMonitorModeData data;
-
- meta_monitor_mode_get_resolution (mode, &width, &height);
- refresh_rate = meta_monitor_mode_get_refresh_rate (mode);
- flags = meta_monitor_mode_get_flags (mode);
-
- g_assert_cmpint (width,
- ==,
- expect->monitors[i].modes[j].width);
- g_assert_cmpint (height,
- ==,
- expect->monitors[i].modes[j].height);
- g_assert_cmpfloat (refresh_rate,
- ==,
- expect->monitors[i].modes[j].refresh_rate);
- g_assert_cmpint (flags,
- ==,
- expect->monitors[i].modes[j].flags);
-
- data = (CheckMonitorModeData) {
- .backend = backend,
- .expect_crtc_mode_iter =
- expect->monitors[i].modes[j].crtc_modes
- };
- meta_monitor_mode_foreach_output (monitor, mode,
- check_monitor_mode,
- &data,
- NULL);
- }
-
- current_mode = meta_monitor_get_current_mode (monitor);
- expected_current_mode_index = expect->monitors[i].current_mode;
- if (expected_current_mode_index == -1)
- expected_current_mode = NULL;
- else
- expected_current_mode = g_list_nth (modes,
- expected_current_mode_index)->data;
-
- g_assert (current_mode == expected_current_mode);
- if (current_mode)
- g_assert (meta_monitor_is_active (monitor));
- else
- g_assert (!meta_monitor_is_active (monitor));
-
- if (current_mode)
- {
- CheckMonitorModeData data;
-
- data = (CheckMonitorModeData) {
- .backend = backend,
- .expect_crtc_mode_iter =
- expect->monitors[i].modes[expected_current_mode_index].crtc_modes
- };
- meta_monitor_mode_foreach_output (monitor, expected_current_mode,
- check_current_monitor_mode,
- &data,
- NULL);
- }
-
- meta_monitor_derive_current_mode (monitor);
- g_assert (current_mode == meta_monitor_get_current_mode (monitor));
- }
-
- n_logical_monitors =
- meta_monitor_manager_get_num_logical_monitors (monitor_manager);
- g_assert_cmpint (n_logical_monitors,
- ==,
- expect->n_logical_monitors);
-
- /*
- * Check that we have a primary logical monitor (except for headless),
- * and that the main output of the first monitor is the only output
- * that is marked as primary (further below). Note: outputs being primary or
- * not only matters on X11.
- */
- if (expect->primary_logical_monitor == -1)
- {
- g_assert_null (monitor_manager->primary_logical_monitor);
- g_assert_null (monitor_manager->logical_monitors);
- }
- else
- {
- MonitorTestCaseLogicalMonitor *test_logical_monitor =
- &expect->logical_monitors[expect->primary_logical_monitor];
- MetaLogicalMonitor *logical_monitor;
-
- logical_monitor =
- logical_monitor_from_layout (monitor_manager,
- &test_logical_monitor->layout);
- g_assert (logical_monitor == monitor_manager->primary_logical_monitor);
- }
-
- for (i = 0; i < expect->n_logical_monitors; i++)
- {
- MonitorTestCaseLogicalMonitor *test_logical_monitor =
- &expect->logical_monitors[i];
-
- check_logical_monitor (monitor_manager, test_logical_monitor);
- }
- g_assert_cmpint (n_logical_monitors, ==, i);
-
- crtcs = meta_gpu_get_crtcs (gpu);
- for (l = crtcs, i = 0; l; l = l->next, i++)
- {
- MetaCrtc *crtc = l->data;
- MetaCrtcConfig *crtc_config = crtc->config;
-
- if (expect->crtcs[i].current_mode == -1)
- {
- g_assert_null (crtc_config);
- }
- else
- {
- MetaCrtcMode *expected_current_mode;
-
- g_assert_nonnull (crtc_config);
-
- expected_current_mode =
- g_list_nth_data (meta_gpu_get_modes (gpu),
- expect->crtcs[i].current_mode);
- g_assert (crtc_config->mode == expected_current_mode);
-
- g_assert_cmpuint (crtc_config->transform,
- ==,
- expect->crtcs[i].transform);
-
- g_assert_cmpfloat_with_epsilon (crtc_config->layout.origin.x,
- expect->crtcs[i].x,
- FLT_EPSILON);
- g_assert_cmpfloat_with_epsilon (crtc_config->layout.origin.y,
- expect->crtcs[i].y,
- FLT_EPSILON);
- }
- }
-}
-
-static void
-meta_output_test_destroy_notify (MetaOutput *output)
-{
- g_clear_pointer (&output->driver_private, g_free);
-}
-
-static MetaMonitorTestSetup *
-create_monitor_test_setup (MonitorTestCaseSetup *setup,
- MonitorTestFlag flags)
-{
- MetaMonitorTestSetup *test_setup;
- int i;
- int n_laptop_panels = 0;
- int n_normal_panels = 0;
- gboolean hotplug_mode_update;
-
- if (flags & MONITOR_TEST_FLAG_NO_STORED)
- hotplug_mode_update = TRUE;
- else
- hotplug_mode_update = FALSE;
-
- test_setup = g_new0 (MetaMonitorTestSetup, 1);
-
- test_setup->modes = NULL;
- for (i = 0; i < setup->n_modes; i++)
- {
- MetaCrtcMode *mode;
-
- mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
- mode->mode_id = i;
- mode->width = setup->modes[i].width;
- mode->height = setup->modes[i].height;
- mode->refresh_rate = setup->modes[i].refresh_rate;
- mode->flags = setup->modes[i].flags;
-
- test_setup->modes = g_list_append (test_setup->modes, mode);
- }
-
- test_setup->crtcs = NULL;
- for (i = 0; i < setup->n_crtcs; i++)
- {
- MetaCrtc *crtc;
-
- crtc = g_object_new (META_TYPE_CRTC, NULL);
- crtc->crtc_id = i + 1;
- crtc->all_transforms = ALL_TRANSFORMS;
-
- test_setup->crtcs = g_list_append (test_setup->crtcs, crtc);
- }
-
- test_setup->outputs = NULL;
- for (i = 0; i < setup->n_outputs; i++)
- {
- MetaOutput *output;
- MetaOutputTest *output_test;
- int crtc_index;
- MetaCrtc *crtc;
- int preferred_mode_index;
- MetaCrtcMode *preferred_mode;
- MetaCrtcMode **modes;
- int n_modes;
- int j;
- MetaCrtc **possible_crtcs;
- int n_possible_crtcs;
- int scale;
- gboolean is_laptop_panel;
- const char *serial;
-
- crtc_index = setup->outputs[i].crtc;
- if (crtc_index == -1)
- crtc = NULL;
- else
- crtc = g_list_nth_data (test_setup->crtcs, crtc_index);
-
- preferred_mode_index = setup->outputs[i].preferred_mode;
- if (preferred_mode_index == -1)
- preferred_mode = NULL;
- else
- preferred_mode = g_list_nth_data (test_setup->modes,
- preferred_mode_index);
-
- n_modes = setup->outputs[i].n_modes;
- modes = g_new0 (MetaCrtcMode *, n_modes);
- for (j = 0; j < n_modes; j++)
- {
- int mode_index;
-
- mode_index = setup->outputs[i].modes[j];
- modes[j] = g_list_nth_data (test_setup->modes, mode_index);
- }
-
- n_possible_crtcs = setup->outputs[i].n_possible_crtcs;
- possible_crtcs = g_new0 (MetaCrtc *, n_possible_crtcs);
- for (j = 0; j < n_possible_crtcs; j++)
- {
- int possible_crtc_index;
-
- possible_crtc_index = setup->outputs[i].possible_crtcs[j];
- possible_crtcs[j] = g_list_nth_data (test_setup->crtcs,
- possible_crtc_index);
- }
-
- output_test = g_new0 (MetaOutputTest, 1);
-
- scale = setup->outputs[i].scale;
- if (scale < 1)
- scale = 1;
-
- *output_test = (MetaOutputTest) {
- .scale = scale
- };
-
- is_laptop_panel = setup->outputs[i].is_laptop_panel;
-
- serial = setup->outputs[i].serial;
- if (!serial)
- serial = "0x123456";
-
- output = g_object_new (META_TYPE_OUTPUT, NULL);
-
- if (crtc)
- meta_output_assign_crtc (output, crtc);
- output->winsys_id = i;
- output->name = (is_laptop_panel ? g_strdup_printf ("eDP-%d",
- ++n_laptop_panels)
- : g_strdup_printf ("DP-%d",
- ++n_normal_panels));
- output->vendor = g_strdup ("MetaProduct's Inc.");
- output->product = g_strdup ("MetaMonitor");
- output->serial = g_strdup (serial);
- output->suggested_x = -1;
- output->suggested_y = -1;
- output->hotplug_mode_update = hotplug_mode_update;
- output->width_mm = setup->outputs[i].width_mm;
- output->height_mm = setup->outputs[i].height_mm;
- output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
- output->preferred_mode = preferred_mode;
- output->n_modes = n_modes;
- output->modes = modes;
- output->n_possible_crtcs = n_possible_crtcs;
- output->possible_crtcs = possible_crtcs;
- output->n_possible_clones = 0;
- output->possible_clones = NULL;
- output->backlight = -1;
- output->connector_type = (is_laptop_panel ? META_CONNECTOR_TYPE_eDP
- : META_CONNECTOR_TYPE_DisplayPort);
- output->tile_info = setup->outputs[i].tile_info;
- output->is_underscanning = setup->outputs[i].is_underscanning;
- output->panel_orientation_transform =
- setup->outputs[i].panel_orientation_transform;
- output->driver_private = output_test;
- output->driver_notify = (GDestroyNotify) meta_output_test_destroy_notify;
-
- test_setup->outputs = g_list_append (test_setup->outputs, output);
- }
-
- return test_setup;
-}
-
static void
meta_test_monitor_initial_linear_config (void)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]