From e496ed0a6b6c467ac01e33fa14e05dc2e0888a74 Mon Sep 17 00:00:00 2001
From: Kyle Gospodnetich <me@kylegospodneti.ch>
Date: Wed, 31 Jan 2024 17:22:32 -0800
Subject: [PATCH 1/4] Revert "xwayland: add support for wp-tearing-control-v1"

This reverts commit 1ce2025822244c85826ab36febfa5945186b4a2a.
---
 hw/xwayland/meson.build        |  3 ---
 hw/xwayland/xwayland-present.c | 21 +++------------------
 hw/xwayland/xwayland-present.h |  1 -
 hw/xwayland/xwayland-screen.c  |  5 -----
 hw/xwayland/xwayland-screen.h  |  1 -
 hw/xwayland/xwayland-window.c  |  9 ---------
 hw/xwayland/xwayland-window.h  |  1 -
 7 files changed, 3 insertions(+), 38 deletions(-)

diff --git a/hw/xwayland/meson.build b/hw/xwayland/meson.build
index 54529b64e..fbdbb2458 100644
--- a/hw/xwayland/meson.build
+++ b/hw/xwayland/meson.build
@@ -48,7 +48,6 @@ xdg_shell_xml = join_paths(protodir, 'stable', 'xdg-shell', 'xdg-shell.xml')
 drm_lease_xml = join_paths(protodir, 'staging', 'drm-lease', 'drm-lease-v1.xml')
 shortcuts_inhibit_xml = join_paths(protodir, 'unstable', 'keyboard-shortcuts-inhibit', 'keyboard-shortcuts-inhibit-unstable-v1.xml')
 xwayland_shell_xml = join_paths(protodir, 'staging', 'xwayland-shell', 'xwayland-shell-v1.xml')
-tearing_xml = join_paths(protodir, 'staging', 'tearing-control', 'tearing-control-v1.xml')
 
 client_header = generator(scanner,
     output : '@BASENAME@-client-protocol.h',
@@ -77,7 +76,6 @@ srcs += client_header.process(xdg_shell_xml)
 srcs += client_header.process(drm_lease_xml)
 srcs += client_header.process(shortcuts_inhibit_xml)
 srcs += client_header.process(xwayland_shell_xml)
-srcs += client_header.process(tearing_xml)
 srcs += code.process(relative_xml)
 srcs += code.process(pointer_xml)
 srcs += code.process(gestures_xml)
@@ -90,7 +88,6 @@ srcs += code.process(xdg_shell_xml)
 srcs += code.process(drm_lease_xml)
 srcs += code.process(shortcuts_inhibit_xml)
 srcs += code.process(xwayland_shell_xml)
-srcs += code.process(tearing_xml)
 
 if build_ei
     xwayland_dep += libei_dep
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
index 941be06da..bb3310dc9 100644
--- a/hw/xwayland/xwayland-present.c
+++ b/hw/xwayland/xwayland-present.c
@@ -34,9 +34,8 @@
 #include "xwayland-pixmap.h"
 #include "glamor.h"
 
-#include "tearing-control-v1-client-protocol.h"
 
-#define XWL_PRESENT_CAPS PresentCapabilityAsync | PresentCapabilityAsyncMayTear
+#define XWL_PRESENT_CAPS PresentCapabilityAsync
 
 
 /*
@@ -797,16 +796,6 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage)
                        damage_box->x2 - damage_box->x1,
                        damage_box->y2 - damage_box->y1);
 
-    if (xwl_window->tearing_control) {
-        uint32_t hint;
-        if (event->async_may_tear)
-            hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC;
-        else
-            hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_VSYNC;
-
-        wp_tearing_control_v1_set_presentation_hint(xwl_window->tearing_control, hint);
-    }
-
     wl_surface_commit(xwl_window->surface);
 
     if (!vblank->sync_flip) {
@@ -1010,15 +999,11 @@ xwl_present_pixmap(WindowPtr window,
     }
 
     vblank->event_id = ++xwl_present_event_id;
-    event->async_may_tear = options & PresentOptionAsyncMayTear;
 
-    /* Synchronous Xwayland presentations always complete (at least) one frame after they
+    /* Xwayland presentations always complete (at least) one frame after they
      * are executed
      */
-    if (event->async_may_tear)
-        vblank->exec_msc = vblank->target_msc;
-    else
-        vblank->exec_msc = vblank->target_msc - 1;
+    vblank->exec_msc = vblank->target_msc - 1;
 
     vblank->queued = TRUE;
     if (crtc_msc < vblank->exec_msc) {
diff --git a/hw/xwayland/xwayland-present.h b/hw/xwayland/xwayland-present.h
index 4fd1e579f..806272089 100644
--- a/hw/xwayland/xwayland-present.h
+++ b/hw/xwayland/xwayland-present.h
@@ -59,7 +59,6 @@ struct xwl_present_event {
     present_vblank_rec vblank;
 
     PixmapPtr pixmap;
-    Bool async_may_tear;
 };
 
 Bool xwl_present_entered_for_each_frame_callback(void);
diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c
index cc14e0771..2bc553b50 100644
--- a/hw/xwayland/xwayland-screen.c
+++ b/hw/xwayland/xwayland-screen.c
@@ -63,7 +63,6 @@
 #include "viewporter-client-protocol.h"
 #include "xdg-shell-client-protocol.h"
 #include "xwayland-shell-v1-client-protocol.h"
-#include "tearing-control-v1-client-protocol.h"
 
 static DevPrivateKeyRec xwl_screen_private_key;
 static DevPrivateKeyRec xwl_client_private_key;
@@ -462,10 +461,6 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id,
         xwl_screen->xwayland_shell =
             wl_registry_bind(registry, id, &xwayland_shell_v1_interface, 1);
     }
-    else if (strcmp(interface, "wp_tearing_control_manager_v1") == 0) {
-        xwl_screen->tearing_control_manager =
-            wl_registry_bind(registry, id, &wp_tearing_control_manager_v1_interface, 1);
-    }
 #ifdef XWL_HAS_GLAMOR
     else if (xwl_screen->glamor) {
         xwl_glamor_init_wl_registry(xwl_screen, registry, id, interface,
diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h
index bd66dd681..656d2afde 100644
--- a/hw/xwayland/xwayland-screen.h
+++ b/hw/xwayland/xwayland-screen.h
@@ -110,7 +110,6 @@ struct xwl_screen {
     struct zxdg_output_manager_v1 *xdg_output_manager;
     struct wp_viewporter *viewporter;
     struct xwayland_shell_v1 *xwayland_shell;
-    struct wp_tearing_control_manager_v1 *tearing_control_manager;
     struct xorg_list drm_lease_devices;
     struct xorg_list queued_drm_lease_devices;
     struct xorg_list drm_leases;
diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c
index 4978f37c7..b018d9656 100644
--- a/hw/xwayland/xwayland-window.c
+++ b/hw/xwayland/xwayland-window.c
@@ -46,7 +46,6 @@
 #include "xwayland-shm.h"
 
 #include "linux-dmabuf-unstable-v1-client-protocol.h"
-#include "tearing-control-v1-client-protocol.h"
 #include "viewporter-client-protocol.h"
 #include "xdg-shell-client-protocol.h"
 #include "xwayland-shell-v1-client-protocol.h"
@@ -967,11 +966,6 @@ ensure_surface_for_window(WindowPtr window)
         xwl_window_check_resolution_change_emulation(xwl_window);
     }
 
-    if (xwl_screen->tearing_control_manager) {
-        xwl_window->tearing_control = wp_tearing_control_manager_v1_get_tearing_control(
-            xwl_screen->tearing_control_manager, xwl_window->surface);
-    }
-
     return TRUE;
 
 err:
@@ -1182,9 +1176,6 @@ xwl_unrealize_window(WindowPtr window)
         xwl_present_for_each_frame_callback(xwl_window, xwl_present_unrealize_window);
 #endif
 
-    if (xwl_window->tearing_control)
-        wp_tearing_control_v1_destroy(xwl_window->tearing_control);
-
     release_wl_surface_for_window(xwl_window);
     xorg_list_del(&xwl_window->link_damage);
     xorg_list_del(&xwl_window->link_window);
diff --git a/hw/xwayland/xwayland-window.h b/hw/xwayland/xwayland-window.h
index 7fbb2a623..f8200d537 100644
--- a/hw/xwayland/xwayland-window.h
+++ b/hw/xwayland/xwayland-window.h
@@ -121,7 +121,6 @@ struct xwl_window {
     struct xwl_dmabuf_feedback feedback;
     /* If TRUE, the window buffer format supports scanout with implicit modifier */
     Bool has_implicit_scanout_support;
-    struct wp_tearing_control_v1 *tearing_control;
 };
 
 struct xwl_window *xwl_window_get(WindowPtr window);
-- 
2.42.0


From 01a8a454f04dca944db446815f28bf46f8f822b6 Mon Sep 17 00:00:00 2001
From: Joshua Ashton <joshua@froggi.es>
Date: Wed, 24 Aug 2022 23:16:24 +0000
Subject: [PATCH 2/4] xwayland: Implement tearing protocol

---
 hw/xwayland/meson.build                       |   3 +
 .../tearing-control-unstable-v1.xml           | 142 ++++++++++++++++++
 hw/xwayland/xwayland-present.c                |  11 ++
 hw/xwayland/xwayland-screen.c                 |   4 +
 hw/xwayland/xwayland-screen.h                 |   1 +
 hw/xwayland/xwayland-window.c                 |  11 ++
 hw/xwayland/xwayland-window.h                 |   1 +
 7 files changed, 173 insertions(+)
 create mode 100644 hw/xwayland/protocols/unstable/tearing-control/tearing-control-unstable-v1.xml

diff --git a/hw/xwayland/meson.build b/hw/xwayland/meson.build
index fbdbb2458..d29e55d7d 100644
--- a/hw/xwayland/meson.build
+++ b/hw/xwayland/meson.build
@@ -46,6 +46,7 @@ dmabuf_xml = join_paths(protodir, 'unstable', 'linux-dmabuf', 'linux-dmabuf-unst
 viewporter_xml = join_paths(protodir, 'stable', 'viewporter', 'viewporter.xml')
 xdg_shell_xml = join_paths(protodir, 'stable', 'xdg-shell', 'xdg-shell.xml')
 drm_lease_xml = join_paths(protodir, 'staging', 'drm-lease', 'drm-lease-v1.xml')
+tearing_xml = join_paths('protocols', 'unstable', 'tearing-control', 'tearing-control-unstable-v1.xml')
 shortcuts_inhibit_xml = join_paths(protodir, 'unstable', 'keyboard-shortcuts-inhibit', 'keyboard-shortcuts-inhibit-unstable-v1.xml')
 xwayland_shell_xml = join_paths(protodir, 'staging', 'xwayland-shell', 'xwayland-shell-v1.xml')
 
@@ -74,6 +75,7 @@ srcs += client_header.process(dmabuf_xml)
 srcs += client_header.process(viewporter_xml)
 srcs += client_header.process(xdg_shell_xml)
 srcs += client_header.process(drm_lease_xml)
+srcs += client_header.process(tearing_xml)
 srcs += client_header.process(shortcuts_inhibit_xml)
 srcs += client_header.process(xwayland_shell_xml)
 srcs += code.process(relative_xml)
@@ -86,6 +88,7 @@ srcs += code.process(dmabuf_xml)
 srcs += code.process(viewporter_xml)
 srcs += code.process(xdg_shell_xml)
 srcs += code.process(drm_lease_xml)
+srcs += code.process(tearing_xml)
 srcs += code.process(shortcuts_inhibit_xml)
 srcs += code.process(xwayland_shell_xml)
 
diff --git a/hw/xwayland/protocols/unstable/tearing-control/tearing-control-unstable-v1.xml b/hw/xwayland/protocols/unstable/tearing-control/tearing-control-unstable-v1.xml
new file mode 100644
index 000000000..ce130718e
--- /dev/null
+++ b/hw/xwayland/protocols/unstable/tearing-control/tearing-control-unstable-v1.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<protocol name="zwp_tearing_control_unstable_v1">
+
+  <copyright>
+    Copyright © 2021 Xaver Hugl
+
+    Permission is hereby granted, free of charge, to any person obtaining a
+    copy of this software and associated documentation files (the "Software"),
+    to deal in the Software without restriction, including without limitation
+    the rights to use, copy, modify, merge, publish, distribute, sublicense,
+    and/or sell copies of the Software, and to permit persons to whom the
+    Software is furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice (including the next
+    paragraph) shall be included in all copies or substantial portions of the
+    Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+    DEALINGS IN THE SOFTWARE.
+  </copyright>
+
+  <interface name="zwp_tearing_control_v1" version="1">
+    <description summary="protocol for tearing control">
+      This global is a factory interface, allowing clients to request
+      the compositor to use asynchronous page flips on a per-surface basis.
+
+      Graphics APIs, like EGL or Vulkan, that manage the buffer queue and
+      commits of a wl_surface themselves, are likely to be using this
+      extension internally. If a client is using such an API for a
+      wl_surface, it should not directly use this extension on that surface,
+      to avoid raising a tearing_control_exists protocol error.
+
+      Warning! The protocol described in this file is experimental and
+      backward incompatible changes may be made. Backward compatible changes
+      may be added together with the corresponding interface version bump.
+      Backward incompatible changes are done by bumping the version number in
+      the protocol and interface names and resetting the interface version.
+      Once the protocol is to be declared stable, the 'z' prefix and the
+      version number in the protocol and interface names are removed and the
+      interface version number is reset.
+    </description>
+
+    <request name="destroy" type="destructor">
+      <description summary="destroy tearing control factory object">
+        Destroy this tearing control factory object. Other objects, including
+        zwp_surface_tearing_control_v1 objects created by this factory,
+        shall not be affected by this request.
+      </description>
+    </request>
+
+    <enum name="error">
+      <entry name="tearing_control_exists" value="0"
+             summary="the surface already has a tearing object associated"/>
+    </enum>
+
+    <request name="get_tearing_control">
+      <description summary="extend surface interface for tearing control">
+        Instantiate an interface extension for the given wl_surface to
+        request asynchronous page flips for presentation.
+
+        If the given wl_surface already has a zwp_surface_tearing_control_v1
+        object associated, the tearing_control_exists protocol error is raised.
+      </description>
+
+      <arg name="id" type="new_id"
+           interface="zwp_surface_tearing_control_v1"
+           summary="the new surface tearing interface id"/>
+      <arg name="surface" type="object" interface="wl_surface"
+           summary="the surface"/>
+    </request>
+  </interface>
+
+  <interface name="zwp_surface_tearing_control_v1" version="1">
+    <description summary="per-surface tearing control request">
+      An additional interface to a wl_surface object, which allows the client
+      to hint to the compositor if and when it should use asynchronous page
+      flips for presentation.
+    </description>
+
+    <enum name="presentation_hint">
+      <description summary="presentation hint values">
+        This enum provides information for if and when submitted frames from
+        the client may be presented with tearing. The possible values are:
+
+        VSYNC:
+        Presentation should be synchronized to the vertical retrace by the
+        display hardware so that tearing doesn't happen.
+
+        VSYNC_RELAXED:
+        Presentation should be synchronized to the vertical retrace by the
+        display hardware so that tearing doesn't happen as long as the client
+        submits new frame fast enough. If a frame is late for presentation,
+        that is, if more than one vertical retrace has occurred since the last
+        commit then the compositor should use asynchronous page flips to
+        immediately present the frame. This may cause visible tearing.
+        The compositor is encouraged to send requested frame callbacks as soon
+        as possible after such a late commit to make sure clients have as much
+        time as possible to render their next frame.
+
+        ASYNC:
+        Presentation should not be synchronized to the vertical retrace,
+        committed frames are meant to be immediately presented with asynchronous
+        page flips with as little delay as possible. Tearing will be visible.
+        The compositor is encouraged to send requested frame callbacks as soon
+        as possible after every commit.
+      </description>
+      <entry name="vsync" value="0"
+             summary="tearing-free presentation"/>
+      <entry name="vsync_relaxed" value="1"
+             summary="async pageflips on missed presentation deadline"/>
+      <entry name="async" value="2"
+             summary="async pageflips for all frames"/>
+    </enum>
+
+    <request name="set_presentation_hint">
+      <description summary="set presentation hint">
+        Set the presentation hint for the associated wl_surface. See
+        presentation_hint for the description. This state is double-buffered
+        and is applied on the next wl_surface.commit.
+
+        The compositor is free to dynamically respect or ignore this hint based
+        on various conditions, including GPU capabilities and surface window
+        state.
+      </description>
+      <arg name="hint" type="uint" enum="presentation_hint"/>
+    </request>
+
+    <request name="destroy" type="destructor">
+      <description summary="destroy synchronization object">
+        Destroy this surface tearing object and remove the presentation hint.
+        The change will be applied on the next wl_surface.commit.
+      </description>
+    </request>
+  </interface>
+
+</protocol>
+
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
index bb3310dc9..6f1d57a42 100644
--- a/hw/xwayland/xwayland-present.c
+++ b/hw/xwayland/xwayland-present.c
@@ -34,6 +34,8 @@
 #include "xwayland-pixmap.h"
 #include "glamor.h"
 
+#include "tearing-control-unstable-v1-client-protocol.h"
+
 
 #define XWL_PRESENT_CAPS PresentCapabilityAsync
 
@@ -796,6 +798,15 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage)
                        damage_box->x2 - damage_box->x1,
                        damage_box->y2 - damage_box->y1);
 
+
+    // Josh: No support for VSync relaxed, this is something that should
+    // be determined by a user setting in gamescope.
+    if (xwl_window->tearing_control)
+        zwp_surface_tearing_control_v1_set_presentation_hint(xwl_window->tearing_control, 
+            sync_flip
+                ? ZWP_SURFACE_TEARING_CONTROL_V1_PRESENTATION_HINT_VSYNC
+                : ZWP_SURFACE_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC);
+
     wl_surface_commit(xwl_window->surface);
 
     if (!vblank->sync_flip) {
diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c
index 2bc553b50..e35861e46 100644
--- a/hw/xwayland/xwayland-screen.c
+++ b/hw/xwayland/xwayland-screen.c
@@ -62,6 +62,7 @@
 #include "xdg-output-unstable-v1-client-protocol.h"
 #include "viewporter-client-protocol.h"
 #include "xdg-shell-client-protocol.h"
+#include "tearing-control-unstable-v1-client-protocol.h"
 #include "xwayland-shell-v1-client-protocol.h"
 
 static DevPrivateKeyRec xwl_screen_private_key;
@@ -457,6 +458,9 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id,
     else if (strcmp(interface, "wp_viewporter") == 0) {
         xwl_screen->viewporter = wl_registry_bind(registry, id, &wp_viewporter_interface, 1);
     }
+    else if (strcmp(interface, "zwp_tearing_control_v1") == 0) {
+        xwl_screen->tearing_control = wl_registry_bind(registry, id, &zwp_tearing_control_v1_interface, 1);
+    }
     else if (strcmp(interface, "xwayland_shell_v1") == 0 && xwl_screen->rootless) {
         xwl_screen->xwayland_shell =
             wl_registry_bind(registry, id, &xwayland_shell_v1_interface, 1);
diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h
index 656d2afde..bf75278fd 100644
--- a/hw/xwayland/xwayland-screen.h
+++ b/hw/xwayland/xwayland-screen.h
@@ -113,6 +113,7 @@ struct xwl_screen {
     struct xorg_list drm_lease_devices;
     struct xorg_list queued_drm_lease_devices;
     struct xorg_list drm_leases;
+    struct zwp_tearing_control_v1 *tearing_control;
     struct xwl_output *fixed_output;
     struct xorg_list pending_wl_surface_destroy;
     uint64_t surface_association_serial;
diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c
index b018d9656..7b3534385 100644
--- a/hw/xwayland/xwayland-window.c
+++ b/hw/xwayland/xwayland-window.c
@@ -48,6 +48,7 @@
 #include "linux-dmabuf-unstable-v1-client-protocol.h"
 #include "viewporter-client-protocol.h"
 #include "xdg-shell-client-protocol.h"
+#include "tearing-control-unstable-v1-client-protocol.h"
 #include "xwayland-shell-v1-client-protocol.h"
 
 #define DELAYED_WL_SURFACE_DESTROY 1000 /* ms */
@@ -920,6 +921,11 @@ ensure_surface_for_window(WindowPtr window)
         goto err;
     }
 
+    if (xwl_screen->tearing_control) {
+        xwl_window->tearing_control =
+            zwp_tearing_control_v1_get_tearing_control(xwl_screen->tearing_control, xwl_window->surface);
+    }
+
     if (xwl_screen->xwayland_shell) {
         xwl_window->xwayland_surface = xwayland_shell_v1_get_xwayland_surface(
             xwl_screen->xwayland_shell, xwl_window->surface);
@@ -1169,6 +1175,11 @@ xwl_unrealize_window(WindowPtr window)
     if (xwl_window_has_viewport_enabled(xwl_window))
         xwl_window_disable_viewport(xwl_window);
 
+    if (xwl_window->tearing_control) {
+        zwp_surface_tearing_control_v1_destroy(xwl_window->tearing_control);
+        xwl_window->tearing_control = NULL;
+    }
+
     xwl_dmabuf_feedback_destroy(&xwl_window->feedback);
 
 #ifdef GLAMOR_HAS_GBM
diff --git a/hw/xwayland/xwayland-window.h b/hw/xwayland/xwayland-window.h
index f8200d537..519d9394c 100644
--- a/hw/xwayland/xwayland-window.h
+++ b/hw/xwayland/xwayland-window.h
@@ -99,6 +99,7 @@ struct xwl_window {
     struct wp_viewport *viewport;
     float scale_x, scale_y;
     struct xdg_surface *xdg_surface;
+    struct zwp_surface_tearing_control_v1 *tearing_control;
     struct xdg_toplevel *xdg_toplevel;
     WindowPtr window;
     struct xorg_list link_damage;
-- 
2.42.0


From 3357fc57deb1e397e6a2023a4b0254aeed957349 Mon Sep 17 00:00:00 2001
From: Joshua Ashton <joshua@froggi.es>
Date: Wed, 31 Aug 2022 12:57:09 +0000
Subject: [PATCH 3/4] Use gamescope tearing protocol instead

Renamed to not clash
---
 hw/xwayland/meson.build                              |  2 +-
 ...xml => gamescope-tearing-control-unstable-v1.xml} | 12 ++++++------
 hw/xwayland/xwayland-present.c                       |  8 ++++----
 hw/xwayland/xwayland-screen.c                        |  6 +++---
 hw/xwayland/xwayland-screen.h                        |  2 +-
 hw/xwayland/xwayland-window.c                        |  6 +++---
 hw/xwayland/xwayland-window.h                        |  2 +-
 7 files changed, 19 insertions(+), 19 deletions(-)
 rename hw/xwayland/protocols/unstable/tearing-control/{tearing-control-unstable-v1.xml => gamescope-tearing-control-unstable-v1.xml} (93%)

diff --git a/hw/xwayland/meson.build b/hw/xwayland/meson.build
index d29e55d7d..73f2bdd94 100644
--- a/hw/xwayland/meson.build
+++ b/hw/xwayland/meson.build
@@ -46,7 +46,7 @@ dmabuf_xml = join_paths(protodir, 'unstable', 'linux-dmabuf', 'linux-dmabuf-unst
 viewporter_xml = join_paths(protodir, 'stable', 'viewporter', 'viewporter.xml')
 xdg_shell_xml = join_paths(protodir, 'stable', 'xdg-shell', 'xdg-shell.xml')
 drm_lease_xml = join_paths(protodir, 'staging', 'drm-lease', 'drm-lease-v1.xml')
-tearing_xml = join_paths('protocols', 'unstable', 'tearing-control', 'tearing-control-unstable-v1.xml')
+tearing_xml = join_paths('protocols', 'unstable', 'tearing-control', 'gamescope-tearing-control-unstable-v1.xml')
 shortcuts_inhibit_xml = join_paths(protodir, 'unstable', 'keyboard-shortcuts-inhibit', 'keyboard-shortcuts-inhibit-unstable-v1.xml')
 xwayland_shell_xml = join_paths(protodir, 'staging', 'xwayland-shell', 'xwayland-shell-v1.xml')
 
diff --git a/hw/xwayland/protocols/unstable/tearing-control/tearing-control-unstable-v1.xml b/hw/xwayland/protocols/unstable/tearing-control/gamescope-tearing-control-unstable-v1.xml
similarity index 93%
rename from hw/xwayland/protocols/unstable/tearing-control/tearing-control-unstable-v1.xml
rename to hw/xwayland/protocols/unstable/tearing-control/gamescope-tearing-control-unstable-v1.xml
index ce130718e..3c7cfb09e 100644
--- a/hw/xwayland/protocols/unstable/tearing-control/tearing-control-unstable-v1.xml
+++ b/hw/xwayland/protocols/unstable/tearing-control/gamescope-tearing-control-unstable-v1.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<protocol name="zwp_tearing_control_unstable_v1">
+<protocol name="gamescope_tearing_control_unstable_v1">
 
   <copyright>
     Copyright © 2021 Xaver Hugl
@@ -24,7 +24,7 @@
     DEALINGS IN THE SOFTWARE.
   </copyright>
 
-  <interface name="zwp_tearing_control_v1" version="1">
+  <interface name="gamescope_tearing_control_v1" version="1">
     <description summary="protocol for tearing control">
       This global is a factory interface, allowing clients to request
       the compositor to use asynchronous page flips on a per-surface basis.
@@ -48,7 +48,7 @@
     <request name="destroy" type="destructor">
       <description summary="destroy tearing control factory object">
         Destroy this tearing control factory object. Other objects, including
-        zwp_surface_tearing_control_v1 objects created by this factory,
+        gamescope_surface_tearing_control_v1 objects created by this factory,
         shall not be affected by this request.
       </description>
     </request>
@@ -63,19 +63,19 @@
         Instantiate an interface extension for the given wl_surface to
         request asynchronous page flips for presentation.
 
-        If the given wl_surface already has a zwp_surface_tearing_control_v1
+        If the given wl_surface already has a gamescope_surface_tearing_control_v1
         object associated, the tearing_control_exists protocol error is raised.
       </description>
 
       <arg name="id" type="new_id"
-           interface="zwp_surface_tearing_control_v1"
+           interface="gamescope_surface_tearing_control_v1"
            summary="the new surface tearing interface id"/>
       <arg name="surface" type="object" interface="wl_surface"
            summary="the surface"/>
     </request>
   </interface>
 
-  <interface name="zwp_surface_tearing_control_v1" version="1">
+  <interface name="gamescope_surface_tearing_control_v1" version="1">
     <description summary="per-surface tearing control request">
       An additional interface to a wl_surface object, which allows the client
       to hint to the compositor if and when it should use asynchronous page
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
index 6f1d57a42..5cbd767c9 100644
--- a/hw/xwayland/xwayland-present.c
+++ b/hw/xwayland/xwayland-present.c
@@ -34,7 +34,7 @@
 #include "xwayland-pixmap.h"
 #include "glamor.h"
 
-#include "tearing-control-unstable-v1-client-protocol.h"
+#include "gamescope-tearing-control-unstable-v1-client-protocol.h"
 
 
 #define XWL_PRESENT_CAPS PresentCapabilityAsync
@@ -802,10 +802,10 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage)
     // Josh: No support for VSync relaxed, this is something that should
     // be determined by a user setting in gamescope.
     if (xwl_window->tearing_control)
-        zwp_surface_tearing_control_v1_set_presentation_hint(xwl_window->tearing_control, 
+        gamescope_surface_tearing_control_v1_set_presentation_hint(xwl_window->tearing_control, 
             sync_flip
-                ? ZWP_SURFACE_TEARING_CONTROL_V1_PRESENTATION_HINT_VSYNC
-                : ZWP_SURFACE_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC);
+                ? GAMESCOPE_SURFACE_TEARING_CONTROL_V1_PRESENTATION_HINT_VSYNC
+                : GAMESCOPE_SURFACE_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC);
 
     wl_surface_commit(xwl_window->surface);
 
diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c
index e35861e46..2a025db18 100644
--- a/hw/xwayland/xwayland-screen.c
+++ b/hw/xwayland/xwayland-screen.c
@@ -62,7 +62,7 @@
 #include "xdg-output-unstable-v1-client-protocol.h"
 #include "viewporter-client-protocol.h"
 #include "xdg-shell-client-protocol.h"
-#include "tearing-control-unstable-v1-client-protocol.h"
+#include "gamescope-tearing-control-unstable-v1-client-protocol.h"
 #include "xwayland-shell-v1-client-protocol.h"
 
 static DevPrivateKeyRec xwl_screen_private_key;
@@ -458,8 +458,8 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id,
     else if (strcmp(interface, "wp_viewporter") == 0) {
         xwl_screen->viewporter = wl_registry_bind(registry, id, &wp_viewporter_interface, 1);
     }
-    else if (strcmp(interface, "zwp_tearing_control_v1") == 0) {
-        xwl_screen->tearing_control = wl_registry_bind(registry, id, &zwp_tearing_control_v1_interface, 1);
+    else if (strcmp(interface, "gamescope_tearing_control_v1") == 0) {
+        xwl_screen->tearing_control = wl_registry_bind(registry, id, &gamescope_tearing_control_v1_interface, 1);
     }
     else if (strcmp(interface, "xwayland_shell_v1") == 0 && xwl_screen->rootless) {
         xwl_screen->xwayland_shell =
diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h
index bf75278fd..d6b1a1d84 100644
--- a/hw/xwayland/xwayland-screen.h
+++ b/hw/xwayland/xwayland-screen.h
@@ -113,7 +113,7 @@ struct xwl_screen {
     struct xorg_list drm_lease_devices;
     struct xorg_list queued_drm_lease_devices;
     struct xorg_list drm_leases;
-    struct zwp_tearing_control_v1 *tearing_control;
+    struct gamescope_tearing_control_v1 *tearing_control;
     struct xwl_output *fixed_output;
     struct xorg_list pending_wl_surface_destroy;
     uint64_t surface_association_serial;
diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c
index 7b3534385..d3bbe703d 100644
--- a/hw/xwayland/xwayland-window.c
+++ b/hw/xwayland/xwayland-window.c
@@ -48,7 +48,7 @@
 #include "linux-dmabuf-unstable-v1-client-protocol.h"
 #include "viewporter-client-protocol.h"
 #include "xdg-shell-client-protocol.h"
-#include "tearing-control-unstable-v1-client-protocol.h"
+#include "gamescope-tearing-control-unstable-v1-client-protocol.h"
 #include "xwayland-shell-v1-client-protocol.h"
 
 #define DELAYED_WL_SURFACE_DESTROY 1000 /* ms */
@@ -923,7 +923,7 @@ ensure_surface_for_window(WindowPtr window)
 
     if (xwl_screen->tearing_control) {
         xwl_window->tearing_control =
-            zwp_tearing_control_v1_get_tearing_control(xwl_screen->tearing_control, xwl_window->surface);
+            gamescope_tearing_control_v1_get_tearing_control(xwl_screen->tearing_control, xwl_window->surface);
     }
 
     if (xwl_screen->xwayland_shell) {
@@ -1176,7 +1176,7 @@ xwl_unrealize_window(WindowPtr window)
         xwl_window_disable_viewport(xwl_window);
 
     if (xwl_window->tearing_control) {
-        zwp_surface_tearing_control_v1_destroy(xwl_window->tearing_control);
+        gamescope_surface_tearing_control_v1_destroy(xwl_window->tearing_control);
         xwl_window->tearing_control = NULL;
     }
 
diff --git a/hw/xwayland/xwayland-window.h b/hw/xwayland/xwayland-window.h
index 519d9394c..95f770c07 100644
--- a/hw/xwayland/xwayland-window.h
+++ b/hw/xwayland/xwayland-window.h
@@ -99,7 +99,7 @@ struct xwl_window {
     struct wp_viewport *viewport;
     float scale_x, scale_y;
     struct xdg_surface *xdg_surface;
-    struct zwp_surface_tearing_control_v1 *tearing_control;
+    struct gamescope_surface_tearing_control_v1 *tearing_control;
     struct xdg_toplevel *xdg_toplevel;
     WindowPtr window;
     struct xorg_list link_damage;
-- 
2.42.0


From c799ef123d1ed4eddc7972451b1b313b14195935 Mon Sep 17 00:00:00 2001
From: Kyle Gospodnetich <me@kylegospodneti.ch>
Date: Wed, 31 Jan 2024 17:36:04 -0800
Subject: [PATCH 4/4] Fix missing sync_flip param

---
 hw/xwayland/xwayland-present.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
index 5cbd767c9..f22e8f987 100644
--- a/hw/xwayland/xwayland-present.c
+++ b/hw/xwayland/xwayland-present.c
@@ -754,7 +754,7 @@ xwl_present_clear_window_flip(WindowPtr window)
 }
 
 static Bool
-xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage)
+xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage, Bool sync_flip)
 {
     WindowPtr present_window = vblank->window;
     PixmapPtr pixmap = vblank->pixmap;
@@ -873,7 +873,7 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
             } else
                 damage = RegionDuplicate(&window->clipList);
 
-            if (xwl_present_flip(vblank, damage)) {
+            if (xwl_present_flip(vblank, damage, vblank->sync_flip)) {
                 WindowPtr toplvl_window = xwl_present_toplvl_pixmap_window(vblank->window);
                 PixmapPtr old_pixmap = screen->GetWindowPixmap(window);
 
-- 
2.42.0

