This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit d0af60afa88af4edc2297c615aa85bf58a71897a Author: Lynne <[email protected]> AuthorDate: Sun Apr 26 12:21:09 2026 +0200 Commit: Lynne <[email protected]> CommitDate: Fri May 22 14:05:26 2026 +0900 swscale/vulkan: make dither buffer allocation path generic Just a simple rename. Sponsored-by: Sovereign Tech Fund --- libswscale/vulkan/ops.c | 95 ++++++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 40 deletions(-) diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c index 69b4e9e25c..80d8058815 100644 --- a/libswscale/vulkan/ops.c +++ b/libswscale/vulkan/ops.c @@ -90,13 +90,14 @@ AVBufferRef *ff_sws_vk_device_ref(SwsContext *sws) } #define MAX_DITHER_BUFS 4 +#define MAX_DATA_BUFS (MAX_DITHER_BUFS) typedef struct VulkanPriv { FFVulkanOpsCtx *s; FFVkExecPool e; FFVulkanShader shd; - FFVkBuffer dither_buf[MAX_DITHER_BUFS]; - int nb_dither_buf; + FFVkBuffer data_bufs[MAX_DATA_BUFS]; + int nb_data_bufs; enum FFVkShaderRepFormat src_rep; enum FFVkShaderRepFormat dst_rep; } VulkanPriv; @@ -164,54 +165,68 @@ static void free_fn(void *priv) VulkanPriv *p = priv; ff_vk_exec_pool_free(&p->s->vkctx, &p->e); ff_vk_shader_free(&p->s->vkctx, &p->shd); - for (int i = 0; i < p->nb_dither_buf; i++) - ff_vk_free_buf(&p->s->vkctx, &p->dither_buf[i]); + for (int i = 0; i < p->nb_data_bufs; i++) + ff_vk_free_buf(&p->s->vkctx, &p->data_bufs[i]); av_refstruct_unref(&p->s); av_free(priv); } -static int create_dither_bufs(FFVulkanOpsCtx *s, VulkanPriv *p, SwsOpList *ops) +static int create_dither_buf(FFVulkanOpsCtx *s, VulkanPriv *p, + const SwsDitherOp *dd, FFVkBuffer *buf) { int err; - p->nb_dither_buf = 0; - for (int n = 0; n < ops->num_ops; n++) { - const SwsOp *op = &ops->ops[n]; - if (op->op != SWS_OP_DITHER) - continue; - av_assert0(p->nb_dither_buf + 1 <= MAX_DITHER_BUFS); - int size = (1 << op->dither.size_log2); - int idx = p->nb_dither_buf; - err = ff_vk_create_buf(&s->vkctx, &p->dither_buf[idx], - size*size*sizeof(float), NULL, NULL, - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); - if (err < 0) - goto fail; - p->nb_dither_buf++; + int size = (1 << dd->size_log2); + err = ff_vk_create_buf(&s->vkctx, buf, + size*size*sizeof(float), NULL, NULL, + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); + if (err < 0) + return err; - float *dither_data; - err = ff_vk_map_buffer(&s->vkctx, &p->dither_buf[idx], - (uint8_t **)&dither_data, 0); - if (err < 0) - goto fail; + float *dither_data; + err = ff_vk_map_buffer(&s->vkctx, buf, (uint8_t **)&dither_data, 0); + if (err < 0) + goto fail; - for (int i = 0; i < size; i++) { - for (int j = 0; j < size; j++) { - const AVRational r = op->dither.matrix[i*size + j]; - dither_data[i*size + j] = r.num/(float)r.den; - } + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + const AVRational r = dd->matrix[i*size + j]; + dither_data[i*size + j] = r.num/(float)r.den; } + } - ff_vk_unmap_buffer(&s->vkctx, &p->dither_buf[idx], 1); + ff_vk_unmap_buffer(&s->vkctx, buf, 1); + + return 0; + +fail: + ff_vk_free_buf(&p->s->vkctx, buf); + return err; +} + +static int create_bufs(FFVulkanOpsCtx *s, VulkanPriv *p, SwsOpList *ops) +{ + int err; + p->nb_data_bufs = 0; + for (int n = 0; n < ops->num_ops; n++) { + const SwsOp *op = &ops->ops[n]; + if (op->op == SWS_OP_DITHER) { + av_assert0(p->nb_data_bufs + 1 <= FF_ARRAY_ELEMS(p->data_bufs)); + err = create_dither_buf(s, p, &op->dither, + &p->data_bufs[p->nb_data_bufs]); + if (err < 0) + goto fail; + p->nb_data_bufs++; + } } return 0; fail: - for (int i = 0; i < p->nb_dither_buf; i++) - ff_vk_free_buf(&p->s->vkctx, &p->dither_buf[i]); + for (int i = 0; i < p->nb_data_bufs; i++) + ff_vk_free_buf(&p->s->vkctx, &p->data_bufs[i]); return err; } @@ -227,7 +242,7 @@ struct DitherData { }; typedef struct SPIRVIDs { - int in_vars[3 + MAX_DITHER_BUFS]; + int in_vars[3 + MAX_DATA_BUFS]; int glfn; int ep; @@ -598,7 +613,7 @@ static int add_ops_spirv(VulkanPriv *p, FFVulkanOpsCtx *s, if (op_r) p->src_rep = op_r->type == SWS_PIXEL_F32 ? FF_VK_REP_FLOAT : FF_VK_REP_UINT; - FFVulkanDescriptorSetBinding desc_set[MAX_DITHER_BUFS] = { + FFVulkanDescriptorSetBinding desc_set[MAX_DATA_BUFS] = { { .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, .stages = VK_SHADER_STAGE_COMPUTE_BIT, @@ -613,7 +628,7 @@ static int add_ops_spirv(VulkanPriv *p, FFVulkanOpsCtx *s, ff_vk_shader_add_descriptor_set(&s->vkctx, shd, desc_set, 2, 0, 0); /* Create dither buffers */ - int err = create_dither_bufs(s, p, ops); + int err = create_bufs(s, p, ops); if (err < 0) return err; @@ -965,7 +980,7 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s, add_desc_read_write(&buf_desc[nb_desc++], &p->dst_rep, write); ff_vk_shader_add_descriptor_set(&s->vkctx, shd, buf_desc, nb_desc, 0, 0); - err = create_dither_bufs(s, p, ops); + err = create_bufs(s, p, ops); if (err < 0) return err; @@ -1213,9 +1228,9 @@ static int compile(SwsContext *sws, SwsOpList *ops, SwsCompiledOp *out, int glsl if (err < 0) goto fail; - for (int i = 0; i < p->nb_dither_buf; i++) + for (int i = 0; i < p->nb_data_bufs; i++) ff_vk_shader_update_desc_buffer(&s->vkctx, &p->e.contexts[0], &p->shd, - 1, i, 0, &p->dither_buf[i], + 1, i, 0, &p->data_bufs[i], 0, VK_WHOLE_SIZE, VK_FORMAT_UNDEFINED); *out = (SwsCompiledOp) { _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
