[mutter] backend/native: Add tests for refresh rate calculation



commit a6df6796ddc31a8e3093d327923a88e78222232b
Author: Akihiko Odaki <akihiko odaki gmail com>
Date:   Fri Feb 26 20:16:23 2021 +0900

    backend/native: Add tests for refresh rate calculation
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1737>

 src/backends/native/meta-kms-utils.h |   3 +
 src/tests/kms-utils-unit-tests.c     | 145 +++++++++++++++++++++++++++++++++++
 src/tests/kms-utils-unit-tests.h     |  23 ++++++
 src/tests/meson.build                |   2 +
 src/tests/unit-tests.c               |   2 +
 5 files changed, 175 insertions(+)
---
diff --git a/src/backends/native/meta-kms-utils.h b/src/backends/native/meta-kms-utils.h
index 7a2fdfd790..c22ceaaa0f 100644
--- a/src/backends/native/meta-kms-utils.h
+++ b/src/backends/native/meta-kms-utils.h
@@ -24,11 +24,14 @@
 #include <stdint.h>
 #include <xf86drmMode.h>
 
+#include "core/util-private.h"
+
 typedef struct _MetaDrmFormatBuf
 {
   char s[5];
 } MetaDrmFormatBuf;
 
+META_EXPORT_TEST
 float meta_calculate_drm_mode_refresh_rate (const drmModeModeInfo *drm_mode);
 
 const char * meta_drm_format_to_string (MetaDrmFormatBuf *tmp,
diff --git a/src/tests/kms-utils-unit-tests.c b/src/tests/kms-utils-unit-tests.c
new file mode 100644
index 0000000000..743d46e0eb
--- /dev/null
+++ b/src/tests/kms-utils-unit-tests.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2021 Akihiko Odaki <akihiko odaki gmail com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "config.h"
+
+#include "tests/kms-utils-unit-tests.h"
+
+#include "tests/test-utils.h"
+#include "backends/native/meta-kms-utils.h"
+
+typedef struct {
+  drmModeModeInfo drm_mode;
+  float expected_refresh_rate;
+} ModeInfoTestCase;
+
+static const ModeInfoTestCase test_cases[] = {
+  /* "cvt 640 480" */
+  {
+    .drm_mode = {
+      .clock = 23975,
+      .hdisplay = 640,
+      .hsync_start = 664,
+      .hsync_end = 720,
+      .htotal = 800,
+      .vdisplay = 480,
+      .vsync_start = 483,
+      .vsync_end = 487,
+      .vtotal = 500,
+      .vscan = 0,
+      .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC,
+    },
+    .expected_refresh_rate = 59.9375,
+  },
+
+  /* "cvt 640 480" with htotal 0 */
+  {
+    .drm_mode = {
+       .clock = 23975,
+       .hdisplay = 640,
+       .hsync_start = 664,
+       .hsync_end = 720,
+       .htotal = 0,
+       .vdisplay = 480,
+       .vsync_start = 483,
+       .vsync_end = 487,
+       .vtotal = 500,
+       .vscan = 0,
+       .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC,
+    },
+    .expected_refresh_rate = 0.0,
+  },
+
+  /* "cvt 640 480" with vtotal 0 */
+  {
+    .drm_mode = {
+      .clock = 23975,
+      .hdisplay = 640,
+      .hsync_start = 664,
+      .hsync_end = 720,
+      .htotal = 800,
+      .vdisplay = 480,
+      .vsync_start = 483,
+      .vsync_end = 487,
+      .vtotal = 0,
+      .vscan = 0,
+      .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC,
+    },
+    .expected_refresh_rate = 0.0,
+  },
+
+  /* "cvt 320 240" with doubled clock and vscan 2 */
+  {
+    .drm_mode = {
+      .clock = 12062,
+      .hdisplay = 320,
+      .hsync_start = 336,
+      .hsync_end = 360,
+      .htotal = 400,
+      .vdisplay = 240,
+      .vsync_start = 243,
+      .vsync_end = 247,
+      .vtotal = 252,
+      .vscan = 2,
+      .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC,
+    },
+    .expected_refresh_rate = 59.8313,
+  },
+
+  /* "cvt 15360 8640 180" */
+  {
+    .drm_mode = {
+      .clock = 37793603,
+      .hdisplay = 15360,
+      .hsync_start = 16880,
+      .hsync_end = 18624,
+      .htotal = 21888,
+      .vdisplay = 8640,
+      .vsync_start = 8643,
+      .vsync_end = 8648,
+      .vtotal = 9593,
+      .vscan = 0,
+      .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC,
+    },
+    .expected_refresh_rate = 179.9939,
+  },
+};
+
+static void
+refresh_rate (void)
+{
+  size_t index;
+
+  for (index = 0; index < G_N_ELEMENTS(test_cases); index++)
+    {
+      const ModeInfoTestCase *test_case = test_cases + index;
+      float refresh_rate;
+
+      refresh_rate =
+        meta_calculate_drm_mode_refresh_rate (&test_case->drm_mode);
+      g_assert_cmpfloat_with_epsilon (refresh_rate,
+                                      test_case->expected_refresh_rate,
+                                      0.0001);
+    }
+}
+
+void
+init_kms_utils_tests (void)
+{
+  g_test_add_func ("/kms-utils/refresh-rate", refresh_rate);
+}
diff --git a/src/tests/kms-utils-unit-tests.h b/src/tests/kms-utils-unit-tests.h
new file mode 100644
index 0000000000..e85fd87fe0
--- /dev/null
+++ b/src/tests/kms-utils-unit-tests.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2021 Akihiko Odaki <akihiko odaki gmail com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KMS_UTILS_UNIT_TESTS_H
+#define KMS_UTILS_UNIT_TESTS_H
+
+void init_kms_utils_tests (void);
+
+#endif /* KMS_UTILS_UNIT_TESTS_H */
diff --git a/src/tests/meson.build b/src/tests/meson.build
index f63e28952c..05c6aaf701 100644
--- a/src/tests/meson.build
+++ b/src/tests/meson.build
@@ -76,6 +76,8 @@ unit_tests = executable('mutter-test-unit-tests',
     'unit-tests.c',
     'boxes-tests.c',
     'boxes-tests.h',
+    'kms-utils-unit-tests.c',
+    'kms-utils-unit-tests.h',
     'meta-backend-test.c',
     'meta-backend-test.h',
     'meta-gpu-test.c',
diff --git a/src/tests/unit-tests.c b/src/tests/unit-tests.c
index 464fd769b3..0ec709c1f4 100644
--- a/src/tests/unit-tests.c
+++ b/src/tests/unit-tests.c
@@ -29,6 +29,7 @@
 #include "core/boxes-private.h"
 #include "core/main-private.h"
 #include "tests/boxes-tests.h"
+#include "tests/kms-utils-unit-tests.h"
 #include "tests/meta-backend-test.h"
 #include "tests/monitor-config-migration-unit-tests.h"
 #include "tests/monitor-unit-tests.h"
@@ -250,6 +251,7 @@ init_tests (int argc, char **argv)
 
   g_test_add_func ("/core/boxes/adjacent-to", meta_test_adjacent_to);
 
+  init_kms_utils_tests ();
   init_monitor_store_tests ();
   init_monitor_config_migration_tests ();
   init_monitor_tests ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]