1
0
mirror of https://git.ffmpeg.org/ffmpeg.git synced 2026-10-24 02:09:03 +03:00

swscale/vulkan/ops: track entrypoint interface variables by name

Instead of hard-coding the layout of the in_vars[] array, give the fixed
variables names and build the entrypoint interface list by appending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Niklas Haas <git@haasn.dev>
This commit is contained in:
Niklas Haas
2026-10-20 02:08:41 +02:00
committed by Niklas Haas
parent caf17a3247
commit 91d6402932

View File

@@ -308,7 +308,13 @@ struct FilterData {
};
typedef struct SPIRVIDs {
int in_vars[3 + MAX_DATA_BUFS + 1];
/* Entrypoint interface variables */
int iface[3 + MAX_DATA_BUFS + 1];
int nb_iface;
int gid_var;
int in_img_var;
int out_img_var;
int glfn;
int ep;
@@ -394,9 +400,7 @@ static void define_shader_header(SwsContext *sws, FFVulkanShader *shd,
/* Entrypoint */
id->ep = spi_OpEntryPoint(spi, SpvExecutionModelGLCompute, "main",
id->in_vars,
3 + id->nb_dither_bufs + id->nb_filter_bufs +
(id->interlaced ? 1 : 0));
id->iface, id->nb_iface);
spi_OpExecutionMode(spi, id->ep, SpvExecutionModeLocalSize,
shd->lg_size, 3);
@@ -407,18 +411,18 @@ static void define_shader_header(SwsContext *sws, FFVulkanShader *shd,
}
/* gl_GlobalInvocationID descriptor decorations */
spi_OpDecorate(spi, id->in_vars[0], SpvDecorationBuiltIn,
spi_OpDecorate(spi, id->gid_var, SpvDecorationBuiltIn,
SpvBuiltInGlobalInvocationId);
/* Input image descriptor decorations */
spi_OpDecorate(spi, id->in_vars[1], SpvDecorationNonWritable);
spi_OpDecorate(spi, id->in_vars[1], SpvDecorationDescriptorSet, 0);
spi_OpDecorate(spi, id->in_vars[1], SpvDecorationBinding, 0);
spi_OpDecorate(spi, id->in_img_var, SpvDecorationNonWritable);
spi_OpDecorate(spi, id->in_img_var, SpvDecorationDescriptorSet, 0);
spi_OpDecorate(spi, id->in_img_var, SpvDecorationBinding, 0);
/* Output image descriptor decorations */
spi_OpDecorate(spi, id->in_vars[2], SpvDecorationNonReadable);
spi_OpDecorate(spi, id->in_vars[2], SpvDecorationDescriptorSet, 0);
spi_OpDecorate(spi, id->in_vars[2], SpvDecorationBinding, 1);
spi_OpDecorate(spi, id->out_img_var, SpvDecorationNonReadable);
spi_OpDecorate(spi, id->out_img_var, SpvDecorationDescriptorSet, 0);
spi_OpDecorate(spi, id->out_img_var, SpvDecorationBinding, 1);
for (int i = 0; i < id->nb_dither_bufs; i++) {
spi_OpDecorate(spi, id->dither[i].arr_1d_id, SpvDecorationArrayStride,
@@ -734,13 +738,13 @@ static void define_shader_bindings(const SwsOpList *ops, SPICtx *spi, SPIRVIDs *
}
/* Define inputs */
spi_OpVariable(spi, id->in_vars[0], id->u32vec3_tptr,
spi_OpVariable(spi, id->gid_var, id->u32vec3_tptr,
SpvStorageClassInput, 0);
if (op_r) {
spi_OpVariable(spi, id->in_vars[1], id->in_img_tptr,
spi_OpVariable(spi, id->in_img_var, id->in_img_tptr,
SpvStorageClassUniformConstant, 0);
}
spi_OpVariable(spi, id->in_vars[2], id->out_img_tptr,
spi_OpVariable(spi, id->out_img_var, id->out_img_tptr,
SpvStorageClassUniformConstant, 0);
if (id->interlaced) {
@@ -997,9 +1001,9 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
return err;
/* Entrypoint inputs; gl_GlobalInvocationID, input and output images, dither */
id->in_vars[0] = spi_get_id(spi);
id->in_vars[1] = spi_get_id(spi);
id->in_vars[2] = spi_get_id(spi);
id->gid_var = id->iface[id->nb_iface++] = spi_get_id(spi);
id->in_img_var = id->iface[id->nb_iface++] = spi_get_id(spi);
id->out_img_var = id->iface[id->nb_iface++] = spi_get_id(spi);
/* Create dither and filter buffer descriptor set. Both are collected in
* op order, so the bindings match the buffer order from create_bufs().*/
@@ -1041,7 +1045,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
continue;
}
id->in_vars[3 + nb_data_bufs] = var_id;
id->iface[id->nb_iface++] = var_id;
desc_set[nb_data_bufs++] = (FFVulkanDescriptorSetBinding) {
.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.stages = VK_SHADER_STAGE_COMPUTE_BIT,
@@ -1053,9 +1057,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
if (id->interlaced) {
id->push_const_struct_id = spi_get_id(spi);
id->push_const_var_id = spi_get_id(spi);
id->in_vars[3 + id->nb_dither_bufs + id->nb_filter_bufs] =
id->push_const_var_id;
id->push_const_var_id = id->iface[id->nb_iface++] = spi_get_id(spi);
}
/* Define shader header sections */
@@ -1072,7 +1074,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
for (int i = 0; i < in_img_count; i++) {
/* Deref array and then the pointer */
int img = spi_OpAccessChain(spi, id->in_img_sptr,
id->in_vars[1], id->u32_cid[i]);
id->in_img_var, id->u32_cid[i]);
in_img[i] = spi_OpLoad(spi, id->in_img_type, img,
SpvMemoryAccessMaskNone, 0);
}
@@ -1081,13 +1083,13 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
int out_img[4] = { 0 };
for (int i = 0; i < out_img_count; i++) {
int img = spi_OpAccessChain(spi, id->out_img_sptr,
id->in_vars[2], id->u32_cid[i]);
id->out_img_var, id->u32_cid[i]);
out_img[i] = spi_OpLoad(spi, id->out_img_type, img,
SpvMemoryAccessMaskNone, 0);
}
/* Load gl_GlobalInvocationID */
int gid = spi_OpLoad(spi, id->u32vec3_type, id->in_vars[0],
int gid = spi_OpLoad(spi, id->u32vec3_type, id->gid_var,
SpvMemoryAccessMaskNone, 0);
/* ivec2(gl_GlobalInvocationID.xy) */