162 .name =
"SliceBuffer",
163 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
164 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
168 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
169 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
200 (uint32_t []) { 16, 16, 1 }, 0);
204 .name =
"SliceBuffer",
205 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
206 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
210 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
211 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
232 int dim_x = pv->
ctx.
alpha_bits ? subgroup_size : (subgroup_size / 3) * 3;
245 (uint32_t []) { dim_x, 1, 1 }, 0);
249 .name =
"SliceBuffer",
250 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
251 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
254 .name =
"SliceScores",
255 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
256 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
259 .name =
"ProresDataTables",
260 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
261 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
299 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
300 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
303 .name =
"SliceScores",
304 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
305 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
335 (uint32_t []) { 64, 1, 1 }, 0);
339 .name =
"SliceBuffer",
340 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
341 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
344 .name =
"SliceScores",
345 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
346 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
349 .name =
"ProresDataTables",
350 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
351 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
376 int err = 0, nb_img_bar = 0,
i, is_chroma;
377 int min_quant =
ctx->profile_info->min_quant;
378 int max_quant =
ctx->profile_info->max_quant;
380 int estimate_dim_x =
ctx->alpha_bits ? subgroup_size : (subgroup_size / 3) * 3;
385 FFVkBuffer *pkt_vk_buf, *slice_data_buf, *slice_score_buf, *frame_size_buf;
395 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
396 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
397 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
NULL,
400 : (VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
401 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
402 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)));
408 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
409 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
411 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
417 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
418 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
420 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
426 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
427 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
429 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
430 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
431 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT));
437 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
438 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
441 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
442 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
443 VK_ACCESS_SHADER_READ_BIT,
444 VK_IMAGE_LAYOUT_GENERAL,
445 VK_QUEUE_FAMILY_IGNORED);
448 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
449 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
450 .pImageMemoryBarriers = img_bar,
451 .imageMemoryBarrierCount = nb_img_bar,
458 for (
i = 0;
i <
ctx->num_planes;
i++) {
459 is_chroma = (
i == 1 ||
i == 2);
462 slice_data_info.
plane =
i;
465 slice_data_buf, 0, slice_data_buf->
size,
466 VK_FORMAT_UNDEFINED);
468 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
472 vk->CmdDispatch(exec->
buf,
ctx->slices_width,
ctx->mb_height, 1);
475 slice_data_buf, 0, slice_data_buf->
size,
476 VK_FORMAT_UNDEFINED);
478 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
480 vk->CmdDispatch(exec->
buf,
ctx->mb_width,
ctx->mb_height, 1);
485 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
486 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
487 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
488 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
490 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
491 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
492 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
493 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
494 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
495 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
496 .buffer = slice_data_buf->buf,
498 .size = slice_data_buf->size,
500 .bufferMemoryBarrierCount = 1,
505 slice_data_buf, 0, slice_data_buf->size,
506 VK_FORMAT_UNDEFINED);
508 slice_score_buf, 0, slice_score_buf->size,
509 VK_FORMAT_UNDEFINED);
511 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
512 VK_FORMAT_UNDEFINED);
514 vk->CmdDispatch(exec->buf, (
ctx->slices_per_picture *
ctx->num_planes + estimate_dim_x - 1) / estimate_dim_x,
515 ctx->force_quant ? 1 : (max_quant - min_quant + 1), 1);
518 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
519 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
520 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
521 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
523 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
524 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
525 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
526 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
527 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
528 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
529 .buffer = slice_score_buf->buf,
531 .size = slice_score_buf->size,
533 .bufferMemoryBarrierCount = 1,
538 frame_size_buf, 0, frame_size_buf->size,
539 VK_FORMAT_UNDEFINED);
541 slice_score_buf, 0, slice_score_buf->size,
542 VK_FORMAT_UNDEFINED);
544 vk->CmdDispatch(exec->buf, 1, 1, 1);
547 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
548 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
549 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
550 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
552 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
553 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
554 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
555 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
556 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
557 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
558 .buffer = frame_size_buf->buf,
560 .size = frame_size_buf->size,
562 .bufferMemoryBarrierCount = 1,
567 .seek_table = pkt_vk_buf->address,
568 .bytestream = pkt_vk_buf->address +
ctx->slices_per_picture * 2,
571 slice_data_buf, 0, slice_data_buf->size,
572 VK_FORMAT_UNDEFINED);
574 slice_score_buf, 0, slice_score_buf->size,
575 VK_FORMAT_UNDEFINED);
577 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
578 VK_FORMAT_UNDEFINED);
581 VK_SHADER_STAGE_COMPUTE_BIT, 0,
sizeof(encode_info), &encode_info);
582 vk->CmdDispatch(exec->buf,
FFALIGN(
ctx->slices_per_picture, 64) / 64,
590 uint8_t **orig_buf,
int flags,
600 bytestream_put_be32 (orig_buf,
FRAME_ID);
606 bytestream_put_be16 (&buf,
ctx->chroma_factor !=
CFACTOR_Y422 ||
ctx->alpha_bits ? 1 : 0);
608 bytestream_put_be16 (&buf, avctx->
width);
609 bytestream_put_be16 (&buf, avctx->
height);
611 frame_flags =
ctx->chroma_factor << 6;
614 bytestream_put_byte (&buf, frame_flags);
616 bytestream_put_byte (&buf, 0);
618 bytestream_put_byte (&buf, color_trc);
619 bytestream_put_byte (&buf, colorspace);
620 bytestream_put_byte (&buf,
ctx->alpha_bits >> 3);
621 bytestream_put_byte (&buf, 0);
623 bytestream_put_byte (&buf, 0x03);
627 bytestream_put_byte (&buf, 0x00);
629 bytestream_put_be16 (&
tmp, buf - *orig_buf);
641 uint8_t *orig_buf, *buf, *slice_sizes;
642 uint8_t *picture_size_pos;
643 int picture_idx, err = 0;
645 int pkt_size =
ctx->frame_size_upper_bound;
648 VkMappedMemoryRange invalidate_data;
679 VK_BUFFER_USAGE_TRANSFER_DST_BIT));
685 for (picture_idx = 0; picture_idx <
ctx->pictures_per_frame; picture_idx++) {
691 invalidate_data = (VkMappedMemoryRange) {
692 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
694 .size = VK_WHOLE_SIZE,
696 if (!(frame_size_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
697 invalidate_data.memory = frame_size_buf->
mem;
698 vk->InvalidateMappedMemoryRanges(vkctx->
hwctx->
act_dev, 1, &invalidate_data);
702 picture_size_pos = buf + 1;
703 bytestream_put_byte(&buf, 0x40);
705 bytestream_put_be16(&buf,
ctx->slices_per_picture);
706 bytestream_put_byte(&buf,
av_log2(
ctx->mbs_per_slice) << 4);
710 buf +=
ctx->slices_per_picture * 2;
719 vk->CmdCopyBuffer(transfer_exec->
buf, out_data_buf->
buf, mapped_buf->
buf, 1, & (VkBufferCopy) {
721 .dstOffset = mapped_buf->virtual_offset + slice_sizes - pkt->data,
722 .size = buf - slice_sizes,
726 if (!(out_data_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
727 invalidate_data.memory = out_data_buf->
mem;
728 vk->InvalidateMappedMemoryRanges(vkctx->
hwctx->
act_dev, 1, &invalidate_data);
730 memcpy(slice_sizes, out_data_buf->
mapped_mem, buf - slice_sizes);
735 picture_size = buf - (picture_size_pos - 1);
736 bytestream_put_be32(&picture_size_pos, picture_size);
808 if (
ctx->pictures_per_frame > 1)
913 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
914 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
915 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
916 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
919 for (
i = 0;
i < 64;
i++) {
925 for (
i = 0;
i < 64;
i++) {
935 #define OFFSET(x) offsetof(ProresVulkanContext, x)
936 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
939 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(
ctx.mbs_per_slice),
945 0, 0,
VE, .unit =
"profile" },
947 0, 0,
VE, .unit =
"profile" },
949 0, 0,
VE, .unit =
"profile" },
951 0, 0,
VE, .unit =
"profile" },
953 0, 0,
VE, .unit =
"profile" },
955 0, 0,
VE, .unit =
"profile" },
957 0, 0,
VE, .unit =
"profile" },
958 {
"vendor",
"vendor ID",
OFFSET(
ctx.vendor),
960 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(
ctx.bits_per_mb),
965 0, 0,
VE, .unit =
"quant_mat" },
967 0, 0,
VE, .unit =
"quant_mat" },
969 0, 0,
VE, .unit =
"quant_mat" },
971 0, 0,
VE, .unit =
"quant_mat" },
973 0, 0,
VE, .unit =
"quant_mat" },
975 0, 0,
VE, .unit =
"quant_mat" },
977 { .i64 = 16 }, 0, 16,
VE },
979 { .i64 = 1 }, 1, INT_MAX,
VE },
997 .
p.
name =
"prores_ks_vulkan",