FFmpeg
vulkan_filter.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) Lynne
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "filters.h"
22 #include "vulkan_filter.h"
24 
26  AVBufferRef *frames_ref,
27  int width, int height, enum AVPixelFormat sw_format)
28 {
29  int err;
30  AVHWFramesContext *frames_ctx;
31  AVHWDeviceContext *device_ctx;
32  AVVulkanFramesContext *vk_frames;
33  AVVulkanDeviceContext *vk_dev;
34  AVBufferRef *device_ref = avctx->hw_device_ctx;
35 
36  /* Check if context is reusable as-is */
37  if (frames_ref) {
38  int no_storage = 0;
40  VkImageUsageFlagBits usage_req;
41  const VkFormat *sub = av_vkfmt_from_pixfmt(sw_format);
42 
43  frames_ctx = (AVHWFramesContext *)frames_ref->data;
44  device_ctx = (AVHWDeviceContext *)frames_ctx->device_ref->data;
45  vk_frames = frames_ctx->hwctx;
46  vk_dev = device_ctx->hwctx;
47 
48  /* Width and height mismatch */
49  if (width != frames_ctx->width ||
50  height != frames_ctx->height)
51  goto skip;
52 
53  /* Format mismatch */
54  if (sw_format != frames_ctx->sw_format)
55  goto skip;
56 
57  /* Don't let linear through. */
58  if (vk_frames->tiling == VK_IMAGE_TILING_LINEAR)
59  goto skip;
60 
63 
64  /* More advanced format checks */
65  err = ff_vk_load_functions(device_ctx, &s->vkfn, s->extensions, 1, 1);
66  if (err < 0)
67  return err;
68  vk = &s->vkfn;
69 
70  /* Usage mismatch */
71  usage_req = VK_IMAGE_USAGE_SAMPLED_BIT |
72  VK_IMAGE_USAGE_STORAGE_BIT;
73 
74  /* If format supports hardware encoding, make sure
75  * the context includes it. */
76  if (vk_frames->format[1] == VK_FORMAT_UNDEFINED &&
77  (s->extensions & (FF_VK_EXT_VIDEO_ENCODE_QUEUE |
79  VkFormatProperties3 fprops = {
80  .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3,
81  };
82  VkFormatProperties2 prop = {
83  .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
84  .pNext = &fprops,
85  };
86  vk->GetPhysicalDeviceFormatProperties2(vk_dev->phys_dev,
87  vk_frames->format[0],
88  &prop);
89  if (fprops.optimalTilingFeatures & VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR)
90  usage_req |= VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
91  }
92 
93  if ((vk_frames->usage & usage_req) != usage_req)
94  goto skip;
95 
96  /* Check if the subformats can do storage */
97  for (int i = 0; sub[i] != VK_FORMAT_UNDEFINED; i++) {
98  VkFormatProperties2 prop = {
99  .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
100  };
101  vk->GetPhysicalDeviceFormatProperties2(vk_dev->phys_dev, sub[i],
102  &prop);
103  no_storage |= !(prop.formatProperties.optimalTilingFeatures &
104  VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT);
105  }
106 
107  /* Check if it's usable */
108  if (no_storage) {
109 skip:
110  av_log(avctx, AV_LOG_VERBOSE, "Cannot reuse context, creating a new one\n");
111  device_ref = frames_ctx->device_ref;
112  frames_ref = NULL;
113  } else {
114  av_log(avctx, AV_LOG_VERBOSE, "Reusing existing frames context\n");
115  frames_ref = av_buffer_ref(frames_ref);
116  if (!frames_ref)
117  return AVERROR(ENOMEM);
118  }
119  }
120 
121  if (!frames_ref) {
122  if (!device_ref) {
123  av_log(avctx, AV_LOG_ERROR,
124  "Vulkan filtering requires a device context!\n");
125  return AVERROR(EINVAL);
126  }
127 
128  frames_ref = av_hwframe_ctx_alloc(device_ref);
129 
130  frames_ctx = (AVHWFramesContext *)frames_ref->data;
131  frames_ctx->format = AV_PIX_FMT_VULKAN;
132  frames_ctx->sw_format = sw_format;
133  frames_ctx->width = width;
134  frames_ctx->height = height;
135 
136  vk_frames = frames_ctx->hwctx;
137  vk_frames->tiling = VK_IMAGE_TILING_OPTIMAL;
138  vk_frames->usage = VK_IMAGE_USAGE_SAMPLED_BIT |
139  VK_IMAGE_USAGE_STORAGE_BIT |
140  VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
141 
142  err = av_hwframe_ctx_init(frames_ref);
143  if (err < 0) {
144  av_buffer_unref(&frames_ref);
145  return err;
146  }
147 
148  device_ctx = (AVHWDeviceContext *)frames_ctx->device_ref->data;
149  vk_dev = device_ctx->hwctx;
150  }
151 
152  s->extensions = ff_vk_extensions_to_mask(vk_dev->enabled_dev_extensions,
153  vk_dev->nb_enabled_dev_extensions);
154  s->extensions |= ff_vk_extensions_to_mask(vk_dev->enabled_inst_extensions,
156 
157  err = ff_vk_load_functions(device_ctx, &s->vkfn, s->extensions, 1, 1);
158  if (err < 0) {
159  av_buffer_unref(&frames_ref);
160  return err;
161  }
162 
163  s->frames_ref = frames_ref;
164  s->frames = frames_ctx;
165  s->hwfc = vk_frames;
166  s->device = device_ctx;
167  s->hwctx = device_ctx->hwctx;
168 
169  err = ff_vk_load_props(s);
170  if (err < 0)
171  av_buffer_unref(&s->frames_ref);
172 
173  return err;
174 }
175 
177 {
179  AVHWFramesContext *input_frames;
180  AVFilterContext *avctx = inlink->dst;
181  FFVulkanContext *s = inlink->dst->priv;
182 
183  if (!l->hw_frames_ctx) {
184  av_log(inlink->dst, AV_LOG_ERROR, "Vulkan filtering requires a "
185  "hardware frames context on the input.\n");
186  return AVERROR(EINVAL);
187  }
188 
189  input_frames = (AVHWFramesContext *)l->hw_frames_ctx->data;
190  if (input_frames->format != AV_PIX_FMT_VULKAN)
191  return AVERROR(EINVAL);
192 
193  /* Extract the device and default output format from the first input. */
194  if (avctx->inputs[0] != inlink)
195  return 0;
196 
197  /* Save the ref, without reffing it */
198  s->input_frames_ref = l->hw_frames_ctx;
199 
200  /* Defaults */
201  s->input_format = input_frames->sw_format;
202  s->output_format = input_frames->sw_format;
203  s->output_width = inlink->w;
204  s->output_height = inlink->h;
205 
206  return 0;
207 }
208 
210 {
211  int err;
212  FilterLink *l = ff_filter_link(outlink);
213  FFVulkanContext *s = outlink->src->priv;
214 
216 
217  err = ff_vk_filter_init_context(outlink->src, s, s->input_frames_ref,
218  s->output_width, s->output_height,
219  s->output_format);
220  if (err < 0)
221  return err;
222 
223  l->hw_frames_ctx = av_buffer_ref(s->frames_ref);
224  if (!l->hw_frames_ctx)
225  return AVERROR(ENOMEM);
226 
227  outlink->w = s->output_width;
228  outlink->h = s->output_height;
229 
230  return err;
231 }
232 
234 {
235  FFVulkanContext *s = avctx->priv;
236 
237  s->output_format = AV_PIX_FMT_NONE;
238 
239  return 0;
240 }
241 
243  FFVulkanShader *shd, AVFrame *out_f, AVFrame *in_f,
244  VkSampler sampler, void *push_src, size_t push_size)
245 {
246  int err = 0;
247  FFVulkanFunctions *vk = &vkctx->vkfn;
248  VkImageView in_views[AV_NUM_DATA_POINTERS];
249  VkImageView out_views[AV_NUM_DATA_POINTERS];
250  VkImageMemoryBarrier2 img_bar[37];
251  int nb_img_bar = 0;
252 
253  /* Update descriptors and init the exec context */
254  FFVkExecContext *exec = ff_vk_exec_get(vkctx, e);
255  ff_vk_exec_start(vkctx, exec);
256 
257  RET(ff_vk_exec_add_dep_frame(vkctx, exec, out_f,
258  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
259  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
260  RET(ff_vk_create_imageviews(vkctx, exec, out_views, out_f, FF_VK_REP_FLOAT));
261  ff_vk_shader_update_img_array(vkctx, exec, shd, out_f, out_views, 0, !!in_f,
262  VK_IMAGE_LAYOUT_GENERAL,
263  VK_NULL_HANDLE);
264  if (in_f) {
265  RET(ff_vk_exec_add_dep_frame(vkctx, exec, in_f,
266  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
267  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
268  RET(ff_vk_create_imageviews(vkctx, exec, in_views, in_f, FF_VK_REP_FLOAT));
269  ff_vk_shader_update_img_array(vkctx, exec, shd, in_f, in_views, 0, 0,
270  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
271  sampler);
272  }
273 
274  /* Bind pipeline, update push data */
275  ff_vk_exec_bind_shader(vkctx, exec, shd);
276  if (push_src)
277  ff_vk_shader_update_push_const(vkctx, exec, shd, VK_SHADER_STAGE_COMPUTE_BIT,
278  0, push_size, push_src);
279 
280  /* Add data sync barriers */
281  ff_vk_frame_barrier(vkctx, exec, out_f, img_bar, &nb_img_bar,
282  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
283  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
284  VK_ACCESS_SHADER_WRITE_BIT,
285  VK_IMAGE_LAYOUT_GENERAL,
286  VK_QUEUE_FAMILY_IGNORED);
287  if (in_f)
288  ff_vk_frame_barrier(vkctx, exec, in_f, img_bar, &nb_img_bar,
289  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
290  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
291  VK_ACCESS_SHADER_READ_BIT,
292  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
293  VK_QUEUE_FAMILY_IGNORED);
294 
295  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
296  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
297  .pImageMemoryBarriers = img_bar,
298  .imageMemoryBarrierCount = nb_img_bar,
299  });
300 
301  vk->CmdDispatch(exec->buf,
302  FFALIGN(vkctx->output_width, shd->lg_size[0])/shd->lg_size[0],
303  FFALIGN(vkctx->output_height, shd->lg_size[1])/shd->lg_size[1],
304  shd->lg_size[2]);
305 
306  return ff_vk_exec_submit(vkctx, exec);
307 fail:
308  ff_vk_exec_discard_deps(vkctx, exec);
309  return err;
310 }
311 
313  FFVulkanShader *shd_list[2],
314  AVFrame *out, AVFrame *tmp, AVFrame *in,
315  VkSampler sampler, void *push_src, size_t push_size)
316 {
317  int err = 0;
318  FFVulkanFunctions *vk = &vkctx->vkfn;
319  VkImageView in_views[AV_NUM_DATA_POINTERS];
320  VkImageView tmp_views[AV_NUM_DATA_POINTERS];
321  VkImageView out_views[AV_NUM_DATA_POINTERS];
322  VkImageMemoryBarrier2 img_bar[37];
323  int nb_img_bar = 0;
324 
325  /* Update descriptors and init the exec context */
326  FFVkExecContext *exec = ff_vk_exec_get(vkctx, e);
327  ff_vk_exec_start(vkctx, exec);
328 
329  RET(ff_vk_exec_add_dep_frame(vkctx, exec, in,
330  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
331  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
332  RET(ff_vk_exec_add_dep_frame(vkctx, exec, tmp,
333  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
334  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
335  RET(ff_vk_exec_add_dep_frame(vkctx, exec, out,
336  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
337  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
338 
339  RET(ff_vk_create_imageviews(vkctx, exec, in_views, in, FF_VK_REP_FLOAT));
340  RET(ff_vk_create_imageviews(vkctx, exec, tmp_views, tmp, FF_VK_REP_FLOAT));
341  RET(ff_vk_create_imageviews(vkctx, exec, out_views, out, FF_VK_REP_FLOAT));
342 
343  ff_vk_frame_barrier(vkctx, exec, in, img_bar, &nb_img_bar,
344  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
345  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
346  VK_ACCESS_SHADER_READ_BIT,
347  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
348  VK_QUEUE_FAMILY_IGNORED);
349  ff_vk_frame_barrier(vkctx, exec, tmp, img_bar, &nb_img_bar,
350  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
351  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
352  VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
353  VK_IMAGE_LAYOUT_GENERAL,
354  VK_QUEUE_FAMILY_IGNORED);
355  ff_vk_frame_barrier(vkctx, exec, out, img_bar, &nb_img_bar,
356  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
357  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
358  VK_ACCESS_SHADER_WRITE_BIT,
359  VK_IMAGE_LAYOUT_GENERAL,
360  VK_QUEUE_FAMILY_IGNORED);
361 
362  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
363  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
364  .pImageMemoryBarriers = img_bar,
365  .imageMemoryBarrierCount = nb_img_bar,
366  });
367 
368  for (int i = 0; i < 2; i++) {
369  FFVulkanShader *shd = shd_list[i];
370  AVFrame *src_f = !i ? in : tmp;
371  AVFrame *dst_f = !i ? tmp : out;
372  VkImageView *src_views = !i ? in_views : tmp_views;
373  VkImageView *dst_views = !i ? tmp_views : out_views;
374 
375  ff_vk_shader_update_img_array(vkctx, exec, shd, src_f, src_views, 0, 0,
376  !i ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
377  VK_IMAGE_LAYOUT_GENERAL,
378  sampler);
379  ff_vk_shader_update_img_array(vkctx, exec, shd, dst_f, dst_views, 0, 1,
380  VK_IMAGE_LAYOUT_GENERAL,
381  VK_NULL_HANDLE);
382 
383  /* Bind pipeline, update push data */
384  ff_vk_exec_bind_shader(vkctx, exec, shd);
385  if (push_src)
386  ff_vk_shader_update_push_const(vkctx, exec, shd, VK_SHADER_STAGE_COMPUTE_BIT,
387  0, push_size, push_src);
388 
389  vk->CmdDispatch(exec->buf,
390  FFALIGN(vkctx->output_width, shd->lg_size[0])/shd->lg_size[0],
391  FFALIGN(vkctx->output_height, shd->lg_size[1])/shd->lg_size[1],
392  shd->lg_size[2]);
393  }
394 
395  return ff_vk_exec_submit(vkctx, exec);
396 fail:
397  ff_vk_exec_discard_deps(vkctx, exec);
398  return err;
399 }
400 
402  FFVulkanShader *shd,
403  AVFrame *out, AVFrame *in[], int nb_in,
404  VkSampler sampler, void *push_src, size_t push_size)
405 {
406  int err = 0;
407  FFVulkanFunctions *vk = &vkctx->vkfn;
408  VkImageView in_views[16][AV_NUM_DATA_POINTERS];
409  VkImageView out_views[AV_NUM_DATA_POINTERS];
410  VkImageMemoryBarrier2 img_bar[128];
411  int nb_img_bar = 0;
412 
413  /* Update descriptors and init the exec context */
414  FFVkExecContext *exec = ff_vk_exec_get(vkctx, e);
415  ff_vk_exec_start(vkctx, exec);
416 
417  /* Add deps and create temporary imageviews */
418  RET(ff_vk_exec_add_dep_frame(vkctx, exec, out,
419  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
420  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
421  RET(ff_vk_create_imageviews(vkctx, exec, out_views, out, FF_VK_REP_FLOAT));
422  for (int i = 0; i < nb_in; i++) {
423  RET(ff_vk_exec_add_dep_frame(vkctx, exec, in[i],
424  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
425  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
426  RET(ff_vk_create_imageviews(vkctx, exec, in_views[i], in[i], FF_VK_REP_FLOAT));
427  }
428 
429  /* Update descriptor sets */
430  ff_vk_shader_update_img_array(vkctx, exec, shd, out, out_views, 0, nb_in,
431  VK_IMAGE_LAYOUT_GENERAL,
432  VK_NULL_HANDLE);
433  for (int i = 0; i < nb_in; i++)
434  ff_vk_shader_update_img_array(vkctx, exec, shd, in[i], in_views[i], 0, i,
435  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
436  sampler);
437 
438  /* Bind pipeline, update push data */
439  ff_vk_exec_bind_shader(vkctx, exec, shd);
440  if (push_src)
441  ff_vk_shader_update_push_const(vkctx, exec, shd, VK_SHADER_STAGE_COMPUTE_BIT,
442  0, push_size, push_src);
443 
444  /* Add data sync barriers */
445  ff_vk_frame_barrier(vkctx, exec, out, img_bar, &nb_img_bar,
446  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
447  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
448  VK_ACCESS_SHADER_WRITE_BIT,
449  VK_IMAGE_LAYOUT_GENERAL,
450  VK_QUEUE_FAMILY_IGNORED);
451  for (int i = 0; i < nb_in; i++)
452  ff_vk_frame_barrier(vkctx, exec, in[i], img_bar, &nb_img_bar,
453  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
454  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
455  VK_ACCESS_SHADER_READ_BIT,
456  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
457  VK_QUEUE_FAMILY_IGNORED);
458 
459  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
460  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
461  .pImageMemoryBarriers = img_bar,
462  .imageMemoryBarrierCount = nb_img_bar,
463  });
464 
465  vk->CmdDispatch(exec->buf,
466  FFALIGN(vkctx->output_width, shd->lg_size[0])/shd->lg_size[0],
467  FFALIGN(vkctx->output_height, shd->lg_size[1])/shd->lg_size[1],
468  shd->lg_size[2]);
469 
470  return ff_vk_exec_submit(vkctx, exec);
471 fail:
472  ff_vk_exec_discard_deps(vkctx, exec);
473  return err;
474 }
vulkan_loader.h
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:85
ff_vk_load_props
int ff_vk_load_props(FFVulkanContext *s)
Loads props/mprops/driver_props.
Definition: vulkan.c:106
AVVulkanDeviceContext::phys_dev
VkPhysicalDevice phys_dev
Physical device.
Definition: hwcontext_vulkan.h:79
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
FFVulkanContext::output_height
int output_height
Definition: vulkan.h:307
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
out
FILE * out
Definition: movenc.c:55
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
RET
#define RET(x)
Definition: vulkan.h:67
ff_vk_filter_process_simple
int ff_vk_filter_process_simple(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanShader *shd, AVFrame *out_f, AVFrame *in_f, VkSampler sampler, void *push_src, size_t push_size)
Submit a compute shader with a zero/one input and single out for execution.
Definition: vulkan_filter.c:242
AVHWFramesContext::format
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
Definition: hwcontext.h:197
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
av_hwframe_ctx_init
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:322
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:403
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
ff_vk_filter_init
int ff_vk_filter_init(AVFilterContext *avctx)
General lavfi IO functions.
Definition: vulkan_filter.c:233
av_hwframe_ctx_alloc
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:248
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
AVFilterContext::hw_device_ctx
AVBufferRef * hw_device_ctx
For filters which will create hardware frames, sets the device the filter should create them in.
Definition: avfilter.h:539
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:477
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
AVHWFramesContext::width
int width
The allocated dimensions of the frames in this pool.
Definition: hwcontext.h:217
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
ff_vk_exec_add_dep_frame
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
Definition: vulkan.c:696
AVFilterContext::priv
void * priv
private data for use by the filter
Definition: avfilter.h:472
fail
#define fail()
Definition: checkasm.h:193
vulkan_filter.h
ff_vk_filter_init_context
int ff_vk_filter_init_context(AVFilterContext *avctx, FFVulkanContext *s, AVBufferRef *frames_ref, int width, int height, enum AVPixelFormat sw_format)
Can be called manually, if not using ff_vk_filter_config_output.
Definition: vulkan_filter.c:25
ff_vk_shader_update_img_array
void ff_vk_shader_update_img_array(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, AVFrame *f, VkImageView *views, int set, int binding, VkImageLayout layout, VkSampler sampler)
Update a descriptor in a buffer with an image array.
Definition: vulkan.c:2507
AVVulkanFramesContext
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
Definition: hwcontext_vulkan.h:213
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
AVHWFramesContext::height
int height
Definition: hwcontext.h:217
FFVulkanContext::output_width
int output_width
Definition: vulkan.h:306
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_vk_load_functions
static int ff_vk_load_functions(AVHWDeviceContext *ctx, FFVulkanFunctions *vk, uint64_t extensions_mask, int has_inst, int has_dev)
Function loader.
Definition: vulkan_loader.h:105
filters.h
FF_VK_REP_FLOAT
@ FF_VK_REP_FLOAT
Definition: vulkan.h:376
if
if(ret)
Definition: filter_design.txt:179
AVVulkanDeviceContext
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_vulkan.h:59
NULL
#define NULL
Definition: coverity.c:32
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:210
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
AVVulkanDeviceContext::nb_enabled_dev_extensions
int nb_enabled_dev_extensions
Definition: hwcontext_vulkan.h:113
AVHWFramesContext::device_ref
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
Definition: hwcontext.h:126
FF_VK_EXT_VIDEO_ENCODE_QUEUE
#define FF_VK_EXT_VIDEO_ENCODE_QUEUE
Definition: vulkan_functions.h:61
AVFilterContext::inputs
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:465
AVVulkanDeviceContext::enabled_inst_extensions
const char *const * enabled_inst_extensions
Enabled instance extensions.
Definition: hwcontext_vulkan.h:101
ff_vk_filter_config_output
int ff_vk_filter_config_output(AVFilterLink *outlink)
Definition: vulkan_filter.c:209
AVVulkanFramesContext::format
VkFormat format[AV_NUM_DATA_POINTERS]
Vulkan format for each image.
Definition: hwcontext_vulkan.h:273
AVVulkanFramesContext::usage
VkImageUsageFlagBits usage
Defines extra usage of output frames.
Definition: hwcontext_vulkan.h:232
FFVulkanContext
Definition: vulkan.h:266
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:197
ff_vk_filter_process_Nin
int ff_vk_filter_process_Nin(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanShader *shd, AVFrame *out, AVFrame *in[], int nb_in, VkSampler sampler, void *push_src, size_t push_size)
Up to 16 inputs, one output.
Definition: vulkan_filter.c:401
FF_VK_EXT_VIDEO_MAINTENANCE_1
#define FF_VK_EXT_VIDEO_MAINTENANCE_1
Definition: vulkan_functions.h:54
ff_vk_shader_update_push_const
void ff_vk_shader_update_push_const(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Update push constant in a shader.
Definition: vulkan.c:2520
height
#define height
Definition: dsp.h:85
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:404
FFVulkanShader
Definition: vulkan.h:182
FFVkExecContext
Definition: vulkan.h:102
av_vkfmt_from_pixfmt
const VkFormat * av_vkfmt_from_pixfmt(enum AVPixelFormat p)
Returns the optimal per-plane Vulkan format for a given sw_format, one for each plane.
Definition: hwcontext_stub.c:30
ff_vk_filter_process_2pass
int ff_vk_filter_process_2pass(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanShader *shd_list[2], AVFrame *out, AVFrame *tmp, AVFrame *in, VkSampler sampler, void *push_src, size_t push_size)
Submit a compute shader with a single in and single out with 2 stages.
Definition: vulkan_filter.c:312
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:489
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
VkFormat
enum VkFormat VkFormat
Definition: hwcontext_stub.c:25
ff_vk_frame_barrier
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlagBits new_access, VkImageLayout new_layout, uint32_t new_qf)
Definition: vulkan.c:1672
ff_vk_exec_bind_shader
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd)
Bind a shader.
Definition: vulkan.c:2530
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:115
ff_vk_create_imageviews
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
Create an imageview and add it as a dependency to an execution.
Definition: vulkan.c:1589
FFVulkanContext::vkfn
FFVulkanFunctions vkfn
Definition: vulkan.h:270
AVHWFramesContext::hwctx
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
Definition: hwcontext.h:150
FFVkExecPool
Definition: vulkan.h:244
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:114
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AVVulkanFramesContext::tiling
VkImageTiling tiling
Controls the tiling of allocated frames.
Definition: hwcontext_vulkan.h:222
AVFilterContext
An instance of a filter.
Definition: avfilter.h:457
AVVulkanDeviceContext::enabled_dev_extensions
const char *const * enabled_dev_extensions
Enabled device extensions.
Definition: hwcontext_vulkan.h:112
ff_vk_filter_config_input
int ff_vk_filter_config_input(AVFilterLink *inlink)
Definition: vulkan_filter.c:176
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AVVulkanDeviceContext::nb_enabled_inst_extensions
int nb_enabled_inst_extensions
Definition: hwcontext_vulkan.h:102
ff_vk_exec_discard_deps
void ff_vk_exec_discard_deps(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:521
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:811
ff_vk_extensions_to_mask
static uint64_t ff_vk_extensions_to_mask(const char *const *extensions, int nb_extensions)
Definition: vulkan_loader.h:36
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
width
#define width
Definition: dsp.h:85
FFVulkanFunctions
Definition: vulkan_functions.h:264
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:375
FFVulkanShader::lg_size
int lg_size[3]
Definition: vulkan.h:190