avfilter/v360_vulkan: reduce size of Push Constants

Remove `in_img_size[][]` from PushData.
Even though it is constant through a filter process, it occupies
128 bites of Push Constants. It may exceed limit of some hardware.
The information is passed via Specialization Constants.

In addition to `in_img_size`, number of planes is passed via
Specialization Constants, that was hard-coded with magic number.
`m_pi4` is for later enhancement.

Signed-off-by: TADANO Tokumei <aimingoff@pc.nifty.jp>
This commit is contained in:
TADANO Tokumei authored and Lynne committed 2026-10-01 14:57:38 +00:00
1 parent 527f5050ed
commit cc6003d5f5
2 files changed
+25 -13

No files matched your search

+10 -11
View File
@@ -29,7 +29,6 @@ extern const unsigned int ff_v360_comp_spv_len;
/* Push constants */
struct PushData {
float rot_mat[4][4];
int in_img_size[4][2];
float iflat_range[2];
float flat_range[2];
};
@@ -428,13 +427,6 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in)
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->vkctx.output_format);
const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
s->pd.in_img_size[0][0] = s->pd.in_img_size[3][0] = in->width;
s->pd.in_img_size[0][1] = s->pd.in_img_size[3][1] = in->height;
s->pd.in_img_size[1][0] = s->pd.in_img_size[2][0] =
FF_CEIL_RSHIFT(in->width, desc->log2_chroma_w);
s->pd.in_img_size[1][1] = s->pd.in_img_size[2][1] =
FF_CEIL_RSHIFT(in->height, desc->log2_chroma_h);
RET(ff_vk_init_sampler(vkctx, &s->sampler, 0, VK_FILTER_LINEAR));
s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0);
@@ -444,15 +436,22 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in)
goto fail;
}
RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, 2, 0, 0, 0, NULL));
RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, FF_VK_DEFAULT_EXEC_CONTEXTS, 0, 0, 0, NULL));
SPEC_LIST_CREATE(sl, 4, 2*sizeof(int) + 2*sizeof(float))
SPEC_LIST_CREATE(sl, 10, 7*sizeof(int) + 3*sizeof(float))
SPEC_LIST_ADD(sl, 0, 32, s->out);
SPEC_LIST_ADD(sl, 1, 32, s->in);
const float m_pi = M_PI, m_pi2 = M_PI_2;
const float m_pi = M_PI, m_pi2 = M_PI_2, m_pi4 = M_PI_4;
SPEC_LIST_ADD(sl, 2, 32, av_float2int(m_pi));
SPEC_LIST_ADD(sl, 3, 32, av_float2int(m_pi2));
SPEC_LIST_ADD(sl, 4, 32, av_float2int(m_pi4));
SPEC_LIST_ADD(sl, 5, 32, planes);
SPEC_LIST_ADD(sl, 6, 32, in->width);
SPEC_LIST_ADD(sl, 7, 32, in->height);
SPEC_LIST_ADD(sl, 8, 32, FF_CEIL_RSHIFT(in->width, desc->log2_chroma_w));
SPEC_LIST_ADD(sl, 9, 32, FF_CEIL_RSHIFT(in->height, desc->log2_chroma_h));
ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT,
sl, (uint32_t []) { 16, 16, 1 }, 0);
+15 -2
View File
@@ -34,17 +34,30 @@ layout (constant_id = 1) const int in_transform = 0;
layout (constant_id = 2) const float m_pi = 0;
layout (constant_id = 3) const float m_pi2 = 0;
layout (constant_id = 4) const float m_pi4 = 0;
layout (constant_id = 5) const int planes = 0;
layout (constant_id = 6) const int in_w = 0;
layout (constant_id = 7) const int in_h = 0;
layout (constant_id = 8) const int in_chroma_w = 0;
layout (constant_id = 9) const int in_chroma_h = 0;
layout (set = 0, binding = 0) uniform sampler2D input_img[];
layout (set = 0, binding = 1) uniform writeonly image2D output_img[];
layout (push_constant, scalar) uniform pushConstants {
mat4 rot_mat;
ivec2 in_img_size[4];
vec2 iflat_range;
vec2 flat_range;
};
ivec2 in_img_size[4] = {
ivec2(in_w, in_h),
ivec2(in_chroma_w, in_chroma_h),
ivec2(in_chroma_w, in_chroma_h),
ivec2(in_w, in_h)
};
#define IS_WITHIN(v1, v2) any(lessThan(v1, v2))
void xyz_to_flat(uint idx, in vec3 v, in ivec2 pos, in ivec2 in_size)
@@ -157,7 +170,7 @@ void main()
{
ivec2 pos = ivec2(gl_GlobalInvocationID.xy);
for (int i = 0; i < 3; i++) {
for (int i = 0; i < planes; i++) {
ivec2 in_size = in_img_size[i];
ivec2 out_size = imageSize(output_img[i]);