423 int err = 0, nb_img_bar = 0,
i, is_chroma;
424 int min_quant =
ctx->profile_info->min_quant;
425 int max_quant =
ctx->profile_info->max_quant;
427 int estimate_dim_x =
ctx->alpha_bits ? subgroup_size : (subgroup_size / 3) * 3;
431 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 *
ctx->num_planes + estimate_dim_x - 1) / estimate_dim_x,
582 ctx->force_quant ? 1 : (max_quant - min_quant + 1), 1);
585 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
586 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
587 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
588 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
590 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
591 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
592 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
593 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
594 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
595 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
596 .buffer = slice_score_buf->buf,
598 .size = slice_score_buf->size,
600 .bufferMemoryBarrierCount = 1,
605 frame_size_buf, 0, frame_size_buf->size,
606 VK_FORMAT_UNDEFINED);
608 slice_score_buf, 0, slice_score_buf->size,
609 VK_FORMAT_UNDEFINED);
611 vk->CmdDispatch(exec->buf, 1, 1, 1);
614 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
615 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
616 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
617 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
619 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
620 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
621 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
622 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
623 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
624 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
625 .buffer = frame_size_buf->buf,
627 .size = frame_size_buf->size,
629 .bufferMemoryBarrierCount = 1,
634 .bytestream = pkt_vk_buf->address,
635 .slice_sizes = pd->slice_sizes_ref[picture_idx]->address,
636 .slot_size = pv->slice_slot_size,
639 slice_data_buf, 0, slice_data_buf->size,
640 VK_FORMAT_UNDEFINED);
642 slice_score_buf, 0, slice_score_buf->size,
643 VK_FORMAT_UNDEFINED);
645 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
646 VK_FORMAT_UNDEFINED);
649 VK_SHADER_STAGE_COMPUTE_BIT, 0,
sizeof(encode_info), &encode_info);
650 vk->CmdDispatch(exec->buf,
FFALIGN(
ctx->slices_per_picture, 64) / 64,
655 VkBufferMemoryBarrier2 gather_bar[2] = {
657 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
658 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
659 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
660 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
661 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
662 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
663 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
664 .buffer = pkt_vk_buf->buf,
666 .size = pkt_vk_buf->size,
668 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
669 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
670 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
671 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
672 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
673 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
674 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
675 .buffer = pd->slice_sizes_ref[picture_idx]->buf,
677 .size = pd->slice_sizes_ref[picture_idx]->size,
680 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
681 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
682 .pBufferMemoryBarriers = gather_bar,
683 .bufferMemoryBarrierCount = 2,
687 .sparse = pkt_vk_buf->address,
688 .compacted = pd->gathered_ref[picture_idx]->address +
689 (picture_idx == 0 ? pv->payload_off : 0),
690 .slot_size = pv->slice_slot_size,
693 pd->slice_sizes_ref[picture_idx],
694 0,
ctx->slices_per_picture *
sizeof(uint32_t),
695 VK_FORMAT_UNDEFINED);
698 VK_SHADER_STAGE_COMPUTE_BIT,
699 0,
sizeof(gather_pd), &gather_pd);
700 vk->CmdDispatch(exec->buf,
ctx->slices_per_picture, 1, 1);