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]

Reply via email to