History

vulkan: add support for regular descriptor pools

This permits: - The use of Vulkan filtering on many more devices - Better debugging due to lack of descriptor buffer support in layers Much of the changes here are due to a requirement that updates to descriptors must happen between the command buffer being waited on, and the pipeline not being bound. We routinely did it the other way around, by updating only after we bind the pipeline.

Lynne committed 2 years ago

Commit 8a7af4a1 parent 3d75ba77 files · +394 −232Browse files

Showing the changes to libavfilter (3 of 7 files). Show all

Unified · Split

3 files
  1. libavfilter/vf_gblur_vulkan.c +1 −1
  2. libavfilter/vf_nlmeans_vulkan.c +9 −12
  3. libavfilter/vulkan_filter.c +55 −65
libavfilter/vf_gblur_vulkan.c+1−1
@@ -189,7 +189,7 @@ static int init_gblur_pipeline(GBlurVulkanContext *s, FFVulkanPipeline *pl, · 188 unmodified lines
189 RET(ff_vk_unmap_buffer(&s->vkctx, params_buf, 1));189 RET(ff_vk_unmap_buffer(&s->vkctx, params_buf, 1));
190 190
191 RET(ff_vk_set_descriptor_buffer(&s->vkctx, pl, NULL, 1, 0, 0,191 RET(ff_vk_set_descriptor_buffer(&s->vkctx, pl, NULL, 1, 0, 0,
192 params_buf->address, params_buf->size,192 params_buf, 0, params_buf->size,
193 VK_FORMAT_UNDEFINED));193 VK_FORMAT_UNDEFINED));
194 194
195fail:195fail:
libavfilter/vf_nlmeans_vulkan.c+9−12
@@ -657,7 +657,7 @@ static av_cold int init_filter(AVFilterContext *ctx) · 656 unmodified lines
657 spv, desc, planes));657 spv, desc, planes));
658 658
659 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_weights, NULL, 1, 0, 0,659 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_weights, NULL, 1, 0, 0,
660 s->xyoffsets_buf.address, s->xyoffsets_buf.size,660 &s->xyoffsets_buf, 0, s->xyoffsets_buf.size,
661 VK_FORMAT_UNDEFINED));661 VK_FORMAT_UNDEFINED));
662 662
663 do {663 do {
@@ -751,8 +751,8 @@ static int nlmeans_vulkan_filter_frame(AVFilterLink *link, AVFrame *in) · 87 unmodified lines
751 /* Weights/sums */751 /* Weights/sums */
752 AVBufferRef *ws_buf = NULL;752 AVBufferRef *ws_buf = NULL;
753 FFVkBuffer *ws_vk;753 FFVkBuffer *ws_vk;
754 VkDeviceAddress weights_addr[4];754 VkDeviceSize weights_addr[4];
755 VkDeviceAddress sums_addr[4];755 VkDeviceSize sums_addr[4];
756 uint32_t ws_stride[4];756 uint32_t ws_stride[4];
757 size_t ws_size[4];757 size_t ws_size[4];
758 size_t ws_total_size = 0;758 size_t ws_total_size = 0;
@@ -810,8 +810,8 @@ static int nlmeans_vulkan_filter_frame(AVFilterLink *link, AVFrame *in) · 51 unmodified lines
810 return err;810 return err;
811 ws_vk = (FFVkBuffer *)ws_buf->data;811 ws_vk = (FFVkBuffer *)ws_buf->data;
812 812
813 weights_addr[0] = ws_vk->address;813 weights_addr[0] = 0;
814 sums_addr[0] = ws_vk->address + ws_total_size;814 sums_addr[0] = ws_total_size;
815 for (int i = 1; i < desc->nb_components; i++) {815 for (int i = 1; i < desc->nb_components; i++) {
816 weights_addr[i] = weights_addr[i - 1] + ws_size[i - 1];816 weights_addr[i] = weights_addr[i - 1] + ws_size[i - 1];
817 sums_addr[i] = sums_addr[i - 1] + ws_size[i - 1];817 sums_addr[i] = sums_addr[i - 1] + ws_size[i - 1];
@@ -844,9 +844,6 @@ static int nlmeans_vulkan_filter_frame(AVFilterLink *link, AVFrame *in) · 26 unmodified lines
844 844
845 /* Input frame prep */845 /* Input frame prep */
846 RET(ff_vk_create_imageviews(vkctx, exec, in_views, in));846 RET(ff_vk_create_imageviews(vkctx, exec, in_views, in));
847 ff_vk_update_descriptor_img_array(vkctx, &s->pl_weights, exec, in, in_views, 0, 0,
848 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
849 s->sampler);
850 ff_vk_frame_barrier(vkctx, exec, in, img_bar, &nb_img_bar,847 ff_vk_frame_barrier(vkctx, exec, in, img_bar, &nb_img_bar,
851 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,848 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
852 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,849 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
@@ -934,10 +931,10 @@ static int nlmeans_vulkan_filter_frame(AVFilterLink *link, AVFrame *in) · 81 unmodified lines
934 s->sampler);931 s->sampler);
935 for (int i = 0; i < desc->nb_components; i++) {932 for (int i = 0; i < desc->nb_components; i++) {
936 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_weights, exec, 0, 1 + i*2 + 0, 0,933 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_weights, exec, 0, 1 + i*2 + 0, 0,
937 weights_addr[i], ws_size[i],934 ws_vk, weights_addr[i], ws_size[i],
938 VK_FORMAT_UNDEFINED));935 VK_FORMAT_UNDEFINED));
939 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_weights, exec, 0, 1 + i*2 + 1, 0,936 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_weights, exec, 0, 1 + i*2 + 1, 0,
940 sums_addr[i], ws_size[i],937 ws_vk, sums_addr[i], ws_size[i],
941 VK_FORMAT_UNDEFINED));938 VK_FORMAT_UNDEFINED));
942 }939 }
943 940
@@ -949,10 +946,10 @@ static int nlmeans_vulkan_filter_frame(AVFilterLink *link, AVFrame *in) · 5 unmodified lines
949 VK_IMAGE_LAYOUT_GENERAL, s->sampler);946 VK_IMAGE_LAYOUT_GENERAL, s->sampler);
950 for (int i = 0; i < desc->nb_components; i++) {947 for (int i = 0; i < desc->nb_components; i++) {
951 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_denoise, exec, 0, 2 + i*2 + 0, 0,948 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_denoise, exec, 0, 2 + i*2 + 0, 0,
952 weights_addr[i], ws_size[i],949 ws_vk, weights_addr[i], ws_size[i],
953 VK_FORMAT_UNDEFINED));950 VK_FORMAT_UNDEFINED));
954 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_denoise, exec, 0, 2 + i*2 + 1, 0,951 RET(ff_vk_set_descriptor_buffer(&s->vkctx, &s->pl_denoise, exec, 0, 2 + i*2 + 1, 0,
955 sums_addr[i], ws_size[i],952 ws_vk, sums_addr[i], ws_size[i],
956 VK_FORMAT_UNDEFINED));953 VK_FORMAT_UNDEFINED));
957 }954 }
958 955
libavfilter/vulkan_filter.c+55−65
@@ -152,18 +152,6 @@ skip: · 151 unmodified lines
152 s->extensions = ff_vk_extensions_to_mask(vk_dev->enabled_dev_extensions,152 s->extensions = ff_vk_extensions_to_mask(vk_dev->enabled_dev_extensions,
153 vk_dev->nb_enabled_dev_extensions);153 vk_dev->nb_enabled_dev_extensions);
154 154
155 /**
156 * libplacebo does not use descriptor buffers.
157 */
158 if (!(s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) &&
159 strcmp(avctx->filter->name, "libplacebo")) {
160 av_log(avctx, AV_LOG_ERROR, "Vulkan filtering requires that "
161 "the %s extension is supported!\n",
162 VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME);
163 av_buffer_unref(&frames_ref);
164 return AVERROR(EINVAL);
165 }
166
167 err = ff_vk_load_functions(device_ctx, &s->vkfn, s->extensions, 1, 1);155 err = ff_vk_load_functions(device_ctx, &s->vkfn, s->extensions, 1, 1);
168 if (err < 0) {156 if (err < 0) {
169 av_buffer_unref(&frames_ref);157 av_buffer_unref(&frames_ref);
@@ -264,12 +252,13 @@ int ff_vk_filter_process_simple(FFVulkanContext *vkctx, FFVkExecPool *e, · 94 unmodified lines
264 FFVkExecContext *exec = ff_vk_exec_get(e);252 FFVkExecContext *exec = ff_vk_exec_get(e);
265 ff_vk_exec_start(vkctx, exec);253 ff_vk_exec_start(vkctx, exec);
266 254
267 ff_vk_exec_bind_pipeline(vkctx, exec, pl);255 RET(ff_vk_exec_add_dep_frame(vkctx, exec, out_f,
268 256 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
269 if (push_src)257 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
270 ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,258 RET(ff_vk_create_imageviews(vkctx, exec, out_views, out_f));
271 0, push_size, push_src);259 ff_vk_update_descriptor_img_array(vkctx, pl, exec, out_f, out_views, 0, !!in_f,
272 260 VK_IMAGE_LAYOUT_GENERAL,
261 VK_NULL_HANDLE);
273 if (in_f) {262 if (in_f) {
274 RET(ff_vk_exec_add_dep_frame(vkctx, exec, in_f,263 RET(ff_vk_exec_add_dep_frame(vkctx, exec, in_f,
275 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,264 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
@@ -278,27 +267,28 @@ int ff_vk_filter_process_simple(FFVulkanContext *vkctx, FFVkExecPool *e, · 2 unmodified lines
278 ff_vk_update_descriptor_img_array(vkctx, pl, exec, in_f, in_views, 0, 0,267 ff_vk_update_descriptor_img_array(vkctx, pl, exec, in_f, in_views, 0, 0,
279 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,268 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
280 sampler);269 sampler);
281 ff_vk_frame_barrier(vkctx, exec, in_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_READ_BIT,
285 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
286 VK_QUEUE_FAMILY_IGNORED);
287 }270 }
288 271
289 RET(ff_vk_exec_add_dep_frame(vkctx, exec, out_f,272 /* Bind pipeline, update push data */
290 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,273 ff_vk_exec_bind_pipeline(vkctx, exec, pl);
291 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));274 if (push_src)
292 RET(ff_vk_create_imageviews(vkctx, exec, out_views, out_f));275 ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
293 ff_vk_update_descriptor_img_array(vkctx, pl, exec, out_f, out_views, 0, !!in_f,276 0, push_size, push_src);
294 VK_IMAGE_LAYOUT_GENERAL,277
295 VK_NULL_HANDLE);278 /* Add data sync barriers */
296 ff_vk_frame_barrier(vkctx, exec, out_f, img_bar, &nb_img_bar,279 ff_vk_frame_barrier(vkctx, exec, out_f, img_bar, &nb_img_bar,
297 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,280 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
298 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,281 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
299 VK_ACCESS_SHADER_WRITE_BIT,282 VK_ACCESS_SHADER_WRITE_BIT,
300 VK_IMAGE_LAYOUT_GENERAL,283 VK_IMAGE_LAYOUT_GENERAL,
301 VK_QUEUE_FAMILY_IGNORED);284 VK_QUEUE_FAMILY_IGNORED);
285 if (in_f)
286 ff_vk_frame_barrier(vkctx, exec, in_f, img_bar, &nb_img_bar,
287 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
288 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
289 VK_ACCESS_SHADER_READ_BIT,
290 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
291 VK_QUEUE_FAMILY_IGNORED);
302 292
303 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {293 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
304 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,294 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
@@ -380,12 +370,6 @@ int ff_vk_filter_process_2pass(FFVulkanContext *vkctx, FFVkExecPool *e, · 75 unmodified lines
380 VkImageView *src_views = !i ? in_views : tmp_views;370 VkImageView *src_views = !i ? in_views : tmp_views;
381 VkImageView *dst_views = !i ? tmp_views : out_views;371 VkImageView *dst_views = !i ? tmp_views : out_views;
382 372
383 ff_vk_exec_bind_pipeline(vkctx, exec, pl);
384
385 if (push_src)
386 ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
387 0, push_size, push_src);
388
389 ff_vk_update_descriptor_img_array(vkctx, pl, exec, src_f, src_views, 0, 0,373 ff_vk_update_descriptor_img_array(vkctx, pl, exec, src_f, src_views, 0, 0,
390 !i ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :374 !i ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
391 VK_IMAGE_LAYOUT_GENERAL,375 VK_IMAGE_LAYOUT_GENERAL,
@@ -394,6 +378,12 @@ int ff_vk_filter_process_2pass(FFVulkanContext *vkctx, FFVkExecPool *e, · 2 unmodified lines
394 VK_IMAGE_LAYOUT_GENERAL,378 VK_IMAGE_LAYOUT_GENERAL,
395 VK_NULL_HANDLE);379 VK_NULL_HANDLE);
396 380
381 /* Bind pipeline, update push data */
382 ff_vk_exec_bind_pipeline(vkctx, exec, pl);
383 if (push_src)
384 ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
385 0, push_size, push_src);
386
397 vk->CmdDispatch(exec->buf,387 vk->CmdDispatch(exec->buf,
398 FFALIGN(vkctx->output_width, pl->wg_size[0])/pl->wg_size[0],388 FFALIGN(vkctx->output_width, pl->wg_size[0])/pl->wg_size[0],
399 FFALIGN(vkctx->output_height, pl->wg_size[1])/pl->wg_size[1],389 FFALIGN(vkctx->output_height, pl->wg_size[1])/pl->wg_size[1],
@@ -422,32 +412,47 @@ int ff_vk_filter_process_Nin(FFVulkanContext *vkctx, FFVkExecPool *e, · 22 unmodified lines
422 FFVkExecContext *exec = ff_vk_exec_get(e);412 FFVkExecContext *exec = ff_vk_exec_get(e);
423 ff_vk_exec_start(vkctx, exec);413 ff_vk_exec_start(vkctx, exec);
424 414
425 /* Inputs */415 /* Add deps and create temporary imageviews */
416 RET(ff_vk_exec_add_dep_frame(vkctx, exec, out,
417 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
418 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
419 RET(ff_vk_create_imageviews(vkctx, exec, out_views, out));
426 for (int i = 0; i < nb_in; i++) {420 for (int i = 0; i < nb_in; i++) {
427 RET(ff_vk_exec_add_dep_frame(vkctx, exec, in[i],421 RET(ff_vk_exec_add_dep_frame(vkctx, exec, in[i],
428 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,422 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
429 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));423 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
430 RET(ff_vk_create_imageviews(vkctx, exec, in_views[i], in[i]));424 RET(ff_vk_create_imageviews(vkctx, exec, in_views[i], in[i]));
431
432 ff_vk_frame_barrier(vkctx, exec, in[i], img_bar, &nb_img_bar,
433 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
434 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
435 VK_ACCESS_SHADER_READ_BIT,
436 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
437 VK_QUEUE_FAMILY_IGNORED);
438 }425 }
439 426
440 /* Output */427 /* Update descriptor sets */
441 RET(ff_vk_exec_add_dep_frame(vkctx, exec, out,428 ff_vk_update_descriptor_img_array(vkctx, pl, exec, out, out_views, 0, nb_in,
442 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,429 VK_IMAGE_LAYOUT_GENERAL,
443 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));430 VK_NULL_HANDLE);
444 RET(ff_vk_create_imageviews(vkctx, exec, out_views, out));431 for (int i = 0; i < nb_in; i++)
432 ff_vk_update_descriptor_img_array(vkctx, pl, exec, in[i], in_views[i], 0, i,
433 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
434 sampler);
435
436 /* Bind pipeline, update push data */
437 ff_vk_exec_bind_pipeline(vkctx, exec, pl);
438 if (push_src)
439 ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
440 0, push_size, push_src);
441
442 /* Add data sync barriers */
445 ff_vk_frame_barrier(vkctx, exec, out, img_bar, &nb_img_bar,443 ff_vk_frame_barrier(vkctx, exec, out, img_bar, &nb_img_bar,
446 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,444 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
447 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,445 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
448 VK_ACCESS_SHADER_WRITE_BIT,446 VK_ACCESS_SHADER_WRITE_BIT,
449 VK_IMAGE_LAYOUT_GENERAL,447 VK_IMAGE_LAYOUT_GENERAL,
450 VK_QUEUE_FAMILY_IGNORED);448 VK_QUEUE_FAMILY_IGNORED);
449 for (int i = 0; i < nb_in; i++)
450 ff_vk_frame_barrier(vkctx, exec, in[i], img_bar, &nb_img_bar,
451 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
452 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
453 VK_ACCESS_SHADER_READ_BIT,
454 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
455 VK_QUEUE_FAMILY_IGNORED);
451 456
452 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {457 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
453 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,458 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
@@ -455,21 +460,6 @@ int ff_vk_filter_process_Nin(FFVulkanContext *vkctx, FFVkExecPool *e, · 1 unmodified line
455 .imageMemoryBarrierCount = nb_img_bar,460 .imageMemoryBarrierCount = nb_img_bar,
456 });461 });
457 462
458 ff_vk_exec_bind_pipeline(vkctx, exec, pl);
459
460 if (push_src)
461 ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
462 0, push_size, push_src);
463
464 for (int i = 0; i < nb_in; i++)
465 ff_vk_update_descriptor_img_array(vkctx, pl, exec, in[i], in_views[i], 0, i,
466 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
467 sampler);
468
469 ff_vk_update_descriptor_img_array(vkctx, pl, exec, out, out_views, 0, nb_in,
470 VK_IMAGE_LAYOUT_GENERAL,
471 VK_NULL_HANDLE);
472
473 vk->CmdDispatch(exec->buf,463 vk->CmdDispatch(exec->buf,
474 FFALIGN(vkctx->output_width, pl->wg_size[0])/pl->wg_size[0],464 FFALIGN(vkctx->output_width, pl->wg_size[0])/pl->wg_size[0],
475 FFALIGN(vkctx->output_height, pl->wg_size[1])/pl->wg_size[1],465 FFALIGN(vkctx->output_height, pl->wg_size[1])/pl->wg_size[1],

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t