Mesa 25.0.3: upgrade Mesa and add patches to this repo
This commit is contained in:
parent
f780a69a2d
commit
1e0e785b14
10 changed files with 1630 additions and 4 deletions
|
|
@ -0,0 +1,28 @@
|
||||||
|
From b97a4dc4caf609975ba9e80336e63ebc9545a91b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Erik Faye-Lund <erik.faye-lund@collabora.com>
|
||||||
|
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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33918>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
|
|
@ -0,0 +1,116 @@
|
||||||
|
From c15c45c54bb2fd03b41416c6628efcb095eec4b6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xaver Hugl <xaver.hugl@kde.org>
|
||||||
|
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 <xaver.hugl@kde.org>
|
||||||
|
Reviewed-by: Eric Engestrom <eric@igalia.com>
|
||||||
|
Reviewed-by: Sebastian Wick <sebastian.wick@redhat.com>
|
||||||
|
Acked-by: Daniel Stone <daniels@collabora.com>
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32038>
|
||||||
|
---
|
||||||
|
.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
|
||||||
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
From 7f749c41ba8d9918251c00eeb86d453cda5fbb7b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Lee <benjamin.lee@collabora.com>
|
||||||
|
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 <benjamin.lee@collabora.com>
|
||||||
|
Fixes: 53b40a40f46 ("increase required wayland-protocols version to 1.41")
|
||||||
|
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33752>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
|
|
@ -0,0 +1,614 @@
|
||||||
|
From 5dd0635b31fcb6b12e9dcb3b908e501f153e7e8b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Colin Marc <hi@colinmarc.com>
|
||||||
|
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 <xaver.hugl@kde.org>
|
||||||
|
Reviewed-by: Sebastian Wick <sebastian.wick@redhat.com>
|
||||||
|
Acked-by: Daniel Stone <daniels@collabora.com>
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32038>
|
||||||
|
---
|
||||||
|
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 <util/cnd_monotonic.h>
|
||||||
|
#include <util/compiler.h>
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
@ -0,0 +1,496 @@
|
||||||
|
From fbdd6fedb4af31db2f4dc0333751f8fd7779a841 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xaver Hugl <xaver.hugl@kde.org>
|
||||||
|
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 <xaver.hugl@kde.org>
|
||||||
|
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
|
||||||
|
Reviewed-by: Sebastian Wick <sebastian.wick@redhat.com>
|
||||||
|
Acked-by: Daniel Stone <daniels@collabora.com>
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32038>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
From 692057de05dcf90ea9ac180a23d4996ebc1e7206 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xaver Hugl <xaver.hugl@kde.org>
|
||||||
|
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 <xaver.hugl@kde.org>
|
||||||
|
Reviewed-by: Sebastian Wick <sebastian.wick@redhat.com>
|
||||||
|
Acked-by: Daniel Stone <daniels@collabora.com>
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32038>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
117
my-ostree-os/mesa/Mesa-MLAA-License-Clarification-Email.txt
Normal file
117
my-ostree-os/mesa/Mesa-MLAA-License-Clarification-Email.txt
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
|
||||||
|
Subject: RE: Question about Mesa MLAA license
|
||||||
|
From: Jorge Jimenez <iryoku@gmail.com>
|
||||||
|
Date: 01/08/2013 12:50 PM
|
||||||
|
To: Tom Callaway <tcallawa@redhat.com>
|
||||||
|
CC: "jorge@iryoku.com" <jorge@iryoku.com>
|
||||||
|
|
||||||
|
Yes to both questions.
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
Jorge
|
||||||
|
|
||||||
|
From: Tom Callaway <tcallawa@redhat.com>
|
||||||
|
Sent: January 8, 2013 6:49 PM
|
||||||
|
To: Jorge Jimenez <iryoku@gmail.com>
|
||||||
|
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 <iryoku@gmail.com>
|
||||||
|
Date: 01/08/2013 12:39 PM
|
||||||
|
To: "jorge@iryoku.com" <jorge@iryoku.com>, Tom Callaway <tcallawa@redhat.com>
|
||||||
|
|
||||||
|
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 <tcallawa@redhat.com>
|
||||||
|
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
|
||||||
144
my-ostree-os/mesa/e4eb5e80c316c0af3fff310ca89e1175d81556c1.patch
Normal file
144
my-ostree-os/mesa/e4eb5e80c316c0af3fff310ca89e1175d81556c1.patch
Normal file
|
|
@ -0,0 +1,144 @@
|
||||||
|
From e4eb5e80c316c0af3fff310ca89e1175d81556c1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nikita Popov <npopov@redhat.com>
|
||||||
|
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 <kherbst@redhat.com>
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33805>
|
||||||
|
---
|
||||||
|
.../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 <dlfcn.h>
|
||||||
|
+
|
||||||
|
#include <llvm/IR/DiagnosticPrinter.h>
|
||||||
|
#include <llvm/IR/DiagnosticInfo.h>
|
||||||
|
#include <llvm/IR/LLVMContext.h>
|
||||||
|
@@ -39,6 +41,8 @@
|
||||||
|
#include <clang/Frontend/TextDiagnosticBuffer.h>
|
||||||
|
#include <clang/Frontend/TextDiagnosticPrinter.h>
|
||||||
|
#include <clang/Basic/TargetInfo.h>
|
||||||
|
+#include <clang/Config/config.h>
|
||||||
|
+#include <clang/Driver/Driver.h>
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR >= 20
|
||||||
|
#include <llvm/Support/VirtualFileSystem.h>
|
||||||
|
@@ -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<Module>
|
||||||
|
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
|
||||||
|
|
||||||
11
my-ostree-os/mesa/gnome-shell-glthread-disable.patch
Normal file
11
my-ostree-os/mesa/gnome-shell-glthread-disable.patch
Normal file
|
|
@ -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.
|
||||||
|
<application name="gnome-shell" executable="gnome-shell">
|
||||||
|
<option name="adaptive_sync" value="false" />
|
||||||
|
<option name="v3d_nonmsaa_texture_size_limit" value="true" />
|
||||||
|
+ <option name="mesa_glthread" value="false"/>
|
||||||
|
</application>
|
||||||
|
<application name="Desktop — Plasma" executable="plasmashell">
|
||||||
|
<option name="adaptive_sync" value="false" />
|
||||||
|
|
@ -69,7 +69,7 @@
|
||||||
|
|
||||||
Name: mesa
|
Name: mesa
|
||||||
Summary: Mesa graphics libraries
|
Summary: Mesa graphics libraries
|
||||||
%global ver 25.0.1
|
%global ver 25.0.3
|
||||||
Version: %{lua:ver = string.gsub(rpm.expand("%{ver}"), "-", "~"); print(ver)}
|
Version: %{lua:ver = string.gsub(rpm.expand("%{ver}"), "-", "~"); print(ver)}
|
||||||
Release: 10.clang.skylake%{?dist}
|
Release: 10.clang.skylake%{?dist}
|
||||||
License: MIT AND BSD-3-Clause AND SGI-B-2.0
|
License: MIT AND BSD-3-Clause AND SGI-B-2.0
|
||||||
|
|
@ -79,9 +79,22 @@ Source0: https://archive.mesa3d.org/mesa-%{ver}.tar.xz
|
||||||
# src/gallium/auxiliary/postprocess/pp_mlaa* have an ... interestingly worded license.
|
# src/gallium/auxiliary/postprocess/pp_mlaa* have an ... interestingly worded license.
|
||||||
# Source1 contains email correspondence clarifying the license terms.
|
# Source1 contains email correspondence clarifying the license terms.
|
||||||
# Fedora opts to ignore the optional part of clause 2 and treat that code as 2 clause BSD.
|
# Fedora opts to ignore the optional part of clause 2 and treat that code as 2 clause BSD.
|
||||||
Source1: https://src.fedoraproject.org/rpms/mesa/raw/f41/f/Mesa-MLAA-License-Clarification-Email.txt
|
Source1: Mesa-MLAA-License-Clarification-Email.txt
|
||||||
|
|
||||||
Patch10: https://src.fedoraproject.org/rpms/mesa/raw/f41/f/gnome-shell-glthread-disable.patch
|
Patch10: gnome-shell-glthread-disable.patch
|
||||||
|
|
||||||
|
# Backport of https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33805
|
||||||
|
# to fix clover with libclc from LLVM 20.
|
||||||
|
Patch20: e4eb5e80c316c0af3fff310ca89e1175d81556c1.patch
|
||||||
|
|
||||||
|
# Backport of https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32038
|
||||||
|
# and fixes: vulkan/wsi: implement the Wayland color management protocol
|
||||||
|
Patch21: 0001-increase-required-wayland-protocols-version-to-1.41.patch
|
||||||
|
Patch22: 0002-vulkan-wsi-implement-the-Wayland-color-management-pr.patch
|
||||||
|
Patch23: 0003-vulkan-wsi-implement-support-for-VK_EXT_hdr_metadata.patch
|
||||||
|
Patch24: 0004-vulkan-wsi-handle-the-compositor-not-supporting-exte.patch
|
||||||
|
Patch25: 0001-meson-update-wayland-protocols-source_hash.patch
|
||||||
|
Patch26: 0001-docs-features-add-VK_EXT_hdr_metadata.patch
|
||||||
|
|
||||||
BuildRequires: meson >= 1.3.0
|
BuildRequires: meson >= 1.3.0
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
|
|
@ -318,7 +331,7 @@ Provides: libxatracker-devel%{?_isa}
|
||||||
%if 0%{?with_opencl}
|
%if 0%{?with_opencl}
|
||||||
%package libOpenCL
|
%package libOpenCL
|
||||||
Summary: Mesa OpenCL runtime library
|
Summary: Mesa OpenCL runtime library
|
||||||
Requires: ocl-icd%{?_isa}
|
Requires: (ocl-icd%{?_isa} or OpenCL-ICD-Loader%{?_isa})
|
||||||
Requires: libclc%{?_isa}
|
Requires: libclc%{?_isa}
|
||||||
Requires: %{name}-libgbm%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
|
Requires: %{name}-libgbm%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
|
||||||
Requires: opencl-filesystem
|
Requires: opencl-filesystem
|
||||||
Loading…
Add table
Add a link
Reference in a new issue