Commit cc6003d5f5 for ffmpeg
commit cc6003d5f5b197fb13a305accbd93d923259de7f
Author: TADANO Tokumei <aimingoff@pc.nifty.jp>
Date: Sun Aug 23 21:59:05 2026 +0900
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>
diff --git a/libavfilter/vf_v360_vulkan.c b/libavfilter/vf_v360_vulkan.c
index c4651fd62c..85b4c6bfb5 100644
--- a/libavfilter/vf_v360_vulkan.c
+++ b/libavfilter/vf_v360_vulkan.c
@@ -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);
diff --git a/libavfilter/vulkan/v360.comp.glsl b/libavfilter/vulkan/v360.comp.glsl
index 74b83b232f..131b10e3b2 100644
--- a/libavfilter/vulkan/v360.comp.glsl
+++ b/libavfilter/vulkan/v360.comp.glsl
@@ -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]);