PR #23083 opened by Lynne URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23083 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23083.patch
Those were simple to fix but difficult to debug. >From d19d0a0286e031dc271508d35c7a705562df427d Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Tue, 12 May 2026 22:28:15 +0900 Subject: [PATCH 1/4] hwcontext_vulkan: reenable and remap XV30 The issue was that XV30 is a native 444 10-bit format, rather than 16-bits. This resulted in padding leaking into bits where it shouldn't. Sponsored-by: Sovereign Tech Fund --- libavutil/hwcontext_vulkan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index ff0eeb60eb..25caab7261 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -526,7 +526,7 @@ static const struct FFVkFormatEntry { { VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA444P16, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } }, /* Single plane 444 at 8, 10, 12 and 16 bits */ -// { VK_FORMAT_A2R10G10B10_UNORM_PACK32, AV_PIX_FMT_XV30, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } }, + { VK_FORMAT_A2R10G10B10_UNORM_PACK32, AV_PIX_FMT_XV30, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2R10G10B10_UNORM_PACK32 } }, { VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, AV_PIX_FMT_XV36, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } }, { VK_FORMAT_R16G16B16A16_UNORM, AV_PIX_FMT_XV48, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } }, }; -- 2.52.0 >From 7ca5446e1dcc2024b6c56bbe448b6f42a8d985cf Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Tue, 12 May 2026 22:29:20 +0900 Subject: [PATCH 2/4] hwcontext_vulkan: reenable X2RGB10 Now that all issues are fixed, we can go ahead with it. Sponsored-by: Sovereign Tech Fund --- libavutil/hwcontext_vulkan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 25caab7261..510510d832 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -440,7 +440,7 @@ static const struct FFVkFormatEntry { { VK_FORMAT_R16G16B16A16_UNORM, AV_PIX_FMT_RGBA64, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } }, // { VK_FORMAT_B8G8R8A8_UNORM, AV_PIX_FMT_BGR0, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_B8G8R8A8_UNORM } }, { VK_FORMAT_R8G8B8A8_UNORM, AV_PIX_FMT_RGB0, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8G8B8A8_UNORM } }, -// { VK_FORMAT_A2R10G10B10_UNORM_PACK32, AV_PIX_FMT_X2RGB10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2R10G10B10_UNORM_PACK32 } }, + { VK_FORMAT_A2R10G10B10_UNORM_PACK32, AV_PIX_FMT_X2RGB10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2R10G10B10_UNORM_PACK32 } }, // { VK_FORMAT_A2B10G10R10_UNORM_PACK32, AV_PIX_FMT_X2BGR10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2B10G10R10_UNORM_PACK32 } }, { VK_FORMAT_R32G32B32_SFLOAT, AV_PIX_FMT_RGBF32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32_SFLOAT } }, { VK_FORMAT_R32G32B32A32_SFLOAT, AV_PIX_FMT_RGBAF32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32A32_SFLOAT } }, -- 2.52.0 >From 8f1fcfd63589a9d9d2349674bf5696e5fc9e6c92 Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Tue, 12 May 2026 22:40:15 +0900 Subject: [PATCH 3/4] hwcontext_vulkan: enable X2BGR10 The format itself was working perfectly. Unlike BGR0/BGRA, all known Vulkan implementations support storage images just fine. --- libavutil/hwcontext_vulkan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 510510d832..4fa30f1ef0 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -441,7 +441,7 @@ static const struct FFVkFormatEntry { // { VK_FORMAT_B8G8R8A8_UNORM, AV_PIX_FMT_BGR0, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_B8G8R8A8_UNORM } }, { VK_FORMAT_R8G8B8A8_UNORM, AV_PIX_FMT_RGB0, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8G8B8A8_UNORM } }, { VK_FORMAT_A2R10G10B10_UNORM_PACK32, AV_PIX_FMT_X2RGB10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2R10G10B10_UNORM_PACK32 } }, -// { VK_FORMAT_A2B10G10R10_UNORM_PACK32, AV_PIX_FMT_X2BGR10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2B10G10R10_UNORM_PACK32 } }, + { VK_FORMAT_A2B10G10R10_UNORM_PACK32, AV_PIX_FMT_X2BGR10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2B10G10R10_UNORM_PACK32 } }, { VK_FORMAT_R32G32B32_SFLOAT, AV_PIX_FMT_RGBF32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32_SFLOAT } }, { VK_FORMAT_R32G32B32A32_SFLOAT, AV_PIX_FMT_RGBAF32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32A32_SFLOAT } }, { VK_FORMAT_R32G32B32_UINT, AV_PIX_FMT_RGB96, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32_UINT } }, -- 2.52.0 >From 4c88dd3bb1fd97ef4fb7548dabf769cbc5ddb0d9 Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Tue, 12 May 2026 22:26:11 +0900 Subject: [PATCH 4/4] swscale/vulkan: implement SWS_OP_PACK/SWS_OP_UNPACK The issue is that while Vulkan already does the decomposition for us, swscale assumes that the pixels will be in bitstream order, rather than in their decomposed form. This is valid for all packed formats for which these instructions are issued (XV30 and X2RGB10). This allows us to support the formats in Vulkan. Sponsored-by: Sovereign Tech Fund --- libswscale/vulkan/ops.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c index cf128b00c1..a2ef13918e 100644 --- a/libswscale/vulkan/ops.c +++ b/libswscale/vulkan/ops.c @@ -875,6 +875,18 @@ static int add_ops_spirv(VulkanPriv *p, FFVulkanOpsCtx *s, nb_linear_ops++; break; } + case SWS_OP_UNPACK: + if (ops->src.format == AV_PIX_FMT_X2BGR10) + data = spi_OpVectorShuffle(spi, type_v, data, data, 3, 2, 1, 0); + else + data = spi_OpVectorShuffle(spi, type_v, data, data, 3, 0, 1, 2); + break; + case SWS_OP_PACK: + if (ops->dst.format == AV_PIX_FMT_X2BGR10) + data = spi_OpVectorShuffle(spi, type_v, data, data, 3, 2, 1, 0); + else + data = spi_OpVectorShuffle(spi, type_v, data, data, 1, 2, 3, 0); + break; default: return AVERROR(ENOTSUP); } @@ -1105,6 +1117,16 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s, } av_bprintf(&shd->src, " f32 = tmp;\n"); break; + case SWS_OP_UNPACK: + /* MSB->LSB indexing */ + av_bprintf(&shd->src, " %s = %s.%s;\n", type_name, type_name, + ops->src.format == AV_PIX_FMT_X2BGR10 ? "wzyx" : "wxyz"); + break; + case SWS_OP_PACK: + /* LSB->MSB indexing */ + av_bprintf(&shd->src, " %s = %s.%s;\n", type_name, type_name, + ops->dst.format == AV_PIX_FMT_X2BGR10 ? "wzyx" : "yzwx"); + break; default: return AVERROR(ENOTSUP); } -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
