From d90cec7aa72f48b04508ab80b7e6863e258c90d0 Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Wed, 5 Mar 2025 13:34:15 +0100 Subject: [PATCH 01/80] xwayland 24.1.6 --- my-ostree-os/xorg-x11-server-Xwayland.spec | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/my-ostree-os/xorg-x11-server-Xwayland.spec b/my-ostree-os/xorg-x11-server-Xwayland.spec index 4852605..ef3430c 100644 --- a/my-ostree-os/xorg-x11-server-Xwayland.spec +++ b/my-ostree-os/xorg-x11-server-Xwayland.spec @@ -11,8 +11,8 @@ Summary: Xwayland Name: xorg-x11-server-Xwayland -Version: 24.1.5 -Release: 15.clang.skylake%{?dist} +Version: 24.1.6 +Release: 10.clang.skylake%{?dist} URL: http://www.x.org %if 0%{?gitdate} @@ -138,6 +138,14 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop %{_libdir}/pkgconfig/xwayland.pc %changelog +* Wed Feb 26 2025 Olivier Fourdan - 24.1.6-1 +- xwayland 24.1.6 (#2343992) +- CVE fix for: CVE-2025-26594, CVE-2025-26595, CVE-2025-26596, CVE-2025-26597, + CVE-2025-26598, CVE-2025-26599, CVE-2025-26600, CVE-2025-26601 + +* Tue Feb 11 2025 Olivier Fourdan - 24.1.5-2 +- Fix a regression with keyboard modifiers due to a bug in gamescope + * Wed Feb 5 2025 Olivier Fourdan - 24.1.5-1 - xwayland 24.1.5 From c6a5d3001f9ec0e242194b8ce051cdfaa42702fe Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Fri, 7 Mar 2025 13:41:10 +0100 Subject: [PATCH 02/80] Mesa 25.0.1 --- my-ostree-os/mesa.spec | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/my-ostree-os/mesa.spec b/my-ostree-os/mesa.spec index dfd0754..cf4fc8b 100644 --- a/my-ostree-os/mesa.spec +++ b/my-ostree-os/mesa.spec @@ -69,7 +69,7 @@ Name: mesa Summary: Mesa graphics libraries -%global ver 25.0.0 +%global ver 25.0.1 Version: %{lua:ver = string.gsub(rpm.expand("%{ver}"), "-", "~"); print(ver)} Release: 11.clang.skylake%{?dist} License: MIT AND BSD-3-Clause AND SGI-B-2.0 @@ -83,8 +83,6 @@ Source1: https://src.fedoraproject.org/rpms/mesa/raw/f41/f/Mesa-MLAA-Lice Patch10: https://src.fedoraproject.org/rpms/mesa/raw/f41/f/gnome-shell-glthread-disable.patch -Patch20: https://src.fedoraproject.org/rpms/mesa/raw/f41/f/0001-vulkan-wsi-x11-fix-use-of-uninitialised-xfixes-regio.patch - BuildRequires: meson >= 1.3.0 BuildRequires: gcc BuildRequires: gcc-c++ From 135c0a9a258fc13257cdc2b1b9c1d54625894918 Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Fri, 7 Mar 2025 19:18:15 +0100 Subject: [PATCH 03/80] kernel 6.12.18 --- my-ostree-os/kernel-cachyos-lts-lto-skylake.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec index f41c701..67f0166 100644 --- a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec +++ b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec @@ -13,7 +13,7 @@ # Linux Kernel Versions %define _basekver 6.12 -%define _stablekver 17 +%define _stablekver 18 %define _rpmver %{version}-%{release} %define _kver %{_rpmver}.%{_arch} From 91a27a1640fa462c9c7f1658e359db6ef8aac6d5 Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Fri, 7 Mar 2025 19:21:39 +0100 Subject: [PATCH 04/80] mesa: change release back to 10 --- my-ostree-os/mesa.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/my-ostree-os/mesa.spec b/my-ostree-os/mesa.spec index cf4fc8b..ffe4407 100644 --- a/my-ostree-os/mesa.spec +++ b/my-ostree-os/mesa.spec @@ -71,7 +71,7 @@ Name: mesa Summary: Mesa graphics libraries %global ver 25.0.1 Version: %{lua:ver = string.gsub(rpm.expand("%{ver}"), "-", "~"); print(ver)} -Release: 11.clang.skylake%{?dist} +Release: 10.clang.skylake%{?dist} License: MIT AND BSD-3-Clause AND SGI-B-2.0 URL: http://www.mesa3d.org From c201ebaca9cf993a7b4197dcfdb8a8bd27cc2178 Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Sat, 15 Mar 2025 10:56:36 +0100 Subject: [PATCH 05/80] kernel 6.12.19 --- my-ostree-os/kernel-cachyos-lts-lto-skylake.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec index 67f0166..f4dfede 100644 --- a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec +++ b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec @@ -13,7 +13,7 @@ # Linux Kernel Versions %define _basekver 6.12 -%define _stablekver 18 +%define _stablekver 19 %define _rpmver %{version}-%{release} %define _kver %{_rpmver}.%{_arch} From b375c5ab3a6a7fe029aa2a016d4fd532462fc596 Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Tue, 25 Mar 2025 15:10:58 +0100 Subject: [PATCH 06/80] kernel 6.12.20 --- my-ostree-os/kernel-cachyos-lts-lto-skylake.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec index f4dfede..e101b38 100644 --- a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec +++ b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec @@ -13,7 +13,7 @@ # Linux Kernel Versions %define _basekver 6.12 -%define _stablekver 19 +%define _stablekver 20 %define _rpmver %{version}-%{release} %define _kver %{_rpmver}.%{_arch} From 3bb9f21f0b3e987fd9a3c2bbc6e83650602bbee5 Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Wed, 2 Apr 2025 09:50:41 +0200 Subject: [PATCH 07/80] kernel 6.12.21 --- my-ostree-os/kernel-cachyos-lts-lto-skylake.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec index e101b38..bbd012b 100644 --- a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec +++ b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec @@ -13,7 +13,7 @@ # Linux Kernel Versions %define _basekver 6.12 -%define _stablekver 20 +%define _stablekver 21 %define _rpmver %{version}-%{release} %define _kver %{_rpmver}.%{_arch} From f780a69a2dbf2fb6fb5755533df1fb90e274b54b Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Tue, 15 Apr 2025 15:58:52 +0200 Subject: [PATCH 08/80] kernel 6.12.23 --- my-ostree-os/kernel-cachyos-lts-lto-skylake.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec index bbd012b..9f1e046 100644 --- a/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec +++ b/my-ostree-os/kernel-cachyos-lts-lto-skylake.spec @@ -13,7 +13,7 @@ # Linux Kernel Versions %define _basekver 6.12 -%define _stablekver 21 +%define _stablekver 23 %define _rpmver %{version}-%{release} %define _kver %{_rpmver}.%{_arch} From 1e0e785b14219969681df1834cbdd876ab9cb8c5 Mon Sep 17 00:00:00 2001 From: Anders Rytter Hansen Date: Tue, 15 Apr 2025 16:08:39 +0200 Subject: [PATCH 09/80] Mesa 25.0.3: upgrade Mesa and add patches to this repo --- ...ocs-features-add-VK_EXT_hdr_metadata.patch | 28 + ...ed-wayland-protocols-version-to-1.41.patch | 116 ++++ ...update-wayland-protocols-source_hash.patch | 34 + ...ment-the-Wayland-color-management-pr.patch | 614 ++++++++++++++++++ ...ment-support-for-VK_EXT_hdr_metadata.patch | 496 ++++++++++++++ ...e-the-compositor-not-supporting-exte.patch | 53 ++ .../Mesa-MLAA-License-Clarification-Email.txt | 117 ++++ ...5e80c316c0af3fff310ca89e1175d81556c1.patch | 144 ++++ .../mesa/gnome-shell-glthread-disable.patch | 11 + my-ostree-os/{ => mesa}/mesa.spec | 21 +- 10 files changed, 1630 insertions(+), 4 deletions(-) create mode 100644 my-ostree-os/mesa/0001-docs-features-add-VK_EXT_hdr_metadata.patch create mode 100644 my-ostree-os/mesa/0001-increase-required-wayland-protocols-version-to-1.41.patch create mode 100644 my-ostree-os/mesa/0001-meson-update-wayland-protocols-source_hash.patch create mode 100644 my-ostree-os/mesa/0002-vulkan-wsi-implement-the-Wayland-color-management-pr.patch create mode 100644 my-ostree-os/mesa/0003-vulkan-wsi-implement-support-for-VK_EXT_hdr_metadata.patch create mode 100644 my-ostree-os/mesa/0004-vulkan-wsi-handle-the-compositor-not-supporting-exte.patch create mode 100644 my-ostree-os/mesa/Mesa-MLAA-License-Clarification-Email.txt create mode 100644 my-ostree-os/mesa/e4eb5e80c316c0af3fff310ca89e1175d81556c1.patch create mode 100644 my-ostree-os/mesa/gnome-shell-glthread-disable.patch rename my-ostree-os/{ => mesa}/mesa.spec (95%) diff --git a/my-ostree-os/mesa/0001-docs-features-add-VK_EXT_hdr_metadata.patch b/my-ostree-os/mesa/0001-docs-features-add-VK_EXT_hdr_metadata.patch new file mode 100644 index 0000000..235dfb6 --- /dev/null +++ b/my-ostree-os/mesa/0001-docs-features-add-VK_EXT_hdr_metadata.patch @@ -0,0 +1,28 @@ +From b97a4dc4caf609975ba9e80336e63ebc9545a91b Mon Sep 17 00:00:00 2001 +From: Erik Faye-Lund +Date: Thu, 6 Mar 2025 13:53:07 +0100 +Subject: [PATCH] docs/features: add VK_EXT_hdr_metadata + +This was missed when it was recently added. + +Fixes: 4b663d561b8 ("vulkan/wsi: implement support for VK_EXT_hdr_metadata on Wayland") +Part-of: +--- + docs/features.txt | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/docs/features.txt b/docs/features.txt +index 6e789b3ed29..53395bfee2a 100644 +--- a/docs/features.txt ++++ b/docs/features.txt +@@ -612,6 +612,7 @@ Khronos extensions that are not part of any Vulkan version: + VK_EXT_global_priority DONE (anv, hasvk, panvk, radv, tu) + VK_EXT_global_priority_query DONE (anv, hasvk, panvk, radv, tu) + VK_EXT_graphics_pipeline_library DONE (anv, lvp, nvk, panvk, radv, tu, vn) ++ VK_EXT_hdr_metadata DONE (anv, lvp, nvk, panvk, radv, tu) + VK_EXT_headless_surface DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) + VK_EXT_image_2d_view_of_3d DONE (anv, hasvk, lvp, nvk, radv, tu, vn) + VK_EXT_image_compression_control DONE (radv) +-- +2.49.0 + diff --git a/my-ostree-os/mesa/0001-increase-required-wayland-protocols-version-to-1.41.patch b/my-ostree-os/mesa/0001-increase-required-wayland-protocols-version-to-1.41.patch new file mode 100644 index 0000000..f5f36a5 --- /dev/null +++ b/my-ostree-os/mesa/0001-increase-required-wayland-protocols-version-to-1.41.patch @@ -0,0 +1,116 @@ +From c15c45c54bb2fd03b41416c6628efcb095eec4b6 Mon Sep 17 00:00:00 2001 +From: Xaver Hugl +Date: Mon, 17 Feb 2025 16:25:09 +0100 +Subject: [PATCH 1/4] increase required wayland-protocols version to 1.41 + +This version contains the color management protocol. + +This commit also adjusts the build-wayland script to mention +that the DEBIAN_BASE_TAG also has to be bumped. + +Signed-off-by: Xaver Hugl +Reviewed-by: Eric Engestrom +Reviewed-by: Sebastian Wick +Acked-by: Daniel Stone +Part-of: +--- + .gitlab-ci/container/build-wayland.sh | 4 +++- + .gitlab-ci/image-tags.yml | 16 ++++++++-------- + meson.build | 2 +- + subprojects/wayland-protocols.wrap | 6 +++--- + 4 files changed, 15 insertions(+), 13 deletions(-) + +diff --git a/.gitlab-ci/container/build-wayland.sh b/.gitlab-ci/container/build-wayland.sh +index d6117254e87..551edcfe7db 100644 +--- a/.gitlab-ci/container/build-wayland.sh ++++ b/.gitlab-ci/container/build-wayland.sh +@@ -7,6 +7,8 @@ uncollapsed_section_start wayland "Building Wayland" + + # When changing this file, you need to bump the following + # .gitlab-ci/image-tags.yml tags: ++# ALPINE_X86_64_BUILD_TAG ++# DEBIAN_BASE_TAG + # DEBIAN_BUILD_TAG + # DEBIAN_TEST_ANDROID_TAG + # DEBIAN_TEST_GL_TAG +@@ -15,7 +17,7 @@ uncollapsed_section_start wayland "Building Wayland" + # KERNEL_ROOTFS_TAG + + export LIBWAYLAND_VERSION="1.21.0" +-export WAYLAND_PROTOCOLS_VERSION="1.38" ++export WAYLAND_PROTOCOLS_VERSION="1.41" + + git clone https://gitlab.freedesktop.org/wayland/wayland + cd wayland +diff --git a/.gitlab-ci/image-tags.yml b/.gitlab-ci/image-tags.yml +index 89909ed7912..b8423ef3d4f 100644 +--- a/.gitlab-ci/image-tags.yml ++++ b/.gitlab-ci/image-tags.yml +@@ -13,10 +13,10 @@ + + variables: + DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base" +- DEBIAN_BASE_TAG: "20250130-vvless" ++ DEBIAN_BASE_TAG: "20250223-way-prot" + + DEBIAN_X86_64_BUILD_IMAGE_PATH: "debian/x86_64_build" +- DEBIAN_BUILD_TAG: "20250128-llvm19-up" ++ DEBIAN_BUILD_TAG: "20250223-way-prot" + + DEBIAN_X86_64_TEST_BASE_IMAGE: "debian/x86_64_test-base" + DEBIAN_ARM64_TEST_BASE_IMAGE: "debian/arm64_test-base" +@@ -27,17 +27,17 @@ variables: + DEBIAN_ARM64_TEST_IMAGE_VK_PATH: "debian/arm64_test-vk" + DEBIAN_X86_64_TEST_ANDROID_IMAGE_PATH: "debian/x86_64_test-android" + +- DEBIAN_TEST_ANDROID_TAG: "20250130-vvless" +- DEBIAN_TEST_GL_TAG: "20250327-piglit-250" +- DEBIAN_TEST_VK_TAG: "20250327-piglit-250" +- KERNEL_ROOTFS_TAG: "20250327-trace-250" ++ DEBIAN_TEST_ANDROID_TAG: "20250223-way-prot" ++ DEBIAN_TEST_GL_TAG: "20250223-way-prot" ++ DEBIAN_TEST_VK_TAG: "20250223-way-prot" ++ KERNEL_ROOTFS_TAG: "20250223-way-prot" + + DEBIAN_PYUTILS_IMAGE: "debian/x86_64_pyutils" + DEBIAN_PYUTILS_TAG: "20250129-lavacli" + +- ALPINE_X86_64_BUILD_TAG: "20250128-llversionm" ++ ALPINE_X86_64_BUILD_TAG: "20250223-way-prot" + ALPINE_X86_64_LAVA_SSH_TAG: "20250124-spirv-tools" +- FEDORA_X86_64_BUILD_TAG: "20250128-llversionm" ++ FEDORA_X86_64_BUILD_TAG: "20250223-way-prot" + + KERNEL_TAG: "v6.13-rc4-mesa-5e77" + KERNEL_REPO: "gfx-ci/linux" +diff --git a/meson.build b/meson.build +index 095aec5d9ea..ddde02c1755 100644 +--- a/meson.build ++++ b/meson.build +@@ -2058,7 +2058,7 @@ if with_platform_wayland + else + wl_scanner_arg = 'code' + endif +- dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.38', default_options: [ 'tests=false' ]) ++ dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.41', default_options: [ 'tests=false' ]) + dep_wayland_client = dependency('wayland-client', version : '>=1.18') + dep_wayland_server = dependency('wayland-server', version : '>=1.18') + if with_egl +diff --git a/subprojects/wayland-protocols.wrap b/subprojects/wayland-protocols.wrap +index 61f306bdffd..c82fece01e3 100644 +--- a/subprojects/wayland-protocols.wrap ++++ b/subprojects/wayland-protocols.wrap +@@ -1,7 +1,7 @@ + [wrap-file] +-directory = wayland-protocols-1.38 +-source_url = https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.38/downloads/wayland-protocols-1.38.tar.xz +-source_filename = wayland-protocols-1.38.tar.xz ++directory = wayland-protocols-1.41 ++source_url = https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.41/downloads/wayland-protocols-1.41.tar.xz ++source_filename = wayland-protocols-1.41.tar.xz + source_hash = ff17292c05159d2b20ce6cacfe42d7e31a28198fa1429a769b03af7c38581dbe + + [provide] +-- +2.47.0 + diff --git a/my-ostree-os/mesa/0001-meson-update-wayland-protocols-source_hash.patch b/my-ostree-os/mesa/0001-meson-update-wayland-protocols-source_hash.patch new file mode 100644 index 0000000..424f76e --- /dev/null +++ b/my-ostree-os/mesa/0001-meson-update-wayland-protocols-source_hash.patch @@ -0,0 +1,34 @@ +From 7f749c41ba8d9918251c00eeb86d453cda5fbb7b Mon Sep 17 00:00:00 2001 +From: Benjamin Lee +Date: Tue, 25 Feb 2025 22:03:25 -0800 +Subject: [PATCH] meson: update wayland-protocols source_hash +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This was missed when updating to 1.41. + +Signed-off-by: Benjamin Lee +Fixes: 53b40a40f46 ("increase required wayland-protocols version to 1.41") +Reviewed-by: Tapani Pälli +Part-of: +--- + subprojects/wayland-protocols.wrap | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/subprojects/wayland-protocols.wrap b/subprojects/wayland-protocols.wrap +index c82fece01e3..c6686b4ae4a 100644 +--- a/subprojects/wayland-protocols.wrap ++++ b/subprojects/wayland-protocols.wrap +@@ -2,7 +2,7 @@ + directory = wayland-protocols-1.41 + source_url = https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.41/downloads/wayland-protocols-1.41.tar.xz + source_filename = wayland-protocols-1.41.tar.xz +-source_hash = ff17292c05159d2b20ce6cacfe42d7e31a28198fa1429a769b03af7c38581dbe ++source_hash = 2786b6b1b79965e313f2c289c12075b9ed700d41844810c51afda10ee329576b + + [provide] + wayland-protocols = wayland_protocols +-- +2.49.0 + diff --git a/my-ostree-os/mesa/0002-vulkan-wsi-implement-the-Wayland-color-management-pr.patch b/my-ostree-os/mesa/0002-vulkan-wsi-implement-the-Wayland-color-management-pr.patch new file mode 100644 index 0000000..cfab19a --- /dev/null +++ b/my-ostree-os/mesa/0002-vulkan-wsi-implement-the-Wayland-color-management-pr.patch @@ -0,0 +1,614 @@ +From 5dd0635b31fcb6b12e9dcb3b908e501f153e7e8b Mon Sep 17 00:00:00 2001 +From: Colin Marc +Date: Tue, 26 Mar 2024 11:12:28 +0100 +Subject: [PATCH 2/4] vulkan/wsi: implement the Wayland color management + protocol + +This allows applications to use color spaces other than sRGB, if the compositor +supports them. + +The color management surface is only created if a non-sRGB and non-passthrough +colorspace is set on the surface, so applications can still use the protocol +directly if they prefer. + +Co-authored-by: Xaver Hugl +Reviewed-by: Sebastian Wick +Acked-by: Daniel Stone +Part-of: +--- + src/egl/wayland/wayland-drm/meson.build | 1 + + src/vulkan/wsi/meson.build | 1 + + src/vulkan/wsi/wsi_common_wayland.c | 421 ++++++++++++++++++++++-- + 3 files changed, 400 insertions(+), 23 deletions(-) + +diff --git a/src/egl/wayland/wayland-drm/meson.build b/src/egl/wayland/wayland-drm/meson.build +index 59ce3442499..d3b6c15ddd2 100644 +--- a/src/egl/wayland/wayland-drm/meson.build ++++ b/src/egl/wayland/wayland-drm/meson.build +@@ -48,6 +48,7 @@ wp_protos = { + 'presentation-time': 'stable/presentation-time/presentation-time.xml', + 'tearing-control-v1': 'staging/tearing-control/tearing-control-v1.xml', + 'linux-drm-syncobj-v1': 'staging/linux-drm-syncobj/linux-drm-syncobj-v1.xml', ++ 'color-management-v1': 'staging/color-management/color-management-v1.xml', + } + wp_files = {} + foreach name, xml : wp_protos +diff --git a/src/vulkan/wsi/meson.build b/src/vulkan/wsi/meson.build +index 6933eb780c4..ba609ab3151 100644 +--- a/src/vulkan/wsi/meson.build ++++ b/src/vulkan/wsi/meson.build +@@ -22,6 +22,7 @@ if with_platform_wayland + files_vulkan_wsi += wp_files['tearing-control-v1'] + links_vulkan_wsi += libloader_wayland_helper + files_vulkan_wsi += wp_files['linux-drm-syncobj-v1'] ++ files_vulkan_wsi += wp_files['color-management-v1'] + endif + + if with_platform_windows +diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c +index d6c1b862324..d4b47c1f1b8 100644 +--- a/src/vulkan/wsi/wsi_common_wayland.c ++++ b/src/vulkan/wsi/wsi_common_wayland.c +@@ -47,6 +47,7 @@ + #include "presentation-time-client-protocol.h" + #include "linux-drm-syncobj-v1-client-protocol.h" + #include "tearing-control-v1-client-protocol.h" ++#include "color-management-v1-client-protocol.h" + + #include + #include +@@ -110,8 +111,13 @@ struct wsi_wl_display { + struct wp_tearing_control_manager_v1 *tearing_control_manager; + struct wp_linux_drm_syncobj_manager_v1 *wl_syncobj; + ++ struct wp_color_manager_v1 *color_manager; ++ + struct dmabuf_feedback_format_table format_table; + ++ struct u_vector color_primaries; ++ struct u_vector color_transfer_funcs; ++ + /* users want per-chain wsi_wl_swapchain->present_ids.wp_presentation */ + struct wp_presentation *wp_presentation_notwrapped; + uint32_t wp_presentation_version; +@@ -125,6 +131,9 @@ struct wsi_wl_display { + /* Formats populated by zwp_linux_dmabuf_v1 or wl_shm interfaces */ + struct u_vector formats; + ++ /* Additional colorspaces returned by wp_color_management_v1. */ ++ struct u_vector colorspaces; ++ + bool sw; + + dev_t main_device; +@@ -180,6 +189,11 @@ struct wsi_wl_surface { + struct dmabuf_feedback dmabuf_feedback, pending_dmabuf_feedback; + + struct wp_linux_drm_syncobj_surface_v1 *wl_syncobj_surface; ++ ++ struct vk_instance *instance; ++ struct wp_color_management_surface_v1 *color_surface; ++ int color_surface_refcount; ++ VkColorSpaceKHR colorspace; + }; + + struct wsi_wl_swapchain { +@@ -230,6 +244,8 @@ struct wsi_wl_swapchain { + unsigned int refresh_nsec; + } present_ids; + ++ VkColorSpaceKHR colorspace; ++ + struct wsi_wl_image images[0]; + }; + VK_DEFINE_NONDISP_HANDLE_CASTS(wsi_wl_swapchain, base.base, VkSwapchainKHR, +@@ -885,6 +901,316 @@ static const struct wl_shm_listener shm_listener = { + .format = shm_handle_format + }; + ++static bool ++vector_contains(struct u_vector *vec, unsigned int val) ++{ ++ unsigned int *ptr; ++ ++ u_vector_foreach(ptr, vec) ++ if (*ptr == val) ++ return true; ++ ++ return false; ++} ++ ++struct Colorspace { ++ VkColorSpaceKHR colorspace; ++ enum wp_color_manager_v1_primaries primaries; ++ enum wp_color_manager_v1_transfer_function tf; ++}; ++struct Colorspace colorspace_mapping[] = { ++ { ++ .colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_DISPLAY_P3, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_DISPLAY_P3, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_BT709_LINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_BT709_NONLINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_BT1886, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_BT2020_LINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_BT2020, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_HDR10_ST2084_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_BT2020, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST2084_PQ, ++ }, ++ /* VK_COLOR_SPACE_DOLBYVISION_EXT is left out because it's deprecated */ ++ { ++ .colorspace = VK_COLOR_SPACE_HDR10_HLG_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_BT2020, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_HLG, ++ }, ++ { ++ .colorspace = VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_ADOBE_RGB, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ }, ++ /* VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT is left out because there's no ++ * exactly matching transfer function in the Wayland protocol */ ++ /* VK_COLOR_SPACE_PASS_THROUGH_EXT is handled elsewhere */ ++ { ++ .colorspace = VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT, ++ .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, ++ .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_SRGB, ++ }, ++ /* VK_COLOR_SPACE_DISPLAY_NATIVE_AMD isn't supported */ ++ /* VK_COLORSPACE_SRGB_NONLINEAR_KHR is just an alias */ ++ /* VK_COLOR_SPACE_DCI_P3_LINEAR_EXT is just an alias */ ++}; ++ ++static int ++wsi_wl_display_determine_colorspaces(struct wsi_wl_display *display) ++{ ++ u_vector_finish(&display->colorspaces); ++ if (!u_vector_init(&display->colorspaces, 8, sizeof(VkColorSpaceKHR))) ++ return -1; ++ ++ /* SRGB_NONLINEAR is always supported. */ ++ VkColorSpaceKHR *new_cs = u_vector_add(&display->colorspaces); ++ if (!new_cs) ++ return -1; ++ *new_cs = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; ++ ++ /* as is PASS_THROUGH */ ++ new_cs = u_vector_add(&display->colorspaces); ++ if (!new_cs) ++ return -1; ++ *new_cs = VK_COLOR_SPACE_PASS_THROUGH_EXT; ++ ++ if (!display->color_manager) ++ return 0; ++ ++ struct u_vector *tfs = &display->color_transfer_funcs; ++ struct u_vector *primaries = &display->color_primaries; ++ for (int i = 0; i < ARRAY_SIZE(colorspace_mapping); i++) { ++ if (!vector_contains(primaries, colorspace_mapping[i].primaries)) ++ continue; ++ if (!vector_contains(tfs, colorspace_mapping[i].tf)) ++ continue; ++ VkColorSpaceKHR *new_cs = u_vector_add(&display->colorspaces); ++ if (!new_cs) ++ return -1; ++ *new_cs = colorspace_mapping[i].colorspace; ++ } ++ return 0; ++} ++ ++static void ++color_management_handle_supported_intent(void *data, ++ struct wp_color_manager_v1 *color_manager, ++ unsigned int intent) ++{ ++ /* We only use the perceptual rendering intent, which is always supported. */ ++} ++ ++static void ++color_management_handle_supported_features(void *data, ++ struct wp_color_manager_v1 *color_manager, ++ unsigned int feature) ++{ ++ /* We don't use any non-default features yet. */ ++} ++ ++static void ++color_management_handle_supported_tf_named(void *data, ++ struct wp_color_manager_v1 *color_manager, ++ unsigned int tf) ++{ ++ struct wsi_wl_display *display = data; ++ unsigned int *new_tf = u_vector_add(&display->color_transfer_funcs); ++ if (new_tf) ++ *new_tf = tf; ++} ++ ++static void ++color_management_handle_supported_primaries_named(void *data, ++ struct wp_color_manager_v1 *color_manager, ++ unsigned int primaries) ++{ ++ struct wsi_wl_display *display = data; ++ unsigned int *new_primaries = u_vector_add(&display->color_primaries); ++ if (new_primaries) ++ *new_primaries = primaries; ++} ++ ++static void ++color_management_handle_done(void *data, struct wp_color_manager_v1 *color_manager) ++{ ++ /* Intentionally left blank */ ++} ++ ++static const struct wp_color_manager_v1_listener color_manager_listener = { ++ .supported_intent = color_management_handle_supported_intent, ++ .supported_feature = color_management_handle_supported_features, ++ .supported_tf_named = color_management_handle_supported_tf_named, ++ .supported_primaries_named = color_management_handle_supported_primaries_named, ++ .done = color_management_handle_done, ++}; ++ ++enum image_description_status { ++ undefined, ++ ready, ++ failed, ++}; ++ ++static void ++color_management_handle_image_desc_failed(void *data, ++ struct wp_image_description_v1 *desc, ++ unsigned int cause, ++ const char *msg) ++{ ++ enum image_description_status *status = data; ++ *status = failed; ++} ++ ++static void ++color_management_handle_image_desc_ready(void *data, ++ struct wp_image_description_v1 *desc, ++ unsigned int id) ++{ ++ enum image_description_status *status = data; ++ *status = ready; ++} ++ ++static const struct wp_image_description_v1_listener image_description_listener = { ++ .failed = color_management_handle_image_desc_failed, ++ .ready = color_management_handle_image_desc_ready, ++}; ++ ++static bool ++needs_color_surface(VkColorSpaceKHR colorspace) ++{ ++ return colorspace != VK_COLOR_SPACE_PASS_THROUGH_EXT; ++} ++ ++static void ++wsi_wl_surface_add_color_refcount(struct wsi_wl_surface *wsi_surface) ++{ ++ wsi_surface->color_surface_refcount++; ++ if (wsi_surface->color_surface_refcount == 1) { ++ wsi_surface->color_surface = ++ wp_color_manager_v1_get_surface(wsi_surface->display->color_manager, wsi_surface->surface); ++ } ++} ++ ++static void ++wsi_wl_surface_remove_color_refcount(struct wsi_wl_surface *wsi_surface) ++{ ++ wsi_surface->color_surface_refcount--; ++ if (wsi_surface->color_surface_refcount == 0) { ++ wp_color_management_surface_v1_destroy(wsi_surface->color_surface); ++ wsi_surface->color_surface = NULL; ++ } ++} ++ ++static VkResult ++wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) ++{ ++ struct wsi_wl_surface *surface = chain->wsi_wl_surface; ++ struct wsi_wl_display *display = surface->display; ++ ++ /* we need the color management extension for ++ * everything except sRGB and PASS_THROUGH */ ++ if (!display->color_manager) { ++ if (chain->colorspace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR || ++ chain->colorspace == VK_COLOR_SPACE_PASS_THROUGH_EXT) { ++ return VK_SUCCESS; ++ } else { ++ return VK_ERROR_SURFACE_LOST_KHR; ++ } ++ } ++ ++ bool new_color_surface = !surface->color_surface; ++ bool needs_color_surface_new = needs_color_surface(chain->colorspace); ++ bool needs_color_surface_old = needs_color_surface(surface->colorspace); ++ if ((new_color_surface || !needs_color_surface_old) && needs_color_surface_new) { ++ wsi_wl_surface_add_color_refcount(surface); ++ } else if (needs_color_surface_old && !needs_color_surface_new) { ++ wsi_wl_surface_remove_color_refcount(surface); ++ } ++ ++ if (!new_color_surface && surface->colorspace == chain->colorspace) ++ return VK_SUCCESS; ++ ++ /* failure is fatal, so this potentially being wrong ++ in that case doesn't matter */ ++ surface->colorspace = chain->colorspace; ++ if (!needs_color_surface_new) ++ return VK_SUCCESS; ++ ++ struct wp_image_description_creator_params_v1 *creator = ++ wp_color_manager_v1_create_parametric_creator(display->color_manager); ++ ++ if (!creator) ++ return VK_ERROR_SURFACE_LOST_KHR; ++ ++ unsigned int primaries = 0; ++ unsigned int tf = 0; ++ for (int i = 0; i < ARRAY_SIZE(colorspace_mapping); i++) { ++ if (colorspace_mapping[i].colorspace == chain->colorspace) { ++ primaries = colorspace_mapping[i].primaries; ++ tf = colorspace_mapping[i].tf; ++ } ++ } ++ ++ if (!primaries) ++ return VK_ERROR_SURFACE_LOST_KHR; ++ ++ wp_image_description_creator_params_v1_set_primaries_named(creator, primaries); ++ wp_image_description_creator_params_v1_set_tf_named(creator, tf); ++ ++ wl_proxy_set_queue((struct wl_proxy *) creator, display->queue); ++ ++ struct wp_image_description_v1 *image_desc = ++ wp_image_description_creator_params_v1_create(creator); ++ if (!image_desc) ++ return VK_ERROR_SURFACE_LOST_KHR; ++ ++ enum image_description_status status = undefined; ++ wp_image_description_v1_add_listener(image_desc, &image_description_listener, &status); ++ ++ while (status == undefined) { ++ int ret = wl_display_dispatch_queue(display->wl_display, display->queue); ++ if (ret < 0) ++ return VK_ERROR_OUT_OF_DATE_KHR; ++ } ++ if (status == failed) ++ return VK_ERROR_SURFACE_LOST_KHR; ++ ++ wp_color_management_surface_v1_set_image_description(chain->wsi_wl_surface->color_surface, ++ image_desc, ++ WP_COLOR_MANAGER_V1_RENDER_INTENT_PERCEPTUAL); ++ wp_image_description_v1_destroy(image_desc); ++ ++ return VK_SUCCESS; ++} ++ ++ + static void + presentation_handle_clock_id(void* data, struct wp_presentation *wp_presentation, uint32_t clk_id) + { +@@ -942,6 +1268,17 @@ registry_handle_global(void *data, struct wl_registry *registry, + display->commit_timing_manager = + wl_registry_bind(registry, name, &wp_commit_timing_manager_v1_interface, 1); + } ++ ++ if (strcmp(interface, wp_color_manager_v1_interface.name) == 0) { ++ display->color_manager = ++ wl_registry_bind(registry, name, &wp_color_manager_v1_interface, 1); ++ ++ u_vector_init(&display->color_primaries, 8, sizeof(uint32_t)); ++ u_vector_init(&display->color_transfer_funcs, 8, sizeof(uint32_t)); ++ ++ wp_color_manager_v1_add_listener(display->color_manager, ++ &color_manager_listener, display); ++ } + } + + static void +@@ -961,6 +1298,10 @@ wsi_wl_display_finish(struct wsi_wl_display *display) + u_vector_foreach(f, &display->formats) + u_vector_finish(&f->modifiers); + u_vector_finish(&display->formats); ++ u_vector_finish(&display->colorspaces); ++ u_vector_finish(&display->color_primaries); ++ u_vector_finish(&display->color_transfer_funcs); ++ + if (display->wl_shm) + wl_shm_destroy(display->wl_shm); + if (display->wl_syncobj) +@@ -975,6 +1316,8 @@ wsi_wl_display_finish(struct wsi_wl_display *display) + wp_commit_timing_manager_v1_destroy(display->commit_timing_manager); + if (display->tearing_control_manager) + wp_tearing_control_manager_v1_destroy(display->tearing_control_manager); ++ if (display->color_manager) ++ wp_color_manager_v1_destroy(display->color_manager); + if (display->wl_display_wrapper) + wl_proxy_wrapper_destroy(display->wl_display_wrapper); + if (display->queue) +@@ -1066,9 +1409,14 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl, + } + } + +- /* Round-trip again to get formats and modifiers */ ++ /* Round-trip again to get formats, modifiers and color properties */ + wl_display_roundtrip_queue(display->wl_display, display->queue); + ++ if (wsi_wl_display_determine_colorspaces(display) < 0) { ++ result = VK_ERROR_OUT_OF_HOST_MEMORY; ++ goto fail; ++ } ++ + if (wsi_wl->wsi->force_bgra8_unorm_first) { + /* Find BGRA8_UNORM in the list and swap it to the first position if we + * can find it. Some apps get confused if SRGB is first in the list. +@@ -1358,6 +1706,8 @@ wsi_wl_surface_get_formats(VkIcdSurfaceBase *icd_surface, + VkSurfaceFormatKHR* pSurfaceFormats) + { + VkIcdSurfaceWayland *surface = (VkIcdSurfaceWayland *)icd_surface; ++ struct wsi_wl_surface *wsi_wl_surface = ++ wl_container_of((VkIcdSurfaceWayland *)icd_surface, wsi_wl_surface, base); + struct wsi_wayland *wsi = + (struct wsi_wayland *)wsi_device->wsi[VK_ICD_WSI_PLATFORM_WAYLAND]; + +@@ -1369,18 +1719,22 @@ wsi_wl_surface_get_formats(VkIcdSurfaceBase *icd_surface, + VK_OUTARRAY_MAKE_TYPED(VkSurfaceFormatKHR, out, + pSurfaceFormats, pSurfaceFormatCount); + +- struct wsi_wl_format *disp_fmt; +- u_vector_foreach(disp_fmt, &display.formats) { +- /* Skip formats for which we can't support both alpha & opaque +- * formats. +- */ +- if (!(disp_fmt->flags & WSI_WL_FMT_ALPHA) || +- !(disp_fmt->flags & WSI_WL_FMT_OPAQUE)) +- continue; ++ VkColorSpaceKHR *cs; ++ u_vector_foreach(cs, &display.colorspaces) { ++ struct wsi_wl_format *disp_fmt; ++ u_vector_foreach(disp_fmt, &display.formats) { ++ /* Skip formats for which we can't support both alpha & opaque ++ * formats. ++ */ ++ if (!(disp_fmt->flags & WSI_WL_FMT_ALPHA) || ++ !(disp_fmt->flags & WSI_WL_FMT_OPAQUE)) { ++ continue; ++ } + +- vk_outarray_append_typed(VkSurfaceFormatKHR, &out, out_fmt) { +- out_fmt->format = disp_fmt->vk_format; +- out_fmt->colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; ++ vk_outarray_append_typed(VkSurfaceFormatKHR, &out, out_fmt) { ++ out_fmt->format = disp_fmt->vk_format; ++ out_fmt->colorSpace = *cs; ++ } + } + } + +@@ -1397,6 +1751,8 @@ wsi_wl_surface_get_formats2(VkIcdSurfaceBase *icd_surface, + VkSurfaceFormat2KHR* pSurfaceFormats) + { + VkIcdSurfaceWayland *surface = (VkIcdSurfaceWayland *)icd_surface; ++ struct wsi_wl_surface *wsi_wl_surface = ++ wl_container_of((VkIcdSurfaceWayland *)icd_surface, wsi_wl_surface, base); + struct wsi_wayland *wsi = + (struct wsi_wayland *)wsi_device->wsi[VK_ICD_WSI_PLATFORM_WAYLAND]; + +@@ -1408,18 +1764,22 @@ wsi_wl_surface_get_formats2(VkIcdSurfaceBase *icd_surface, + VK_OUTARRAY_MAKE_TYPED(VkSurfaceFormat2KHR, out, + pSurfaceFormats, pSurfaceFormatCount); + +- struct wsi_wl_format *disp_fmt; +- u_vector_foreach(disp_fmt, &display.formats) { +- /* Skip formats for which we can't support both alpha & opaque +- * formats. +- */ +- if (!(disp_fmt->flags & WSI_WL_FMT_ALPHA) || +- !(disp_fmt->flags & WSI_WL_FMT_OPAQUE)) +- continue; ++ VkColorSpaceKHR *cs; ++ u_vector_foreach(cs, &display.colorspaces) { ++ struct wsi_wl_format *disp_fmt; ++ u_vector_foreach(disp_fmt, &display.formats) { ++ /* Skip formats for which we can't support both alpha & opaque ++ * formats. ++ */ ++ if (!(disp_fmt->flags & WSI_WL_FMT_ALPHA) || ++ !(disp_fmt->flags & WSI_WL_FMT_OPAQUE)) { ++ continue; ++ } + +- vk_outarray_append_typed(VkSurfaceFormat2KHR, &out, out_fmt) { +- out_fmt->surfaceFormat.format = disp_fmt->vk_format; +- out_fmt->surfaceFormat.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; ++ vk_outarray_append_typed(VkSurfaceFormat2KHR, &out, out_fmt) { ++ out_fmt->surfaceFormat.format = disp_fmt->vk_format; ++ out_fmt->surfaceFormat.colorSpace = *cs; ++ } + } + } + +@@ -1515,6 +1875,9 @@ wsi_wl_surface_destroy(VkIcdSurfaceBase *icd_surface, VkInstance _instance, + dmabuf_feedback_fini(&wsi_wl_surface->pending_dmabuf_feedback); + } + ++ if (wsi_wl_surface->color_surface) ++ wp_color_management_surface_v1_destroy(wsi_wl_surface->color_surface); ++ + if (wsi_wl_surface->surface) + wl_proxy_wrapper_destroy(wsi_wl_surface->surface); + +@@ -1837,6 +2200,9 @@ wsi_CreateWaylandSurfaceKHR(VkInstance _instance, + surface->display = pCreateInfo->display; + surface->surface = pCreateInfo->surface; + ++ wsi_wl_surface->instance = instance; ++ wsi_wl_surface->colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; ++ + *pSurface = VkIcdSurfaceBase_to_handle(&surface->base); + + return VK_SUCCESS; +@@ -2459,6 +2825,10 @@ wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain, + image->base.row_pitches[0] * chain->extent.height); + } + ++ VkResult ret = wsi_wl_swapchain_update_colorspace(chain); ++ if (ret != VK_SUCCESS) ++ return ret; ++ + /* For EXT_swapchain_maintenance1. We might have transitioned from FIFO to MAILBOX. + * In this case we need to let the FIFO request complete, before presenting MAILBOX. */ + while (!chain->legacy_fifo_ready) { +@@ -2815,6 +3185,9 @@ wsi_wl_swapchain_chain_free(struct wsi_wl_swapchain *chain, + wl_callback_destroy(chain->frame); + if (chain->tearing_control) + wp_tearing_control_v1_destroy(chain->tearing_control); ++ if (needs_color_surface(chain->colorspace) && wsi_wl_surface->color_surface) { ++ wsi_wl_surface_remove_color_refcount(wsi_wl_surface); ++ } + + /* Only unregister if we are the non-retired swapchain, or + * we are a retired swapchain and memory allocation failed, +@@ -2979,6 +3352,8 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, + WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC); + } + ++ chain->colorspace = pCreateInfo->imageColorSpace; ++ + enum wsi_wl_buffer_type buffer_type; + struct wsi_base_image_params *image_params = NULL; + struct wsi_cpu_image_params cpu_image_params; +-- +2.49.0 + diff --git a/my-ostree-os/mesa/0003-vulkan-wsi-implement-support-for-VK_EXT_hdr_metadata.patch b/my-ostree-os/mesa/0003-vulkan-wsi-implement-support-for-VK_EXT_hdr_metadata.patch new file mode 100644 index 0000000..0790b26 --- /dev/null +++ b/my-ostree-os/mesa/0003-vulkan-wsi-implement-support-for-VK_EXT_hdr_metadata.patch @@ -0,0 +1,496 @@ +From fbdd6fedb4af31db2f4dc0333751f8fd7779a841 Mon Sep 17 00:00:00 2001 +From: Xaver Hugl +Date: Tue, 5 Nov 2024 19:17:28 +0100 +Subject: [PATCH 3/4] vulkan/wsi: implement support for VK_EXT_hdr_metadata on + Wayland + +Signed-off-by: Xaver Hugl +Reviewed-by: Alyssa Rosenzweig +Reviewed-by: Sebastian Wick +Acked-by: Daniel Stone +Part-of: +--- + src/amd/vulkan/radv_physical_device.c | 1 + + src/asahi/vulkan/hk_physical_device.c | 1 + + src/freedreno/vulkan/tu_device.cc | 1 + + src/gallium/frontends/lavapipe/lvp_device.c | 1 + + src/intel/vulkan/anv_physical_device.c | 1 + + src/nouveau/vulkan/nvk_physical_device.c | 1 + + src/panfrost/vulkan/panvk_physical_device.c | 1 + + src/vulkan/wsi/wsi_common.c | 12 ++ + src/vulkan/wsi/wsi_common_private.h | 2 + + src/vulkan/wsi/wsi_common_wayland.c | 151 ++++++++++++++++---- + 10 files changed, 146 insertions(+), 26 deletions(-) + +diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c +index 0d3660e7064..4dc4f647593 100644 +--- a/src/amd/vulkan/radv_physical_device.c ++++ b/src/amd/vulkan/radv_physical_device.c +@@ -630,6 +630,7 @@ radv_physical_device_get_supported_extensions(const struct radv_physical_device + .EXT_global_priority = true, + .EXT_global_priority_query = true, + .EXT_graphics_pipeline_library = !pdev->use_llvm && !(instance->debug_flags & RADV_DEBUG_NO_GPL), ++ .EXT_hdr_metadata = true, + .EXT_host_query_reset = true, + .EXT_image_2d_view_of_3d = true, + .EXT_image_compression_control = true, +diff --git a/src/asahi/vulkan/hk_physical_device.c b/src/asahi/vulkan/hk_physical_device.c +index 8dcbd15c2b7..d916d749a0d 100644 +--- a/src/asahi/vulkan/hk_physical_device.c ++++ b/src/asahi/vulkan/hk_physical_device.c +@@ -153,6 +153,7 @@ hk_get_device_extensions(const struct hk_instance *instance, + .EXT_global_priority = true, + .EXT_global_priority_query = true, + .EXT_graphics_pipeline_library = true, ++ .EXT_hdr_metadata = true, + .EXT_host_query_reset = true, + .EXT_host_image_copy = true, + .EXT_image_2d_view_of_3d = true, +diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc +index 7b18dcf24f9..41d15d64733 100644 +--- a/src/freedreno/vulkan/tu_device.cc ++++ b/src/freedreno/vulkan/tu_device.cc +@@ -274,6 +274,7 @@ get_device_extensions(const struct tu_physical_device *device, + .EXT_global_priority = true, + .EXT_global_priority_query = true, + .EXT_graphics_pipeline_library = true, ++ .EXT_hdr_metadata = true, + .EXT_host_image_copy = true, + .EXT_host_query_reset = true, + .EXT_image_2d_view_of_3d = true, +diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c +index 934c501e231..260200e7d1c 100644 +--- a/src/gallium/frontends/lavapipe/lvp_device.c ++++ b/src/gallium/frontends/lavapipe/lvp_device.c +@@ -211,6 +211,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported = + .EXT_extended_dynamic_state3 = true, + .EXT_external_memory_host = true, + .EXT_graphics_pipeline_library = true, ++ .EXT_hdr_metadata = true, + .EXT_host_image_copy = true, + .EXT_host_query_reset = true, + .EXT_image_2d_view_of_3d = true, +diff --git a/src/intel/vulkan/anv_physical_device.c b/src/intel/vulkan/anv_physical_device.c +index b2eda469415..8506790cd72 100644 +--- a/src/intel/vulkan/anv_physical_device.c ++++ b/src/intel/vulkan/anv_physical_device.c +@@ -282,6 +282,7 @@ get_device_extensions(const struct anv_physical_device *device, + .EXT_global_priority_query = device->max_context_priority >= + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR, + .EXT_graphics_pipeline_library = !debug_get_bool_option("ANV_NO_GPL", false), ++ .EXT_hdr_metadata = true, + .EXT_host_image_copy = !device->emu_astc_ldr, + .EXT_host_query_reset = true, + .EXT_image_2d_view_of_3d = true, +diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c +index 9b05c1968aa..10ab3b6e488 100644 +--- a/src/nouveau/vulkan/nvk_physical_device.c ++++ b/src/nouveau/vulkan/nvk_physical_device.c +@@ -229,6 +229,7 @@ nvk_get_device_extensions(const struct nvk_instance *instance, + .EXT_global_priority = true, + .EXT_global_priority_query = true, + .EXT_graphics_pipeline_library = true, ++ .EXT_hdr_metadata = true, + .EXT_host_query_reset = true, + .EXT_host_image_copy = info->cls_eng3d >= TURING_A, + .EXT_image_2d_view_of_3d = true, +diff --git a/src/panfrost/vulkan/panvk_physical_device.c b/src/panfrost/vulkan/panvk_physical_device.c +index dc3b371c3b0..4250d66bbb9 100644 +--- a/src/panfrost/vulkan/panvk_physical_device.c ++++ b/src/panfrost/vulkan/panvk_physical_device.c +@@ -231,6 +231,7 @@ get_device_extensions(const struct panvk_physical_device *device, + .EXT_global_priority = true, + .EXT_global_priority_query = true, + .EXT_graphics_pipeline_library = true, ++ .EXT_hdr_metadata = true, + .EXT_host_query_reset = true, + .EXT_image_drm_format_modifier = true, + .EXT_image_robustness = true, +diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c +index d18ca4d9ebd..7f41e61639f 100644 +--- a/src/vulkan/wsi/wsi_common.c ++++ b/src/vulkan/wsi/wsi_common.c +@@ -2253,3 +2253,15 @@ wsi_device_supports_explicit_sync(struct wsi_device *device) + (device->timeline_semaphore_export_handle_types & + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT); + } ++ ++VKAPI_ATTR void VKAPI_CALL ++wsi_SetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, ++ const VkSwapchainKHR* pSwapchains, ++ const VkHdrMetadataEXT* pMetadata) ++{ ++ for (uint32_t i = 0; i < swapchainCount; i++) { ++ VK_FROM_HANDLE(wsi_swapchain, swapchain, pSwapchains[i]); ++ if (swapchain->set_hdr_metadata) ++ swapchain->set_hdr_metadata(swapchain, pMetadata); ++ } ++} +diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h +index 849bdc6715f..40db1a7c176 100644 +--- a/src/vulkan/wsi/wsi_common_private.h ++++ b/src/vulkan/wsi/wsi_common_private.h +@@ -223,6 +223,8 @@ struct wsi_swapchain { + const uint32_t *indices); + void (*set_present_mode)(struct wsi_swapchain *swap_chain, + VkPresentModeKHR mode); ++ void (*set_hdr_metadata)(struct wsi_swapchain *swap_chain, ++ const VkHdrMetadataEXT* pMetadata); + }; + + bool +diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c +index d4b47c1f1b8..de12f524891 100644 +--- a/src/vulkan/wsi/wsi_common_wayland.c ++++ b/src/vulkan/wsi/wsi_common_wayland.c +@@ -140,6 +140,11 @@ struct wsi_wl_display { + bool same_gpu; + + clockid_t presentation_clock_id; ++ ++ struct { ++ bool mastering_display_primaries; ++ bool extended_target_volume; ++ } color_features; + }; + + struct wsi_wayland { +@@ -191,9 +196,14 @@ struct wsi_wl_surface { + struct wp_linux_drm_syncobj_surface_v1 *wl_syncobj_surface; + + struct vk_instance *instance; +- struct wp_color_management_surface_v1 *color_surface; +- int color_surface_refcount; +- VkColorSpaceKHR colorspace; ++ ++ struct { ++ struct wp_color_management_surface_v1 *color_surface; ++ int color_surface_refcount; ++ VkColorSpaceKHR colorspace; ++ VkHdrMetadataEXT hdr_metadata; ++ bool has_hdr_metadata; ++ } color; + }; + + struct wsi_wl_swapchain { +@@ -244,7 +254,11 @@ struct wsi_wl_swapchain { + unsigned int refresh_nsec; + } present_ids; + +- VkColorSpaceKHR colorspace; ++ struct { ++ VkColorSpaceKHR colorspace; ++ VkHdrMetadataEXT hdr_metadata; ++ bool has_hdr_metadata; ++ } color; + + struct wsi_wl_image images[0]; + }; +@@ -917,58 +931,69 @@ struct Colorspace { + VkColorSpaceKHR colorspace; + enum wp_color_manager_v1_primaries primaries; + enum wp_color_manager_v1_transfer_function tf; ++ bool should_use_hdr_metadata; + }; + struct Colorspace colorspace_mapping[] = { + { + .colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB, ++ .should_use_hdr_metadata = false, + }, + { + .colorspace = VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_DISPLAY_P3, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB, ++ .should_use_hdr_metadata = false, + }, + { + .colorspace = VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ .should_use_hdr_metadata = true, + }, + { + .colorspace = VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_DISPLAY_P3, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ .should_use_hdr_metadata = false, + }, + { + .colorspace = VK_COLOR_SPACE_BT709_LINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ .should_use_hdr_metadata = false, + }, + { + .colorspace = VK_COLOR_SPACE_BT709_NONLINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_BT1886, ++ .should_use_hdr_metadata = false, + }, + { + .colorspace = VK_COLOR_SPACE_BT2020_LINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_BT2020, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ .should_use_hdr_metadata = false, + }, + { + .colorspace = VK_COLOR_SPACE_HDR10_ST2084_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_BT2020, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST2084_PQ, ++ .should_use_hdr_metadata = true, + }, + /* VK_COLOR_SPACE_DOLBYVISION_EXT is left out because it's deprecated */ + { + .colorspace = VK_COLOR_SPACE_HDR10_HLG_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_BT2020, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_HLG, ++ .should_use_hdr_metadata = true, + }, + { + .colorspace = VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_ADOBE_RGB, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR, ++ .should_use_hdr_metadata = false, + }, + /* VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT is left out because there's no + * exactly matching transfer function in the Wayland protocol */ +@@ -977,6 +1002,7 @@ struct Colorspace colorspace_mapping[] = { + .colorspace = VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT, + .primaries = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB, + .tf = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_SRGB, ++ .should_use_hdr_metadata = true, + }, + /* VK_COLOR_SPACE_DISPLAY_NATIVE_AMD isn't supported */ + /* VK_COLORSPACE_SRGB_NONLINEAR_KHR is just an alias */ +@@ -1033,7 +1059,17 @@ color_management_handle_supported_features(void *data, + struct wp_color_manager_v1 *color_manager, + unsigned int feature) + { +- /* We don't use any non-default features yet. */ ++ struct wsi_wl_display *display = data; ++ switch (feature) { ++ case WP_COLOR_MANAGER_V1_FEATURE_SET_MASTERING_DISPLAY_PRIMARIES: ++ display->color_features.mastering_display_primaries = true; ++ break; ++ case WP_COLOR_MANAGER_V1_FEATURE_EXTENDED_TARGET_VOLUME: ++ display->color_features.extended_target_volume = true; ++ break; ++ default: ++ break; ++ } + } + + static void +@@ -1111,9 +1147,9 @@ needs_color_surface(VkColorSpaceKHR colorspace) + static void + wsi_wl_surface_add_color_refcount(struct wsi_wl_surface *wsi_surface) + { +- wsi_surface->color_surface_refcount++; +- if (wsi_surface->color_surface_refcount == 1) { +- wsi_surface->color_surface = ++ wsi_surface->color.color_surface_refcount++; ++ if (wsi_surface->color.color_surface_refcount == 1) { ++ wsi_surface->color.color_surface = + wp_color_manager_v1_get_surface(wsi_surface->display->color_manager, wsi_surface->surface); + } + } +@@ -1121,13 +1157,30 @@ wsi_wl_surface_add_color_refcount(struct wsi_wl_surface *wsi_surface) + static void + wsi_wl_surface_remove_color_refcount(struct wsi_wl_surface *wsi_surface) + { +- wsi_surface->color_surface_refcount--; +- if (wsi_surface->color_surface_refcount == 0) { +- wp_color_management_surface_v1_destroy(wsi_surface->color_surface); +- wsi_surface->color_surface = NULL; ++ wsi_surface->color.color_surface_refcount--; ++ if (wsi_surface->color.color_surface_refcount == 0) { ++ wp_color_management_surface_v1_destroy(wsi_surface->color.color_surface); ++ wsi_surface->color.color_surface = NULL; + } + } + ++static bool ++compare_hdr_metadata(struct VkHdrMetadataEXT *l, struct VkHdrMetadataEXT *r) ++{ ++ return l->displayPrimaryRed.x == r->displayPrimaryRed.x ++ && l->displayPrimaryRed.y == r->displayPrimaryRed.y ++ && l->displayPrimaryGreen.x == r->displayPrimaryGreen.x ++ && l->displayPrimaryGreen.y == r->displayPrimaryGreen.y ++ && l->displayPrimaryBlue.x == r->displayPrimaryBlue.x ++ && l->displayPrimaryBlue.y == r->displayPrimaryBlue.y ++ && l->whitePoint.x == r->whitePoint.x ++ && l->whitePoint.y == r->whitePoint.y ++ && l->maxLuminance == r->maxLuminance ++ && l->minLuminance == r->minLuminance ++ && l->maxContentLightLevel == r->maxContentLightLevel ++ && l->maxFrameAverageLightLevel == r->maxFrameAverageLightLevel; ++} ++ + static VkResult + wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + { +@@ -1137,29 +1190,43 @@ wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + /* we need the color management extension for + * everything except sRGB and PASS_THROUGH */ + if (!display->color_manager) { +- if (chain->colorspace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR || +- chain->colorspace == VK_COLOR_SPACE_PASS_THROUGH_EXT) { ++ if (chain->color.colorspace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR || ++ chain->color.colorspace == VK_COLOR_SPACE_PASS_THROUGH_EXT) { + return VK_SUCCESS; + } else { + return VK_ERROR_SURFACE_LOST_KHR; + } + } + +- bool new_color_surface = !surface->color_surface; +- bool needs_color_surface_new = needs_color_surface(chain->colorspace); +- bool needs_color_surface_old = needs_color_surface(surface->colorspace); ++ bool new_color_surface = !surface->color.color_surface; ++ bool needs_color_surface_new = needs_color_surface(chain->color.colorspace); ++ bool needs_color_surface_old = needs_color_surface(surface->color.colorspace); + if ((new_color_surface || !needs_color_surface_old) && needs_color_surface_new) { + wsi_wl_surface_add_color_refcount(surface); + } else if (needs_color_surface_old && !needs_color_surface_new) { + wsi_wl_surface_remove_color_refcount(surface); + } + +- if (!new_color_surface && surface->colorspace == chain->colorspace) ++ bool should_use_hdr_metadata = chain->color.has_hdr_metadata; ++ for (int i = 0; i < ARRAY_SIZE(colorspace_mapping); i++) { ++ if (colorspace_mapping[i].colorspace == chain->color.colorspace) { ++ should_use_hdr_metadata &= colorspace_mapping[i].should_use_hdr_metadata; ++ break; ++ } ++ } ++ ++ if (!new_color_surface && ++ surface->color.colorspace == chain->color.colorspace && ++ surface->color.has_hdr_metadata == should_use_hdr_metadata && ++ compare_hdr_metadata(&surface->color.hdr_metadata, &chain->color.hdr_metadata)) { + return VK_SUCCESS; ++ } + + /* failure is fatal, so this potentially being wrong + in that case doesn't matter */ +- surface->colorspace = chain->colorspace; ++ surface->color.colorspace = chain->color.colorspace; ++ surface->color.hdr_metadata = chain->color.hdr_metadata; ++ surface->color.has_hdr_metadata = should_use_hdr_metadata; + if (!needs_color_surface_new) + return VK_SUCCESS; + +@@ -1172,7 +1239,7 @@ wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + unsigned int primaries = 0; + unsigned int tf = 0; + for (int i = 0; i < ARRAY_SIZE(colorspace_mapping); i++) { +- if (colorspace_mapping[i].colorspace == chain->colorspace) { ++ if (colorspace_mapping[i].colorspace == chain->color.colorspace) { + primaries = colorspace_mapping[i].primaries; + tf = colorspace_mapping[i].tf; + } +@@ -1183,6 +1250,29 @@ wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + + wp_image_description_creator_params_v1_set_primaries_named(creator, primaries); + wp_image_description_creator_params_v1_set_tf_named(creator, tf); ++ if (should_use_hdr_metadata && display->color_features.extended_target_volume) { ++ uint32_t max_cll = round(chain->color.hdr_metadata.maxContentLightLevel); ++ uint32_t max_fall = round(chain->color.hdr_metadata.maxFrameAverageLightLevel); ++ wp_image_description_creator_params_v1_set_max_cll(creator, max_cll); ++ wp_image_description_creator_params_v1_set_max_fall(creator, max_fall); ++ if (display->color_features.mastering_display_primaries) { ++ uint32_t red_x = round(chain->color.hdr_metadata.displayPrimaryRed.x * 1000000); ++ uint32_t red_y = round(chain->color.hdr_metadata.displayPrimaryRed.y * 1000000); ++ uint32_t green_x = round(chain->color.hdr_metadata.displayPrimaryGreen.x * 1000000); ++ uint32_t green_y = round(chain->color.hdr_metadata.displayPrimaryGreen.y * 1000000); ++ uint32_t blue_x = round(chain->color.hdr_metadata.displayPrimaryBlue.x * 1000000); ++ uint32_t blue_y = round(chain->color.hdr_metadata.displayPrimaryBlue.y * 1000000); ++ uint32_t white_x = round(chain->color.hdr_metadata.whitePoint.x * 1000000); ++ uint32_t white_y = round(chain->color.hdr_metadata.whitePoint.y * 1000000); ++ wp_image_description_creator_params_v1_set_mastering_display_primaries(creator, red_x, red_y, ++ green_x, green_y, ++ blue_x, blue_y, ++ white_x, white_y); ++ uint32_t min_lum = round(chain->color.hdr_metadata.minLuminance * 10000); ++ uint32_t max_lum = round(chain->color.hdr_metadata.maxLuminance); ++ wp_image_description_creator_params_v1_set_mastering_luminance(creator, min_lum, max_lum); ++ } ++ } + + wl_proxy_set_queue((struct wl_proxy *) creator, display->queue); + +@@ -1202,7 +1292,7 @@ wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + if (status == failed) + return VK_ERROR_SURFACE_LOST_KHR; + +- wp_color_management_surface_v1_set_image_description(chain->wsi_wl_surface->color_surface, ++ wp_color_management_surface_v1_set_image_description(chain->wsi_wl_surface->color.color_surface, + image_desc, + WP_COLOR_MANAGER_V1_RENDER_INTENT_PERCEPTUAL); + wp_image_description_v1_destroy(image_desc); +@@ -1210,6 +1300,14 @@ wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + return VK_SUCCESS; + } + ++static void ++wsi_wl_swapchain_set_hdr_metadata(struct wsi_swapchain *wsi_chain, ++ const VkHdrMetadataEXT* pMetadata) ++{ ++ struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain; ++ chain->color.hdr_metadata = *pMetadata; ++ chain->color.has_hdr_metadata = true; ++} + + static void + presentation_handle_clock_id(void* data, struct wp_presentation *wp_presentation, uint32_t clk_id) +@@ -1875,8 +1973,8 @@ wsi_wl_surface_destroy(VkIcdSurfaceBase *icd_surface, VkInstance _instance, + dmabuf_feedback_fini(&wsi_wl_surface->pending_dmabuf_feedback); + } + +- if (wsi_wl_surface->color_surface) +- wp_color_management_surface_v1_destroy(wsi_wl_surface->color_surface); ++ if (wsi_wl_surface->color.color_surface) ++ wp_color_management_surface_v1_destroy(wsi_wl_surface->color.color_surface); + + if (wsi_wl_surface->surface) + wl_proxy_wrapper_destroy(wsi_wl_surface->surface); +@@ -2201,7 +2299,7 @@ wsi_CreateWaylandSurfaceKHR(VkInstance _instance, + surface->surface = pCreateInfo->surface; + + wsi_wl_surface->instance = instance; +- wsi_wl_surface->colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; ++ wsi_wl_surface->color.colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + + *pSurface = VkIcdSurfaceBase_to_handle(&surface->base); + +@@ -3185,7 +3283,7 @@ wsi_wl_swapchain_chain_free(struct wsi_wl_swapchain *chain, + wl_callback_destroy(chain->frame); + if (chain->tearing_control) + wp_tearing_control_v1_destroy(chain->tearing_control); +- if (needs_color_surface(chain->colorspace) && wsi_wl_surface->color_surface) { ++ if (needs_color_surface(chain->color.colorspace) && wsi_wl_surface->color.color_surface) { + wsi_wl_surface_remove_color_refcount(wsi_wl_surface); + } + +@@ -3352,7 +3450,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, + WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC); + } + +- chain->colorspace = pCreateInfo->imageColorSpace; ++ chain->color.colorspace = pCreateInfo->imageColorSpace; + + enum wsi_wl_buffer_type buffer_type; + struct wsi_base_image_params *image_params = NULL; +@@ -3426,6 +3524,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, + chain->base.wait_for_present = wsi_wl_swapchain_wait_for_present; + chain->base.present_mode = present_mode; + chain->base.image_count = num_images; ++ chain->base.set_hdr_metadata = wsi_wl_swapchain_set_hdr_metadata; + chain->extent = pCreateInfo->imageExtent; + chain->vk_format = pCreateInfo->imageFormat; + chain->buffer_type = buffer_type; +-- +2.49.0 + diff --git a/my-ostree-os/mesa/0004-vulkan-wsi-handle-the-compositor-not-supporting-exte.patch b/my-ostree-os/mesa/0004-vulkan-wsi-handle-the-compositor-not-supporting-exte.patch new file mode 100644 index 0000000..f4ee0ea --- /dev/null +++ b/my-ostree-os/mesa/0004-vulkan-wsi-handle-the-compositor-not-supporting-exte.patch @@ -0,0 +1,53 @@ +From 692057de05dcf90ea9ac180a23d4996ebc1e7206 Mon Sep 17 00:00:00 2001 +From: Xaver Hugl +Date: Thu, 7 Nov 2024 13:58:49 +0100 +Subject: [PATCH 4/4] vulkan/wsi: handle the compositor not supporting extended + target volume better + +Instead of unconditionally ignoring the HDR metadata, just attempt to create the image +description, and if it fails, fall back to creating it without HDR metadata. + +Signed-off-by: Xaver Hugl +Reviewed-by: Sebastian Wick +Acked-by: Daniel Stone +Part-of: +--- + src/vulkan/wsi/wsi_common_wayland.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c +index de12f524891..4c364401226 100644 +--- a/src/vulkan/wsi/wsi_common_wayland.c ++++ b/src/vulkan/wsi/wsi_common_wayland.c +@@ -1250,7 +1250,7 @@ wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + + wp_image_description_creator_params_v1_set_primaries_named(creator, primaries); + wp_image_description_creator_params_v1_set_tf_named(creator, tf); +- if (should_use_hdr_metadata && display->color_features.extended_target_volume) { ++ if (should_use_hdr_metadata) { + uint32_t max_cll = round(chain->color.hdr_metadata.maxContentLightLevel); + uint32_t max_fall = round(chain->color.hdr_metadata.maxFrameAverageLightLevel); + wp_image_description_creator_params_v1_set_max_cll(creator, max_cll); +@@ -1289,8 +1289,17 @@ wsi_wl_swapchain_update_colorspace(struct wsi_wl_swapchain *chain) + if (ret < 0) + return VK_ERROR_OUT_OF_DATE_KHR; + } +- if (status == failed) +- return VK_ERROR_SURFACE_LOST_KHR; ++ if (status == failed) { ++ wp_image_description_v1_destroy(image_desc); ++ if (!display->color_features.extended_target_volume && should_use_hdr_metadata) { ++ /* VK_EXT_hdr_metadata doesn't specify if or how the metadata is used, ++ * so it's fine to try again without it. */ ++ chain->color.has_hdr_metadata = false; ++ return wsi_wl_swapchain_update_colorspace(chain); ++ } else { ++ return VK_ERROR_SURFACE_LOST_KHR; ++ } ++ } + + wp_color_management_surface_v1_set_image_description(chain->wsi_wl_surface->color.color_surface, + image_desc, +-- +2.49.0 + diff --git a/my-ostree-os/mesa/Mesa-MLAA-License-Clarification-Email.txt b/my-ostree-os/mesa/Mesa-MLAA-License-Clarification-Email.txt new file mode 100644 index 0000000..30bdf2e --- /dev/null +++ b/my-ostree-os/mesa/Mesa-MLAA-License-Clarification-Email.txt @@ -0,0 +1,117 @@ + +Subject: RE: Question about Mesa MLAA license +From: Jorge Jimenez +Date: 01/08/2013 12:50 PM +To: Tom Callaway +CC: "jorge@iryoku.com" + +Yes to both questions. + +Thanks, +Jorge + +From: Tom Callaway +Sent: January 8, 2013 6:49 PM +To: Jorge Jimenez +CC: jorge@iryoku.com +Subject: Re: Question about Mesa MLAA license + +On 01/08/2013 12:39 PM, Jorge Jimenez wrote: +> Hi Tom, +> +> What we meant with that is that we made an exception for clause 2. +> Instead of clause 2, in the case of the Mesa project, you have to name +> the technique Jimenez's MLAA in the config options of Mesa. We did that +> just to allow them to solve license issues. This exception should be for +> the Mesa project, and any project using Mesa, like Fedora. +> +> We want to widespread usage of our MLAA, so we want to avoid any kind of +> license complications. Hope current one is good for Fedora, if not +> please tell, and we'll see what we can do! + +Okay, a few more questions: + +* If Fedora decides to simply reproduce the quoted statement: +"Uses Jimenez's MLAA. Copyright (C) 2010 by Jorge Jimenez, Belen Masia, +Jose I. Echevarria, Fernando Navarro and Diego Gutierrez." + +Specifically, if this is done as part of documentation included with +Mesa, is that sufficient to meet clause 2 even if the Mesa config option +is not set as described in your exception? + +* Currently, the Mesa config option for MLAA says: "Morphological +anti-aliasing based on Jimenez\' MLAA. 0 to disable, 8 for default +quality". Is this in compliance with your exception? + +Thanks again, + +~tom + +== +Fedora Project + +Subject: RE: Question about Mesa MLAA license +From: Jorge Jimenez +Date: 01/08/2013 12:39 PM +To: "jorge@iryoku.com" , Tom Callaway + +Hi Tom, + +What we meant with that is that we made an exception for clause 2. +Instead of clause 2, in the case of the Mesa project, you have to name +the technique Jimenez's MLAA in the config options of Mesa. We did that +just to allow them to solve license issues. This exception should be for +the Mesa project, and any project using Mesa, like Fedora. + +We want to widespread usage of our MLAA, so we want to avoid any kind of +license complications. Hope current one is good for Fedora, if not +please tell, and we'll see what we can do! + +Cheers, +Jorge + +From: Tom Callaway +Sent: January 8, 2013 6:30 PM +To: jorge@iryoku.com +Subject: Question about Mesa MLAA license + +Jorge, + +Thanks for all of your fantastic graphics work! I have been auditing +Fedora (a popular distribution of Linux) for license compliance and I +came across your MLAA code in Mesa. + +The license says: + + * 2. Redistributions in binary form must reproduce the following +statement: + * + * "Uses Jimenez's MLAA. Copyright (C) 2010 by Jorge Jimenez, Belen Masia, + * Jose I. Echevarria, Fernando Navarro and Diego Gutierrez." + * + * Only for use in the Mesa project, this point 2 is filled by naming the + * technique Jimenez's MLAA in the Mesa config options. + +That wording is unclear. When you say "Only for use in the Mesa +project...", it seems like you could either be saying: + +- This code may only be used as part of Mesa. + +OR + +- In Mesa, you can comply with clause 2 by simply selecting "Jimenez's +MLAA" in the Mesa config options. + +***** + +If the first item is true, then we may have to remove the MLAA code from +Fedora's copy of Mesa. However, looking at the license on your SMAA +code, I do not believe it to be the case. Please let me know either way! + +Thanks in advance, + +Tom Callaway +Fedora Legal + +== +Fedora Project diff --git a/my-ostree-os/mesa/e4eb5e80c316c0af3fff310ca89e1175d81556c1.patch b/my-ostree-os/mesa/e4eb5e80c316c0af3fff310ca89e1175d81556c1.patch new file mode 100644 index 0000000..5cf4073 --- /dev/null +++ b/my-ostree-os/mesa/e4eb5e80c316c0af3fff310ca89e1175d81556c1.patch @@ -0,0 +1,144 @@ +From e4eb5e80c316c0af3fff310ca89e1175d81556c1 Mon Sep 17 00:00:00 2001 +From: Nikita Popov +Date: Thu, 27 Feb 2025 15:44:27 +0100 +Subject: [PATCH] clover: Don't include libclc headers + +Per https://github.com/llvm/llvm-project/issues/119967 these +headers are internal implementation details of libclc and were +never supposed to be installed. They are not available anymore +since LLVM 20. Instead opencl-c.h should be used. + +There already ise a code path for including opencl-c.h, so always +use it. + +This didn't work for me out of the box, because the build system +currently hardcodes the clang resource directory, which is incorrect +for Fedora at least. Fix this by using GetResourcePath + +CLANG_RESOURCE_DIR provided by clang instead. This is basically +the same as what is done in clc_helper.c + +I've still retained the old behavior as a fallback just in case +(e.g. if clang is linked statically?) + +Reviewed-by: Karol Herbst +Part-of: +--- + .../frontends/clover/llvm/invocation.cpp | 53 +++++++++++++------ + src/gallium/frontends/clover/meson.build | 5 +- + 2 files changed, 39 insertions(+), 19 deletions(-) + +diff --git a/src/gallium/frontends/clover/llvm/invocation.cpp b/src/gallium/frontends/clover/llvm/invocation.cpp +index 3cbb05baecf67..ca030b404d791 100644 +--- a/src/gallium/frontends/clover/llvm/invocation.cpp ++++ b/src/gallium/frontends/clover/llvm/invocation.cpp +@@ -24,6 +24,8 @@ + // OTHER DEALINGS IN THE SOFTWARE. + // + ++#include ++ + #include + #include + #include +@@ -39,6 +41,8 @@ + #include + #include + #include ++#include ++#include + + #if LLVM_VERSION_MAJOR >= 20 + #include +@@ -323,6 +327,30 @@ namespace { + return c; + } + ++ std::string getResourceDirectory() { ++ Dl_info info; ++ if (dladdr((void *)clang::CompilerInvocation::CreateFromArgs, &info) == 0) { ++ return FALLBACK_CLANG_RESOURCE_DIR; ++ } ++ ++ char *libclang_path = realpath(info.dli_fname, NULL); ++ if (libclang_path == nullptr) { ++ return FALLBACK_CLANG_RESOURCE_DIR; ++ } ++ ++ // GetResourcePath is a way to retrieve the actual libclang resource dir based on a given ++ // binary or library. ++ std::string clang_resource_dir = ++#if LLVM_VERSION_MAJOR >= 20 ++ clang::driver::Driver::GetResourcesPath(std::string(libclang_path)); ++#else ++ clang::driver::Driver::GetResourcesPath(std::string(libclang_path), CLANG_RESOURCE_DIR); ++#endif ++ free(libclang_path); ++ ++ return clang_resource_dir; ++ } ++ + std::unique_ptr + compile(LLVMContext &ctx, clang::CompilerInstance &c, + const std::string &name, const std::string &source, +@@ -331,25 +359,18 @@ namespace { + c.getFrontendOpts().ProgramAction = clang::frontend::EmitLLVMOnly; + c.getHeaderSearchOpts().UseBuiltinIncludes = true; + c.getHeaderSearchOpts().UseStandardSystemIncludes = true; +- c.getHeaderSearchOpts().ResourceDir = CLANG_RESOURCE_DIR; + +- if (use_libclc) { +- // Add libclc generic search path +- c.getHeaderSearchOpts().AddPath(LIBCLC_INCLUDEDIR, +- clang::frontend::Angled, +- false, false); ++ std::string clang_resource_dir = getResourceDirectory(); ++ c.getHeaderSearchOpts().ResourceDir = clang_resource_dir; + +- // Add libclc include +- c.getPreprocessorOpts().Includes.push_back("clc/clc.h"); +- } else { +- // Add opencl-c generic search path +- c.getHeaderSearchOpts().AddPath(CLANG_RESOURCE_DIR, +- clang::frontend::Angled, +- false, false); ++ // Add opencl-c generic search path ++ std::string clang_include_path = clang_resource_dir + "/include"; ++ c.getHeaderSearchOpts().AddPath(clang_include_path, ++ clang::frontend::Angled, ++ false, false); + +- // Add opencl include +- c.getPreprocessorOpts().Includes.push_back("opencl-c.h"); +- } ++ // Add opencl include ++ c.getPreprocessorOpts().Includes.push_back("opencl-c.h"); + + // Add definition for the OpenCL version + const auto dev_version = dev.device_version(); +diff --git a/src/gallium/frontends/clover/meson.build b/src/gallium/frontends/clover/meson.build +index e569b86a1bea7..56a9894f0dbb1 100644 +--- a/src/gallium/frontends/clover/meson.build ++++ b/src/gallium/frontends/clover/meson.build +@@ -10,7 +10,6 @@ clover_opencl_cpp_args = [ + '-DCL_USE_DEPRECATED_OPENCL_2_0_APIS', + '-DCL_USE_DEPRECATED_OPENCL_2_1_APIS', + '-DCL_USE_DEPRECATED_OPENCL_2_2_APIS', +- '-DLIBCLC_INCLUDEDIR="@0@/"'.format(dep_clc.get_variable(pkgconfig : 'includedir')), + '-DLIBCLC_LIBEXECDIR="@0@/"'.format(dep_clc.get_variable(pkgconfig : 'libexecdir')) + ] + clover_incs = [inc_include, inc_src, inc_gallium, inc_gallium_aux] +@@ -43,9 +42,9 @@ libclllvm = static_library( + cpp_args : [ + clover_cpp_args, + clover_opencl_cpp_args, +- '-DCLANG_RESOURCE_DIR="@0@"'.format(join_paths( ++ '-DFALLBACK_CLANG_RESOURCE_DIR="@0@"'.format(join_paths( + dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir'), 'clang', +- dep_llvm.version(), 'include', ++ dep_llvm.version() + )), + ], + gnu_symbol_visibility : 'hidden', +-- +GitLab + diff --git a/my-ostree-os/mesa/gnome-shell-glthread-disable.patch b/my-ostree-os/mesa/gnome-shell-glthread-disable.patch new file mode 100644 index 0000000..b2caeb8 --- /dev/null +++ b/my-ostree-os/mesa/gnome-shell-glthread-disable.patch @@ -0,0 +1,11 @@ +diff -up mesa-22.3.0-rc4/src/util/00-mesa-defaults.conf.dma mesa-22.3.0-rc4/src/util/00-mesa-defaults.conf +--- mesa-22.3.0-rc4/src/util/00-mesa-defaults.conf.dma 2022-11-25 10:32:32.175879868 +1000 ++++ mesa-22.3.0-rc4/src/util/00-mesa-defaults.conf 2022-11-25 10:32:43.743067470 +1000 +@@ -653,6 +653,7 @@ TODO: document the other workarounds. + + + +