430 int err = 0, nb_img_bar = 0,
i, is_chroma;
431 int min_quant =
ctx->profile_info->min_quant;
432 int max_quant =
ctx->profile_info->max_quant;
436 FFVkBuffer *pkt_vk_buf, *slice_data_buf, *slice_score_buf, *frame_size_buf;
443 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
444 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
446 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
453 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
454 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
455 ctx->slices_per_picture *
sizeof(uint32_t),
456 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
457 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
458 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT));
465 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
466 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
469 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
475 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
476 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
478 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
484 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
485 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
487 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
493 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
494 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
496 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
497 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
498 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT));
504 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
505 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
508 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
509 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
510 VK_ACCESS_SHADER_READ_BIT,
511 VK_IMAGE_LAYOUT_GENERAL,
512 VK_QUEUE_FAMILY_IGNORED);
515 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
516 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
517 .pImageMemoryBarriers = img_bar,
518 .imageMemoryBarrierCount = nb_img_bar,
525 for (
i = 0;
i <
ctx->num_planes;
i++) {
526 is_chroma = (
i == 1 ||
i == 2);
529 slice_data_info.
plane =
i;
532 slice_data_buf, 0, slice_data_buf->
size,
533 VK_FORMAT_UNDEFINED);
535 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
539 vk->CmdDispatch(exec->
buf,
ctx->slices_width,
ctx->mb_height, 1);
542 slice_data_buf, 0, slice_data_buf->
size,
543 VK_FORMAT_UNDEFINED);
545 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
547 vk->CmdDispatch(exec->
buf,
ctx->mb_width,
ctx->mb_height, 1);
552 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
553 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
554 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
555 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
557 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
558 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
559 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
560 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
561 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
562 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
563 .buffer = slice_data_buf->buf,
565 .size = slice_data_buf->size,
567 .bufferMemoryBarrierCount = 1,
572 slice_data_buf, 0, slice_data_buf->size,
573 VK_FORMAT_UNDEFINED);
575 slice_score_buf, 0, slice_score_buf->size,
576 VK_FORMAT_UNDEFINED);
578 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
579 VK_FORMAT_UNDEFINED);
581 vk->CmdDispatch(exec->buf, (
ctx->slices_per_picture + pv->estimate_slices_per_wg - 1) /
582 pv->estimate_slices_per_wg,
583 ctx->force_quant ? 1 : (max_quant - min_quant + 1), 1);
586 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
587 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
588 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
589 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
591 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
592 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
593 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
594 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
595 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
596 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
597 .buffer = slice_score_buf->buf,
599 .size = slice_score_buf->size,
601 .bufferMemoryBarrierCount = 1,
606 frame_size_buf, 0, frame_size_buf->size,
607 VK_FORMAT_UNDEFINED);
609 slice_score_buf, 0, slice_score_buf->size,
610 VK_FORMAT_UNDEFINED);
612 vk->CmdDispatch(exec->buf, 1, 1, 1);
615 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
616 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
617 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
618 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
620 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
621 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
622 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
623 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
624 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
625 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
626 .buffer = frame_size_buf->buf,
628 .size = frame_size_buf->size,
630 .bufferMemoryBarrierCount = 1,
635 .bytestream = pkt_vk_buf->address,
636 .slice_sizes = pd->slice_sizes_ref[picture_idx]->address,
637 .slot_size = pv->slice_slot_size,
640 slice_data_buf, 0, slice_data_buf->size,
641 VK_FORMAT_UNDEFINED);
643 slice_score_buf, 0, slice_score_buf->size,
644 VK_FORMAT_UNDEFINED);
646 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
647 VK_FORMAT_UNDEFINED);
650 VK_SHADER_STAGE_COMPUTE_BIT, 0,
sizeof(encode_info), &encode_info);
651 vk->CmdDispatch(exec->buf,
FFALIGN(
ctx->slices_per_picture, 64) / 64,
656 VkBufferMemoryBarrier2 gather_bar[2] = {
658 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
659 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
660 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
661 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
662 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
663 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
664 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
665 .buffer = pkt_vk_buf->buf,
667 .size = pkt_vk_buf->size,
669 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
670 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
671 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
672 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
673 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
674 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
675 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
676 .buffer = pd->slice_sizes_ref[picture_idx]->buf,
678 .size = pd->slice_sizes_ref[picture_idx]->size,
681 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
682 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
683 .pBufferMemoryBarriers = gather_bar,
684 .bufferMemoryBarrierCount = 2,
688 .sparse = pkt_vk_buf->address,
689 .compacted = pd->gathered_ref[picture_idx]->address +
690 (picture_idx == 0 ? pv->payload_off : 0),
691 .slot_size = pv->slice_slot_size,
694 pd->slice_sizes_ref[picture_idx],
695 0,
ctx->slices_per_picture *
sizeof(uint32_t),
696 VK_FORMAT_UNDEFINED);
699 VK_SHADER_STAGE_COMPUTE_BIT,
700 0,
sizeof(gather_pd), &gather_pd);
701 vk->CmdDispatch(exec->buf,
ctx->slices_per_picture, 1, 1);