Files
jellyfin-ffmpeg/builder/patches/libplacebo/0001-vulkan-force-using-16bit-for-p01x-formats.patch
T
2025-05-28 23:33:58 +08:00

65 lines
2.5 KiB
Diff

From 554c91c09a47afef1f66cb3338eadb5939507072 Mon Sep 17 00:00:00 2001
From: nyanmisaka <nst799610810@gmail.com>
Date: Thu, 27 Mar 2025 19:26:24 +0800
Subject: [PATCH] vulkan: force using 16bit for p01x formats
Workaround for the regression made in Mesa RADV.
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
---
src/vulkan/formats.c | 7 ++++++-
src/vulkan/gpu_tex.c | 12 +++++++++++-
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/src/vulkan/formats.c b/src/vulkan/formats.c
index f0eb0fb7..7d1c6478 100644
--- a/src/vulkan/formats.c
+++ b/src/vulkan/formats.c
@@ -415,7 +415,12 @@ void vk_setup_formats(struct pl_gpu_t *gpu)
.pNext = has_drm_mods ? &drm_props : NULL,
};
- vk->GetPhysicalDeviceFormatProperties2(vk->physd, vk_fmt->tfmt, &prop2);
+ VkFormat tfmt = vk_fmt->tfmt;
+ if (tfmt == VK_FORMAT_R10X6_UNORM_PACK16)
+ tfmt = VK_FORMAT_R16_UNORM;
+ else if (tfmt == VK_FORMAT_R10X6G10X6_UNORM_2PACK16)
+ tfmt = VK_FORMAT_R16G16_UNORM;
+ vk->GetPhysicalDeviceFormatProperties2(vk->physd, tfmt, &prop2);
// If wholly unsupported, try falling back to the emulation formats
// for texture operations
diff --git a/src/vulkan/gpu_tex.c b/src/vulkan/gpu_tex.c
index a419ffdc..ec32c546 100644
--- a/src/vulkan/gpu_tex.c
+++ b/src/vulkan/gpu_tex.c
@@ -371,6 +371,11 @@ pl_tex vk_tex_create(pl_gpu gpu, const struct pl_tex_params *params)
.pQueueFamilyIndices = qfs,
};
+ if (tex_vk->img_fmt == VK_FORMAT_R10X6_UNORM_PACK16)
+ iinfo.format = VK_FORMAT_R16_UNORM;
+ else if (tex_vk->img_fmt == VK_FORMAT_R10X6G10X6_UNORM_2PACK16)
+ iinfo.format = VK_FORMAT_R16G16_UNORM;
+
struct vk_malloc_params mparams = {
.optimal = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
.export_handle = params->export_handle,
@@ -1215,7 +1220,12 @@ pl_tex pl_vulkan_wrap(pl_gpu gpu, const struct pl_vulkan_wrap_params *params)
tex_vk->external_img = true;
tex_vk->held = !fmt->num_planes;
tex_vk->img = params->image;
- tex_vk->img_fmt = params->format;
+ if (params->format == VK_FORMAT_R10X6_UNORM_PACK16)
+ tex_vk->img_fmt = VK_FORMAT_R16_UNORM;
+ else if (params->format == VK_FORMAT_R10X6G10X6_UNORM_2PACK16)
+ tex_vk->img_fmt = VK_FORMAT_R16G16_UNORM;
+ else
+ tex_vk->img_fmt = params->format;
tex_vk->num_planes = fmt->num_planes;
tex_vk->usage_flags = usage;
tex_vk->aspect = params->aspect;
--
2.34.1