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;
441 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
442 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
444 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
451 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
452 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
453 ctx->slices_per_picture *
sizeof(uint32_t),
454 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
455 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
456 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT));
463 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
464 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
467 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
473 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
474 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
476 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
482 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
483 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
485 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
491 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
492 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
494 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
495 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
496 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT));
502 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
503 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
506 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
507 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
508 VK_ACCESS_SHADER_READ_BIT,
509 VK_IMAGE_LAYOUT_GENERAL,
510 VK_QUEUE_FAMILY_IGNORED);
513 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
514 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
515 .pImageMemoryBarriers = img_bar,
516 .imageMemoryBarrierCount = nb_img_bar,
523 for (
i = 0;
i <
ctx->num_planes;
i++) {
524 is_chroma = (
i == 1 ||
i == 2);
527 slice_data_info.
plane =
i;
530 slice_data_buf, 0, slice_data_buf->
size,
531 VK_FORMAT_UNDEFINED);
533 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
537 vk->CmdDispatch(exec->
buf,
ctx->slices_width,
ctx->mb_height, 1);
540 slice_data_buf, 0, slice_data_buf->
size,
541 VK_FORMAT_UNDEFINED);
543 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
545 vk->CmdDispatch(exec->
buf,
ctx->mb_width,
ctx->mb_height, 1);
550 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
551 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
552 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
553 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
555 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
556 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
557 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
558 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
559 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
560 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
561 .buffer = slice_data_buf->buf,
563 .size = slice_data_buf->size,
565 .bufferMemoryBarrierCount = 1,
570 slice_data_buf, 0, slice_data_buf->size,
571 VK_FORMAT_UNDEFINED);
573 slice_score_buf, 0, slice_score_buf->size,
574 VK_FORMAT_UNDEFINED);
576 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
577 VK_FORMAT_UNDEFINED);
579 vk->CmdDispatch(exec->buf, (
ctx->slices_per_picture *
ctx->num_planes + estimate_dim_x - 1) / estimate_dim_x,
580 ctx->force_quant ? 1 : (max_quant - min_quant + 1), 1);
583 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
584 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
585 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
586 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
588 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
589 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
590 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
591 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
592 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
593 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
594 .buffer = slice_score_buf->buf,
596 .size = slice_score_buf->size,
598 .bufferMemoryBarrierCount = 1,
603 frame_size_buf, 0, frame_size_buf->size,
604 VK_FORMAT_UNDEFINED);
606 slice_score_buf, 0, slice_score_buf->size,
607 VK_FORMAT_UNDEFINED);
609 vk->CmdDispatch(exec->buf, 1, 1, 1);
612 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
613 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
614 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
615 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
617 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
618 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
619 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
620 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
621 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
622 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
623 .buffer = frame_size_buf->buf,
625 .size = frame_size_buf->size,
627 .bufferMemoryBarrierCount = 1,
632 .bytestream = pkt_vk_buf->address,
633 .slice_sizes = pd->slice_sizes_ref[picture_idx]->address,
634 .slot_size = pv->slice_slot_size,
637 slice_data_buf, 0, slice_data_buf->size,
638 VK_FORMAT_UNDEFINED);
640 slice_score_buf, 0, slice_score_buf->size,
641 VK_FORMAT_UNDEFINED);
643 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
644 VK_FORMAT_UNDEFINED);
647 VK_SHADER_STAGE_COMPUTE_BIT, 0,
sizeof(encode_info), &encode_info);
648 vk->CmdDispatch(exec->buf,
FFALIGN(
ctx->slices_per_picture, 64) / 64,
653 VkBufferMemoryBarrier2 gather_bar[2] = {
655 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
656 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
657 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
658 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
659 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
660 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
661 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
662 .buffer = pkt_vk_buf->buf,
664 .size = pkt_vk_buf->size,
666 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
667 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
668 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
669 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
670 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
671 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
672 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
673 .buffer = pd->slice_sizes_ref[picture_idx]->buf,
675 .size = pd->slice_sizes_ref[picture_idx]->size,
678 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
679 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
680 .pBufferMemoryBarriers = gather_bar,
681 .bufferMemoryBarrierCount = 2,
685 .sparse = pkt_vk_buf->address,
686 .compacted = pd->gathered_ref[picture_idx]->address +
687 (picture_idx == 0 ? pv->payload_off : 0),
688 .slot_size = pv->slice_slot_size,
691 pd->slice_sizes_ref[picture_idx],
692 0,
ctx->slices_per_picture *
sizeof(uint32_t),
693 VK_FORMAT_UNDEFINED);
696 VK_SHADER_STAGE_COMPUTE_BIT,
697 0,
sizeof(gather_pd), &gather_pd);
698 vk->CmdDispatch(exec->buf,
ctx->slices_per_picture, 1, 1);