Commit fd8a1bb036 for ffmpeg

commit fd8a1bb0367c58c071f7871fd4b67c172c5d10fb
Author: Niklas Haas <git@haasn.dev>
Date:   Wed Oct 21 02:39:36 2026 +0200

    swscale/vulkan/ops: define (un)pack constants at the point of use

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Signed-off-by: Niklas Haas <git@haasn.dev>

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 6ea6d71fdc..ee6be4e3b5 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -332,7 +332,6 @@ typedef struct OpIDs {
     union {
         int vec;                          /* LSHIFT, RSHIFT, SCALE */
         int comp[4];                      /* CLEAR, MIN, MAX, DITHER */
-        struct { int shift, mask; } pack; /* PACK, UNPACK */
         LinearIDs lin;                    /* LINEAR */
     };
     int buf; /* index into dither[] or filt[] */
@@ -439,6 +438,23 @@ static int const_pixel(SPICtx *spi, const SPIRVIDs *id, SwsPixelType type,
     return spi_OpConstantUInt(spi, id->u32_type, val.num);
 }

+/* Shift and mask vectors for (un)packing each component */
+static void define_pack_consts(SPICtx *spi, const SPIRVIDs *id, const SwsOp *op,
+                               int *shift_id, int *mask_id)
+{
+    uint64_t mask[4];
+    int shift[4], tmp[4];
+    ff_sws_pack_decode(op->pack.pattern, mask, shift);
+    for (int i = 0; i < 4; i++)
+        tmp[i] = spi_OpConstantUInt(spi, id->u32_type, shift[i]);
+    *shift_id = spi_OpConstantComposite(spi, id->u32vec4_type,
+                                        tmp[0], tmp[1], tmp[2], tmp[3]);
+    for (int i = 0; i < 4; i++)
+        tmp[i] = spi_OpConstantUInt(spi, id->u32_type, mask[i]);
+    *mask_id = spi_OpConstantComposite(spi, id->u32vec4_type,
+                                       tmp[0], tmp[1], tmp[2], tmp[3]);
+}
+
 /* Arithmetic on operands of the given pixel type */
 static int emit_mul(SPICtx *spi, SwsPixelType type, int res_type, int a, int b)
 {
@@ -550,21 +566,6 @@ static void define_shader_consts(SwsContext *sws, const SwsOpList *ops,
         OpIDs *oid = &id->op[n];
         SwsPixelType type_in = ff_sws_op_input_type(op);
         switch (op->op) {
-        case SWS_OP_PACK:
-        case SWS_OP_UNPACK: {
-            uint64_t mask[4];
-            int shift[4], tmp[4];
-            ff_sws_pack_decode(op->pack.pattern, mask, shift);
-            for (int i = 0; i < 4; i++)
-                tmp[i] = spi_OpConstantUInt(spi, u32_type, shift[i]);
-            oid->pack.shift = spi_OpConstantComposite(spi, id->u32vec4_type,
-                                                      tmp[0], tmp[1], tmp[2], tmp[3]);
-            for (int i = 0; i < 4; i++)
-                tmp[i] = spi_OpConstantUInt(spi, u32_type, mask[i]);
-            oid->pack.mask = spi_OpConstantComposite(spi, id->u32vec4_type,
-                                                     tmp[0], tmp[1], tmp[2], tmp[3]);
-            break;
-        }
         case SWS_OP_LSHIFT:
         case SWS_OP_RSHIFT: {
             int tmp = spi_OpConstantUInt(spi, u32_type, op->shift.amount);
@@ -1260,14 +1261,19 @@ static int emit_shader(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
                 data = insert_vmat_linear(spi, id, &oid->lin, data);
             break;
         }
-        case SWS_OP_UNPACK:
+        case SWS_OP_UNPACK: {
+            int shift, mask;
+            define_pack_consts(spi, id, op, &shift, &mask);
             data = spi_OpVectorShuffle(spi, type_v, data, data, 0, 0, 0, 0);
-            data = spi_OpShiftRightLogical(spi, type_v, data, oid->pack.shift);
-            data = spi_OpBitwiseAnd(spi, type_v, data, oid->pack.mask);
+            data = spi_OpShiftRightLogical(spi, type_v, data, shift);
+            data = spi_OpBitwiseAnd(spi, type_v, data, mask);
             break;
+        }
         case SWS_OP_PACK: {
-            data = spi_OpBitwiseAnd(spi, type_v, data, oid->pack.mask);
-            data = spi_OpShiftLeftLogical(spi, type_v, data, oid->pack.shift);
+            int shift, mask;
+            define_pack_consts(spi, id, op, &shift, &mask);
+            data = spi_OpBitwiseAnd(spi, type_v, data, mask);
+            data = spi_OpShiftLeftLogical(spi, type_v, data, shift);
             int val = spi_OpCompositeExtract(spi, type_s, data, 0);
             for (int i = 1; i < 4; i++) {
                 int tmp = spi_OpCompositeExtract(spi, type_s, data, i);