This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit c94ffc7432dd232dceef463bf1fc53d70b103d97 Author: Niklas Haas <[email protected]> AuthorDate: Wed Oct 21 18:12:51 2026 +0200 Commit: Niklas Haas <[email protected]> CommitDate: Sat Oct 24 19:10:48 2026 +0000 swscale/vulkan/ops: decorate bit-exact linear ops with NoContraction inline Instead of reserving space for the decorations up front and patching them in later, based on a separately computed instruction count, decorate each instruction as it is emitted. Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Niklas Haas <[email protected]> --- libswscale/vulkan/ops.c | 56 +++++++--------------------------------------- libswscale/vulkan/spvasm.h | 9 -------- 2 files changed, 8 insertions(+), 57 deletions(-) diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c index e8ae946307..614fa29fda 100644 --- a/libswscale/vulkan/ops.c +++ b/libswscale/vulkan/ops.c @@ -325,8 +325,6 @@ typedef struct LinearIDs { int mat; /* full matrix, only valid without SWS_BITEXACT */ int off[4]; /* offset coefficients */ int off_vec; - int deco_off; /* space reserved for NoContraction decorations */ - int nb_deco; } LinearIDs; /* Constants and buffers used by a single op */ @@ -463,25 +461,8 @@ static int emit_convert(SPICtx *spi, SwsPixelType from, SwsPixelType to, : spi_OpConvertUToF(spi, res_type, a); } -/* Number of arithmetic instructions emitted by insert_bitexact_linear() */ -static int bitexact_linear_nb_ops(const SwsLinearOp *lin) -{ - int nb_ops = 0; - for (int j = 0; j < 4; j++) { - bool acc = lin->m[j][4].num; - for (int i = 0; i < 4; i++) { - if (!lin->m[j][i].num) - continue; - nb_ops += 1 + acc; /* multiplication, and addition if needed */ - acc = true; - } - } - return nb_ops; -} - /* Section 1: Function to define all shader header data, and decorations */ -static void define_shader_header(SwsContext *sws, const SwsOpList *ops, - SPICtx *spi, SPIRVIDs *id) +static void define_shader_header(SPICtx *spi, SPIRVIDs *id) { spi_OpCapability(spi, SpvCapabilityShader); /* Shader type */ @@ -522,21 +503,6 @@ static void define_shader_header(SwsContext *sws, const SwsOpList *ops, spi_OpDecorate(spi, f->id, SpvDecorationDescriptorSet, 1); spi_OpDecorate(spi, f->id, SpvDecorationBinding, f->binding); } - - if (!(sws->flags & SWS_BITEXACT)) - return; - - /* All linear arithmetic ops must be decorated with NoContraction */ - for (int n = 0; n < ops->num_ops; n++) { - const SwsOp *op = &ops->ops[n]; - if (op->op != SWS_OP_LINEAR) - continue; - - const int nb_ops = bitexact_linear_nb_ops(&op->lin); - LinearIDs *lin = &id->op[n].lin; - lin->deco_off = spi_reserve(spi, SPI_SECTION_DECORATIONS, nb_ops*4*3); - lin->nb_deco = nb_ops; - } } /* Section 2: Define all types and constants */ @@ -841,14 +807,6 @@ static int insert_bitexact_linear(const SwsOp *op, SPICtx *spi, SPIRVIDs *id, tmp[2] = spi_OpCompositeExtract(spi, type_s, data, 2); tmp[3] = spi_OpCompositeExtract(spi, type_s, data, 3); - SPISectionBuf *deco = &spi->sec[SPI_SECTION_DECORATIONS]; - const int off = deco->off; - deco->off = lin->deco_off; - for (int i = 0; i < lin->nb_deco; i++) - spi_OpDecorate(spi, spi->id + i, SpvDecorationNoContraction); - deco->off = off; - const int first_id = spi->id; - /* Same evaluation order as the C backend: offset first, then each column * from left to right, skipping zero coefficients */ int res[4]; @@ -860,14 +818,16 @@ static int insert_bitexact_linear(const SwsOp *op, SPICtx *spi, SPIRVIDs *id, continue; int v = spi_OpFMul(spi, type_s, tmp[i], lin->m[j][i]); - res[j] = acc ? spi_OpFAdd(spi, type_s, res[j], v) : v; + spi_OpDecorate(spi, v, SpvDecorationNoContraction); + if (acc) { + v = spi_OpFAdd(spi, type_s, res[j], v); + spi_OpDecorate(spi, v, SpvDecorationNoContraction); + } + res[j] = v; acc = true; } } - /* The decorations above assume one ID per arithmetic op */ - av_assert0(spi->id - first_id == lin->nb_deco); - return spi_OpCompositeConstruct(spi, type_v, res[0], res[1], res[2], res[3]); } @@ -1087,7 +1047,7 @@ static int emit_shader(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s, nb_data_bufs, 1); /* Define shader header sections */ - define_shader_header(sws, ops, spi, id); + define_shader_header(spi, id); define_shader_consts(sws, ops, spi, id); define_shader_bindings(ops, spi, id, in_img_count, out_img_count); diff --git a/libswscale/vulkan/spvasm.h b/libswscale/vulkan/spvasm.h index d455e59850..17e8d851fe 100644 --- a/libswscale/vulkan/spvasm.h +++ b/libswscale/vulkan/spvasm.h @@ -200,15 +200,6 @@ static inline int spi_end(const SPICtx *spi, uint8_t **out) return len; } -/* Reserves space in the given section, returns its offset */ -static inline int spi_reserve(SPICtx *spi, SPISection s, int len) -{ - SPISectionBuf *sec = &spi->sec[s]; - if (!spi_append(sec, len)) - return 0; - return sec->off - len; -} - static inline void spi_OpCapability(SPICtx *spi, SpvCapability capability) { SPISectionBuf *sec = spi_begin(spi, 2, 17); -- To stop receiving notification emails like this one, please contact [email protected]. _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
