This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit bba7e80f08210bbaef0a2607960c9374c88b6fd3 Author: Niklas Haas <[email protected]> AuthorDate: Tue Oct 20 23:47:50 2026 +0200 Commit: Niklas Haas <[email protected]> CommitDate: Sat Oct 24 19:10:48 2026 +0000 swscale/vulkan/ops: simplify bit-exact linear op generation To match the C backend bit-exactly, each row must be evaluated in the same order: starting from the offset, then adding the product of each nonzero coefficient from left to right. The existing code unrolled this by special casing the first coefficient and the offset, and then assumed that an accumulated value existed for every further coefficient iff either of those was nonzero. This was wrong for rows with more than one nonzero coefficient besides those, e.g. a row of [0 a b 0 0] evaluated to b*z instead of a*y + b*z. Simplify this to start the accumulator from the offset and loop over all coefficients, which fixes the bug. The generated code is otherwise unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Niklas Haas <[email protected]> --- libswscale/vulkan/ops.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c index e651a6c5b6..be3be0621b 100644 --- a/libswscale/vulkan/ops.c +++ b/libswscale/vulkan/ops.c @@ -463,12 +463,12 @@ static int bitexact_linear_nb_ops(const SwsLinearOp *lin) { int nb_ops = 0; for (int j = 0; j < 4; j++) { - nb_ops += !!lin->m[j][0].num; - nb_ops += lin->m[j][0].num && lin->m[j][4].num; - for (int i = 1; i < 4; i++) { - nb_ops += !!lin->m[j][i].num; - nb_ops += lin->m[j][i].num && - (lin->m[j][0].num || lin->m[j][4].num); + 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; @@ -843,26 +843,19 @@ static int insert_bitexact_linear(const SwsOp *op, SPICtx *spi, SPIRVIDs *id, spi->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]; for (int j = 0; j < 4; j++) { - res[j] = const_zero(id, op_type); - if (op->lin.m[j][0].num) - res[j] = spi_OpFMul(spi, type_s, tmp[0], lin->m[j][0]); - - if (op->lin.m[j][0].num && op->lin.m[j][4].num) - res[j] = spi_OpFAdd(spi, type_s, lin->off[j], res[j]); - else if (op->lin.m[j][4].num) - res[j] = lin->off[j]; - - for (int i = 1; i < 4; i++) { + bool acc = op->lin.m[j][4].num; + res[j] = acc ? lin->off[j] : const_zero(id, op_type); + for (int i = 0; i < 4; i++) { if (!op->lin.m[j][i].num) continue; int v = spi_OpFMul(spi, type_s, tmp[i], lin->m[j][i]); - if (op->lin.m[j][0].num || op->lin.m[j][4].num) - res[j] = spi_OpFAdd(spi, type_s, res[j], v); - else - res[j] = v; + res[j] = acc ? spi_OpFAdd(spi, type_s, res[j], v) : v; + acc = true; } } -- 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]
