From 2a0729f842638c61ac7a58d95fcc15c2441782ba Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Wed, 31 Jul 2024 08:28:40 -0700 Subject: [PATCH 1/9] chore: Add missing logo file --- repo_content/logo.png | Bin 0 -> 54981 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 repo_content/logo.png diff --git a/repo_content/logo.png b/repo_content/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d76d0d7e56b85165868839e23761e68f2bea8b54 GIT binary patch literal 54981 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 K<@|e=Z~i|m05xs^ literal 0 HcmV?d00001 From 1bee53417e0dff70fc8ccea06512867008a2d91b Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 11:35:23 -0700 Subject: [PATCH 2/9] chore: Update Mangohud spec --- spec_files/mangohud/mangohud.spec | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/spec_files/mangohud/mangohud.spec b/spec_files/mangohud/mangohud.spec index 21f8533a..ec080d17 100644 --- a/spec_files/mangohud/mangohud.spec +++ b/spec_files/mangohud/mangohud.spec @@ -24,11 +24,6 @@ %bcond_without tests %endif -# Disable unpackaged files check for 32-bit builds shipping with conflicting files -%if %{__isa_bits} != 64 - %define _unpackaged_files_terminate_build 0 -%endif - Name: mangohud Version: 100.0.7.2 Release: %autorelease @@ -157,19 +152,18 @@ sed -i "s@#!/usr/bin/env python@#!/usr/bin/python3@" \ %files %license LICENSE %doc README.md -%if %{__isa_bits} == 64 %{_bindir}/%{name}* %{_bindir}/mangoapp %{_bindir}/mangoplot %{_datadir}/icons/hicolor/scalable/*/*.svg +%{_datadir}/vulkan/implicit_layer.d/*Mango*.json %{_docdir}/%{name}/%{appname}.conf.example %{_docdir}/%{name}/presets.conf.example +%{_libdir}/%{name}/ %{_mandir}/man1/%{name}.1* %{_mandir}/man1/mangoapp.1* %{_metainfodir}/*.metainfo.xml -%endif -%{_datadir}/vulkan/implicit_layer.d/*Mango*.json -%{_libdir}/%{name}/ + %changelog * Mon Oct 02 2023 Artem Polishchuk - 0.7.0-6 @@ -325,4 +319,3 @@ sed -i "s@#!/usr/bin/env python@#!/usr/bin/python3@" \ gasinvein Vitaly Zaitsev - From 3354b6658de128086d7b91a9242c0599e1592d65 Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 11:40:01 -0700 Subject: [PATCH 3/9] chore: Update to gamescope 3.14.26 --- spec_files/gamescope/1231.patch | 239 --------------------------- spec_files/gamescope/chimeraos.patch | 27 --- spec_files/gamescope/gamescope.spec | 10 +- 3 files changed, 2 insertions(+), 274 deletions(-) delete mode 100644 spec_files/gamescope/1231.patch diff --git a/spec_files/gamescope/1231.patch b/spec_files/gamescope/1231.patch deleted file mode 100644 index e21cb0a8..00000000 --- a/spec_files/gamescope/1231.patch +++ /dev/null @@ -1,239 +0,0 @@ -From ab115896be1a448bde0eb7673c26300ea4ca5040 Mon Sep 17 00:00:00 2001 -From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> -Date: Sun, 19 May 2024 20:15:36 -0400 -Subject: [PATCH 1/2] QueuePresent: canBypassXWayland(): fetch multiple xcb - cookies initially before waiting on any of them - ---- - layer/VkLayer_FROG_gamescope_wsi.cpp | 1 + - layer/xcb_helpers.hpp | 105 +++++++++++++++++++++++---- - 2 files changed, 93 insertions(+), 13 deletions(-) - -diff --git a/layer/VkLayer_FROG_gamescope_wsi.cpp b/layer/VkLayer_FROG_gamescope_wsi.cpp -index 5844c2a63..ca44849f2 100644 ---- a/layer/VkLayer_FROG_gamescope_wsi.cpp -+++ b/layer/VkLayer_FROG_gamescope_wsi.cpp -@@ -975,6 +975,7 @@ namespace GamescopeWSILayer { - continue; - } - -+ xcb::Prefetcher prefetcher(gamescopeSurface->connection, gamescopeSurface->window); - const bool canBypass = gamescopeSurface->canBypassXWayland(); - if (canBypass != gamescopeSwapchain->isBypassingXWayland) - UpdateSwapchainResult(canBypass ? VK_SUBOPTIMAL_KHR : VK_ERROR_OUT_OF_DATE_KHR); -diff --git a/layer/xcb_helpers.hpp b/layer/xcb_helpers.hpp -index 8fac5635b..72d0ec092 100644 ---- a/layer/xcb_helpers.hpp -+++ b/layer/xcb_helpers.hpp -@@ -4,22 +4,106 @@ - #include - #include - #include -+#include - - namespace xcb { -+ inline static constinit pthread_t g_cache_tid; //incase g_cache could otherwise be accessed by one thread, while it is being deleted by another thread -+ inline static constinit struct cookie_cache_t { -+ xcb_window_t window; -+ std::tuple cached_cookies; -+ std::tuple cached_replies; -+ } g_cache = {}; -+ -+ //Note: this class is currently only meant to be used within GamescopeWSILayer::VkDeviceOverrides::QueuePresentKHR: -+ struct Prefetcher { -+ explicit Prefetcher(xcb_connection_t* connection, const xcb_window_t window) { -+ g_cache = { -+ .window = window, -+ .cached_cookies = { -+ xcb_get_geometry(connection, window), -+ xcb_query_tree(connection, window) -+ } -+ }; -+ g_cache_tid = pthread_self(); -+ } - -+ ~Prefetcher() { -+ g_cache_tid = {}; -+ free(std::get<0>(g_cache.cached_replies)); -+ free(std::get<1>(g_cache.cached_replies)); -+ g_cache.cached_replies = {nullptr,nullptr}; -+ } -+ }; -+ - struct ReplyDeleter { -+ const bool m_bOwning = true; -+ consteval ReplyDeleter(bool bOwning = true) : m_bOwning{bOwning} {} - template - void operator()(T* ptr) const { -- free(const_cast*>(ptr)); -+ if (m_bOwning) -+ free(const_cast*>(ptr)); - } - }; - - template - using Reply = std::unique_ptr; -+ -+ template -+ class XcbFetch { -+ using cookie_f_ptr_t = Cookie_RetType (*)(XcbConn, Args...); -+ using reply_f_ptr_t = Reply_RetType* (*)(XcbConn, Cookie_RetType, xcb_generic_error_t**); -+ -+ const cookie_f_ptr_t m_cookieFunc; -+ const reply_f_ptr_t m_replyFunc; -+ -+ public: -+ consteval XcbFetch(cookie_f_ptr_t cookieFunc, reply_f_ptr_t replyFunc) : m_cookieFunc{cookieFunc}, m_replyFunc{replyFunc} {} -+ -+ inline Reply operator()(XcbConn conn, auto... args) { //have to use auto for argsTwo, since otherwise there'd be a type deduction conflict -+ return Reply { m_replyFunc(conn, m_cookieFunc(conn, args...), nullptr) }; -+ } -+ }; -+ -+ template -+ concept CacheableCookie = std::is_same::value -+ || std::is_same::value; -+ -+ template -+ class XcbFetch { -+ using cookie_f_ptr_t = Cookie_RetType (*)(xcb_connection_t*, xcb_window_t); -+ using reply_f_ptr_t = Reply_RetType* (*)(xcb_connection_t*, Cookie_RetType, xcb_generic_error_t**); -+ -+ const cookie_f_ptr_t m_cookieFunc; -+ const reply_f_ptr_t m_replyFunc; -+ -+ inline Reply getCachedReply(xcb_connection_t* connection) { -+ if (std::get(g_cache.cached_replies) == nullptr) { -+ std::get(g_cache.cached_replies) = m_replyFunc(connection, std::get(g_cache.cached_cookies), nullptr); -+ } - -+ return Reply{std::get(g_cache.cached_replies), ReplyDeleter{false}}; // return 'non-owning' unique_ptr -+ } -+ -+ public: -+ consteval XcbFetch(cookie_f_ptr_t cookieFunc, reply_f_ptr_t replyFunc) : m_cookieFunc{cookieFunc}, m_replyFunc{replyFunc} {} -+ -+ inline Reply operator()(xcb_connection_t* conn, xcb_window_t window) { -+ const bool tryCached = pthread_equal(g_cache_tid, pthread_self()) -+ && g_cache.window == window; -+ if (!tryCached) [[unlikely]] -+ return Reply { m_replyFunc(conn, m_cookieFunc(conn, window), nullptr) }; -+ -+ auto ret = getCachedReply(conn); -+ #if !defined(NDEBUG) || NDEBUG == 0 -+ if (!ret) -+ fprintf(stderr, "[Gamescope WSI] getCachedReply() failed.\n"); -+ #endif -+ return ret; -+ } -+ }; -+ - static std::optional getAtom(xcb_connection_t* connection, std::string_view name) { -- xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, false, name.length(), name.data()); -- auto reply = Reply{ xcb_intern_atom_reply(connection, cookie, nullptr) }; -+ auto reply = XcbFetch{xcb_intern_atom, xcb_intern_atom_reply}(connection, false, name.length(), name.data()); - if (!reply) { - fprintf(stderr, "[Gamescope WSI] Failed to get xcb atom.\n"); - return std::nullopt; -@@ -34,8 +118,7 @@ namespace xcb { - - xcb_screen_t* screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data; - -- xcb_get_property_cookie_t cookie = xcb_get_property(connection, false, screen->root, atom, XCB_ATOM_CARDINAL, 0, sizeof(T) / sizeof(uint32_t)); -- auto reply = Reply{ xcb_get_property_reply(connection, cookie, nullptr) }; -+ auto reply = XcbFetch{xcb_get_property, xcb_get_property_reply}(connection, false, screen->root, atom, XCB_ATOM_CARDINAL, 0, sizeof(T) / sizeof(uint32_t)); - if (!reply) { - fprintf(stderr, "[Gamescope WSI] Failed to read T root window property.\n"); - return std::nullopt; -@@ -61,8 +144,7 @@ namespace xcb { - - static std::optional getToplevelWindow(xcb_connection_t* connection, xcb_window_t window) { - for (;;) { -- xcb_query_tree_cookie_t cookie = xcb_query_tree(connection, window); -- auto reply = Reply{ xcb_query_tree_reply(connection, cookie, nullptr) }; -+ auto reply = XcbFetch{xcb_query_tree, xcb_query_tree_reply}(connection, window); - - if (!reply) { - fprintf(stderr, "[Gamescope WSI] getToplevelWindow: xcb_query_tree failed for window 0x%x.\n", window); -@@ -77,8 +159,7 @@ namespace xcb { - } - - static std::optional getWindowRect(xcb_connection_t* connection, xcb_window_t window) { -- xcb_get_geometry_cookie_t cookie = xcb_get_geometry(connection, window); -- auto reply = Reply{ xcb_get_geometry_reply(connection, cookie, nullptr) }; -+ auto reply = XcbFetch{xcb_get_geometry, xcb_get_geometry_reply}(connection, window); - if (!reply) { - fprintf(stderr, "[Gamescope WSI] getWindowRect: xcb_get_geometry failed for window 0x%x.\n", window); - return std::nullopt; -@@ -112,8 +193,7 @@ namespace xcb { - static std::optional getLargestObscuringChildWindowSize(xcb_connection_t* connection, xcb_window_t window) { - VkExtent2D largestExtent = {}; - -- xcb_query_tree_cookie_t cookie = xcb_query_tree(connection, window); -- auto reply = Reply{ xcb_query_tree_reply(connection, cookie, nullptr) }; -+ auto reply = XcbFetch{xcb_query_tree, xcb_query_tree_reply}(connection, window); - - if (!reply) { - fprintf(stderr, "[Gamescope WSI] getLargestObscuringWindowSize: xcb_query_tree failed for window 0x%x.\n", window); -@@ -130,8 +210,7 @@ namespace xcb { - for (uint32_t i = 0; i < reply->children_len; i++) { - xcb_window_t child = children[i]; - -- xcb_get_window_attributes_cookie_t attributeCookie = xcb_get_window_attributes(connection, child); -- auto attributeReply = Reply{ xcb_get_window_attributes_reply(connection, attributeCookie, nullptr) }; -+ auto attributeReply = XcbFetch{xcb_get_window_attributes, xcb_get_window_attributes_reply}(connection, child); - - const bool obscuring = - attributeReply && - -From 1b59621f4de5c05096d1f279cba2e04264124154 Mon Sep 17 00:00:00 2001 -From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> -Date: Tue, 18 Jun 2024 22:21:23 -0400 -Subject: [PATCH 2/2] WSI: prefetcher: fix issue w/ attempting to prefetch xcb - stuff for pure wayland surfaces - ---- - layer/VkLayer_FROG_gamescope_wsi.cpp | 2 +- - layer/xcb_helpers.hpp | 9 ++++++++- - 2 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/layer/VkLayer_FROG_gamescope_wsi.cpp b/layer/VkLayer_FROG_gamescope_wsi.cpp -index f26819a60..ce011dcd7 100644 ---- a/layer/VkLayer_FROG_gamescope_wsi.cpp -+++ b/layer/VkLayer_FROG_gamescope_wsi.cpp -@@ -1234,7 +1234,7 @@ namespace GamescopeWSILayer { - continue; - } - -- xcb::Prefetcher prefetcher(gamescopeSurface->connection, gamescopeSurface->window); -+ auto prefetcher = xcb::Prefetcher::GetPrefetcherIf(!gamescopeSurface->isWayland(), gamescopeSurface->connection, gamescopeSurface->window); - const bool canBypass = gamescopeSurface->canBypassXWayland(); - if (canBypass != gamescopeSwapchain->isBypassingXWayland) - UpdateSwapchainResult(canBypass ? VK_SUBOPTIMAL_KHR : VK_ERROR_OUT_OF_DATE_KHR); -diff --git a/layer/xcb_helpers.hpp b/layer/xcb_helpers.hpp -index 72d0ec092..f26aef38b 100644 ---- a/layer/xcb_helpers.hpp -+++ b/layer/xcb_helpers.hpp -@@ -16,6 +16,13 @@ namespace xcb { - - //Note: this class is currently only meant to be used within GamescopeWSILayer::VkDeviceOverrides::QueuePresentKHR: - struct Prefetcher { -+ static std::optional GetPrefetcherIf(bool bCond, xcb_connection_t* connection, const xcb_window_t window) { -+ if (bCond) -+ return std::optional(std::in_place_t{}, connection, window); -+ -+ return std::nullopt; -+ } -+ - explicit Prefetcher(xcb_connection_t* connection, const xcb_window_t window) { - g_cache = { - .window = window, -@@ -90,7 +97,7 @@ namespace xcb { - inline Reply operator()(xcb_connection_t* conn, xcb_window_t window) { - const bool tryCached = pthread_equal(g_cache_tid, pthread_self()) - && g_cache.window == window; -- if (!tryCached) [[unlikely]] -+ if (!tryCached) - return Reply { m_replyFunc(conn, m_cookieFunc(conn, window), nullptr) }; - - auto ret = getCachedReply(conn); diff --git a/spec_files/gamescope/chimeraos.patch b/spec_files/gamescope/chimeraos.patch index 80cc642b..9a6b2ecd 100644 --- a/spec_files/gamescope/chimeraos.patch +++ b/spec_files/gamescope/chimeraos.patch @@ -1944,33 +1944,6 @@ index 10c0a75..1bc9008 100644 2.45.2 -From 7865b34c5cd61fa5cc5428ace614e4551fabb6ec Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Joaqu=C3=ADn=20Ignacio=20Aramend=C3=ADa?= - -Date: Tue, 9 Jul 2024 18:29:16 -0300 -Subject: [PATCH 20/22] disable explicit sync to avoid graphical artifacts - ---- - src/Backends/DRMBackend.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/Backends/DRMBackend.cpp b/src/Backends/DRMBackend.cpp -index 9df20ae..ff1858b 100644 ---- a/src/Backends/DRMBackend.cpp -+++ b/src/Backends/DRMBackend.cpp -@@ -68,7 +68,7 @@ gamescope::ConVar cv_drm_debug_disable_blend_tf( "drm_debug_disable_blend_ - gamescope::ConVar cv_drm_debug_disable_ctm( "drm_debug_disable_ctm", false, "CTM chicken bit. (Forces CTM off, does not affect other logic)" ); - gamescope::ConVar cv_drm_debug_disable_color_encoding( "drm_debug_disable_color_encoding", false, "YUV Color Encoding chicken bit. (Forces COLOR_ENCODING to DEFAULT, does not affect other logic)" ); - gamescope::ConVar cv_drm_debug_disable_color_range( "drm_debug_disable_color_range", false, "YUV Color Range chicken bit. (Forces COLOR_RANGE to DEFAULT, does not affect other logic)" ); --gamescope::ConVar cv_drm_debug_disable_explicit_sync( "drm_debug_disable_explicit_sync", false, "Force disable explicit sync on the DRM backend." ); -+gamescope::ConVar cv_drm_debug_disable_explicit_sync( "drm_debug_disable_explicit_sync", true, "Force disable explicit sync on the DRM backend." ); - gamescope::ConVar cv_drm_debug_disable_in_fence_fd( "drm_debug_disable_in_fence_fd", false, "Force disable IN_FENCE_FD being set to avoid over-synchronization on the DRM backend." ); - - // HACK: --- -2.45.2 - - From 1dbcfed76f4b80d8a9f6570819b5af7917c786fc Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Tue, 2 Jul 2024 14:12:47 -0700 diff --git a/spec_files/gamescope/gamescope.spec b/spec_files/gamescope/gamescope.spec index 68a4c0f1..d1693bbd 100644 --- a/spec_files/gamescope/gamescope.spec +++ b/spec_files/gamescope/gamescope.spec @@ -2,7 +2,7 @@ %global _default_patch_fuzz 2 %global build_timestamp %(date +"%Y%m%d") -%global gamescope_tag 3.14.24 +%global gamescope_tag 3.14.26 Name: gamescope Version: 100.%{gamescope_tag} @@ -22,14 +22,8 @@ Patch1: chimeraos.patch # https://hhd.dev/ Patch2: disable-steam-touch-click-atom.patch Patch3: v2-0001-always-send-ctrl-1-2-to-steam-s-wayland-session.patch -# https://github.com/ValveSoftware/gamescope/pull/1281 -Patch4: deckhd.patch # https://github.com/ValveSoftware/gamescope/issues/1398 -Patch5: drm-Separate-BOE-and-SDC-OLED-Deck-panel-rates.patch -# https://github.com/ValveSoftware/gamescope/issues/1369 -Patch6: revert-299bc34.patch -# https://github.com/ValveSoftware/gamescope/pull/1231 -Patch7: 1231.patch +Patch4: drm-Separate-BOE-and-SDC-OLED-Deck-panel-rates.patch # Temporary until newer tag than 3.14.24 Patch8: upstream.patch From 6f78a4c67eadf3c59e107cc2a25ddd2032ff3269 Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 11:40:12 -0700 Subject: [PATCH 4/9] chore: Remove unneeded patch file --- spec_files/gamescope/revert-299bc34.patch | 65 ----------------------- 1 file changed, 65 deletions(-) delete mode 100644 spec_files/gamescope/revert-299bc34.patch diff --git a/spec_files/gamescope/revert-299bc34.patch b/spec_files/gamescope/revert-299bc34.patch deleted file mode 100644 index 550870fe..00000000 --- a/spec_files/gamescope/revert-299bc34.patch +++ /dev/null @@ -1,65 +0,0 @@ -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index d7498e5..d1800a8 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -3271,7 +3271,7 @@ found:; - if ( window_has_commits( focus ) ) - out->focusWindow = focus; - else -- focus->outdatedInteractiveFocus = true; -+ out->outdatedInteractiveFocus = true; - - // Always update X's idea of focus, but still dirty - // the it being outdated so we can resolve that globally later. -@@ -5995,28 +5995,37 @@ bool handle_done_commit( steamcompmgr_win_t *w, xwayland_ctx_t *ctx, uint64_t co - // Window just got a new available commit, determine if that's worth a repaint - - // If this is an overlay that we're presenting, repaint -- if ( w == global_focus.overlayWindow && w->opacity != TRANSLUCENT ) -+ if ( gameFocused ) - { -- hasRepaintNonBasePlane = true; -- } -+ if ( w == global_focus.overlayWindow && w->opacity != TRANSLUCENT ) -+ { -+ hasRepaintNonBasePlane = true; -+ } - -- if ( w == global_focus.notificationWindow && w->opacity != TRANSLUCENT ) -- { -- hasRepaintNonBasePlane = true; -+ if ( w == global_focus.notificationWindow && w->opacity != TRANSLUCENT ) -+ { -+ hasRepaintNonBasePlane = true; -+ } - } -- -- // If this is an external overlay, repaint -- if ( w == global_focus.externalOverlayWindow && w->opacity != TRANSLUCENT ) -+ if ( ctx ) - { -- hasRepaintNonBasePlane = true; -+ if ( ctx->focus.outdatedInteractiveFocus ) -+ { -+ MakeFocusDirty(); -+ ctx->focus.outdatedInteractiveFocus = false; -+ } - } -- -- if ( w->outdatedInteractiveFocus ) -+ if ( global_focus.outdatedInteractiveFocus ) - { - MakeFocusDirty(); -- w->outdatedInteractiveFocus = false; -- } -+ global_focus.outdatedInteractiveFocus = false; - -+ // If this is an external overlay, repaint -+ if ( w == global_focus.externalOverlayWindow && w->opacity != TRANSLUCENT ) -+ { -+ hasRepaintNonBasePlane = true; -+ } -+ } - // If this is the main plane, repaint - if ( w == global_focus.focusWindow && !w->isSteamStreamingClient ) - { From 8dbce041105f4df5280d9b32d57eec9289215572 Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 11:50:36 -0700 Subject: [PATCH 5/9] chore: Drop upstream patch for gamescope --- spec_files/gamescope/gamescope.spec | 3 - spec_files/gamescope/upstream.patch | 3602 --------------------------- 2 files changed, 3605 deletions(-) delete mode 100644 spec_files/gamescope/upstream.patch diff --git a/spec_files/gamescope/gamescope.spec b/spec_files/gamescope/gamescope.spec index d1693bbd..32d173ae 100644 --- a/spec_files/gamescope/gamescope.spec +++ b/spec_files/gamescope/gamescope.spec @@ -25,9 +25,6 @@ Patch3: v2-0001-always-send-ctrl-1-2-to-steam-s-wayland-session.patch # https://github.com/ValveSoftware/gamescope/issues/1398 Patch4: drm-Separate-BOE-and-SDC-OLED-Deck-panel-rates.patch -# Temporary until newer tag than 3.14.24 -Patch8: upstream.patch - BuildRequires: meson >= 0.54.0 BuildRequires: ninja-build BuildRequires: cmake diff --git a/spec_files/gamescope/upstream.patch b/spec_files/gamescope/upstream.patch deleted file mode 100644 index 3b77c8d0..00000000 --- a/spec_files/gamescope/upstream.patch +++ /dev/null @@ -1,3602 +0,0 @@ -From 261dc46d54aa1c7f5a7363807c39ae1f26b3ab49 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Mon, 15 Jul 2024 14:51:16 +0100 -Subject: [PATCH 01/19] Utils: Add small Algorithm helper file - ---- - src/Utils/Algorithm.h | 173 ++++++++++++++++++++++++++++++++++++++++++ - src/color_bench.cpp | 137 +++++++++++++++++++++++++++++++++ - 2 files changed, 310 insertions(+) - create mode 100644 src/Utils/Algorithm.h - -diff --git a/src/Utils/Algorithm.h b/src/Utils/Algorithm.h -new file mode 100644 -index 0000000..7290367 ---- /dev/null -+++ b/src/Utils/Algorithm.h -@@ -0,0 +1,173 @@ -+#pragma once -+ -+#include -+#include -+ -+namespace gamescope::Algorithm -+{ -+ template -+ constexpr TObj *Begin( std::span span ) -+ { -+ return span.data(); -+ } -+ -+ template -+ constexpr TObj *End( std::span span ) -+ { -+ return Begin( span ) + span.size(); -+ } -+ -+ template -+ constexpr TIter FindSimple( TIter pFirst, TIter pEnd, const TObj &obj ) -+ { -+ while ( pFirst != pEnd && *pFirst != obj ) -+ ++pFirst; -+ -+ return pFirst; -+ } -+ -+ template -+ constexpr TIter FindByFour( TIter pFirst, TIter pEnd, const TObj &obj ) -+ { -+ typename std::iterator_traits< TIter >::difference_type ulTripCount = ( pEnd - pFirst ) >> 2; -+ -+ while ( ulTripCount-- > 0 ) -+ { -+ if ( pFirst[0] == obj ) -+ return &pFirst[0]; -+ -+ if ( pFirst[1] == obj ) -+ return &pFirst[1]; -+ -+ if ( pFirst[2] == obj ) -+ return &pFirst[2]; -+ -+ if ( pFirst[3] == obj ) -+ return &pFirst[3]; -+ -+ pFirst += 4; -+ } -+ -+ switch ( pEnd - pFirst ) -+ { -+ case 3: -+ { -+ if ( pFirst[0] == obj ) -+ return &pFirst[0]; -+ -+ if ( pFirst[1] == obj ) -+ return &pFirst[1]; -+ -+ if ( pFirst[2] == obj ) -+ return &pFirst[2]; -+ -+ return pEnd; -+ } -+ case 2: -+ { -+ if ( pFirst[0] == obj ) -+ return &pFirst[0]; -+ -+ if ( pFirst[1] == obj ) -+ return &pFirst[1]; -+ -+ return pEnd; -+ } -+ case 1: -+ { -+ if ( pFirst[0] == obj ) -+ return &pFirst[0]; -+ -+ return pEnd; -+ } -+ case 0: -+ { -+ return pEnd; -+ } -+ default: -+ { -+ __builtin_unreachable(); -+ } -+ } -+ } -+ -+ template -+ constexpr TIter Find( TIter pFirst, TIter pEnd, const TObj &obj ) -+ { -+ return FindSimple( pFirst, pEnd, obj ); -+ } -+ -+ template -+ constexpr TIter Find( std::span span, const TObj &obj ) -+ { -+ return Find( Begin( span ), End( span ), obj ); -+ } -+ -+ template -+ constexpr bool ContainsShortcut( TIter pFirst, TIter pEnd, const TObj &obj ) -+ { -+ return Find( pFirst, pEnd, obj ) != pEnd; -+ } -+ -+ template -+ constexpr bool ContainsNoShortcut( TIter pFirst, TIter pEnd, const TObj &obj ) -+ { -+ bool bFound = false; -+ -+ typename std::iterator_traits< TIter >::difference_type ulTripCount = ( pEnd - pFirst ) >> 2; -+ -+ while ( ulTripCount-- > 0 ) -+ { -+ bFound |= pFirst[0] == obj || -+ pFirst[1] == obj || -+ pFirst[2] == obj || -+ pFirst[3] == obj; -+ -+ pFirst += 4; -+ } -+ -+ switch ( pEnd - pFirst ) -+ { -+ case 3: -+ { -+ bFound |= pFirst[0] == obj || -+ pFirst[1] == obj || -+ pFirst[2] == obj; -+ break; -+ } -+ case 2: -+ { -+ bFound |= pFirst[0] == obj || -+ pFirst[1] == obj; -+ break; -+ } -+ case 1: -+ { -+ bFound |= pFirst[0] == obj; -+ break; -+ } -+ case 0: -+ { -+ break; -+ } -+ default: -+ { -+ __builtin_unreachable(); -+ } -+ } -+ -+ return bFound; -+ } -+ -+ template -+ constexpr bool Contains( TIter pFirst, TIter pEnd, const TObj &obj ) -+ { -+ return ContainsNoShortcut( pFirst, pEnd, obj ); -+ } -+ -+ template -+ constexpr bool Contains( std::span span, const TObj &obj ) -+ { -+ return Contains( Begin( span ), End( span ), obj ); -+ } -+} -diff --git a/src/color_bench.cpp b/src/color_bench.cpp -index 33dff78..9c9d986 100644 ---- a/src/color_bench.cpp -+++ b/src/color_bench.cpp -@@ -1,5 +1,9 @@ -+#include - #include - -+#include -+#include "Utils/Algorithm.h" -+ - #include "color_helpers.h" - - const uint32_t nLutSize1d = 4096; -@@ -74,4 +78,137 @@ static void BenchmarkCalcColorTransforms(benchmark::State &state) - } - BENCHMARK(BenchmarkCalcColorTransforms); - -+static constexpr uint32_t k_uFindTestValueCountLarge = 524288; -+static constexpr uint32_t k_uFindTestValueCountMedium = 16; -+static constexpr uint32_t k_uFindTestValueCountSmall = 5; -+ -+template -+static __attribute__((noinline)) std::array GetFindTestValues() -+{ -+ static std::array s_Values = []() -+ { -+ std::array values; -+ for ( uint32_t i = 0; i < uSize; i++ ) -+ values[i] = rand() % 255; -+ -+ return values; -+ }(); -+ -+ return s_Values; -+} -+ -+// Large -+ -+static void Benchmark_Find_Large_Gamescope(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ auto iter = gamescope::Algorithm::Find( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( iter ); -+ } -+} -+BENCHMARK(Benchmark_Find_Large_Gamescope); -+ -+static void Benchmark_Find_Large_Std(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ auto iter = std::find( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( iter ); -+ } -+} -+BENCHMARK(Benchmark_Find_Large_Std); -+ -+static void Benchmark_Contains_Large_Gamescope(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ bool bContains = gamescope::Algorithm::ContainsNoShortcut( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( bContains ); -+ } -+} -+BENCHMARK(Benchmark_Contains_Large_Gamescope); -+ -+// -+ -+static void Benchmark_Find_Medium_Gamescope(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ auto iter = gamescope::Algorithm::Find( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( iter ); -+ } -+} -+BENCHMARK(Benchmark_Find_Medium_Gamescope); -+ -+static void Benchmark_Find_Medium_Std(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ auto iter = std::find( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( iter ); -+ } -+} -+BENCHMARK(Benchmark_Find_Medium_Std); -+ -+static void Benchmark_Contains_Medium_Gamescope(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ bool bContains = gamescope::Algorithm::ContainsNoShortcut( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( bContains ); -+ } -+} -+BENCHMARK(Benchmark_Contains_Medium_Gamescope); -+ -+// -+ -+static void Benchmark_Find_Small_Gamescope(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ auto iter = gamescope::Algorithm::Find( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( iter ); -+ } -+} -+BENCHMARK(Benchmark_Find_Small_Gamescope); -+ -+static void Benchmark_Find_Small_Std(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ auto iter = std::find( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( iter ); -+ } -+} -+BENCHMARK(Benchmark_Find_Small_Std); -+ -+static void Benchmark_Contains_Small_Gamescope(benchmark::State &state) -+{ -+ std::array values = GetFindTestValues(); -+ -+ for (auto _ : state) -+ { -+ bool bContains = gamescope::Algorithm::ContainsNoShortcut( values.begin(), values.end(), 765678478 ); -+ benchmark::DoNotOptimize( bContains ); -+ } -+} -+BENCHMARK(Benchmark_Contains_Small_Gamescope); -+ - BENCHMARK_MAIN(); --- -2.45.2 - - -From 74a020865906414f9d4374fa5568fffce71e4027 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Mon, 15 Jul 2024 14:52:02 +0100 -Subject: [PATCH 02/19] Utils: Use Contains in CloseAllFds - ---- - src/Utils/Process.cpp | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/Utils/Process.cpp b/src/Utils/Process.cpp -index 5688fb1..32c52f1 100644 ---- a/src/Utils/Process.cpp -+++ b/src/Utils/Process.cpp -@@ -1,4 +1,5 @@ - #include "Process.h" -+#include "../Utils/Algorithm.h" - #include "../convar.h" - #include "../log.hpp" - #include "../Utils/Defer.h" -@@ -268,7 +269,7 @@ namespace gamescope::Process - - int nFd = *onFd; - -- bool bExcluded = std::find( nExcludedFds.begin(), nExcludedFds.end(), nFd ) != nExcludedFds.end(); -+ bool bExcluded = Algorithm::Contains( nExcludedFds, nFd ); - if ( bExcluded ) - continue; - --- -2.45.2 - - -From 3c5a232269ef8adef56423bf9b2bb48cb5c0cd1d Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Mon, 15 Jul 2024 15:52:33 +0100 -Subject: [PATCH 03/19] steamcompmgr: Only forward relative mouse mode if we - have a cursor constraint - ---- - src/steamcompmgr.cpp | 13 ++++++------- - src/wlserver.cpp | 32 +++++++++++++++++++------------- - src/wlserver.hpp | 26 +++++++++++++++++++++++++- - 3 files changed, 50 insertions(+), 21 deletions(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 9ee265d..f051463 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -682,7 +682,6 @@ constexpr const T& clamp( const T& x, const T& min, const T& max ) - } - - extern bool g_bForceRelativeMouse; --bool bSteamCompMgrGrab = false; - - CommitDoneList_t g_steamcompmgr_xdg_done_commits; - -@@ -7116,8 +7115,6 @@ steamcompmgr_main(int argc, char **argv) - // Reset getopt() state - optind = 1; - -- bSteamCompMgrGrab = GetBackend()->GetNestedHints() && g_bForceRelativeMouse; -- - int o; - int opt_index = -1; - bool bForceWindowsFullscreen = false; -@@ -7574,13 +7571,15 @@ steamcompmgr_main(int argc, char **argv) - - if ( GetBackend()->GetNestedHints() && !g_bForceRelativeMouse ) - { -- bool bImageEmpty = -+ const bool bImageEmpty = - ( global_focus.cursor && global_focus.cursor->imageEmpty() ) && - ( !window_is_steam( global_focus.inputFocusWindow ) ); - -- if ( GetBackend()->GetNestedHints() ) -- GetBackend()->GetNestedHints()->SetRelativeMouseMode( bImageEmpty ); -- bSteamCompMgrGrab = GetBackend()->GetNestedHints() && bImageEmpty; -+ const bool bHasPointerConstraint = wlserver.HasMouseConstraint(); // atomic, no lock needed -+ -+ const bool bRelativeMouseMode = bImageEmpty && bHasPointerConstraint; -+ -+ GetBackend()->GetNestedHints()->SetRelativeMouseMode( bRelativeMouseMode ); - } - - static int nIgnoredOverlayRepaints = 0; -diff --git a/src/wlserver.cpp b/src/wlserver.cpp -index ee6891d..1852be9 100644 ---- a/src/wlserver.cpp -+++ b/src/wlserver.cpp -@@ -225,7 +225,8 @@ std::optional PrepareCommit( struct wlr_surface *surf, struct wl - - struct wlr_surface *pConstraintSurface = wlserver_surface_to_main_surface( surf ); - -- if ( wlserver.mouse_constraint && wlserver.mouse_constraint->surface == pConstraintSurface ) -+ struct wlr_pointer_constraint_v1 *pConstraint = wlserver.GetCursorConstraint(); -+ if ( pConstraint && pConstraint->surface == pConstraintSurface ) - wlserver_update_cursor_constraint(); - - return oNewEntry; -@@ -2235,7 +2236,7 @@ struct GamescopePointerConstraint - - static void wlserver_warp_to_constraint_hint() - { -- struct wlr_pointer_constraint_v1 *pConstraint = wlserver.mouse_constraint; -+ struct wlr_pointer_constraint_v1 *pConstraint = wlserver.GetCursorConstraint(); - - if (pConstraint->current.cursor_hint.enabled) - { -@@ -2248,7 +2249,7 @@ static void wlserver_warp_to_constraint_hint() - - static void wlserver_update_cursor_constraint() - { -- struct wlr_pointer_constraint_v1 *pConstraint = wlserver.mouse_constraint; -+ struct wlr_pointer_constraint_v1 *pConstraint = wlserver.GetCursorConstraint(); - pixman_region32_t *pRegion = &pConstraint->region; - - if ( wlserver.mouse_constraint_requires_warp && pConstraint->surface ) -@@ -2278,27 +2279,29 @@ static void wlserver_update_cursor_constraint() - - static void wlserver_constrain_cursor( struct wlr_pointer_constraint_v1 *pNewConstraint ) - { -- if ( wlserver.mouse_constraint == pNewConstraint ) -+ struct wlr_pointer_constraint_v1 *pOldConstraint = wlserver.GetCursorConstraint(); -+ -+ if ( pOldConstraint == pNewConstraint ) - return; - -- if ( wlserver.mouse_constraint ) -+ if ( pOldConstraint ) - { - if ( !pNewConstraint ) - wlserver_warp_to_constraint_hint(); - -- wlr_pointer_constraint_v1_send_deactivated(wlserver.mouse_constraint); -+ wlr_pointer_constraint_v1_send_deactivated( pOldConstraint ); - } - -- wlserver.mouse_constraint = pNewConstraint; -+ wlserver.SetMouseConstraint( pNewConstraint ); - -- if ( !wlserver.mouse_constraint ) -+ if ( !pNewConstraint ) - return; - - wlserver.mouse_constraint_requires_warp = true; - - wlserver_update_cursor_constraint(); - -- wlr_pointer_constraint_v1_send_activated( wlserver.mouse_constraint ); -+ wlr_pointer_constraint_v1_send_activated( pNewConstraint ); - } - - static void handle_pointer_constraint_set_region(struct wl_listener *listener, void *data) -@@ -2316,11 +2319,12 @@ void handle_constraint_destroy(struct wl_listener *listener, void *data) - wl_list_remove(&pGamescopeConstraint->set_region.link); - wl_list_remove(&pGamescopeConstraint->destroy.link); - -- if (wlserver.mouse_constraint == pGamescopeConstraint->pConstraint) -+ struct wlr_pointer_constraint_v1 *pCurrentConstraint = wlserver.GetCursorConstraint(); -+ if ( pCurrentConstraint == pGamescopeConstraint->pConstraint ) - { - wlserver_warp_to_constraint_hint(); - -- wlserver.mouse_constraint = nullptr; -+ wlserver.SetMouseConstraint( nullptr ); - } - - delete pGamescopeConstraint; -@@ -2345,9 +2349,11 @@ static void handle_pointer_constraint(struct wl_listener *listener, void *data) - - static bool wlserver_apply_constraint( double *dx, double *dy ) - { -- if ( wlserver.mouse_constraint ) -+ struct wlr_pointer_constraint_v1 *pConstraint = wlserver.GetCursorConstraint(); -+ -+ if ( pConstraint ) - { -- if ( wlserver.mouse_constraint->type == WLR_POINTER_CONSTRAINT_V1_LOCKED ) -+ if ( pConstraint->type == WLR_POINTER_CONSTRAINT_V1_LOCKED ) - return false; - - double sx = wlserver.mouse_surface_cursorx; -diff --git a/src/wlserver.hpp b/src/wlserver.hpp -index db7d491..467c54d 100644 ---- a/src/wlserver.hpp -+++ b/src/wlserver.hpp -@@ -70,6 +70,8 @@ struct ResListEntry_t { - - struct wlserver_content_override; - -+bool wlserver_is_lock_held(void); -+ - class gamescope_xwayland_server_t - { - public: -@@ -149,7 +151,29 @@ struct wlserver_t { - double mouse_surface_cursory = 0.0f; - bool mouse_constraint_requires_warp = false; - pixman_region32_t confine; -- struct wlr_pointer_constraint_v1 *mouse_constraint = nullptr; -+ std::atomic mouse_constraint = { nullptr }; -+ -+ void SetMouseConstraint( struct wlr_pointer_constraint_v1 *pConstraint ) -+ { -+ assert( wlserver_is_lock_held() ); -+ // Set by wlserver only. Read by both wlserver + steamcompmgr with no -+ // need to actually be sequentially consistent. -+ mouse_constraint.store( pConstraint, std::memory_order_relaxed ); -+ } -+ -+ struct wlr_pointer_constraint_v1 *GetCursorConstraint() const -+ { -+ assert( wlserver_is_lock_held() ); -+ return mouse_constraint.load( std::memory_order_relaxed ); -+ } -+ -+ bool HasMouseConstraint() const -+ { -+ // Does not need to be sequentially consistent. -+ // Used by the steamcompmgr thread to check if there is currently a mouse constraint. -+ return mouse_constraint.load( std::memory_order_relaxed ) != nullptr; -+ } -+ - uint64_t ulLastMovedCursorTime = 0; - bool bCursorHidden = true; - bool bCursorHasImage = true; --- -2.45.2 - - -From 745d0d6a09e53a8481bc94c67e3a3ae5c86c8796 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Mon, 15 Jul 2024 20:21:16 +0100 -Subject: [PATCH 04/19] convar: Add some helpers for std::string convars and - callbacks - ---- - src/convar.h | 34 ++++++++++++++++++++++++++++++++-- - 1 file changed, 32 insertions(+), 2 deletions(-) - -diff --git a/src/convar.h b/src/convar.h -index c08dccb..f2a0485 100644 ---- a/src/convar.h -+++ b/src/convar.h -@@ -20,6 +20,24 @@ namespace gamescope - { - class ConCommand; - -+ template -+ inline std::string ToString( const T &thing ) -+ { -+ return std::to_string( thing ); -+ } -+ -+ template <> -+ inline std::string ToString( const std::string &sThing ) -+ { -+ return sThing; -+ } -+ -+ template <> -+ inline std::string ToString( const std::string_view &svThing ) -+ { -+ return std::string( svThing ); -+ } -+ - template - inline std::optional Parse( std::string_view chars ) - { -@@ -113,11 +131,15 @@ namespace gamescope - { - using ConVarCallbackFunc = std::function; - public: -- ConVar( std::string_view pszName, T defaultValue = T{}, std::string_view pszDescription = "", ConVarCallbackFunc func = nullptr ) -+ ConVar( std::string_view pszName, T defaultValue = T{}, std::string_view pszDescription = "", ConVarCallbackFunc func = nullptr, bool bRunCallbackAtStartup = false ) - : ConCommand( pszName, pszDescription, [this]( std::span pArgs ){ this->InvokeFunc( pArgs ); } ) - , m_Value{ defaultValue } - , m_Callback{ func } - { -+ if ( bRunCallbackAtStartup ) -+ { -+ RunCallback(); -+ } - } - - const T& Get() const -@@ -130,6 +152,11 @@ namespace gamescope - { - m_Value = T{ newValue }; - -+ RunCallback(); -+ } -+ -+ void RunCallback() -+ { - if ( !m_bInCallback && m_Callback ) - { - m_bInCallback = true; -@@ -143,6 +170,9 @@ namespace gamescope - - operator T() const { return m_Value; } - -+ // SFINAE for std::string... -+ operator std::string_view() const { return m_Value; } -+ - template bool operator == ( const J &other ) const { return m_Value == other; } - template bool operator != ( const J &other ) const { return m_Value != other; } - template auto operator <=>( const J &other ) const { return m_Value <=> other; } -@@ -158,7 +188,7 @@ namespace gamescope - { - // We should move to std format for logging and stuff. - // This is kinda gross and grody! -- std::string sValue = std::to_string( m_Value ); -+ std::string sValue = ToString( m_Value ); - console_log.infof( "%.*s: %.*s\n%.*s", - (int)m_pszName.length(), m_pszName.data(), - (int)sValue.length(), sValue.data(), --- -2.45.2 - - -From 69f94d99082f4b0c5e06c384d65705739608ca2f Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Mon, 15 Jul 2024 20:21:30 +0100 -Subject: [PATCH 05/19] Utils: Add helpers for std::vector in our Algorithm - helpers - ---- - src/Utils/Algorithm.h | 25 +++++++++++++++++++++++++ - 1 file changed, 25 insertions(+) - -diff --git a/src/Utils/Algorithm.h b/src/Utils/Algorithm.h -index 7290367..eb51a79 100644 ---- a/src/Utils/Algorithm.h -+++ b/src/Utils/Algorithm.h -@@ -2,6 +2,7 @@ - - #include - #include -+#include - - namespace gamescope::Algorithm - { -@@ -17,6 +18,18 @@ namespace gamescope::Algorithm - return Begin( span ) + span.size(); - } - -+ template -+ constexpr const TObj *Begin( const std::vector &vec ) -+ { -+ return vec.data(); -+ } -+ -+ template -+ constexpr const TObj *End( const std::vector &vec ) -+ { -+ return Begin( vec ) + vec.size(); -+ } -+ - template - constexpr TIter FindSimple( TIter pFirst, TIter pEnd, const TObj &obj ) - { -@@ -103,6 +116,12 @@ namespace gamescope::Algorithm - return Find( Begin( span ), End( span ), obj ); - } - -+ template -+ constexpr TIter Find( const std::vector &vec, const TObj &obj ) -+ { -+ return Find( Begin( vec ), End( vec ), obj ); -+ } -+ - template - constexpr bool ContainsShortcut( TIter pFirst, TIter pEnd, const TObj &obj ) - { -@@ -170,4 +189,10 @@ namespace gamescope::Algorithm - { - return Contains( Begin( span ), End( span ), obj ); - } -+ -+ template -+ constexpr bool Contains( const std::vector &vec, const TObj &obj ) -+ { -+ return Contains( Begin( vec ), End( vec ), obj ); -+ } - } --- -2.45.2 - - -From dade66318d852387bf8f1e91427dc7e2b5511826 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Mon, 15 Jul 2024 20:28:05 +0100 -Subject: [PATCH 06/19] steamcompmgr: Add filter appids for relative mouse mode - ---- - src/steamcompmgr.cpp | 27 ++++++++++++++++++++++++++- - 1 file changed, 26 insertions(+), 1 deletion(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index f051463..b955a0c 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -92,6 +92,7 @@ - #include "commit.h" - #include "BufferMemo.h" - #include "Utils/Process.h" -+#include "Utils/Algorithm.h" - - #if HAVE_AVIF - #include "avif/avif.h" -@@ -7022,6 +7023,24 @@ static gamescope::ConCommand cc_launch( "launch", "Launch an application with th - gamescope::ConVar cv_shutdown_on_primary_child_death( "shutdown_on_primary_child_death", true, "Should gamescope shutdown when the primary application launched in it was shut down?" ); - static LogScope s_LaunchLogScope( "launch" ); - -+static std::vector s_uRelativeMouseFilteredAppids; -+static gamescope::ConVar cv_mouse_relative_filter_appids( "mouse_relative_filter_appids", -+"8400" /* Geometry Wars: Retro Evolved */, -+"Comma separated appids to filter out using relative mouse mode for.", -+[]() -+{ -+ std::vector sFilterAppids = gamescope::Split( cv_mouse_relative_filter_appids, "," ); -+ std::vector uFilterAppids; -+ uFilterAppids.reserve( sFilterAppids.size() ); -+ for ( auto &sFilterAppid : sFilterAppids ) -+ { -+ std::optional ouFilterAppid = gamescope::Parse( sFilterAppid ); -+ uFilterAppids.push_back( *ouFilterAppid ); -+ } -+ -+ s_uRelativeMouseFilteredAppids = std::move( uFilterAppids ); -+}, true); -+ - void LaunchNestedChildren( char **ppPrimaryChildArgv ) - { - std::string sNewPreload; -@@ -7577,7 +7596,13 @@ steamcompmgr_main(int argc, char **argv) - - const bool bHasPointerConstraint = wlserver.HasMouseConstraint(); // atomic, no lock needed - -- const bool bRelativeMouseMode = bImageEmpty && bHasPointerConstraint; -+ uint32_t uAppId = global_focus.inputFocusWindow -+ ? global_focus.inputFocusWindow->appID -+ : 0; -+ -+ const bool bExcludedAppId = uAppId && gamescope::Algorithm::Contains( s_uRelativeMouseFilteredAppids, uAppId ); -+ -+ const bool bRelativeMouseMode = bImageEmpty && bHasPointerConstraint && !bExcludedAppId; - - GetBackend()->GetNestedHints()->SetRelativeMouseMode( bRelativeMouseMode ); - } --- -2.45.2 - - -From 6c187b7f69d5f7e7d1a01728c1c22e055a1683f6 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Thu, 18 Jul 2024 00:53:44 +0100 -Subject: [PATCH 07/19] steamcompmgr: Add adaptive sync convar - ---- - src/Backends/OpenVRBackend.cpp | 1 - - src/Backends/WaylandBackend.cpp | 4 ++-- - src/main.cpp | 4 ++-- - src/steamcompmgr.cpp | 8 ++++---- - 4 files changed, 8 insertions(+), 9 deletions(-) - -diff --git a/src/Backends/OpenVRBackend.cpp b/src/Backends/OpenVRBackend.cpp -index acc84ed..79b05d1 100644 ---- a/src/Backends/OpenVRBackend.cpp -+++ b/src/Backends/OpenVRBackend.cpp -@@ -38,7 +38,6 @@ extern int g_nPreferredOutputWidth; - extern int g_nPreferredOutputHeight; - extern bool g_bForceHDR10OutputDebug; - extern bool g_bBorderlessOutputWindow; --extern bool g_bAllowVRR; - - extern gamescope::ConVar cv_composite_force; - extern bool g_bColorSliderInUse; -diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp -index 6f578a2..3603be7 100644 ---- a/src/Backends/WaylandBackend.cpp -+++ b/src/Backends/WaylandBackend.cpp -@@ -40,7 +40,7 @@ extern int g_nPreferredOutputWidth; - extern int g_nPreferredOutputHeight; - extern bool g_bForceHDR10OutputDebug; - extern bool g_bBorderlessOutputWindow; --extern bool g_bAllowVRR; -+extern gamescope::ConVar cv_adaptive_sync; - - extern gamescope::ConVar cv_composite_force; - extern bool g_bColorSliderInUse; -@@ -1531,7 +1531,7 @@ namespace gamescope - } - bool CWaylandBackend::IsVRRActive() const - { -- return g_bAllowVRR && m_bHostCompositorIsCurrentlyVRR; -+ return cv_adaptive_sync && m_bHostCompositorIsCurrentlyVRR; - } - - bool CWaylandBackend::SupportsPlaneHardwareCursor() const -diff --git a/src/main.cpp b/src/main.cpp -index cd4aeca..da1b516 100644 ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -42,7 +42,7 @@ - using namespace std::literals; - - EStreamColorspace g_ForcedNV12ColorSpace = k_EStreamColorspace_Unknown; --extern bool g_bAllowVRR; -+extern gamescope::ConVar cv_adaptive_sync; - - const char *gamescope_optstring = nullptr; - const char *g_pOriginalDisplay = nullptr; -@@ -765,7 +765,7 @@ int main(int argc, char **argv) - } else if (strcmp(opt_name, "display-index") == 0) { - g_nNestedDisplayIndex = atoi( optarg ); - } else if (strcmp(opt_name, "adaptive-sync") == 0) { -- g_bAllowVRR = true; -+ cv_adaptive_sync = true; - } else if (strcmp(opt_name, "expose-wayland") == 0) { - g_bExposeWayland = true; - } else if (strcmp(opt_name, "backend") == 0) { -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index b955a0c..b8102eb 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -187,7 +187,7 @@ timespec nanos_to_timespec( uint64_t ulNanos ) - static void - update_runtime_info(); - --bool g_bAllowVRR = false; -+gamescope::ConVar cv_adaptive_sync( "adaptive_sync", false, "Whether or not adaptive sync is enabled if available." ); - - uint64_t g_SteamCompMgrLimitedAppRefreshCycle = 16'666'666; - uint64_t g_SteamCompMgrAppRefreshCycle = 16'666'666; -@@ -2229,7 +2229,7 @@ paint_all(bool async) - struct FrameInfo_t frameInfo = {}; - frameInfo.applyOutputColorMgmt = g_ColorMgmt.pending.enabled; - frameInfo.outputEncodingEOTF = g_ColorMgmt.pending.outputEncodingEOTF; -- frameInfo.allowVRR = g_bAllowVRR; -+ frameInfo.allowVRR = cv_adaptive_sync; - frameInfo.bFadingOut = fadingOut; - - // If the window we'd paint as the base layer is the streaming client, -@@ -5410,7 +5410,7 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - if ( ev->atom == ctx->atoms.gamescopeVRREnabled ) - { - bool enabled = !!get_prop( ctx, ctx->root, ctx->atoms.gamescopeVRREnabled, 0 ); -- g_bAllowVRR = enabled; -+ cv_adaptive_sync = enabled; - } - if ( ev->atom == ctx->atoms.gamescopeDisplayForceInternal ) - { -@@ -6886,7 +6886,7 @@ void update_vrr_atoms(xwayland_ctx_t *root_ctx, bool force, bool* needs_flush = - // Keep this as a preference, starting with off. - if ( force ) - { -- bool wants_vrr = g_bAllowVRR; -+ bool wants_vrr = cv_adaptive_sync; - uint32_t enabled_value = wants_vrr ? 1 : 0; - XChangeProperty(root_ctx->dpy, root_ctx->root, root_ctx->atoms.gamescopeVRREnabled, XA_CARDINAL, 32, PropModeReplace, - (unsigned char *)&enabled_value, 1 ); --- -2.45.2 - - -From 1ebfacbb7477437ef295eb821a972ff3cfe992df Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Thu, 18 Jul 2024 01:14:19 +0100 -Subject: [PATCH 08/19] WaylandBackend: Fix picking output refresh for VRR - displays. - ---- - src/Backends/WaylandBackend.cpp | 69 ++++++++++++++++++++++++++++++++- - 1 file changed, 68 insertions(+), 1 deletion(-) - -diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp -index 3603be7..b7f275e 100644 ---- a/src/Backends/WaylandBackend.cpp -+++ b/src/Backends/WaylandBackend.cpp -@@ -5,6 +5,7 @@ - #include "steamcompmgr.hpp" - #include "edid.h" - #include "Utils/Defer.h" -+#include "Utils/Algorithm.h" - #include "convar.h" - #include "refresh_rate.h" - #include "waitable.h" -@@ -186,8 +187,14 @@ namespace gamescope - - std::optional GetCurrentState() { std::unique_lock lock( m_PlaneStateLock ); return m_oCurrentPlaneState; } - -+ void UpdateVRRRefreshRate(); -+ - private: - -+ void Wayland_Surface_Enter( wl_surface *pSurface, wl_output *pOutput ); -+ void Wayland_Surface_Leave( wl_surface *pSurface, wl_output *pOutput ); -+ static const wl_surface_listener s_SurfaceListener; -+ - void LibDecor_Frame_Configure( libdecor_frame *pFrame, libdecor_configuration *pConfiguration ); - void LibDecor_Frame_Close( libdecor_frame *pFrame ); - void LibDecor_Frame_Commit( libdecor_frame *pFrame ); -@@ -228,12 +235,20 @@ namespace gamescope - frog_color_managed_surface *m_pFrogColorManagedSurface = nullptr; - wp_fractional_scale_v1 *m_pFractionalScale = nullptr; - libdecor_window_state m_eWindowState = LIBDECOR_WINDOW_STATE_NONE; -+ std::vector m_pOutputs; - bool m_bNeedsDecorCommit = false; - uint32_t m_uFractionalScale = 120; - - std::mutex m_PlaneStateLock; - std::optional m_oCurrentPlaneState; - }; -+ const wl_surface_listener CWaylandPlane::s_SurfaceListener = -+ { -+ .enter = WAYLAND_USERDATA_TO_THIS( CWaylandPlane, Wayland_Surface_Enter ), -+ .leave = WAYLAND_USERDATA_TO_THIS( CWaylandPlane, Wayland_Surface_Leave ), -+ .preferred_buffer_scale = WAYLAND_NULL(), -+ .preferred_buffer_transform = WAYLAND_NULL(), -+ }; - // Can't be const, libdecor api bad... - libdecor_frame_interface CWaylandPlane::s_LibDecorFrameInterface = - { -@@ -540,9 +555,19 @@ namespace gamescope - - bool SupportsFormat( uint32_t uDRMFormat ) const; - -+ bool HostCompositorIsCurrentlyVRR() const { return m_bHostCompositorIsCurrentlyVRR; } - void SetHostCompositorIsCurrentlyVRR( bool bActive ) { m_bHostCompositorIsCurrentlyVRR = bActive; } - -- bool CurrentDisplaySupportsVRR() const { return m_bHostCompositorIsCurrentlyVRR; } -+ WaylandOutputInfo *GetOutputInfo( wl_output *pOutput ) -+ { -+ auto iter = m_pOutputs.find( pOutput ); -+ if ( iter == m_pOutputs.end() ) -+ return nullptr; -+ -+ return &iter->second; -+ } -+ -+ bool CurrentDisplaySupportsVRR() const { return HostCompositorIsCurrentlyVRR(); } - wl_region *GetFullRegion() const { return m_pFullRegion; } - - private: -@@ -819,6 +844,7 @@ namespace gamescope - m_pParent = pParent; - m_pSurface = wl_compositor_create_surface( m_pBackend->GetCompositor() ); - wl_surface_set_user_data( m_pSurface, this ); -+ wl_surface_add_listener( m_pSurface, &s_SurfaceListener, this ); - - m_pViewport = wp_viewporter_get_viewport( m_pBackend->GetViewporter(), m_pSurface ); - -@@ -1005,6 +1031,45 @@ namespace gamescope - } - } - -+ void CWaylandPlane::UpdateVRRRefreshRate() -+ { -+ if ( m_pParent ) -+ return; -+ -+ if ( !m_pBackend->HostCompositorIsCurrentlyVRR() ) -+ return; -+ -+ if ( m_pOutputs.empty() ) -+ return; -+ -+ int32_t nLargestRefreshRateMhz = 0; -+ for ( wl_output *pOutput : m_pOutputs ) -+ { -+ WaylandOutputInfo *pOutputInfo = m_pBackend->GetOutputInfo( pOutput ); -+ if ( !pOutputInfo ) -+ continue; -+ -+ nLargestRefreshRateMhz = std::max( nLargestRefreshRateMhz, pOutputInfo->nRefresh ); -+ } -+ -+ if ( nLargestRefreshRateMhz && nLargestRefreshRateMhz != g_nOutputRefresh ) -+ { -+ xdg_log.infof( "Changed refresh to: %.3fhz", ConvertmHzToHz( (float) nLargestRefreshRateMhz ) ); -+ g_nOutputRefresh = nLargestRefreshRateMhz; -+ } -+ } -+ -+ void CWaylandPlane::Wayland_Surface_Enter( wl_surface *pSurface, wl_output *pOutput ) -+ { -+ m_pOutputs.emplace_back( pOutput ); -+ -+ UpdateVRRRefreshRate(); -+ } -+ void CWaylandPlane::Wayland_Surface_Leave( wl_surface *pSurface, wl_output *pOutput ) -+ { -+ std::erase( m_pOutputs, pOutput ); -+ } -+ - void CWaylandPlane::LibDecor_Frame_Configure( libdecor_frame *pFrame, libdecor_configuration *pConfiguration ) - { - if ( !libdecor_configuration_get_window_state( pConfiguration, &m_eWindowState ) ) -@@ -1060,6 +1125,8 @@ namespace gamescope - else - { - m_pBackend->SetHostCompositorIsCurrentlyVRR( true ); -+ -+ UpdateVRRRefreshRate(); - } - - GetVBlankTimer().MarkVBlank( ulTime, true ); --- -2.45.2 - - -From 37cc4d368b3804215b9b4bb2719a3ac2b64cf2e6 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Thu, 18 Jul 2024 01:18:17 +0100 -Subject: [PATCH 09/19] WaylandBackend: Run UpdateVRRRefreshRate on - Wayland_Surface_Leave - ---- - src/Backends/WaylandBackend.cpp | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp -index b7f275e..3aac004 100644 ---- a/src/Backends/WaylandBackend.cpp -+++ b/src/Backends/WaylandBackend.cpp -@@ -1068,6 +1068,8 @@ namespace gamescope - void CWaylandPlane::Wayland_Surface_Leave( wl_surface *pSurface, wl_output *pOutput ) - { - std::erase( m_pOutputs, pOutput ); -+ -+ UpdateVRRRefreshRate(); - } - - void CWaylandPlane::LibDecor_Frame_Configure( libdecor_frame *pFrame, libdecor_configuration *pConfiguration ) --- -2.45.2 - - -From 853cb9879505efea832ddc05517f57e06d410739 Mon Sep 17 00:00:00 2001 -From: CakeKing64 -Date: Sat, 20 Jul 2024 17:39:35 +1000 -Subject: [PATCH 10/19] WaylandBackend: Restore fullscreen state if returning - from not being visible - ---- - src/Backends/WaylandBackend.cpp | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp -index 3aac004..8c98689 100644 ---- a/src/Backends/WaylandBackend.cpp -+++ b/src/Backends/WaylandBackend.cpp -@@ -1863,7 +1863,10 @@ namespace gamescope - - void CWaylandBackend::UpdateFullscreenState() - { -- if ( m_bDesiredFullscreenState != g_bFullscreen ) -+ if ( !m_bVisible ) -+ g_bFullscreen = false; -+ -+ if ( m_bDesiredFullscreenState != g_bFullscreen && m_bVisible ) - { - if ( m_bDesiredFullscreenState ) - libdecor_frame_set_fullscreen( m_Planes[0].GetFrame(), nullptr ); --- -2.45.2 - - -From 96f141d8b8453f9c28872e8ffc94a29d81d0758d Mon Sep 17 00:00:00 2001 -From: flightlessmango -Date: Mon, 22 Jul 2024 17:47:30 +0200 -Subject: [PATCH 11/19] mangoapp: only set env in steammode - -MANGOHUD_CONFIGFILE should only be set by gamescope if we're in steamMode. -This is causing confusion for regular users as it prevents usage of -the standard mangohud config paths ---- - src/main.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/main.cpp b/src/main.cpp -index da1b516..96484dc 100644 ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -613,7 +613,7 @@ static void UpdateCompatEnvVars() - setenv( "GAMESCOPE_NV12_COLORSPACE", "k_EStreamColorspace_BT601", 0 ); - - const char *pszMangoConfigPath = getenv( "MANGOHUD_CONFIGFILE" ); -- if ( g_bLaunchMangoapp && ( !pszMangoConfigPath || !*pszMangoConfigPath ) ) -+ if ( (g_bLaunchMangoapp && steamMode) && ( !pszMangoConfigPath || !*pszMangoConfigPath ) ) - { - char szMangoConfigPath[ PATH_MAX ]; - FILE *pMangoConfigFile = gamescope::MakeTempFile( szMangoConfigPath, gamescope::k_szGamescopeTempMangoappTemplate, "w", true ); --- -2.45.2 - - -From 634d739ac609c6550d30a759fb2bc2fa616e0997 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Wed, 24 Jul 2024 17:00:13 +0100 -Subject: [PATCH 12/19] backend: Add dump debug info command - ---- - src/backend.cpp | 27 +++++++++++++++++++++++++++ - src/backend.h | 4 ++++ - src/steamcompmgr.cpp | 19 +++++++++++++++++++ - 3 files changed, 50 insertions(+) - -diff --git a/src/backend.cpp b/src/backend.cpp -index d11fcca..91ad0ef 100644 ---- a/src/backend.cpp -+++ b/src/backend.cpp -@@ -120,4 +120,31 @@ namespace gamescope - - return cv_touch_click_mode; - } -+ -+ void CBaseBackend::DumpDebugInfo() -+ { -+ console_log.infof( "Uses Modifiers: %s", this->UsesModifiers() ? "true" : "false" ); -+ console_log.infof( "VRR Active: %s", this->IsVRRActive() ? "true" : "false" ); -+ console_log.infof( "Supports Plane Hardware Cursor: %s (not relevant for nested backends)", this->SupportsPlaneHardwareCursor() ? "true" : "false" ); -+ console_log.infof( "Supports Tearing: %s", this->SupportsTearing() ? "true" : "false" ); -+ console_log.infof( "Uses Vulkan Swapchain: %s", this->UsesVulkanSwapchain() ? "true" : "false" ); -+ console_log.infof( "Is Session Based: %s", this->IsSessionBased() ? "true" : "false" ); -+ console_log.infof( "Supports Explicit Sync: %s", this->SupportsExplicitSync() ? "true" : "false" ); -+ console_log.infof( "Current Screen Type: %s", this->GetScreenType() == GAMESCOPE_SCREEN_TYPE_INTERNAL ? "Internal" : "External" ); -+ console_log.infof( "Is Visible: %s", this->IsVisible() ? "true" : "false" ); -+ console_log.infof( "Is Nested: %s", this->GetNestedHints() != nullptr ? "true" : "false" ); -+ console_log.infof( "Needs Frame Sync: %s", this->NeedsFrameSync() ? "true" : "false" ); -+ console_log.infof( "Total Presents Queued: %lu", this->PresentationFeedback().TotalPresentsQueued() ); -+ console_log.infof( "Total Presents Completed: %lu", this->PresentationFeedback().TotalPresentsCompleted() ); -+ console_log.infof( "Current Presents In Flight: %lu", this->PresentationFeedback().CurrentPresentsInFlight() ); -+ } -+ -+ ConCommand cc_backend_info( "backend_info", "Dump debug info about the backend state", -+ []( std::span svArgs ) -+ { -+ if ( !GetBackend() ) -+ return; -+ -+ GetBackend()->DumpDebugInfo(); -+ }); - } -diff --git a/src/backend.h b/src/backend.h -index 9c2db15..4f91fe7 100644 ---- a/src/backend.h -+++ b/src/backend.h -@@ -236,6 +236,8 @@ namespace gamescope - - virtual TouchClickMode GetTouchClickMode() = 0; - -+ virtual void DumpDebugInfo() = 0; -+ - static IBackend *Get(); - template - static bool Set(); -@@ -263,6 +265,8 @@ namespace gamescope - virtual BackendPresentFeedback& PresentationFeedback() override { return m_PresentFeedback; } - - virtual TouchClickMode GetTouchClickMode() override; -+ -+ virtual void DumpDebugInfo() override; - protected: - BackendPresentFeedback m_PresentFeedback{}; - }; -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index b8102eb..60ddbbe 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -856,6 +856,25 @@ void steamcompmgr_set_app_refresh_cycle_override( gamescope::GamescopeScreenType - update_app_target_refresh_cycle(); - } - -+gamescope::ConCommand cc_debug_set_fps_limit( "debug_set_fps_limit", "Set refresh cycle (debug)", -+[](std::span svArgs) -+{ -+ if ( svArgs.size() < 2 ) -+ return; -+ -+ // TODO: Expose all facets as args. -+ std::optional onFps = gamescope::Parse( svArgs[1] ); -+ if ( !onFps ) -+ { -+ console_log.errorf( "Failed to parse FPS." ); -+ return; -+ } -+ -+ int32_t nFps = *onFps; -+ -+ steamcompmgr_set_app_refresh_cycle_override( GetBackend()->GetScreenType(), nFps, true, true ); -+}); -+ - static int g_nRuntimeInfoFd = -1; - - bool g_bFSRActive = false; --- -2.45.2 - - -From e2a277e15b7f6b7075e0433a5b9605168faf91b5 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Wed, 24 Jul 2024 17:00:35 +0100 -Subject: [PATCH 13/19] WaylandBackend: Beginnings of support for - xx-color-management-v3 - ---- - protocol/meson.build | 3 + - protocol/xx-color-management-v3.xml | 1421 +++++++++++++++++++++++++++ - src/Backends/WaylandBackend.cpp | 229 ++++- - src/backend.h | 3 +- - 4 files changed, 1645 insertions(+), 11 deletions(-) - create mode 100644 protocol/xx-color-management-v3.xml - -diff --git a/protocol/meson.build b/protocol/meson.build -index 9af3607..5eb681e 100644 ---- a/protocol/meson.build -+++ b/protocol/meson.build -@@ -37,6 +37,9 @@ protocols = [ - - # wlroots protocols - 'wlr-layer-shell-unstable-v1.xml', -+ -+ # WIP protocols -+ 'xx-color-management-v3.xml', - ] - - protocols_client_src = [] -diff --git a/protocol/xx-color-management-v3.xml b/protocol/xx-color-management-v3.xml -new file mode 100644 -index 0000000..e637a25 ---- /dev/null -+++ b/protocol/xx-color-management-v3.xml -@@ -0,0 +1,1421 @@ -+ -+ -+ -+ Copyright 2019 Sebastian Wick -+ Copyright 2019 Erwin Burema -+ Copyright 2020 AMD -+ Copyright 2020-2024 Collabora, Ltd. -+ -+ 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. -+ -+ -+ -+ The aim of the color management extension is to allow clients to know -+ the color properties of outputs, and to tell the compositor about the color -+ properties of their content on surfaces. Doing this enables a compositor -+ to perform automatic color management of content for different outputs -+ according to how content is intended to look like. -+ -+ The color properties are represented as an image description object which -+ is immutable after it has been created. A wl_output always has an -+ associated image description that clients can observe. A wl_surface -+ always has an associated preferred image description as a hint chosen by -+ the compositor that clients can also observe. Clients can set an image -+ description on a wl_surface to denote the color characteristics of the -+ surface contents. -+ -+ An image description includes SDR and HDR colorimetry and encoding, HDR -+ metadata, and viewing environment parameters. An image description does -+ not include the properties set through color-representation extension. -+ It is expected that the color-representation extension is used in -+ conjunction with the color management extension when necessary, -+ particularly with the YUV family of pixel formats. -+ -+ Recommendation ITU-T H.273 -+ "Coding-independent code points for video signal type identification" -+ shall be referred to as simply H.273 here. -+ -+ The color-and-hdr repository -+ (https://gitlab.freedesktop.org/pq/color-and-hdr) contains -+ background information on the protocol design and legacy color management. -+ It also contains a glossary, learning resources for digital color, tools, -+ samples and more. -+ -+ The terminology used in this protocol is based on common color science and -+ color encoding terminology where possible. The glossary in the color-and-hdr -+ repository shall be the authority on the definition of terms in this -+ protocol. -+ -+ -+ -+ -+ A global interface used for getting color management extensions for -+ wl_surface and wl_output objects, and for creating client defined image -+ description objects. The extension interfaces allow -+ getting the image description of outputs and setting the image -+ description of surfaces. -+ -+ -+ -+ -+ Destroy the xx_color_manager_v3 object. This does not affect any other -+ objects in any way. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ See the ICC.1:2022 specification from the International Color Consortium -+ for more details about rendering intents. -+ -+ The principles of ICC defined rendering intents apply with all types of -+ image descriptions, not only those with ICC file profiles. -+ -+ Compositors must support the perceptual rendering intent. Other -+ rendering intents are optional. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The compositor supports set_mastering_display_primaries request with a -+ target color volume fully contained inside the primary color volume. -+ -+ -+ -+ -+ The compositor additionally supports target color volumes that -+ extend outside of the primary color volume. -+ -+ This can only be advertised if feature set_mastering_display_primaries -+ is supported as well. -+ -+ -+ -+ -+ -+ -+ Named color primaries used to encode well-known sets of primaries. H.273 -+ is the authority, when it comes to the exact values of primaries and -+ authoritative specifications, where an equivalent code point exists. -+ -+ Descriptions do list the specifications for convenience. -+ -+ -+ -+ -+ Color primaries as defined by -+ - Rec. ITU-R BT.709-6 -+ - Rec. ITU-R BT.1361-0 conventional colour gamut system and extended -+ colour gamut system (historical) -+ - IEC 61966-2-1 sRGB or sYCC -+ - IEC 61966-2-4 -+ - Society of Motion Picture and Television Engineers (SMPTE) RP 177 -+ (1993) Annex B -+ Equivalent to H.273 ColourPrimaries code point 1. -+ -+ -+ -+ -+ Color primaries as defined by -+ - Rec. ITU-R BT.470-6 System M (historical) -+ - United States National Television System Committee 1953 -+ Recommendation for transmission standards for color television -+ - United States Federal Communications Commission (2003) Title 47 Code -+ of Federal Regulations 73.682 (a)(20) -+ Equivalent to H.273 ColourPrimaries code point 4. -+ -+ -+ -+ -+ Color primaries as defined by -+ - Rec. ITU-R BT.470-6 System B, G (historical) -+ - Rec. ITU-R BT.601-7 625 -+ - Rec. ITU-R BT.1358-0 625 (historical) -+ - Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM -+ Equivalent to H.273 ColourPrimaries code point 5. -+ -+ -+ -+ -+ Color primaries as defined by -+ - Rec. ITU-R BT.601-7 525 -+ - Rec. ITU-R BT.1358-1 525 or 625 (historical) -+ - Rec. ITU-R BT.1700-0 NTSC -+ - SMPTE 170M (2004) -+ - SMPTE 240M (1999) (historical) -+ Equivalent to H.273 ColourPrimaries code point 6 and 7. -+ -+ -+ -+ -+ Color primaries as defined by H.273 for generic film. -+ Equivalent to H.273 ColourPrimaries code point 8. -+ -+ -+ -+ -+ Color primaries as defined by -+ - Rec. ITU-R BT.2020-2 -+ - Rec. ITU-R BT.2100-0 -+ Equivalent to H.273 ColourPrimaries code point 9. -+ -+ -+ -+ -+ Color primaries as defined as the maximum of the CIE 1931 XYZ color -+ space by -+ - SMPTE ST 428-1 -+ - (CIE 1931 XYZ as in ISO 11664-1) -+ Equivalent to H.273 ColourPrimaries code point 10. -+ -+ -+ -+ -+ Color primaries as defined by Digital Cinema System and published in -+ SMPTE RP 431-2 (2011). Equivalent to H.273 ColourPrimaries code point -+ 11. -+ -+ -+ -+ -+ Color primaries as defined by Digital Cinema System and published in -+ SMPTE EG 432-1 (2010). -+ Equivalent to H.273 ColourPrimaries code point 12. -+ -+ -+ -+ -+ Color primaries as defined by Adobe as "Adobe RGB" and later published -+ by ISO 12640-4 (2011). -+ -+ -+ -+ -+ -+ -+ Named transfer functions used to encode well-known transfer -+ characteristics. H.273 is the authority, when it comes to the exact -+ formulas and authoritative specifications, where an equivalent code -+ point exists. -+ -+ Descriptions do list the specifications for convenience. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - Rec. ITU-R BT.709-6 -+ - Rec. ITU-R BT.1361-0 conventional colour gamut system (historical) -+ Equivalent to H.273 TransferCharacteristics code point 1, 6, 14, 15. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - Rec. ITU-R BT.470-6 System M (historical) -+ - United States National Television System Committee 1953 -+ Recommendation for transmission standards for color television -+ - United States Federal Communications Commission (2003) Title 47 Code -+ of Federal Regulations 73.682 (a) (20) -+ - Rec. ITU-R BT.1700-0 625 PAL and 625 SECAM -+ Equivalent to H.273 TransferCharacteristics code point 4. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - Rec. ITU-R BT.470-6 System B, G (historical) -+ Equivalent to H.273 TransferCharacteristics code point 5. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - SMPTE ST 240 (1999) -+ Equivalent to H.273 TransferCharacteristics code point 7. -+ -+ -+ -+ -+ Linear transfer characteristics. -+ Equivalent to H.273 TransferCharacteristics code point 8. -+ -+ -+ -+ -+ Logarithmic transfer characteristic (100:1 range). -+ Equivalent to H.273 TransferCharacteristics code point 9. -+ -+ -+ -+ -+ Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range). -+ Equivalent to H.273 TransferCharacteristics code point 10. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - IEC 61966-2-4 -+ Equivalent to H.273 TransferCharacteristics code point 11. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - Rec. ITU-R BT.1361-0 extended colour gamut system (historical) -+ Equivalent to H.273 TransferCharacteristics code point 12. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - IEC 61966-2-1 sRGB -+ Equivalent to H.273 TransferCharacteristics code point 13 with -+ MatrixCoefficients set to 0. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - IEC 61966-2-1 sYCC -+ Equivalent to H.273 TransferCharacteristics code point 13 with -+ MatrixCoefficients set to anything but 0. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - SMPTE ST 2084 (2014) for 10-, 12-, 14- and 16-bit systems -+ - Rec. ITU-R BT.2100-2 perceptual quantization (PQ) system -+ Equivalent to H.273 TransferCharacteristics code point 16. -+ -+ This TF implies these default luminances -+ - primary color volume minimum: 0.005 cd/m² -+ - primary color volume maximum: 10000 cd/m² -+ - reference white: 203 cd/m² -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - SMPTE ST 428-1 (2019) -+ Equivalent to H.273 TransferCharacteristics code point 17. -+ -+ -+ -+ -+ Transfer characteristics as defined by -+ - ARIB STD-B67 (2015) -+ - Rec. ITU-R BT.2100-2 hybrid log-gamma (HLG) system -+ Equivalent to H.273 TransferCharacteristics code point 18. -+ -+ This TF implies these default luminances -+ - primary color volume minimum: 0.005 cd/m² -+ - primary color volume maximum: 1000 cd/m² -+ - reference white: 203 cd/m² -+ Note: HLG is a scene referred signal. All absolute luminance values -+ used here for HLG assume a 1000 cd/m² display. -+ -+ -+ -+ -+ -+ -+ This creates a new xx_color_management_output_v3 object for the -+ given wl_output. -+ -+ See the xx_color_management_output_v3 interface for more details. -+ -+ -+ -+ -+ -+ -+ -+ -+ If a xx_color_management_surface_v3 object already exists for the given -+ wl_surface, the protocol error surface_exists is raised. -+ -+ This creates a new color xx_color_management_surface_v3 object for the -+ given wl_surface. -+ -+ See the xx_color_management_surface_v3 interface for more details. -+ -+ -+ -+ -+ -+ -+ -+ -+ Makes a new ICC-based image description creator object with all -+ properties initially unset. The client can then use the object's -+ interface to define all the required properties for an image description -+ and finally create a xx_image_description_v3 object. -+ -+ This request can be used when the compositor advertises -+ xx_color_manager_v3.feature.icc_v2_v4. -+ Otherwise this request raises the protocol error unsupported_feature. -+ -+ -+ -+ -+ -+ -+ -+ Makes a new parametric image description creator object with all -+ properties initially unset. The client can then use the object's -+ interface to define all the required properties for an image description -+ and finally create a xx_image_description_v3 object. -+ -+ This request can be used when the compositor advertises -+ xx_color_manager_v3.feature.parametric. -+ Otherwise this request raises the protocol error unsupported_feature. -+ -+ -+ -+ -+ -+ -+ -+ When this object is created, it shall immediately send this event once -+ for each rendering intent the compositor supports. -+ -+ -+ -+ -+ -+ -+ -+ When this object is created, it shall immediately send this event once -+ for each compositor supported feature listed in the enumeration. -+ -+ -+ -+ -+ -+ -+ -+ When this object is created, it shall immediately send this event once -+ for each named transfer function the compositor supports with the -+ parametric image description creator. -+ -+ -+ -+ -+ -+ -+ -+ When this object is created, it shall immediately send this event once -+ for each named set of primaries the compositor supports with the -+ parametric image description creator. -+ -+ -+ -+ -+ -+ -+ -+ -+ A xx_color_management_output_v3 describes the color properties of an -+ output. -+ -+ The xx_color_management_output_v3 is associated with the wl_output global -+ underlying the wl_output object. Therefore the client destroying the -+ wl_output object has no impact, but the compositor removing the output -+ global makes the xx_color_management_output_v3 object inert. -+ -+ -+ -+ -+ Destroy the color xx_color_management_output_v3 object. This does not -+ affect any remaining protocol objects. -+ -+ -+ -+ -+ -+ This event is sent whenever the image description of the output changed, -+ followed by one wl_output.done event common to output events across all -+ extensions. -+ -+ If the client wants to use the updated image description, it needs to do -+ get_image_description again, because image description objects are -+ immutable. -+ -+ -+ -+ -+ -+ This creates a new xx_image_description_v3 object for the current image -+ description of the output. There always is exactly one image description -+ active for an output so the client should destroy the image description -+ created by earlier invocations of this request. This request is usually -+ sent as a reaction to the image_description_changed event or when -+ creating a xx_color_management_output_v3 object. -+ -+ The image description of an output represents the color encoding the -+ output expects. There might be performance and power advantages, as well -+ as improved color reproduction, if a content update matches the image -+ description of the output it is being shown on. If a content update is -+ shown on any other output than the one it matches the image description -+ of, then the color reproduction on those outputs might be considerably -+ worse. -+ -+ The created xx_image_description_v3 object preserves the image -+ description of the output from the time the object was created. -+ -+ The resulting image description object allows get_information request. -+ -+ If this protocol object is inert, the resulting image description object -+ shall immediately deliver the xx_image_description_v3.failed event with -+ the no_output cause. -+ -+ If the interface version is inadequate for the output's image -+ description, meaning that the client does not support all the events -+ needed to deliver the crucial information, the resulting image -+ description object shall immediately deliver the -+ xx_image_description_v3.failed event with the low_version cause. -+ -+ Otherwise the object shall immediately deliver the ready event. -+ -+ -+ -+ -+ -+ -+ -+ -+ A xx_color_management_surface_v3 allows the client to set the color -+ space and HDR properties of a surface. -+ -+ If the wl_surface associated with the xx_color_management_surface_v3 is -+ destroyed, the xx_color_management_surface_v3 object becomes inert. -+ -+ -+ -+ -+ Destroy the xx_color_management_surface_v3 object and do the same as -+ unset_image_description. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Set the image description of the underlying surface. The image -+ description and rendering intent are double-buffered state, see -+ wl_surface.commit. -+ -+ It is the client's responsibility to understand the image description -+ it sets on a surface, and to provide content that matches that image -+ description. Compositors might convert images to match their own or any -+ other image descriptions. -+ -+ Image description whose creation gracefully failed (received -+ xx_image_description_v3.failed) are forbidden in this request, and in -+ such case the protocol error image_description is raised. -+ -+ All image descriptions whose creation succeeded (received -+ xx_image_description_v3.ready) are allowed and must always be accepted -+ by the compositor. -+ -+ A rendering intent provides the client's preference on how content -+ colors should be mapped to each output. The render_intent value must -+ be one advertised by the compositor with -+ xx_color_manager_v3.render_intent event, otherwise the protocol error -+ render_intent is raised. -+ -+ By default, a surface does not have an associated image description -+ nor a rendering intent. The handling of color on such surfaces is -+ compositor implementation defined. Compositors should handle such -+ surfaces as sRGB but may handle them differently if they have specific -+ requirements. -+ -+ -+ -+ -+ -+ -+ -+ -+ This request removes any image description from the surface. See -+ set_image_description for how a compositor handles a surface without -+ an image description. This is double-buffered state, see -+ wl_surface.commit. -+ -+ -+ -+ -+ -+ The preferred image description is the one which likely has the most -+ performance and/or quality benefits for the compositor if used by the -+ client for its wl_surface contents. This event is sent whenever the -+ compositor changes the wl_surface's preferred image description. -+ -+ This is not an initial event. -+ -+ This event is merely a notification. When the client wants to know -+ what the preferred image description is, it shall use the get_preferred -+ request. -+ -+ The preferred image description is not automatically used for anything. -+ It is only a hint, and clients may set any valid image description with -+ set_image_description but there might be performance and color accuracy -+ improvements by providing the wl_surface contents in the preferred -+ image description. Therefore clients that can, should render according -+ to the preferred image description -+ -+ -+ -+ -+ -+ If this protocol object is inert, the protocol error inert is raised. -+ -+ The preferred image description represents the compositor's preferred -+ color encoding for this wl_surface at the current time. There might be -+ performance and power advantages, as well as improved color -+ reproduction, if the image description of a content update matches the -+ preferred image description. -+ -+ This creates a new xx_image_description_v3 object for the currently -+ preferred image description for the wl_surface. The client should -+ stop using and destroy the image descriptions created by earlier -+ invocations of this request for the associated wl_surface. -+ This request is usually sent as a reaction to the preferred_changed -+ event or when creating a xx_color_management_surface_v3 object if -+ the client is capable of adapting to image descriptions. -+ -+ The created xx_image_description_v3 object preserves the preferred image -+ description of the wl_surface from the time the object was created. -+ -+ The resulting image description object allows get_information request. -+ -+ If the interface version is inadequate for the preferred image -+ description, meaning that the client does not support all the -+ events needed to deliver the crucial information, the resulting image -+ description object shall immediately deliver the -+ xx_image_description_v3.failed event with the low_version cause, -+ otherwise the object shall immediately deliver the ready event. -+ -+ -+ -+ -+ -+ -+ -+ -+ This type of object is used for collecting all the information required -+ to create a xx_image_description_v3 object from an ICC file. A complete -+ set of required parameters consists of these properties: -+ - ICC file -+ -+ Each required property must be set exactly once if the client is to create -+ an image description. The set requests verify that a property was not -+ already set. The create request verifies that all required properties are -+ set. There may be several alternative requests for setting each property, -+ and in that case the client must choose one of them. -+ -+ Once all properties have been set, the create request must be used to -+ create the image description object, destroying the creator in the -+ process. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Create an image description object based on the ICC information -+ previously set on this object. A compositor must parse the ICC data in -+ some undefined but finite amount of time. -+ -+ The completeness of the parameter set is verified. If the set is not -+ complete, the protocol error incomplete_set is raised. For the -+ definition of a complete set, see the description of this interface. -+ -+ If the particular combination of the information is not supported -+ by the compositor, the resulting image description object shall -+ immediately deliver the xx_image_description_v3.failed event with the -+ 'unsupported' cause. If a valid image description was created from the -+ information, the xx_image_description_v3.ready event will eventually -+ be sent instead. -+ -+ This request destroys the xx_image_description_creator_icc_v3 object. -+ -+ The resulting image description object does not allow get_information -+ request. -+ -+ -+ -+ -+ -+ -+ -+ Sets the ICC profile file to be used as the basis of the image -+ description. -+ -+ The data shall be found through the given fd at the given offset, having -+ the given length. The fd must seekable and readable. Violating these -+ requirements raises the bad_fd protocol error. -+ -+ If reading the data fails due to an error independent of the client, the -+ compositor shall send the xx_image_description_v3.failed event on the -+ created xx_image_description_v3 with the 'operating_system' cause. -+ -+ The maximum size of the ICC profile is 4 MB. If length is greater than -+ that or zero, the protocol error bad_size is raised. If offset + length -+ exceeds the file size, the protocol error out_of_file is raised. -+ -+ A compositor may read the file at any time starting from this request -+ and only until whichever happens first: -+ - If create request was issued, the xx_image_description_v3 object -+ delivers either failed or ready event; or -+ - if create request was not issued, this -+ xx_image_description_creator_icc_v3 object is destroyed. -+ -+ A compositor shall not modify the contents of the file, and the fd may -+ be sealed for writes and size changes. The client must ensure to its -+ best ability that the data does not change while the compositor is -+ reading it. -+ -+ The data must represent a valid ICC profile. The ICC profile version -+ must be 2 or 4, it must be a 3 channel profile and the class must be -+ Display or ColorSpace. Violating these requirements will not result in a -+ protocol error but will eventually send the -+ xx_image_description_v3.failed event on the created -+ xx_image_description_v3 with the 'unsupported' cause. -+ -+ See the International Color Consortium specification ICC.1:2022 for more -+ details about ICC profiles. -+ -+ If ICC file has already been set on this object, the protocol error -+ already_set is raised. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This type of object is used for collecting all the parameters required -+ to create a xx_image_description_v3 object. A complete set of required -+ parameters consists of these properties: -+ - transfer characteristic function (tf) -+ - chromaticities of primaries and white point (primary color volume) -+ -+ The following properties are optional and have a well-defined default -+ if not explicitly set: -+ - primary color volume luminance range -+ - reference white luminance level -+ - mastering display primaries and white point (target color volume) -+ - mastering luminance range -+ - maximum content light level -+ - maximum frame-average light level -+ -+ Each required property must be set exactly once if the client is to create -+ an image description. The set requests verify that a property was not -+ already set. The create request verifies that all required properties are -+ set. There may be several alternative requests for setting each property, -+ and in that case the client must choose one of them. -+ -+ Once all properties have been set, the create request must be used to -+ create the image description object, destroying the creator in the -+ process. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Create an image description object based on the parameters previously -+ set on this object. -+ -+ The completeness of the parameter set is verified. If the set is not -+ complete, the protocol error incomplete_set is raised. For the -+ definition of a complete set, see the description of this interface. -+ -+ Also, the combination of the parameter set is verified. If the set is -+ not consistent, the protocol error inconsistent_set is raised. -+ -+ If the particular combination of the parameter set is not supported -+ by the compositor, the resulting image description object shall -+ immediately deliver the xx_image_description_v3.failed event with the -+ 'unsupported' cause. If a valid image description was created from the -+ parameter set, the xx_image_description_v3.ready event will eventually -+ be sent instead. -+ -+ This request destroys the xx_image_description_creator_params_v3 -+ object. -+ -+ The resulting image description object does not allow get_information -+ request. -+ -+ -+ -+ -+ -+ -+ -+ Sets the transfer characteristic using explicitly enumerated named -+ functions. -+ -+ When the resulting image description is attached to an image, the -+ content should be encoded and decoded according to the industry standard -+ practices for the transfer characteristic. -+ -+ Only names advertised with xx_color_manager_v3 event supported_tf_named -+ are allowed. Other values shall raise the protocol error invalid_tf. -+ -+ If transfer characteristic has already been set on this object, the -+ protocol error already_set is raised. -+ -+ -+ -+ -+ -+ -+ -+ Sets the color component transfer characteristic to a power curve with -+ the given exponent. This curve represents the conversion from electrical -+ to optical pixel or color values. -+ -+ When the resulting image description is attached to an image, the -+ content should be encoded with the inverse of the power curve. -+ -+ The curve exponent shall be multiplied by 10000 to get the argument eexp -+ value to carry the precision of 4 decimals. -+ -+ The curve exponent must be at least 1.0 and at most 10.0. Otherwise the -+ protocol error invalid_tf is raised. -+ -+ If transfer characteristic has already been set on this object, the -+ protocol error already_set is raised. -+ -+ This request can be used when the compositor advertises -+ xx_color_manager_v3.feature.set_tf_power. Otherwise this request raises -+ the protocol error unsupported_feature. -+ -+ -+ -+ -+ -+ -+ -+ Sets the color primaries and white point using explicitly named sets. -+ This describes the primary color volume which is the basis for color -+ value encoding. -+ -+ Only names advertised with xx_color_manager_v3 event -+ supported_primaries_named are allowed. Other values shall raise the -+ protocol error invalid_primaries. -+ -+ If primaries have already been set on this object, the protocol error -+ already_set is raised. -+ -+ -+ -+ -+ -+ -+ -+ Sets the color primaries and white point using CIE 1931 xy chromaticity -+ coordinates. This describes the primary color volume which is the basis -+ for color value encoding. -+ -+ Each coordinate value is multiplied by 10000 to get the argument value -+ to carry precision of 4 decimals. -+ -+ If primaries have already been set on this object, the protocol error -+ already_set is raised. -+ -+ This request can be used if the compositor advertises -+ xx_color_manager_v3.feature.set_primaries. Otherwise this request raises -+ the protocol error unsupported_feature. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Sets the primary color volume luminance range and the reference white -+ luminance level. -+ -+ The default luminances are -+ - primary color volume minimum: 0.2 cd/m² -+ - primary color volume maximum: 80 cd/m² -+ - reference white: 80 cd/m² -+ -+ Setting a named transfer characteristic can imply other default -+ luminances. -+ -+ The default luminances get overwritten when this request is used. -+ -+ 'min_lum' and 'max_lum' specify the minimum and maximum luminances of -+ the primary color volume as reproduced by the targeted display. -+ -+ 'reference_lum' specifies the luminance of the reference white as -+ reproduced by the targeted display, and reflects the targeted viewing -+ environment. -+ -+ Compositors should make sure that all content is anchored, meaning that -+ an input signal level of 'reference_lum' on one image description and -+ another input signal level of 'reference_lum' on another image -+ description should produce the same output level, even though the -+ 'reference_lum' on both image representations can be different. -+ -+ If 'max_lum' is less than the 'reference_lum', or 'reference_lum' is -+ less than or equal to 'min_lum', the protocol error invalid_luminance is -+ raised. -+ -+ The minimum luminance is multiplied by 10000 to get the argument -+ 'min_lum' value and carries precision of 4 decimals. The maximum -+ luminance and reference white luminance values are unscaled. -+ -+ If the primary color volume luminance range and the reference white -+ luminance level have already been set on this object, the protocol error -+ already_set is raised. -+ -+ This request can be used if the compositor advertises -+ xx_color_manager_v3.feature.set_luminances. Otherwise this request -+ raises the protocol error unsupported_feature. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Provides the color primaries and white point of the mastering display -+ using CIE 1931 xy chromaticity coordinates. This is compatible with the -+ SMPTE ST 2086 definition of HDR static metadata. -+ -+ The mastering display primaries define the target color volume. -+ -+ If mastering display primaries are not explicitly set, the target color -+ volume is assumed to be equal to the primary color volume. -+ -+ The target color volume is defined by all tristimulus values between 0.0 -+ and 1.0 (inclusive) of the color space defined by the given mastering -+ display primaries and white point. The colorimetry is identical between -+ the container color space and the mastering display color space, -+ including that no chromatic adaptation is applied even if the white -+ points differ. -+ -+ The target color volume can exceed the primary color volume to allow for -+ a greater color volume with an existing color space definition (for -+ example scRGB). It can be smaller than the primary color volume to -+ minimize gamut and tone mapping distances for big color spaces (HDR -+ metadata). -+ -+ To make use of the entire target color volume a suitable pixel format -+ has to be chosen (e.g. floating point to exceed the primary color -+ volume, or abusing limited quantization range as with xvYCC). -+ -+ Each coordinate value is multiplied by 10000 to get the argument value -+ to carry precision of 4 decimals. -+ -+ If mastering display primaries have already been set on this object, the -+ protocol error already_set is raised. -+ -+ This request can be used if the compositor advertises -+ xx_color_manager_v3.feature.set_mastering_display_primaries. Otherwise -+ this request raises the protocol error unsupported_feature. The -+ advertisement implies support only for target color volumes fully -+ contained within the primary color volume. -+ -+ If a compositor additionally supports target color volume exceeding the -+ primary color volume, it must advertise -+ xx_color_manager_v3.feature.extended_target_volume. If a client uses -+ target color volume exceeding the primary color volume and the -+ compositor does not support it, the result is implementation defined. -+ Compositors are recommended to detect this case and fail the image -+ description gracefully, but it may as well result in color artifacts. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Sets the luminance range that was used during the content mastering -+ process as the minimum and maximum absolute luminance L. This is -+ compatible with the SMPTE ST 2086 definition of HDR static metadata. -+ -+ The mastering luminance range is undefined by default. -+ -+ If max L is less than or equal to min L, the protocol error -+ invalid_luminance is raised. -+ -+ Min L value is multiplied by 10000 to get the argument min_lum value -+ and carry precision of 4 decimals. Max L value is unscaled for max_lum. -+ -+ -+ -+ -+ -+ -+ -+ -+ Sets the maximum content light level (max_cll) as defined by CTA-861-H. -+ -+ This can only be set when set_tf_cicp is used to set the transfer -+ characteristic to Rec. ITU-R BT.2100-2 perceptual quantization system. -+ Otherwise, 'create' request shall raise inconsistent_set protocol -+ error. -+ -+ max_cll is undefined by default. -+ -+ -+ -+ -+ -+ -+ -+ Sets the maximum frame-average light level (max_fall) as defined by -+ CTA-861-H. -+ -+ This can only be set when set_tf_cicp is used to set the transfer -+ characteristic to Rec. ITU-R BT.2100-2 perceptual quantization system. -+ Otherwise, 'create' request shall raise inconsistent_set protocol error. -+ -+ max_fall is undefined by default. -+ -+ -+ -+ -+ -+ -+ -+ -+ An image description carries information about the color encoding used on -+ a surface when attached to a wl_surface via -+ xx_color_management_surface_v3.set_image_description. A compositor can use -+ this information to decode pixel values into colorimetrically meaningful -+ quantities. -+ -+ Note, that the xx_image_description_v3 object is not ready to be used -+ immediately after creation. The object eventually delivers either the -+ 'ready' or the 'failed' event, specified in all requests creating it. The -+ object is deemed "ready" after receiving the 'ready' event. -+ -+ An object which is not ready is illegal to use, it can only be destroyed. -+ Any other request in this interface shall result in the 'not_ready' -+ protocol error. Attempts to use an object which is not ready through other -+ interfaces shall raise protocol errors defined there. -+ -+ Once created and regardless of how it was created, a -+ xx_image_description_v3 object always refers to one fixed image -+ description. It cannot change after creation. -+ -+ -+ -+ -+ Destroy this object. It is safe to destroy an object which is not ready. -+ -+ Destroying a xx_image_description_v3 object has no side-effects, not -+ even if a xx_color_management_surface_v3.set_image_description has not -+ yet been followed by a wl_surface.commit. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ If creating a xx_image_description_v3 object fails for a reason that is -+ not defined as a protocol error, this event is sent. -+ -+ The requests that create image description objects define whether and -+ when this can occur. Only such creation requests can trigger this event. -+ This event cannot be triggered after the image description was -+ successfully formed. -+ -+ Once this event has been sent, the xx_image_description_v3 object will -+ never become ready and it can only be destroyed. -+ -+ -+ -+ -+ -+ -+ -+ -+ Once this event has been sent, the xx_image_description_v3 object is -+ deemed "ready". Ready objects can be used to send requests and can be -+ used through other interfaces. -+ -+ Every ready xx_image_description_v3 protocol object refers to an -+ underlying image description record in the compositor. Multiple protocol -+ objects may end up referring to the same record. Clients may identify -+ these "copies" by comparing their id numbers: if the numbers from two -+ protocol objects are identical, the protocol objects refer to the same -+ image description record. Two different image description records -+ cannot have the same id number simultaneously. The id number does not -+ change during the lifetime of the image description record. -+ -+ The id number is valid only as long as the protocol object is alive. If -+ all protocol objects referring to the same image description record are -+ destroyed, the id number may be recycled for a different image -+ description record. -+ -+ Image description id number is not a protocol object id. Zero is -+ reserved as an invalid id number. It shall not be possible for a client -+ to refer to an image description by its id number in protocol. The id -+ numbers might not be portable between Wayland connections. -+ -+ This identity allows clients to de-duplicate image description records -+ and avoid get_information request if they already have the image -+ description information. -+ -+ -+ -+ -+ -+ -+ -+ Creates a xx_image_description_info_v3 object which delivers the -+ information that makes up the image description. -+ -+ Not all image description protocol objects allow get_information -+ request. Whether it is allowed or not is defined by the request that -+ created the object. If get_information is not allowed, the protocol -+ error no_information is raised. -+ -+ -+ -+ -+ -+ -+ -+ -+ Sends all matching events describing an image description object exactly -+ once and finally sends the 'done' event. -+ -+ Once a xx_image_description_info_v3 object has delivered a 'done' event it -+ is automatically destroyed. -+ -+ Every xx_image_description_info_v3 created from the same -+ xx_image_description_v3 shall always return the exact same data. -+ -+ -+ -+ -+ Signals the end of information events and destroys the object. -+ -+ -+ -+ -+ -+ The icc argument provides a file descriptor to the client which may be -+ memory-mapped to provide the ICC profile matching the image description. -+ The fd is read-only, and if mapped then it must be mapped with -+ MAP_PRIVATE by the client. -+ -+ The ICC profile version and other details are determined by the -+ compositor. There is no provision for a client to ask for a specific -+ kind of a profile. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Delivers the primary color volume primaries and white point using CIE -+ 1931 xy chromaticity coordinates. -+ -+ Each coordinate value is multiplied by 10000 to get the argument value -+ to carry precision of 4 decimals. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Delivers the primary color volume primaries and white point using an -+ explicitly enumerated named set. -+ -+ -+ -+ -+ -+ -+ -+ The color component transfer characteristic of this image description is -+ a pure power curve. This event provides the exponent of the power -+ function. This curve represents the conversion from electrical to -+ optical pixel or color values. -+ -+ The curve exponent has been multiplied by 10000 to get the argument eexp -+ value to carry the precision of 4 decimals. -+ -+ -+ -+ -+ -+ -+ -+ Delivers the transfer characteristic using an explicitly enumerated -+ named function. -+ -+ -+ -+ -+ -+ -+ -+ Delivers the primary color volume luminance range and the reference -+ white luminance level. -+ -+ The minimum luminance is multiplied by 10000 to get the argument -+ 'min_lum' value and carries precision of 4 decimals. The maximum -+ luminance and reference white luminance values are unscaled. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Provides the color primaries and white point of the target color volume -+ using CIE 1931 xy chromaticity coordinates. This is compatible with the -+ SMPTE ST 2086 definition of HDR static metadata for mastering displays. -+ -+ While primary color volume is about how color is encoded, the target -+ color volume is the actually displayable color volume. If target color -+ volume is equal to the primary color volume, then this event is not -+ sent. -+ -+ Each coordinate value is multiplied by 10000 to get the argument value -+ to carry precision of 4 decimals. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Provides the luminance range that the image description is targeting as -+ the minimum and maximum absolute luminance L. This is compatible with -+ the SMPTE ST 2086 definition of HDR static metadata. -+ -+ This luminance range is only theoretical and may not correspond to the -+ luminance of light emitted on an actual display. -+ -+ Min L value is multiplied by 10000 to get the argument min_lum value and -+ carry precision of 4 decimals. Max L value is unscaled for max_lum. -+ -+ -+ -+ -+ -+ -+ -+ -+ Provides the targeted max_cll of the image description. max_cll is -+ defined by CTA-861-H. -+ -+ This luminance is only theoretical and may not correspond to the -+ luminance of light emitted on an actual display. -+ -+ -+ -+ -+ -+ -+ -+ Provides the targeted max_fall of the image description. max_fall is -+ defined by CTA-861-H. -+ -+ This luminance is only theoretical and may not correspond to the -+ luminance of light emitted on an actual display. -+ -+ -+ -+ -+ -+ -diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp -index 8c98689..1a09acc 100644 ---- a/src/Backends/WaylandBackend.cpp -+++ b/src/Backends/WaylandBackend.cpp -@@ -29,6 +29,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -129,6 +130,7 @@ namespace gamescope - friend CWaylandPlane; - - BackendConnectorHDRInfo m_HDRInfo{}; -+ displaycolorimetry_t m_DisplayColorimetry = displaycolorimetry_709; - std::vector m_FakeEdid; - - CWaylandBackend *m_pBackend = nullptr; -@@ -222,6 +224,22 @@ namespace gamescope - uint32_t uMaxFullFrameLuminance ); - static const frog_color_managed_surface_listener s_FrogColorManagedSurfaceListener; - -+ void Wayland_XXColorManagementSurface_PreferredChanged( xx_color_management_surface_v3 *pColorManagementSurface ); -+ static const xx_color_management_surface_v3_listener s_XXColorManagementSurfaceListener; -+ void UpdateXXPreferredColorManagement(); -+ -+ void Wayland_XXImageDescriptionInfo_Done( xx_image_description_info_v3 *pImageDescInfo ); -+ void Wayland_XXImageDescriptionInfo_ICCFile( xx_image_description_info_v3 *pImageDescInfo, int32_t nICCFd, uint32_t uICCSize ); -+ void Wayland_XXImageDescriptionInfo_Primaries( xx_image_description_info_v3 *pImageDescInfo, int32_t nRedX, int32_t nRedY, int32_t nGreenX, int32_t nGreenY, int32_t nBlueX, int32_t nBlueY, int32_t nWhiteX, int32_t nWhiteY ); -+ void Wayland_XXImageDescriptionInfo_PrimariesNamed( xx_image_description_info_v3 *pImageDescInfo, uint32_t uPrimaries ); -+ void Wayland_XXImageDescriptionInfo_TFPower( xx_image_description_info_v3 *pImageDescInfo, uint32_t uExp); -+ void Wayland_XXImageDescriptionInfo_TFNamed( xx_image_description_info_v3 *pImageDescInfo, uint32_t uTF); -+ void Wayland_XXImageDescriptionInfo_Luminances( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMinLum, uint32_t uMaxLum, uint32_t uRefLum ); -+ void Wayland_XXImageDescriptionInfo_TargetPrimaries( xx_image_description_info_v3 *pImageDescInfo, int32_t nRedX, int32_t nRedY, int32_t nGreenX, int32_t nGreenY, int32_t nBlueX, int32_t nBlueY, int32_t nWhiteX, int32_t nWhiteY ); -+ void Wayland_XXImageDescriptionInfo_TargetLuminance( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMinLum, uint32_t uMaxLum ); -+ void Wayland_XXImageDescriptionInfo_Target_MaxCLL( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMaxCLL ); -+ void Wayland_XXImageDescriptionInfo_Target_MaxFALL( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMaxFALL ); -+ - void Wayland_FractionalScale_PreferredScale( wp_fractional_scale_v1 *pFractionalScale, uint32_t uScale ); - static const wp_fractional_scale_v1_listener s_FractionalScaleListener; - -@@ -233,6 +251,7 @@ namespace gamescope - libdecor_frame *m_pFrame = nullptr; - wl_subsurface *m_pSubsurface = nullptr; - frog_color_managed_surface *m_pFrogColorManagedSurface = nullptr; -+ xx_color_management_surface_v3 *m_pXXColorManagedSurface = nullptr; - wp_fractional_scale_v1 *m_pFractionalScale = nullptr; - libdecor_window_state m_eWindowState = LIBDECOR_WINDOW_STATE_NONE; - std::vector m_pOutputs; -@@ -267,6 +286,10 @@ namespace gamescope - { - .preferred_metadata = WAYLAND_USERDATA_TO_THIS( CWaylandPlane, Wayland_FrogColorManagedSurface_PreferredMetadata ), - }; -+ const xx_color_management_surface_v3_listener CWaylandPlane::s_XXColorManagementSurfaceListener = -+ { -+ .preferred_changed = WAYLAND_USERDATA_TO_THIS( CWaylandPlane, Wayland_XXColorManagementSurface_PreferredChanged ), -+ }; - const wp_fractional_scale_v1_listener CWaylandPlane::s_FractionalScaleListener = - { - .preferred_scale = WAYLAND_USERDATA_TO_THIS( CWaylandPlane, Wayland_FractionalScale_PreferredScale ), -@@ -546,6 +569,7 @@ namespace gamescope - wp_viewporter *GetViewporter() const { return m_pViewporter; } - wp_presentation *GetPresentation() const { return m_pPresentation; } - frog_color_management_factory_v1 *GetFrogColorManagementFactory() const { return m_pFrogColorMgmtFactory; } -+ xx_color_manager_v3 *GetXXColorManager() const { return m_pXXColorManager; } - wp_fractional_scale_manager_v1 *GetFractionalScaleManager() const { return m_pFractionalScaleManager; } - xdg_toplevel_icon_manager_v1 *GetToplevelIconManager() const { return m_pToplevelIconManager; } - libdecor *GetLibDecor() const { return m_pLibDecor; } -@@ -596,6 +620,12 @@ namespace gamescope - void Wayland_Keyboard_Leave( wl_keyboard *pKeyboard, uint32_t uSerial, wl_surface *pSurface ); - static const wl_keyboard_listener s_KeyboardListener; - -+ void Wayland_XXColorManager_SupportedIntent( xx_color_manager_v3 *pXXColorManager, uint32_t uRenderIntent ); -+ void Wayland_XXColorManager_SupportedFeature( xx_color_manager_v3 *pXXColorManager, uint32_t uFeature ); -+ void Wayland_XXColorManager_SupportedTFNamed( xx_color_manager_v3 *pXXColorManager, uint32_t uTF ); -+ void Wayland_XXColorManager_SupportedPrimariesNamed( xx_color_manager_v3 *pXXColorManager, uint32_t uPrimaries ); -+ static const xx_color_manager_v3_listener s_XXColorManagerListener; -+ - CWaylandInputThread m_InputThread; - - CWaylandConnector m_Connector; -@@ -615,11 +645,22 @@ namespace gamescope - OwningRc m_pBlackTexture; - wp_presentation *m_pPresentation = nullptr; - frog_color_management_factory_v1 *m_pFrogColorMgmtFactory = nullptr; -+ xx_color_manager_v3 *m_pXXColorManager = nullptr; - zwp_pointer_constraints_v1 *m_pPointerConstraints = nullptr; - zwp_relative_pointer_manager_v1 *m_pRelativePointerManager = nullptr; - wp_fractional_scale_manager_v1 *m_pFractionalScaleManager = nullptr; - xdg_toplevel_icon_manager_v1 *m_pToplevelIconManager = nullptr; - -+ struct -+ { -+ std::vector ePrimaries; -+ std::vector eTransferFunctions; -+ std::vector eRenderIntents; -+ std::vector eFeatures; -+ -+ bool bSupportsGamescopeColorManagement = false; // Has everything we want and need? -+ } m_XXColorManagerFeatures; -+ - std::unordered_map m_pOutputs; - - libdecor *m_pLibDecor = nullptr; -@@ -690,6 +731,13 @@ namespace gamescope - .modifiers = WAYLAND_NULL(), - .repeat_info = WAYLAND_NULL(), - }; -+ const xx_color_manager_v3_listener CWaylandBackend::s_XXColorManagerListener -+ { -+ .supported_intent = WAYLAND_USERDATA_TO_THIS( CWaylandBackend, Wayland_XXColorManager_SupportedIntent ), -+ .supported_feature = WAYLAND_USERDATA_TO_THIS( CWaylandBackend, Wayland_XXColorManager_SupportedFeature ), -+ .supported_tf_named = WAYLAND_USERDATA_TO_THIS( CWaylandBackend, Wayland_XXColorManager_SupportedTFNamed ), -+ .supported_primaries_named = WAYLAND_USERDATA_TO_THIS( CWaylandBackend, Wayland_XXColorManager_SupportedPrimariesNamed ), -+ }; - - ////////////////// - // CWaylandFb -@@ -752,6 +800,7 @@ namespace gamescope - CWaylandConnector::CWaylandConnector( CWaylandBackend *pBackend ) - : m_pBackend( pBackend ) - { -+ m_HDRInfo.bAlwaysPatchEdid = true; - } - - CWaylandConnector::~CWaylandConnector() -@@ -810,18 +859,20 @@ namespace gamescope - displaycolorimetry_t *displayColorimetry, EOTF *displayEOTF, - displaycolorimetry_t *outputEncodingColorimetry, EOTF *outputEncodingEOTF ) const - { -- if ( g_bForceHDR10OutputDebug ) -+ *displayColorimetry = m_DisplayColorimetry; -+ *displayEOTF = EOTF_Gamma22; -+ -+ if ( bHDR10 && GetHDRInfo().IsHDR10() ) - { -- *displayColorimetry = displaycolorimetry_2020; -- *displayEOTF = EOTF_PQ; -+ // For HDR10 output, expected content colorspace != native colorspace. - *outputEncodingColorimetry = displaycolorimetry_2020; -- *outputEncodingEOTF = EOTF_PQ; -+ *outputEncodingEOTF = GetHDRInfo().eOutputEncodingEOTF; - } - else - { -- *displayColorimetry = displaycolorimetry_709; -- *displayEOTF = EOTF_Gamma22; -- *outputEncodingColorimetry = displaycolorimetry_709; -+ // We always use default 'perceptual' intent, so -+ // this should be correct for SDR content. -+ *outputEncodingColorimetry = m_DisplayColorimetry; - *outputEncodingEOTF = EOTF_Gamma22; - } - } -@@ -848,7 +899,17 @@ namespace gamescope - - m_pViewport = wp_viewporter_get_viewport( m_pBackend->GetViewporter(), m_pSurface ); - -- if ( m_pBackend->GetFrogColorManagementFactory() ) -+ if ( m_pBackend->GetXXColorManager() ) -+ { -+ m_pXXColorManagedSurface = xx_color_manager_v3_get_surface( m_pBackend->GetXXColorManager(), m_pSurface ); -+ -+ // Only add the listener for the toplevel to avoid useless spam. -+ if ( !pParent ) -+ xx_color_management_surface_v3_add_listener( m_pXXColorManagedSurface, &s_XXColorManagementSurfaceListener, this ); -+ -+ UpdateXXPreferredColorManagement(); -+ } -+ else if ( m_pBackend->GetFrogColorManagementFactory() ) - { - m_pFrogColorManagedSurface = frog_color_management_factory_v1_get_color_managed_surface( m_pBackend->GetFrogColorManagementFactory(), m_pSurface ); - -@@ -913,7 +974,11 @@ namespace gamescope - wp_presentation_feedback_add_listener( pFeedback, &s_PresentationFeedbackListener, this ); - } - -- if ( m_pFrogColorManagedSurface ) -+ if ( m_pXXColorManagedSurface ) -+ { -+ // TODO: Actually use this. -+ } -+ else if ( m_pFrogColorManagedSurface ) - { - frog_color_managed_surface_set_render_intent( m_pFrogColorManagedSurface, FROG_COLOR_MANAGED_SURFACE_RENDER_INTENT_PERCEPTUAL ); - switch ( oState->eColorspace ) -@@ -1167,6 +1232,12 @@ namespace gamescope - pHDRInfo->uMaxFrameAverageLuminance = uMaxFullFrameLuminance; - pHDRInfo->uMinContentLightLevel = uMinLuminance; - -+ auto *pDisplayColorimetry = &m_pBackend->m_Connector.m_DisplayColorimetry; -+ pDisplayColorimetry->primaries.r = glm::vec2{ uOutputDisplayPrimaryRedX * 0.00002f, uOutputDisplayPrimaryRedY * 0.00002f }; -+ pDisplayColorimetry->primaries.g = glm::vec2{ uOutputDisplayPrimaryGreenX * 0.00002f, uOutputDisplayPrimaryGreenY * 0.00002f }; -+ pDisplayColorimetry->primaries.b = glm::vec2{ uOutputDisplayPrimaryBlueX * 0.00002f, uOutputDisplayPrimaryBlueY * 0.00002f }; -+ pDisplayColorimetry->white = glm::vec2{ uOutputWhitePointX * 0.00002f, uOutputWhitePointY * 0.00002f }; -+ - xdg_log.infof( "PreferredMetadata: Red: %g %g, Green: %g %g, Blue: %g %g, White: %g %g, Max Luminance: %u nits, Min Luminance: %g nits, Max Full Frame Luminance: %u nits", - uOutputDisplayPrimaryRedX * 0.00002, uOutputDisplayPrimaryRedY * 0.00002, - uOutputDisplayPrimaryGreenX * 0.00002, uOutputDisplayPrimaryGreenY * 0.00002, -@@ -1177,6 +1248,87 @@ namespace gamescope - uint32_t( uMaxFullFrameLuminance ) ); - } - -+ // -+ -+ void CWaylandPlane::Wayland_XXColorManagementSurface_PreferredChanged( xx_color_management_surface_v3 *pColorManagementSurface ) -+ { -+ UpdateXXPreferredColorManagement(); -+ } -+ -+ void CWaylandPlane::UpdateXXPreferredColorManagement() -+ { -+ if ( m_pParent ) -+ return; -+ -+ xx_image_description_v3 *pImageDescription = xx_color_management_surface_v3_get_preferred( m_pXXColorManagedSurface ); -+ xx_image_description_info_v3 *pImageDescInfo = xx_image_description_v3_get_information( pImageDescription ); -+ static const xx_image_description_info_v3_listener s_Listener -+ { -+ -+ }; -+ xx_image_description_info_v3_add_listener( pImageDescInfo, &s_Listener, this ); -+ wl_display_roundtrip( m_pBackend->GetDisplay() ); -+ -+ xx_image_description_info_v3_destroy( pImageDescInfo ); -+ xx_image_description_v3_destroy( pImageDescription ); -+ } -+ -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_Done( xx_image_description_info_v3 *pImageDescInfo ) -+ { -+ -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_ICCFile( xx_image_description_info_v3 *pImageDescInfo, int32_t nICCFd, uint32_t uICCSize ) -+ { -+ if ( nICCFd >= 0 ) -+ close( nICCFd ); -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_Primaries( xx_image_description_info_v3 *pImageDescInfo, int32_t nRedX, int32_t nRedY, int32_t nGreenX, int32_t nGreenY, int32_t nBlueX, int32_t nBlueY, int32_t nWhiteX, int32_t nWhiteY ) -+ { -+ -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_PrimariesNamed( xx_image_description_info_v3 *pImageDescInfo, uint32_t uPrimaries ) -+ { -+ -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_TFPower( xx_image_description_info_v3 *pImageDescInfo, uint32_t uExp) -+ { -+ -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_TFNamed( xx_image_description_info_v3 *pImageDescInfo, uint32_t uTF) -+ { -+ auto *pHDRInfo = &m_pBackend->m_Connector.m_HDRInfo; -+ pHDRInfo->bExposeHDRSupport = ( cv_hdr_enabled && uTF == XX_COLOR_MANAGER_V3_TRANSFER_FUNCTION_ST2084_PQ ); -+ pHDRInfo->eOutputEncodingEOTF = ( cv_hdr_enabled && uTF == XX_COLOR_MANAGER_V3_TRANSFER_FUNCTION_ST2084_PQ ) ? EOTF_PQ : EOTF_Gamma22; -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_Luminances( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMinLum, uint32_t uMaxLum, uint32_t uRefLum ) -+ { -+ -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_TargetPrimaries( xx_image_description_info_v3 *pImageDescInfo, int32_t nRedX, int32_t nRedY, int32_t nGreenX, int32_t nGreenY, int32_t nBlueX, int32_t nBlueY, int32_t nWhiteX, int32_t nWhiteY ) -+ { -+ auto *pDisplayColorimetry = &m_pBackend->m_Connector.m_DisplayColorimetry; -+ pDisplayColorimetry->primaries.r = glm::vec2{ nRedX / 10000.0f, nRedY / 10000.0f }; -+ pDisplayColorimetry->primaries.g = glm::vec2{ nGreenX / 10000.0f, nGreenY / 10000.0f }; -+ pDisplayColorimetry->primaries.b = glm::vec2{ nBlueX / 10000.0f, nBlueY / 10000.0f }; -+ pDisplayColorimetry->white = glm::vec2{ nWhiteX / 10000.0f, nWhiteY / 10000.0f }; -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_TargetLuminance( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMinLum, uint32_t uMaxLum ) -+ { -+ -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_Target_MaxCLL( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMaxCLL ) -+ { -+ auto *pHDRInfo = &m_pBackend->m_Connector.m_HDRInfo; -+ pHDRInfo->uMaxContentLightLevel = uMaxCLL; -+ } -+ void CWaylandPlane::Wayland_XXImageDescriptionInfo_Target_MaxFALL( xx_image_description_info_v3 *pImageDescInfo, uint32_t uMaxFALL ) -+ { -+ auto *pHDRInfo = &m_pBackend->m_Connector.m_HDRInfo; -+ pHDRInfo->uMaxFrameAverageLuminance = uMaxFALL; -+ } -+ -+ // -+ - void CWaylandPlane::Wayland_FractionalScale_PreferredScale( wp_fractional_scale_v1 *pFractionalScale, uint32_t uScale ) - { - if ( m_uFractionalScale != uScale ) -@@ -1258,6 +1410,39 @@ namespace gamescope - wl_registry_destroy( pRegistry ); - pRegistry = nullptr; - -+ if ( m_pXXColorManager ) -+ { -+ m_XXColorManagerFeatures.bSupportsGamescopeColorManagement = [this]() -> bool -+ { -+ // Features -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.eFeatures, XX_COLOR_MANAGER_V3_FEATURE_PARAMETRIC ) ) -+ return false; -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.eFeatures, XX_COLOR_MANAGER_V3_FEATURE_SET_PRIMARIES ) ) -+ return false; -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.eFeatures, XX_COLOR_MANAGER_V3_FEATURE_SET_MASTERING_DISPLAY_PRIMARIES ) ) -+ return false; -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.eFeatures, XX_COLOR_MANAGER_V3_FEATURE_EXTENDED_TARGET_VOLUME ) ) -+ return false; -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.eFeatures, XX_COLOR_MANAGER_V3_FEATURE_SET_LUMINANCES ) ) -+ return false; -+ -+ // Transfer Functions -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.eTransferFunctions, XX_COLOR_MANAGER_V3_TRANSFER_FUNCTION_SRGB ) ) -+ return false; -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.eTransferFunctions, XX_COLOR_MANAGER_V3_TRANSFER_FUNCTION_ST2084_PQ ) ) -+ return false; -+ // TODO: Need scRGB -+ -+ // Primaries -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.ePrimaries, XX_COLOR_MANAGER_V3_PRIMARIES_SRGB ) ) -+ return false; -+ if ( !Algorithm::Contains( m_XXColorManagerFeatures.ePrimaries, XX_COLOR_MANAGER_V3_PRIMARIES_BT2020 ) ) -+ return false; -+ -+ return true; -+ }(); -+ } -+ - m_pLibDecor = libdecor_new( m_pDisplay, &s_LibDecorInterface ); - if ( !m_pLibDecor ) - { -@@ -1829,7 +2014,7 @@ namespace gamescope - - bool CWaylandBackend::SupportsColorManagement() const - { -- return m_pFrogColorMgmtFactory != nullptr; -+ return m_pFrogColorMgmtFactory != nullptr || ( m_pXXColorManager != nullptr && m_XXColorManagerFeatures.bSupportsGamescopeColorManagement ); - } - - void CWaylandBackend::UpdateCursor() -@@ -1947,6 +2132,11 @@ namespace gamescope - { - m_pFrogColorMgmtFactory = (frog_color_management_factory_v1 *)wl_registry_bind( pRegistry, uName, &frog_color_management_factory_v1_interface, 1u ); - } -+ else if ( !strcmp( pInterface, xx_color_manager_v3_interface.name ) ) -+ { -+ m_pXXColorManager = (xx_color_manager_v3 *)wl_registry_bind( pRegistry, uName, &xx_color_manager_v3_interface, 1u ); -+ xx_color_manager_v3_add_listener( m_pXXColorManager, &s_XXColorManagerListener, this ); -+ } - else if ( !strcmp( pInterface, zwp_pointer_constraints_v1_interface.name ) ) - { - m_pPointerConstraints = (zwp_pointer_constraints_v1 *)wl_registry_bind( pRegistry, uName, &zwp_pointer_constraints_v1_interface, 1u ); -@@ -2064,6 +2254,25 @@ namespace gamescope - UpdateCursor(); - } - -+ // XX Color Manager -+ -+ void CWaylandBackend::Wayland_XXColorManager_SupportedIntent( xx_color_manager_v3 *pXXColorManager, uint32_t uRenderIntent ) -+ { -+ m_XXColorManagerFeatures.eRenderIntents.push_back( static_cast( uRenderIntent ) ); -+ } -+ void CWaylandBackend::Wayland_XXColorManager_SupportedFeature( xx_color_manager_v3 *pXXColorManager, uint32_t uFeature ) -+ { -+ m_XXColorManagerFeatures.eFeatures.push_back( static_cast( uFeature ) ); -+ } -+ void CWaylandBackend::Wayland_XXColorManager_SupportedTFNamed( xx_color_manager_v3 *pXXColorManager, uint32_t uTF ) -+ { -+ m_XXColorManagerFeatures.eTransferFunctions.push_back( static_cast( uTF ) ); -+ } -+ void CWaylandBackend::Wayland_XXColorManager_SupportedPrimariesNamed( xx_color_manager_v3 *pXXColorManager, uint32_t uPrimaries ) -+ { -+ m_XXColorManagerFeatures.ePrimaries.push_back( static_cast( uPrimaries ) ); -+ } -+ - /////////////////////// - // CWaylandInputThread - /////////////////////// -diff --git a/src/backend.h b/src/backend.h -index 4f91fe7..85783c9 100644 ---- a/src/backend.h -+++ b/src/backend.h -@@ -44,6 +44,7 @@ namespace gamescope - // target/mapping values for the display brightness for undocking from a HDR display, - // but don't want to expose HDR there as it is not good. - bool bExposeHDRSupport = false; -+ bool bAlwaysPatchEdid = false; - - // The output encoding to use for HDR output. - // For typical HDR10 displays, this will be PQ. -@@ -62,7 +63,7 @@ namespace gamescope - - bool ShouldPatchEDID() const - { -- return IsHDRG22(); -+ return bAlwaysPatchEdid || IsHDRG22(); - } - - bool IsHDR10() const --- -2.45.2 - - -From 691c72b319efd2c4dcf73aa44e89e5f117cd00c3 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Wed, 24 Jul 2024 17:51:55 +0100 -Subject: [PATCH 14/19] steamcompmgr: Fix Disable Frame Limit functionality - ---- - src/steamcompmgr.cpp | 23 +++++------------------ - 1 file changed, 5 insertions(+), 18 deletions(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 60ddbbe..1de35e7 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -794,33 +794,18 @@ static void _update_app_target_refresh_cycle() - if ( !GetBackend()->GetCurrentConnector() ) - return; - -- static gamescope::GamescopeScreenType last_type; -- static int last_target_fps; -- static bool first = true; -- - gamescope::GamescopeScreenType type = GetBackend()->GetCurrentConnector()->GetScreenType(); -- int target_fps = g_nCombinedAppRefreshCycleOverride[type]; - -- if ( !first && type == last_type && last_target_fps == target_fps ) -- { -- return; -- } -+ int target_fps = g_nCombinedAppRefreshCycleOverride[type]; - -- last_type = type; -- last_target_fps = target_fps; -- first = false; -+ g_nDynamicRefreshRate[ type ] = 0; -+ g_nSteamCompMgrTargetFPS = 0; - - if ( !target_fps ) - { -- g_nDynamicRefreshRate[ type ] = 0; -- g_nSteamCompMgrTargetFPS = 0; - return; - } - -- auto rates = GetBackend()->GetCurrentConnector()->GetValidDynamicRefreshRates(); -- -- g_nDynamicRefreshRate[ type ] = 0; -- - if ( g_nCombinedAppRefreshCycleChangeFPS[ type ] ) - { - g_nSteamCompMgrTargetFPS = target_fps; -@@ -828,6 +813,8 @@ static void _update_app_target_refresh_cycle() - - if ( g_nCombinedAppRefreshCycleChangeRefresh[ type ] ) - { -+ auto rates = GetBackend()->GetCurrentConnector()->GetValidDynamicRefreshRates(); -+ - // Find highest mode to do refresh doubling with. - for ( auto rate = rates.rbegin(); rate != rates.rend(); rate++ ) - { --- -2.45.2 - - -From 69610ec52429fecbe94c4c042cc42ab43e0491f8 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Wed, 24 Jul 2024 18:22:11 +0100 -Subject: [PATCH 15/19] steamcompmgr: Relative mouse fixes and improvements - ---- - src/steamcompmgr.cpp | 21 ++++++++++++++++++--- - src/steamcompmgr.hpp | 3 +++ - src/wlserver.cpp | 9 ++++++--- - 3 files changed, 27 insertions(+), 6 deletions(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 1de35e7..9c98f9c 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -94,6 +94,10 @@ - #include "Utils/Process.h" - #include "Utils/Algorithm.h" - -+#include "wlr_begin.hpp" -+#include "wlr/types/wlr_pointer_constraints_v1.h" -+#include "wlr_end.hpp" -+ - #if HAVE_AVIF - #include "avif/avif.h" - #endif -@@ -1383,8 +1387,19 @@ MouseCursor::MouseCursor(xwayland_ctx_t *ctx) - void MouseCursor::UpdatePosition() - { - wlserver_lock(); -- m_x = wlserver.mouse_surface_cursorx; -- m_y = wlserver.mouse_surface_cursory; -+ struct wlr_pointer_constraint_v1 *pConstraint = wlserver.GetCursorConstraint(); -+ if ( pConstraint && pConstraint->current.cursor_hint.enabled ) -+ { -+ m_x = pConstraint->current.cursor_hint.x; -+ m_y = pConstraint->current.cursor_hint.y; -+ m_bConstrained = true; -+ } -+ else -+ { -+ m_x = wlserver.mouse_surface_cursorx; -+ m_y = wlserver.mouse_surface_cursory; -+ m_bConstrained = false; -+ } - wlserver_unlock(); - } - -@@ -7600,7 +7615,7 @@ steamcompmgr_main(int argc, char **argv) - ( global_focus.cursor && global_focus.cursor->imageEmpty() ) && - ( !window_is_steam( global_focus.inputFocusWindow ) ); - -- const bool bHasPointerConstraint = wlserver.HasMouseConstraint(); // atomic, no lock needed -+ const bool bHasPointerConstraint = global_focus.cursor->IsConstrained(); - - uint32_t uAppId = global_focus.inputFocusWindow - ? global_focus.inputFocusWindow->appID -diff --git a/src/steamcompmgr.hpp b/src/steamcompmgr.hpp -index 7c2da8c..b009ac7 100644 ---- a/src/steamcompmgr.hpp -+++ b/src/steamcompmgr.hpp -@@ -95,6 +95,8 @@ public: - void GetDesiredSize( int& nWidth, int &nHeight ); - - void checkSuspension(); -+ -+ bool IsConstrained() const { return m_bConstrained; } - private: - - bool getTexture(); -@@ -102,6 +104,7 @@ private: - void updateCursorFeedback( bool bForce = false ); - - int m_x = 0, m_y = 0; -+ bool m_bConstrained = false; - int m_hotspotX = 0, m_hotspotY = 0; - - gamescope::OwningRc m_texture; -diff --git a/src/wlserver.cpp b/src/wlserver.cpp -index 1852be9..bdacff4 100644 ---- a/src/wlserver.cpp -+++ b/src/wlserver.cpp -@@ -2243,7 +2243,9 @@ static void wlserver_warp_to_constraint_hint() - double sx = pConstraint->current.cursor_hint.x; - double sy = pConstraint->current.cursor_hint.y; - -- wlserver_mousewarp( sx, sy, 0, true ); -+ wlserver.mouse_surface_cursorx = sx; -+ wlserver.mouse_surface_cursory = sy; -+ wlr_seat_pointer_warp( wlserver.wlr.seat, sx, sy ); - } - } - -@@ -2256,6 +2258,8 @@ static void wlserver_update_cursor_constraint() - { - wlserver.mouse_constraint_requires_warp = false; - -+ wlserver_warp_to_constraint_hint(); -+ - if (!pixman_region32_contains_point(pRegion, floor(wlserver.mouse_surface_cursorx), floor(wlserver.mouse_surface_cursory), NULL)) - { - int nboxes; -@@ -2265,8 +2269,7 @@ static void wlserver_update_cursor_constraint() - wlserver.mouse_surface_cursorx = std::clamp( wlserver.mouse_surface_cursorx, boxes[0].x1, boxes[0].x2); - wlserver.mouse_surface_cursory = std::clamp( wlserver.mouse_surface_cursory, boxes[0].y1, boxes[0].y2); - -- wlr_seat_pointer_notify_motion( wlserver.wlr.seat, 0, wlserver.mouse_surface_cursorx, wlserver.mouse_surface_cursory ); -- wlr_seat_pointer_notify_frame( wlserver.wlr.seat ); -+ wlr_seat_pointer_warp( wlserver.wlr.seat, wlserver.mouse_surface_cursorx, wlserver.mouse_surface_cursory ); - } - } - } --- -2.45.2 - - -From 1f15714bc37a246c7c7d175970bef5070b7d5649 Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Wed, 24 Jul 2024 18:30:11 +0100 -Subject: [PATCH 16/19] steamcompmgr: Fix return value of avifImageRGBToYUV - being ignored - ---- - src/steamcompmgr.cpp | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 9c98f9c..1861f9d 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -2712,7 +2712,11 @@ paint_all(bool async) - rgbAvifImage.pixels = (uint8_t *)imageData.data(); - rgbAvifImage.rowBytes = g_nOutputWidth * kCompCnt * sizeof( uint16_t ); - -- avifImageRGBToYUV( pAvifImage, &rgbAvifImage ); // Not really! See Matrix Coefficients IDENTITY above. -+ if ( ( avifResult = avifImageRGBToYUV( pAvifImage, &rgbAvifImage ) ) != AVIF_RESULT_OK ) // Not really! See Matrix Coefficients IDENTITY above. -+ { -+ xwm_log.errorf( "Failed to convert RGB to YUV: %u", avifResult ); -+ return; -+ } - - avifEncoder *pEncoder = avifEncoderCreate(); - defer( avifEncoderDestroy( pEncoder ) ); --- -2.45.2 - - -From bfebd15dd6b3141e1ed5ee4bf768dc0d50c9660f Mon Sep 17 00:00:00 2001 -From: psykose -Date: Sat, 6 Jul 2024 20:52:50 +0200 -Subject: [PATCH 17/19] utils: include limits.h for PATH_MAX - ---- - src/Utils/Process.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/Utils/Process.cpp b/src/Utils/Process.cpp -index 32c52f1..9e3f758 100644 ---- a/src/Utils/Process.cpp -+++ b/src/Utils/Process.cpp -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include - #include - #include --- -2.45.2 - - -From 7fe73df4bcf71579203332baa2f3cf47506bc560 Mon Sep 17 00:00:00 2001 -From: Julian Orth -Date: Wed, 24 Jul 2024 12:40:01 +0200 -Subject: [PATCH 18/19] wayland_backend: round surface size towards infinity - -Otherwise, if the scale is larger than the texture size, the surface -size would be 0. - -Signed-off-by: Julian Orth ---- - src/Backends/WaylandBackend.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp -index 1a09acc..cc76f62 100644 ---- a/src/Backends/WaylandBackend.cpp -+++ b/src/Backends/WaylandBackend.cpp -@@ -1083,8 +1083,8 @@ namespace gamescope - .flSrcY = 0.0, - .flSrcWidth = double( pLayer->tex->width() ), - .flSrcHeight = double( pLayer->tex->height() ), -- .nDstWidth = int32_t( pLayer->tex->width() / double( pLayer->scale.x ) ), -- .nDstHeight = int32_t( pLayer->tex->height() / double( pLayer->scale.y ) ), -+ .nDstWidth = int32_t( ceil( pLayer->tex->width() / double( pLayer->scale.x ) ) ), -+ .nDstHeight = int32_t( ceil( pLayer->tex->height() / double( pLayer->scale.y ) ) ), - .eColorspace = pLayer->colorspace, - .bOpaque = pLayer->zpos == g_zposBase, - .uFractionalScale = GetScale(), --- -2.45.2 - - -From 7ae5e0d2a75de06e267c47ca3cd3cddedd1d7416 Mon Sep 17 00:00:00 2001 -From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> -Date: Wed, 24 Jul 2024 13:42:21 -0400 -Subject: [PATCH 19/19] color_helpers: Clang warning fixes - ---- - src/color_bench.cpp | 8 ++++---- - src/color_helpers.cpp | 11 +++++++++-- - src/color_helpers.h | 11 ++++++++++- - src/color_helpers_impl.h | 20 ++++++++++++++++++++ - src/color_tests.cpp | 6 +++--- - src/rendervulkan.hpp | 9 +++++---- - src/steamcompmgr.cpp | 6 +++++- - 7 files changed, 56 insertions(+), 15 deletions(-) - create mode 100644 src/color_helpers_impl.h - -diff --git a/src/color_bench.cpp b/src/color_bench.cpp -index 9c9d986..1058986 100644 ---- a/src/color_bench.cpp -+++ b/src/color_bench.cpp -@@ -4,10 +4,10 @@ - #include - #include "Utils/Algorithm.h" - --#include "color_helpers.h" -+#include "color_helpers_impl.h" - --const uint32_t nLutSize1d = 4096; --const uint32_t nLutEdgeSize3d = 17; -+using color_bench::nLutEdgeSize3d; -+using color_bench::nLutSize1d; - - uint16_t lut1d[nLutSize1d*4]; - uint16_t lut3d[nLutEdgeSize3d*nLutEdgeSize3d*nLutEdgeSize3d*4]; -@@ -38,7 +38,7 @@ static void BenchmarkCalcColorTransform(EOTF inputEOTF, benchmark::State &state) - float flGain = 1.0f; - - for (auto _ : state) { -- calcColorTransform( &lut1d_float, nLutSize1d, &lut3d_float, nLutEdgeSize3d, inputColorimetry, inputEOTF, -+ calcColorTransform( &lut1d_float, nLutSize1d, &lut3d_float, inputColorimetry, inputEOTF, - outputEncodingColorimetry, EOTF_Gamma22, - destVirtualWhite, k_EChromaticAdapatationMethod_XYZ, - colorMapping, nightmode, tonemapping, nullptr, flGain ); -diff --git a/src/color_helpers.cpp b/src/color_helpers.cpp -index 18d3ee6..2075eca 100644 ---- a/src/color_helpers.cpp -+++ b/src/color_helpers.cpp -@@ -1,4 +1,5 @@ --#include "color_helpers.h" -+#define COLOR_HELPERS_CPP -+#include "color_helpers_impl.h" - - #include - #include -@@ -213,7 +214,11 @@ inline void lerp_rgb(float* out, const float* a, const float* b, const float* c, - - inline float ClampAndSanitize( float a, float min, float max ) - { -+#ifndef __FAST_MATH__ - return std::isfinite( a ) ? std::min(std::max(min, a), max) : min; -+#else -+ return std::min(std::max(min, a), max); -+#endif - } - - // Adapted from: -@@ -665,8 +670,9 @@ inline T applyShaper( const T & input, EOTF source, EOTF dest, const tonemapping - - bool g_bHuePreservationWhenClipping = false; - -+template - void calcColorTransform( lut1d_t * pShaper, int nLutSize1d, -- lut3d_t * pLut3d, int nLutEdgeSize3d, -+ lut3d_t * pLut3d, - const displaycolorimetry_t & source, EOTF sourceEOTF, - const displaycolorimetry_t & dest, EOTF destEOTF, - const glm::vec2 & destVirtualWhite, EChromaticAdaptationMethod eMethod, -@@ -679,6 +685,7 @@ void calcColorTransform( lut1d_t * pShaper, int nLutSize1d, - // The 3d lut should be considered a 'matched' pair where the transform is only complete - // when applying both. I.e., you can put ANY transform in here, and it should work. - -+ static constexpr int32_t nLutEdgeSize3d = static_cast(lutEdgeSize3d); - if ( pShaper ) - { - float flScale = 1.f / ( (float) nLutSize1d - 1.f ); -diff --git a/src/color_helpers.h b/src/color_helpers.h -index 319bfc7..66213e1 100644 ---- a/src/color_helpers.h -+++ b/src/color_helpers.h -@@ -363,14 +363,23 @@ bool LoadCubeLut( lut3d_t * lut3d, const char * filename ); - // If the white points differ, this performs an absolute colorimetric match - // Look luts are optional, but if specified applied in the sourceEOTF space - -+template - void calcColorTransform( lut1d_t * pShaper, int nLutSize1d, -- lut3d_t * pLut3d, int nLutEdgeSize3d, -+ lut3d_t * pLut3d, - const displaycolorimetry_t & source, EOTF sourceEOTF, - const displaycolorimetry_t & dest, EOTF destEOTF, - const glm::vec2 & destVirtualWhite, EChromaticAdaptationMethod eMethod, - const colormapping_t & mapping, const nightmode_t & nightmode, const tonemapping_t & tonemapping, - const lut3d_t * pLook, float flGain ); - -+#define REGISTER_LUT_EDGE_SIZE(size) template void calcColorTransform<(size)>( lut1d_t * pShaper, int nLutSize1d, \ -+ lut3d_t * pLut3d, \ -+ const displaycolorimetry_t & source, EOTF sourceEOTF, \ -+ const displaycolorimetry_t & dest, EOTF destEOTF, \ -+ const glm::vec2 & destVirtualWhite, EChromaticAdaptationMethod eMethod, \ -+ const colormapping_t & mapping, const nightmode_t & nightmode, const tonemapping_t & tonemapping, \ -+ const lut3d_t * pLook, float flGain ) -+ - // Build colorimetry and a gamut mapping for the given SDR configuration - // Note: the output colorimetry will use the native display's white point - // Only the color gamut will change -diff --git a/src/color_helpers_impl.h b/src/color_helpers_impl.h -new file mode 100644 -index 0000000..3e8c2d5 ---- /dev/null -+++ b/src/color_helpers_impl.h -@@ -0,0 +1,20 @@ -+#pragma once -+#include "color_helpers.h" -+ -+namespace rendervulkan { -+ static constexpr uint32_t s_nLutEdgeSize3d = 17; -+ static constexpr uint32_t s_nLutSize1d = 4096; -+} -+ -+namespace color_bench { -+ static constexpr uint32_t nLutEdgeSize3d = 17; -+ static constexpr uint32_t nLutSize1d = 4096; -+} -+ -+namespace ns_color_tests { -+ [[maybe_unused]] static constexpr uint32_t nLutEdgeSize3d = 17; -+} -+ -+#ifdef COLOR_HELPERS_CPP -+REGISTER_LUT_EDGE_SIZE(rendervulkan::s_nLutEdgeSize3d); -+#endif -\ No newline at end of file -diff --git a/src/color_tests.cpp b/src/color_tests.cpp -index 66aae90..2d682bf 100644 ---- a/src/color_tests.cpp -+++ b/src/color_tests.cpp -@@ -1,12 +1,12 @@ - #include "color_helpers.h" - #include - --#include -+//#include - #include - - /* -+using ns_color_tests::nLutEdgeSize3d; - const uint32_t nLutSize1d = 4096; --const uint32_t nLutEdgeSize3d = 17; - - uint16_t lut1d[nLutSize1d*4]; - uint16_t lut3d[nLutEdgeSize3d*nLutEdgeSize3d*nLutEdgeSize3d*4]; -@@ -36,7 +36,7 @@ static void BenchmarkCalcColorTransform(EOTF inputEOTF, benchmark::State &state) - float flGain = 1.0f; - - for (auto _ : state) { -- calcColorTransform( &lut1d_float, nLutSize1d, &lut3d_float, nLutEdgeSize3d, inputColorimetry, inputEOTF, -+ calcColorTransform( &lut1d_float, nLutSize1d, &lut3d_float, inputColorimetry, inputEOTF, - outputEncodingColorimetry, EOTF_Gamma22, - colorMapping, nightmode, tonemapping, nullptr, flGain ); - for ( size_t i=0, end = lut1d_float.dataR.size(); i - - #include "main.hpp" --#include "color_helpers.h" -+ - #include "gamescope_shared.h" - #include "backend.h" - -@@ -415,7 +415,7 @@ struct wlr_renderer *vulkan_renderer_create( void ); - - using mat3x4 = std::array, 3>; - --#include "color_helpers.h" -+#include "color_helpers_impl.h" - - struct gamescope_color_mgmt_t - { -@@ -453,8 +453,9 @@ struct gamescope_color_mgmt_t - bool operator != (const gamescope_color_mgmt_t&) const = default; - }; - --static constexpr uint32_t s_nLutEdgeSize3d = 17; --static constexpr uint32_t s_nLutSize1d = 4096; -+//namespace members from "color_helpers_impl.h": -+using rendervulkan::s_nLutEdgeSize3d; -+using rendervulkan::s_nLutSize1d; - - struct gamescope_color_mgmt_luts - { -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 1861f9d..4a9d567 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -315,7 +315,7 @@ create_color_mgmt_luts(const gamescope_color_mgmt_t& newColorMgmt, gamescope_col - buildPQColorimetry( &inputColorimetry, &colorMapping, displayColorimetry ); - } - -- calcColorTransform( &g_tmpLut1d, s_nLutSize1d, &g_tmpLut3d, s_nLutEdgeSize3d, inputColorimetry, inputEOTF, -+ calcColorTransform( &g_tmpLut1d, s_nLutSize1d, &g_tmpLut3d, inputColorimetry, inputEOTF, - outputEncodingColorimetry, newColorMgmt.outputEncodingEOTF, - newColorMgmt.outputVirtualWhite, newColorMgmt.chromaticAdaptationMode, - colorMapping, newColorMgmt.nightmode, tonemapping, pLook, flGain ); -@@ -5029,7 +5029,11 @@ steamcompmgr_latch_frame_done( steamcompmgr_win_t *w, uint64_t vblank_idx ) - - static inline float santitize_float( float f ) - { -+#ifndef __FAST_MATH__ - return ( std::isfinite( f ) ? f : 0.f ); -+#else -+ return f; -+#endif - } - - static void --- -2.45.2 - From 4e1d2ec23d8608e7a9cba69b86fe73e6e929920a Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 12:11:35 -0700 Subject: [PATCH 6/9] chore: Add newer wayland spec file --- spec_files/gamescope/gamescope.spec | 3 +- .../gamescope/wayland/emersion-gpg-key.asc | Bin 0 -> 7501 bytes spec_files/gamescope/wayland/wayland.spec | 449 ++++++++++++++++++ 3 files changed, 451 insertions(+), 1 deletion(-) create mode 100644 spec_files/gamescope/wayland/emersion-gpg-key.asc create mode 100644 spec_files/gamescope/wayland/wayland.spec diff --git a/spec_files/gamescope/gamescope.spec b/spec_files/gamescope/gamescope.spec index 32d173ae..b3ca437b 100644 --- a/spec_files/gamescope/gamescope.spec +++ b/spec_files/gamescope/gamescope.spec @@ -50,7 +50,7 @@ BuildRequires: pkgconfig(xres) BuildRequires: pkgconfig(libdrm) BuildRequires: pkgconfig(vulkan) BuildRequires: pkgconfig(wayland-scanner) -BuildRequires: pkgconfig(wayland-server) +BuildRequires: pkgconfig(wayland-server) >= 1.23.0 BuildRequires: pkgconfig(wayland-protocols) >= 1.17 BuildRequires: pkgconfig(xkbcommon) BuildRequires: pkgconfig(sdl2) @@ -76,6 +76,7 @@ BuildRequires: /usr/bin/glslangValidator BuildRequires: libdecor-devel BuildRequires: libXdamage-devel BuildRequires: xorg-x11-server-Xwayland-devel +BuildRequires: lcms-devel BuildRequires: git # libliftoff hasn't bumped soname, but API/ABI has changed for 0.2.0 release diff --git a/spec_files/gamescope/wayland/emersion-gpg-key.asc b/spec_files/gamescope/wayland/emersion-gpg-key.asc new file mode 100644 index 0000000000000000000000000000000000000000..cc3b6a06af86e73144a2da89ca2f6616fcdd9dcb GIT binary patch literal 7501 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 literal 0 HcmV?d00001 diff --git a/spec_files/gamescope/wayland/wayland.spec b/spec_files/gamescope/wayland/wayland.spec new file mode 100644 index 00000000..05286fbc --- /dev/null +++ b/spec_files/gamescope/wayland/wayland.spec @@ -0,0 +1,449 @@ +Name: wayland +Version: 1.23.0 +Release: 2%{?dist} +Summary: Wayland Compositor Infrastructure + +# SPDX +License: MIT +URL: http://wayland.freedesktop.org/ +Source0: https://gitlab.freedesktop.org/%{name}/%{name}/-/releases/%{version}/downloads/%{name}-%{version}.tar.xz +Source1: https://gitlab.freedesktop.org/%{name}/%{name}/-/releases/%{version}/downloads/%{name}-%{version}.tar.xz.sig +Source2: emersion-gpg-key.asc + +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: docbook-style-xsl +BuildRequires: doxygen +BuildRequires: expat-devel +BuildRequires: graphviz +BuildRequires: libxml2-devel +BuildRequires: libxslt +BuildRequires: meson +BuildRequires: pkgconfig(libffi) +BuildRequires: xmlto + +# For origin certification +BuildRequires: gnupg2 + +%description +Wayland is a protocol for a compositor to talk to its clients as well as a C +library implementation of that protocol. The compositor can be a standalone +display server running on Linux kernel modesetting and evdev input devices, +an X application, or a wayland client itself. The clients can be traditional +applications, X servers (rootless or fullscreen) or other display servers. + +%package devel +Summary: Development files for %{name} +Requires: libwayland-client%{?_isa} = %{version}-%{release} +Requires: libwayland-cursor%{?_isa} = %{version}-%{release} +Requires: libwayland-egl%{?_isa} = %{version}-%{release} +Requires: libwayland-server%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%package doc +Summary: Wayland development documentation +BuildArch: noarch +%description doc +Wayland development documentation + +%package -n libwayland-client +Summary: Wayland client library +%description -n libwayland-client +Wayland client library + +%package -n libwayland-cursor +Summary: Wayland cursor library +Requires: libwayland-client%{?_isa} = %{version}-%{release} +%description -n libwayland-cursor +Wayland cursor library + +%package -n libwayland-egl +Summary: Wayland egl library +%description -n libwayland-egl +Wayland egl library + +%package -n libwayland-server +Summary: Wayland server library +%description -n libwayland-server +Wayland server library + +%prep +%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}' +%autosetup -p1 + +%build +%meson +%meson_build + +%install +%meson_install + +%check +%meson_test + +%files devel +%{_bindir}/wayland-scanner +%{_includedir}/wayland-*.h +%{_libdir}/pkgconfig/wayland-*.pc +%{_libdir}/libwayland-*.so +%{_datadir}/aclocal/wayland-scanner.m4 +%dir %{_datadir}/wayland +%{_datadir}/wayland/wayland-scanner.mk +%{_datadir}/wayland/wayland.xml +%{_datadir}/wayland/wayland.dtd +%{_mandir}/man3/*.3* + +%files doc +%doc README.md +%{_datadir}/doc/wayland/ + +%files -n libwayland-client +%license COPYING +%{_libdir}/libwayland-client.so.0* + +%files -n libwayland-cursor +%license COPYING +%{_libdir}/libwayland-cursor.so.0* + +%files -n libwayland-egl +%license COPYING +%{_libdir}/libwayland-egl.so.1* + +%files -n libwayland-server +%license COPYING +%{_libdir}/libwayland-server.so.0* + +%changelog +* Sat Jul 20 2024 Fedora Release Engineering - 1.23.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Fri Jun 28 2024 Olivier Fourdan - 1.23.0-1 +- Update to 1.23.0 + +* Sat Jan 27 2024 Fedora Release Engineering - 1.22.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Thu Sep 07 2023 José Expósito +- SPDX migration: license is already SPDX compatible + +* Sat Jul 22 2023 Fedora Release Engineering - 1.22.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Tue Apr 04 2023 Kalev Lember - 1.22.0-1 +- Update to 1.22.0 + +* Sat Jan 21 2023 Fedora Release Engineering - 1.21.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Tue Jul 26 2022 Mike Rochefort - 1.21.0-1 +- Update to 1.21.0 + +* Sat Jul 23 2022 Fedora Release Engineering - 1.20.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Mon Mar 21 2022 Olivier Fourdan - 1.20.0-4 +- Close file descriptors not needed + rhbz#2062030 + +* Sat Jan 22 2022 Fedora Release Engineering - 1.20.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Sat Jan 08 2022 Miro Hrončok - 1.20.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Changes/LIBFFI34 + +* Thu Dec 16 2021 Kalev Lember - 1.20.0-1 +- Update to 1.20.0 + +* Fri Jul 23 2021 Fedora Release Engineering - 1.19.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Thu Jan 28 2021 Kalev Lember - 1.19.0-1 +- Update to 1.19.0 +- Switch to meson build system +- Drop old provides + +* Wed Jan 27 2021 Fedora Release Engineering - 1.18.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Jul 29 2020 Fedora Release Engineering - 1.18.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Feb 12 2020 Kalev Lember - 1.18.0-1 +- Update to 1.18.0 +- Drop no longer needed obsoletes/provides + +* Fri Jan 31 2020 Fedora Release Engineering - 1.17.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Sat Jul 27 2019 Fedora Release Engineering - 1.17.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Thu Mar 21 2019 Kalev Lember - 1.17.0-1 +- Update to 1.17.0 + +* Thu Mar 07 2019 Kalev Lember - 1.16.92-1 +- Update to 1.16.92 + +* Thu Feb 28 2019 Kalev Lember - 1.16.91-1 +- Update to 1.16.91 + +* Sun Feb 03 2019 Fedora Release Engineering - 1.16.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Tue Sep 11 2018 Kalev Lember - 1.16.0-1 +- Update to 1.16.0 + +* Mon Aug 13 2018 Kalev Lember - 1.15.93-1 +- Update to 1.15.93 + +* Tue Jul 31 2018 Florian Weimer - 1.15.92-2 +- Rebuild with fixed binutils + +* Sun Jul 29 2018 Kalev Lember - 1.15.92-1 +- Update to 1.15.92 + +* Sat Jul 14 2018 Fedora Release Engineering - 1.15.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Mon Apr 09 2018 Kalev Lember - 1.15.0-1 +- Update to 1.15.0 + +* Wed Apr 04 2018 Kalev Lember - 1.14.93-2 +- Make mesa-libwayland-egl obsoleting actually work + +* Tue Apr 03 2018 Kalev Lember - 1.14.93-1 +- Update to 1.14.93 + +* Tue Mar 20 2018 Kalev Lember - 1.14.92-1 +- Update to 1.14.92 +- Remove F22 upgrade path obsoletes + +* Sat Mar 03 2018 Igor Gnatenko - 1.14.91-2 +- Improve Obsoletes + +* Tue Feb 27 2018 Kalev Lember - 1.14.91-1 +- Update to 1.14.91 +- Add new libwayland-egl subpackage and obsolete mesa-libwayland-egl +- Remove ldconfig scriptlets + +* Fri Feb 09 2018 Fedora Release Engineering - 1.14.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Dec 12 2017 Kalev Lember - 1.14.0-2 +- cursor: Fix heap overflows when parsing malicious files (#1522638) + +* Wed Aug 09 2017 Kalev Lember - 1.14.0-1 +- Update to 1.14.0 + +* Wed Aug 02 2017 Kalev Lember - 1.13.93-1 +- Update to 1.13.93 + +* Sun Jul 30 2017 Florian Weimer - 1.13.92-2 +- Rebuild with binutils fix for ppc64le (#1475636) + +* Wed Jul 26 2017 Kalev Lember - 1.13.92-1 +- Update to 1.13.92 + +* Wed Jul 19 2017 Kalev Lember - 1.13.91-1 +- Update to 1.13.91 + +* Thu Jun 1 2017 Owen Taylor otaylor@redhat.com> - 1.13.0-2 +- Add a patch fixing a build error with newer versions of graphviz + +* Wed Feb 22 2017 Kalev Lember - 1.13.0-1 +- Update to 1.13.0 + +* Sat Feb 11 2017 Fedora Release Engineering - 1.12.91-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Jan 25 2017 Kalev Lember - 1.12.91-1 +- Update to 1.12.91 + +* Wed Sep 21 2016 Kalev Lember - 1.12.0-1 +- Update to 1.12.0 + +* Wed Sep 14 2016 Kalev Lember - 1.11.94-1 +- Update to 1.11.94 + +* Thu Sep 08 2016 Kalev Lember - 1.11.93-1 +- Update to 1.11.93 + +* Wed Aug 31 2016 Kalev Lember - 1.11.92-1 +- Update to 1.11.92 + +* Wed Aug 17 2016 Kalev Lember - 1.11.91-1 +- Update to 1.11.91 +- Simplify -devel subpackage packaging +- Include license files in packaging + +* Wed Jun 01 2016 Kalev Lember - 1.11.0-1 +- Update to 1.11.0 + +* Wed May 25 2016 Kalev Lember - 1.10.93-1 +- Update to 1.10.93 + +* Wed May 18 2016 Kalev Lember - 1.10.92-1 +- Update to 1.10.92 + +* Sun May 08 2016 Kalev Lember - 1.10.91-1 +- Update to 1.10.91 + +* Thu Feb 18 2016 Kalev Lember - 1.10.0-1 +- Update to 1.10.0 + +* Thu Feb 04 2016 Kalev Lember - 1.9.92-1 +- Update to 1.9.92 + +* Wed Jan 20 2016 Kalev Lember - 1.9.91-1 +- Update to 1.9.91 + +* Tue Sep 22 2015 Kalev Lember - 1.9.0-1 +- Update to 1.9.0 +- Use make_install macro + +* Wed Sep 16 2015 Kalev Lember - 1.8.93-1 +- Update to 1.8.93 + +* Wed Sep 02 2015 Kalev Lember - 1.8.92-1 +- Update to 1.8.92 + +* Fri Aug 21 2015 Kalev Lember - 1.8.91-2 +- Split out wayland-doc subpackage for documentation + +* Fri Aug 21 2015 Kalev Lember - 1.8.91-1 +- Update to 1.8.91 + +* Mon Jul 20 2015 Adam Jackson 1.8.0-1 +- wayland 1.8.0 + +* Fri Jun 19 2015 Fedora Release Engineering - 1.7.92-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Tue May 26 2015 Adam Jackson 1.7.92-1 +- wayland 1.7.92 + +* Sat Feb 21 2015 Till Maas - 1.7.0-2 +- Rebuilt for Fedora 23 Change + https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code + +* Tue Feb 17 2015 Richard Hughes - 1.7.0-1 +- Wayland 1.7.0 + +* Fri Sep 19 2014 Kalev Lember - 1.6.0-1 +- Update to 1.6.0 +- Remove lib64 rpaths + +* Fri Aug 22 2014 Kevin Fenzi 1.5.91-1 +- Update to 1.5.90 + +* Mon Aug 18 2014 Fedora Release Engineering - 1.5.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Wed Jul 02 2014 Adam Jackson 1.5.0-4 +- Update protocol: new surface error enums + +* Mon Jun 30 2014 Adam Jackson 1.5.0-3 +- Remove blocking flush patch as it actually introduces deadlocks now + +* Sun Jun 08 2014 Fedora Release Engineering - 1.5.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Wed May 21 2014 Richard Hughes - 1.5.0-1 +- Wayland 1.5.0 + +* Tue May 13 2014 Richard Hughes - 1.4.93-1 +- Wayland 1.4.93 + +* Fri Jan 24 2014 Richard Hughes - 1.4.0-1 +- Wayland 1.4.0 + +* Mon Jan 20 2014 Richard Hughes - 1.3.93-1 +- Wayland 1.3.93 + +* Sat Dec 21 2013 Ville Skyttä - 1.3.91-2 +- Call ldconfig in libwayland-cursor %%post* scripts. +- Run test suite during build. +- Compress snapshot tarballs with xz. + +* Tue Dec 17 2013 Richard Hughes - 1.3.91-1 +- Wayland 1.3.91 + +* Mon Nov 25 2013 Lubomir Rintel - 1.3.0-1 +- Wayland 1.3.0 + +* Mon Oct 07 2013 Adam Jackson 1.2.0-3 +- Don't use MSG_DONTWAIT in wl_connection_flush. + +* Sun Aug 04 2013 Fedora Release Engineering - 1.2.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Mon Jul 15 2013 Richard Hughes - 1.2.0-1 +- wayland 1.2.0 + +* Wed May 15 2013 Richard Hughes - 1.1.90-0.1.20130515 +- Update to a git snapshot based on what will become 1.1.90 + +* Tue Apr 16 2013 Richard Hughes - 1.1.0-1 +- wayland 1.1.0 + +* Wed Mar 27 2013 Richard Hughes - 1.0.6-1 +- wayland 1.0.6 + +* Thu Feb 21 2013 Adam Jackson 1.0.5-1 +- wayland 1.0.5 + +* Fri Feb 15 2013 Fedora Release Engineering - 1.0.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Wed Jan 02 2013 Adam Jackson 1.0.3-1 +- wayland 1.0.3 + +* Tue Oct 23 2012 Adam Jackson 1.0.0-1 +- wayland 1.0 + +* Thu Oct 18 2012 Adam Jackson 0.99.0-1 +- wayland 0.99.0 + +* Tue Sep 04 2012 Adam Jackson 0.95.0-1 +- wayland 0.95.0 (#843738) + +* Sun Jul 22 2012 Fedora Release Engineering - 0.89.0-2.20120424 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue Apr 24 2012 Richard Hughes - 0.89.0-1 +- Update to a git snapshot based on 0.89.0 + +* Sat Feb 18 2012 Thorsten Leemhuis - 0.85.0-1 +- update to 0.85.0 +- adjust license, as upstream changed it to MIT +- update make-git-snapshot.sh to current locations and scheme +- drop common package, not needed anymore +- compositor is now in a separate package, hence reduce BuildRequires to what + is actually needed (a lot less) and adjust summary +- make usage of a git checkout in spec file optional +- a %%{?_isa} to requires where it makes sense + +* Sat Jan 14 2012 Fedora Release Engineering - 0.1-0.6.20101221 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Tue Dec 06 2011 Adam Jackson - 0.1-0.5.20101221 +- Rebuild for new libpng + +* Wed Jun 15 2011 Lubomir Rintel - 0.1-0.4.20101221 +- Install real compositor binary instead of a libtool wrapper + +* Mon Feb 07 2011 Fedora Release Engineering - 0.1-0.3.20101221 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Dec 21 2010 Adam Jackson 0.1-0.2.20101221 +- Today's git snap + +* Tue Nov 23 2010 Adam Jackson 0.1-0.2.20101123 +- Today's git snap +- Fix udev rule install (#653353) + +* Mon Nov 15 2010 Adam Jackson 0.1-0.1.20101111 +- Initial packaging From a1de71cbc5110ca52d464fcd0136e0c5db1d324f Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 12:58:02 -0700 Subject: [PATCH 7/9] chore: Use pkgconfig --- spec_files/gamescope/gamescope.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec_files/gamescope/gamescope.spec b/spec_files/gamescope/gamescope.spec index b3ca437b..4c83504f 100644 --- a/spec_files/gamescope/gamescope.spec +++ b/spec_files/gamescope/gamescope.spec @@ -60,6 +60,7 @@ BuildRequires: (pkgconfig(wlroots) >= 0.18.0 with pkgconfig(wlroots) < 0.19.0) BuildRequires: (pkgconfig(libliftoff) >= 0.4.1 with pkgconfig(libliftoff) < 0.5) BuildRequires: pkgconfig(libcap) BuildRequires: pkgconfig(hwdata) +BuildRequires: pkgconfig(lcms2) BuildRequires: spirv-headers-devel # Enforce the the minimum EVR to contain fixes for all of: # CVE-2021-28021 CVE-2021-42715 CVE-2021-42716 CVE-2022-28041 CVE-2023-43898 @@ -76,7 +77,6 @@ BuildRequires: /usr/bin/glslangValidator BuildRequires: libdecor-devel BuildRequires: libXdamage-devel BuildRequires: xorg-x11-server-Xwayland-devel -BuildRequires: lcms-devel BuildRequires: git # libliftoff hasn't bumped soname, but API/ABI has changed for 0.2.0 release From c8cd94494eb0e71e732941d2a0ba2f9fc790372a Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 15:33:29 -0700 Subject: [PATCH 8/9] fix: Remove files now handled by steamdeck-dsp --- .../wireplumber.conf.d/alsa-card0.conf | 23 ------------ .../wireplumber.conf.d/alsa-card1.conf | 36 ------------------- .../alsa-ps-controller.conf | 20 ----------- .../wireplumber/wireplumber.conf.d/bluez.conf | 25 ------------- 4 files changed, 104 deletions(-) delete mode 100644 system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card0.conf delete mode 100644 system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card1.conf delete mode 100644 system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-ps-controller.conf delete mode 100644 system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/bluez.conf diff --git a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card0.conf b/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card0.conf deleted file mode 100644 index 73255fb9..00000000 --- a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card0.conf +++ /dev/null @@ -1,23 +0,0 @@ -monitor.alsa.rules = [ - { - matches = [ - { - node.name = "~alsa_input.*" - alsa.card_name = "HD-Audio Generic" - } - { - node.name = "~alsa_output.*" - alsa.card_name = "HD-Audio Generic" - } - ] - actions = { - update-props = { - priority.driver = 900 - priority.session = 900 - api.alsa.period-size = 256 - api.alsa.headroom = 1024 - session.suspend-timeout-seconds = 0 - } - } - } -] diff --git a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card1.conf b/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card1.conf deleted file mode 100644 index 4f2e57a2..00000000 --- a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-card1.conf +++ /dev/null @@ -1,36 +0,0 @@ -monitor.alsa.rules = [ - { - matches = [ - { - node.name = "~alsa_input.*" - alsa.card_name = "acp5x" - } - { - node.name = "~alsa_input.*" - alsa.card_name = "acp6x" - } - { - node.name = "~alsa_input.*" - alsa.card_name = "sof-nau8821-max" - } - { - node.name = "~alsa_output.*" - alsa.card_name = "acp5x" - } - { - node.name = "~alsa_output.*" - alsa.card_name = "acp6x" - } - { - node.name = "~alsa_output.*" - alsa.card_name = "sof-nau8821-max" - } - ] - actions = { - update-props = { - session.suspend-timeout-seconds = 0 - api.alsa.headroom = 1024 - } - } - } -] diff --git a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-ps-controller.conf b/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-ps-controller.conf deleted file mode 100644 index e0c2a5ff..00000000 --- a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/alsa-ps-controller.conf +++ /dev/null @@ -1,20 +0,0 @@ -monitor.alsa.rules = [ - { - matches = [ - { - node.name = "~alsa_input.*" - alsa.card_name = "Wireless Controller" - } - { - node.name = "~alsa_output.*" - alsa.card_name = "Wireless Controller" - } - ] - actions = { - update-props = { - priority.driver = 90 - priority.session = 90 - } - } - } -] diff --git a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/bluez.conf b/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/bluez.conf deleted file mode 100644 index 75e8f21a..00000000 --- a/system_files/deck/shared/usr/etc/wireplumber/wireplumber.conf.d/bluez.conf +++ /dev/null @@ -1,25 +0,0 @@ -monitor.bluez.properties = { - ## we only want these audio profiles: - ## 0000110a-0000-1000-8000-00805f9b34fb Audio Source - ## 0000110b-0000-1000-8000-00805f9b34fb Audio Sink - ## 0000110d-0000-1000-8000-00805f9b34fb Advanced Audio Distribution - - ## And only this one headset related profile: - ## disabled: 00001112-0000-1000-8000-00805f9b34fb hsp_ag - ## disabled: 00001108-0000-1000-8000-00805f9b34fb hsp_hs - ## disabled: 0000111e-0000-1000-8000-00805f9b34fb hfp_hf - ## enabled : 0000111f-0000-1000-8000-00805f9b34fb hfp_ag - ## >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> * <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ## NOTE: This used to be in .headset-roles, which was merged into .roles - ## NOTE: check hfphsp-backend below as that also affects hs/hf profiles - ## >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> * <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - bluez5.roles = "[ a2dp_sink a2dp_source hfp_ag ]" - - ## HFP/HSP backend (default: native). - ## Available values: any, none, hsphfpd, ofono, native - ## setting this to "none" disables all headset roles - bluez5.hfphsp-backend = "native" - - ## Disable dummy AVRCP player - bluez5.dummy-avrcp-player = false -} From 991b6044ee58e274ecd31133d1b82ef408b90126 Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Thu, 1 Aug 2024 15:33:54 -0700 Subject: [PATCH 9/9] chore: Remove wayland spec file --- .../gamescope/wayland/emersion-gpg-key.asc | Bin 7501 -> 0 bytes spec_files/gamescope/wayland/wayland.spec | 449 ------------------ 2 files changed, 449 deletions(-) delete mode 100644 spec_files/gamescope/wayland/emersion-gpg-key.asc delete mode 100644 spec_files/gamescope/wayland/wayland.spec diff --git a/spec_files/gamescope/wayland/emersion-gpg-key.asc b/spec_files/gamescope/wayland/emersion-gpg-key.asc deleted file mode 100644 index cc3b6a06af86e73144a2da89ca2f6616fcdd9dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7501 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 diff --git a/spec_files/gamescope/wayland/wayland.spec b/spec_files/gamescope/wayland/wayland.spec deleted file mode 100644 index 05286fbc..00000000 --- a/spec_files/gamescope/wayland/wayland.spec +++ /dev/null @@ -1,449 +0,0 @@ -Name: wayland -Version: 1.23.0 -Release: 2%{?dist} -Summary: Wayland Compositor Infrastructure - -# SPDX -License: MIT -URL: http://wayland.freedesktop.org/ -Source0: https://gitlab.freedesktop.org/%{name}/%{name}/-/releases/%{version}/downloads/%{name}-%{version}.tar.xz -Source1: https://gitlab.freedesktop.org/%{name}/%{name}/-/releases/%{version}/downloads/%{name}-%{version}.tar.xz.sig -Source2: emersion-gpg-key.asc - -BuildRequires: gcc -BuildRequires: gcc-c++ -BuildRequires: docbook-style-xsl -BuildRequires: doxygen -BuildRequires: expat-devel -BuildRequires: graphviz -BuildRequires: libxml2-devel -BuildRequires: libxslt -BuildRequires: meson -BuildRequires: pkgconfig(libffi) -BuildRequires: xmlto - -# For origin certification -BuildRequires: gnupg2 - -%description -Wayland is a protocol for a compositor to talk to its clients as well as a C -library implementation of that protocol. The compositor can be a standalone -display server running on Linux kernel modesetting and evdev input devices, -an X application, or a wayland client itself. The clients can be traditional -applications, X servers (rootless or fullscreen) or other display servers. - -%package devel -Summary: Development files for %{name} -Requires: libwayland-client%{?_isa} = %{version}-%{release} -Requires: libwayland-cursor%{?_isa} = %{version}-%{release} -Requires: libwayland-egl%{?_isa} = %{version}-%{release} -Requires: libwayland-server%{?_isa} = %{version}-%{release} - -%description devel -The %{name}-devel package contains libraries and header files for -developing applications that use %{name}. - -%package doc -Summary: Wayland development documentation -BuildArch: noarch -%description doc -Wayland development documentation - -%package -n libwayland-client -Summary: Wayland client library -%description -n libwayland-client -Wayland client library - -%package -n libwayland-cursor -Summary: Wayland cursor library -Requires: libwayland-client%{?_isa} = %{version}-%{release} -%description -n libwayland-cursor -Wayland cursor library - -%package -n libwayland-egl -Summary: Wayland egl library -%description -n libwayland-egl -Wayland egl library - -%package -n libwayland-server -Summary: Wayland server library -%description -n libwayland-server -Wayland server library - -%prep -%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}' -%autosetup -p1 - -%build -%meson -%meson_build - -%install -%meson_install - -%check -%meson_test - -%files devel -%{_bindir}/wayland-scanner -%{_includedir}/wayland-*.h -%{_libdir}/pkgconfig/wayland-*.pc -%{_libdir}/libwayland-*.so -%{_datadir}/aclocal/wayland-scanner.m4 -%dir %{_datadir}/wayland -%{_datadir}/wayland/wayland-scanner.mk -%{_datadir}/wayland/wayland.xml -%{_datadir}/wayland/wayland.dtd -%{_mandir}/man3/*.3* - -%files doc -%doc README.md -%{_datadir}/doc/wayland/ - -%files -n libwayland-client -%license COPYING -%{_libdir}/libwayland-client.so.0* - -%files -n libwayland-cursor -%license COPYING -%{_libdir}/libwayland-cursor.so.0* - -%files -n libwayland-egl -%license COPYING -%{_libdir}/libwayland-egl.so.1* - -%files -n libwayland-server -%license COPYING -%{_libdir}/libwayland-server.so.0* - -%changelog -* Sat Jul 20 2024 Fedora Release Engineering - 1.23.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Fri Jun 28 2024 Olivier Fourdan - 1.23.0-1 -- Update to 1.23.0 - -* Sat Jan 27 2024 Fedora Release Engineering - 1.22.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Thu Sep 07 2023 José Expósito -- SPDX migration: license is already SPDX compatible - -* Sat Jul 22 2023 Fedora Release Engineering - 1.22.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Tue Apr 04 2023 Kalev Lember - 1.22.0-1 -- Update to 1.22.0 - -* Sat Jan 21 2023 Fedora Release Engineering - 1.21.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Tue Jul 26 2022 Mike Rochefort - 1.21.0-1 -- Update to 1.21.0 - -* Sat Jul 23 2022 Fedora Release Engineering - 1.20.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Mon Mar 21 2022 Olivier Fourdan - 1.20.0-4 -- Close file descriptors not needed - rhbz#2062030 - -* Sat Jan 22 2022 Fedora Release Engineering - 1.20.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Sat Jan 08 2022 Miro Hrončok - 1.20.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Changes/LIBFFI34 - -* Thu Dec 16 2021 Kalev Lember - 1.20.0-1 -- Update to 1.20.0 - -* Fri Jul 23 2021 Fedora Release Engineering - 1.19.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Thu Jan 28 2021 Kalev Lember - 1.19.0-1 -- Update to 1.19.0 -- Switch to meson build system -- Drop old provides - -* Wed Jan 27 2021 Fedora Release Engineering - 1.18.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Wed Jul 29 2020 Fedora Release Engineering - 1.18.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Wed Feb 12 2020 Kalev Lember - 1.18.0-1 -- Update to 1.18.0 -- Drop no longer needed obsoletes/provides - -* Fri Jan 31 2020 Fedora Release Engineering - 1.17.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Sat Jul 27 2019 Fedora Release Engineering - 1.17.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Thu Mar 21 2019 Kalev Lember - 1.17.0-1 -- Update to 1.17.0 - -* Thu Mar 07 2019 Kalev Lember - 1.16.92-1 -- Update to 1.16.92 - -* Thu Feb 28 2019 Kalev Lember - 1.16.91-1 -- Update to 1.16.91 - -* Sun Feb 03 2019 Fedora Release Engineering - 1.16.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Tue Sep 11 2018 Kalev Lember - 1.16.0-1 -- Update to 1.16.0 - -* Mon Aug 13 2018 Kalev Lember - 1.15.93-1 -- Update to 1.15.93 - -* Tue Jul 31 2018 Florian Weimer - 1.15.92-2 -- Rebuild with fixed binutils - -* Sun Jul 29 2018 Kalev Lember - 1.15.92-1 -- Update to 1.15.92 - -* Sat Jul 14 2018 Fedora Release Engineering - 1.15.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Mon Apr 09 2018 Kalev Lember - 1.15.0-1 -- Update to 1.15.0 - -* Wed Apr 04 2018 Kalev Lember - 1.14.93-2 -- Make mesa-libwayland-egl obsoleting actually work - -* Tue Apr 03 2018 Kalev Lember - 1.14.93-1 -- Update to 1.14.93 - -* Tue Mar 20 2018 Kalev Lember - 1.14.92-1 -- Update to 1.14.92 -- Remove F22 upgrade path obsoletes - -* Sat Mar 03 2018 Igor Gnatenko - 1.14.91-2 -- Improve Obsoletes - -* Tue Feb 27 2018 Kalev Lember - 1.14.91-1 -- Update to 1.14.91 -- Add new libwayland-egl subpackage and obsolete mesa-libwayland-egl -- Remove ldconfig scriptlets - -* Fri Feb 09 2018 Fedora Release Engineering - 1.14.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Tue Dec 12 2017 Kalev Lember - 1.14.0-2 -- cursor: Fix heap overflows when parsing malicious files (#1522638) - -* Wed Aug 09 2017 Kalev Lember - 1.14.0-1 -- Update to 1.14.0 - -* Wed Aug 02 2017 Kalev Lember - 1.13.93-1 -- Update to 1.13.93 - -* Sun Jul 30 2017 Florian Weimer - 1.13.92-2 -- Rebuild with binutils fix for ppc64le (#1475636) - -* Wed Jul 26 2017 Kalev Lember - 1.13.92-1 -- Update to 1.13.92 - -* Wed Jul 19 2017 Kalev Lember - 1.13.91-1 -- Update to 1.13.91 - -* Thu Jun 1 2017 Owen Taylor otaylor@redhat.com> - 1.13.0-2 -- Add a patch fixing a build error with newer versions of graphviz - -* Wed Feb 22 2017 Kalev Lember - 1.13.0-1 -- Update to 1.13.0 - -* Sat Feb 11 2017 Fedora Release Engineering - 1.12.91-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Wed Jan 25 2017 Kalev Lember - 1.12.91-1 -- Update to 1.12.91 - -* Wed Sep 21 2016 Kalev Lember - 1.12.0-1 -- Update to 1.12.0 - -* Wed Sep 14 2016 Kalev Lember - 1.11.94-1 -- Update to 1.11.94 - -* Thu Sep 08 2016 Kalev Lember - 1.11.93-1 -- Update to 1.11.93 - -* Wed Aug 31 2016 Kalev Lember - 1.11.92-1 -- Update to 1.11.92 - -* Wed Aug 17 2016 Kalev Lember - 1.11.91-1 -- Update to 1.11.91 -- Simplify -devel subpackage packaging -- Include license files in packaging - -* Wed Jun 01 2016 Kalev Lember - 1.11.0-1 -- Update to 1.11.0 - -* Wed May 25 2016 Kalev Lember - 1.10.93-1 -- Update to 1.10.93 - -* Wed May 18 2016 Kalev Lember - 1.10.92-1 -- Update to 1.10.92 - -* Sun May 08 2016 Kalev Lember - 1.10.91-1 -- Update to 1.10.91 - -* Thu Feb 18 2016 Kalev Lember - 1.10.0-1 -- Update to 1.10.0 - -* Thu Feb 04 2016 Kalev Lember - 1.9.92-1 -- Update to 1.9.92 - -* Wed Jan 20 2016 Kalev Lember - 1.9.91-1 -- Update to 1.9.91 - -* Tue Sep 22 2015 Kalev Lember - 1.9.0-1 -- Update to 1.9.0 -- Use make_install macro - -* Wed Sep 16 2015 Kalev Lember - 1.8.93-1 -- Update to 1.8.93 - -* Wed Sep 02 2015 Kalev Lember - 1.8.92-1 -- Update to 1.8.92 - -* Fri Aug 21 2015 Kalev Lember - 1.8.91-2 -- Split out wayland-doc subpackage for documentation - -* Fri Aug 21 2015 Kalev Lember - 1.8.91-1 -- Update to 1.8.91 - -* Mon Jul 20 2015 Adam Jackson 1.8.0-1 -- wayland 1.8.0 - -* Fri Jun 19 2015 Fedora Release Engineering - 1.7.92-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Tue May 26 2015 Adam Jackson 1.7.92-1 -- wayland 1.7.92 - -* Sat Feb 21 2015 Till Maas - 1.7.0-2 -- Rebuilt for Fedora 23 Change - https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code - -* Tue Feb 17 2015 Richard Hughes - 1.7.0-1 -- Wayland 1.7.0 - -* Fri Sep 19 2014 Kalev Lember - 1.6.0-1 -- Update to 1.6.0 -- Remove lib64 rpaths - -* Fri Aug 22 2014 Kevin Fenzi 1.5.91-1 -- Update to 1.5.90 - -* Mon Aug 18 2014 Fedora Release Engineering - 1.5.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Wed Jul 02 2014 Adam Jackson 1.5.0-4 -- Update protocol: new surface error enums - -* Mon Jun 30 2014 Adam Jackson 1.5.0-3 -- Remove blocking flush patch as it actually introduces deadlocks now - -* Sun Jun 08 2014 Fedora Release Engineering - 1.5.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Wed May 21 2014 Richard Hughes - 1.5.0-1 -- Wayland 1.5.0 - -* Tue May 13 2014 Richard Hughes - 1.4.93-1 -- Wayland 1.4.93 - -* Fri Jan 24 2014 Richard Hughes - 1.4.0-1 -- Wayland 1.4.0 - -* Mon Jan 20 2014 Richard Hughes - 1.3.93-1 -- Wayland 1.3.93 - -* Sat Dec 21 2013 Ville Skyttä - 1.3.91-2 -- Call ldconfig in libwayland-cursor %%post* scripts. -- Run test suite during build. -- Compress snapshot tarballs with xz. - -* Tue Dec 17 2013 Richard Hughes - 1.3.91-1 -- Wayland 1.3.91 - -* Mon Nov 25 2013 Lubomir Rintel - 1.3.0-1 -- Wayland 1.3.0 - -* Mon Oct 07 2013 Adam Jackson 1.2.0-3 -- Don't use MSG_DONTWAIT in wl_connection_flush. - -* Sun Aug 04 2013 Fedora Release Engineering - 1.2.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Mon Jul 15 2013 Richard Hughes - 1.2.0-1 -- wayland 1.2.0 - -* Wed May 15 2013 Richard Hughes - 1.1.90-0.1.20130515 -- Update to a git snapshot based on what will become 1.1.90 - -* Tue Apr 16 2013 Richard Hughes - 1.1.0-1 -- wayland 1.1.0 - -* Wed Mar 27 2013 Richard Hughes - 1.0.6-1 -- wayland 1.0.6 - -* Thu Feb 21 2013 Adam Jackson 1.0.5-1 -- wayland 1.0.5 - -* Fri Feb 15 2013 Fedora Release Engineering - 1.0.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Wed Jan 02 2013 Adam Jackson 1.0.3-1 -- wayland 1.0.3 - -* Tue Oct 23 2012 Adam Jackson 1.0.0-1 -- wayland 1.0 - -* Thu Oct 18 2012 Adam Jackson 0.99.0-1 -- wayland 0.99.0 - -* Tue Sep 04 2012 Adam Jackson 0.95.0-1 -- wayland 0.95.0 (#843738) - -* Sun Jul 22 2012 Fedora Release Engineering - 0.89.0-2.20120424 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Tue Apr 24 2012 Richard Hughes - 0.89.0-1 -- Update to a git snapshot based on 0.89.0 - -* Sat Feb 18 2012 Thorsten Leemhuis - 0.85.0-1 -- update to 0.85.0 -- adjust license, as upstream changed it to MIT -- update make-git-snapshot.sh to current locations and scheme -- drop common package, not needed anymore -- compositor is now in a separate package, hence reduce BuildRequires to what - is actually needed (a lot less) and adjust summary -- make usage of a git checkout in spec file optional -- a %%{?_isa} to requires where it makes sense - -* Sat Jan 14 2012 Fedora Release Engineering - 0.1-0.6.20101221 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Tue Dec 06 2011 Adam Jackson - 0.1-0.5.20101221 -- Rebuild for new libpng - -* Wed Jun 15 2011 Lubomir Rintel - 0.1-0.4.20101221 -- Install real compositor binary instead of a libtool wrapper - -* Mon Feb 07 2011 Fedora Release Engineering - 0.1-0.3.20101221 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Tue Dec 21 2010 Adam Jackson 0.1-0.2.20101221 -- Today's git snap - -* Tue Nov 23 2010 Adam Jackson 0.1-0.2.20101123 -- Today's git snap -- Fix udev rule install (#653353) - -* Mon Nov 15 2010 Adam Jackson 0.1-0.1.20101111 -- Initial packaging