feat(artemis): native test lane at 120 Hz and VRR (#14523) 37aef8611c
* feat(artemis): native test lane at 120 Hz and VRR

* fix(artemis): refresh keeps the present mode's pacing, timing only on Artemis, no blocking refresh probe and no leaks

* chore(artemis): the tool wiring filters name both lanes

Co-authored-by: Luigi Rosso <luigi-rosso@users.noreply.github.com>
diff --git a/.rive_head b/.rive_head
index 719658c..aabac70 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-bd0142048bde516d4d6be3468b5971e0b1ff731e
+37aef8611c6082c822b133243b7ef34a2feeea88
diff --git a/tests/common/testing_window.hpp b/tests/common/testing_window.hpp
index e18b122..7aa6c31 100644
--- a/tests/common/testing_window.hpp
+++ b/tests/common/testing_window.hpp
@@ -151,6 +151,16 @@
             immediate,
         };
         PresentMode presentMode = PresentMode::fifo;
+
+        // The display refresh a window asks for where the platform lets it
+        // choose; others keep their default.
+        enum class Refresh
+        {
+            fixed60,
+            fixed120,
+            variable,
+        };
+        Refresh refresh = Refresh::fixed60;
     };
 
     enum class Visibility
diff --git a/tests/player/player.cpp b/tests/player/player.cpp
index 80df1aa..299dc39 100644
--- a/tests/player/player.cpp
+++ b/tests/player/player.cpp
@@ -282,6 +282,7 @@
     bool onlyUbershaders = false;
     // Applied after parsing, since --backend resets the backend params.
     std::optional<TestingWindow::BackendParams::PresentMode> presentMode;
+    std::optional<TestingWindow::BackendParams::Refresh> refresh;
 
     for (int i = 1; i < argc; ++i)
     {
@@ -334,6 +335,30 @@
                     : strcmp(fit, "fill") == 0  ? rive::Fit::fill
                                                 : rive::Fit::contain;
         }
+        else if (strcmp(argv[i], "--refresh") == 0 && i + 1 < argc)
+        {
+            using RR = TestingWindow::BackendParams::Refresh;
+            const char* rate = argv[++i];
+            if (strcmp(rate, "60") == 0)
+            {
+                refresh = RR::fixed60;
+            }
+            else if (strcmp(rate, "120") == 0)
+            {
+                refresh = RR::fixed120;
+            }
+            else if (strcmp(rate, "vrr") == 0)
+            {
+                refresh = RR::variable;
+            }
+            else
+            {
+                fprintf(stderr,
+                        "--refresh must be 60, 120 or vrr, not %s\n",
+                        rate);
+                abort();
+            }
+        }
         else if (strcmp(argv[i], "--present") == 0 && i + 1 < argc)
         {
             using PM = TestingWindow::BackendParams::PresentMode;
@@ -406,6 +431,10 @@
     {
         options.backendParams.presentMode = *presentMode;
     }
+    if (refresh)
+    {
+        options.backendParams.refresh = *refresh;
+    }
     if (onlyUbershaders)
     {
         options.backendParams.shaderCompilationMode =