161 .name =
"SliceBuffer",
162 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
163 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
167 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
168 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
199 (uint32_t []) { 16, 16, 1 }, 0);
203 .name =
"SliceBuffer",
204 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
205 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
209 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
210 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
231 int dim_x = pv->
ctx.
alpha_bits ? subgroup_size : (subgroup_size / 3) * 3;
244 (uint32_t []) { dim_x, 1, 1 }, 0);
248 .name =
"SliceBuffer",
249 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
250 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
253 .name =
"SliceScores",
254 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
255 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
258 .name =
"ProresDataTables",
259 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
260 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
298 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
299 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
302 .name =
"SliceScores",
303 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
304 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
334 (uint32_t []) { 64, 1, 1 }, 0);
338 .name =
"SliceBuffer",
339 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
340 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
343 .name =
"SliceScores",
344 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
345 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
348 .name =
"ProresDataTables",
349 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
350 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
375 int err = 0, nb_img_bar = 0,
i, is_chroma;
376 int min_quant =
ctx->profile_info->min_quant;
377 int max_quant =
ctx->profile_info->max_quant;
379 int estimate_dim_x =
ctx->alpha_bits ? subgroup_size : (subgroup_size / 3) * 3;
384 FFVkBuffer *pkt_vk_buf, *slice_data_buf, *slice_score_buf, *frame_size_buf;
394 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
395 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
396 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
NULL,
398 transfer_slices ? VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
399 : (VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
400 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
401 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)));
407 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
408 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
410 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
416 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
417 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
419 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
425 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
426 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
NULL,
428 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
429 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
430 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT));
436 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
437 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
440 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
441 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
442 VK_ACCESS_SHADER_READ_BIT,
443 VK_IMAGE_LAYOUT_GENERAL,
444 VK_QUEUE_FAMILY_IGNORED);
447 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
448 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
449 .pImageMemoryBarriers = img_bar,
450 .imageMemoryBarrierCount = nb_img_bar,
457 for (
i = 0;
i <
ctx->num_planes;
i++) {
458 is_chroma = (
i == 1 ||
i == 2);
461 slice_data_info.
plane =
i;
464 slice_data_buf, 0, slice_data_buf->
size,
465 VK_FORMAT_UNDEFINED);
467 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
471 vk->CmdDispatch(exec->
buf,
ctx->slices_width,
ctx->mb_height, 1);
474 slice_data_buf, 0, slice_data_buf->
size,
475 VK_FORMAT_UNDEFINED);
477 VK_IMAGE_LAYOUT_GENERAL, VK_NULL_HANDLE);
479 vk->CmdDispatch(exec->
buf,
ctx->mb_width,
ctx->mb_height, 1);
484 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
485 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
486 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
487 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
489 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
490 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
491 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
492 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT,
493 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
494 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
495 .buffer = slice_data_buf->buf,
497 .size = slice_data_buf->size,
499 .bufferMemoryBarrierCount = 1,
504 slice_data_buf, 0, slice_data_buf->size,
505 VK_FORMAT_UNDEFINED);
507 slice_score_buf, 0, slice_score_buf->size,
508 VK_FORMAT_UNDEFINED);
510 &pv->prores_data_tables_buf, 0, pv->prores_data_tables_buf.size,
511 VK_FORMAT_UNDEFINED);
513 vk->CmdDispatch(exec->buf, (
ctx->slices_per_picture *
ctx->num_planes + estimate_dim_x - 1) / estimate_dim_x,
514 ctx->force_quant ? 1 : (max_quant - min_quant + 1), 1);
517 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
518 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
519 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
520 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
522 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
523 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
524 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
525 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
526 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
527 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
528 .buffer = slice_score_buf->buf,
530 .size = slice_score_buf->size,
532 .bufferMemoryBarrierCount = 1,
537 frame_size_buf, 0, frame_size_buf->size,
538 VK_FORMAT_UNDEFINED);
540 slice_score_buf, 0, slice_score_buf->size,
541 VK_FORMAT_UNDEFINED);
543 vk->CmdDispatch(exec->buf, 1, 1, 1);
546 vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
547 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
548 .pBufferMemoryBarriers = & (VkBufferMemoryBarrier2) {
549 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
551 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
552 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
553 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
554 .dstAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT | VK_ACCESS_2_SHADER_READ_BIT,
555 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
556 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
557 .buffer = frame_size_buf->buf,
559 .size = frame_size_buf->size,
561 .bufferMemoryBarrierCount = 1,
566 .seek_table = pkt_vk_buf->address,
567 .bytestream = pkt_vk_buf->address +
ctx->slices_per_picture * 2,
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);
580 VK_SHADER_STAGE_COMPUTE_BIT, 0,
sizeof(encode_info), &encode_info);
581 vk->CmdDispatch(exec->buf,
FFALIGN(
ctx->slices_per_picture, 64) / 64,
589 uint8_t **orig_buf,
int flags,
599 bytestream_put_be32 (orig_buf,
FRAME_ID);
605 bytestream_put_be16 (&buf,
ctx->chroma_factor !=
CFACTOR_Y422 ||
ctx->alpha_bits ? 1 : 0);
607 bytestream_put_be16 (&buf, avctx->
width);
608 bytestream_put_be16 (&buf, avctx->
height);
610 frame_flags =
ctx->chroma_factor << 6;
613 bytestream_put_byte (&buf, frame_flags);
615 bytestream_put_byte (&buf, 0);
617 bytestream_put_byte (&buf, color_trc);
618 bytestream_put_byte (&buf, colorspace);
619 bytestream_put_byte (&buf,
ctx->alpha_bits >> 3);
620 bytestream_put_byte (&buf, 0);
622 bytestream_put_byte (&buf, 0x03);
626 bytestream_put_byte (&buf, 0x00);
628 bytestream_put_be16 (&
tmp, buf - *orig_buf);
640 uint8_t *orig_buf, *buf, *slice_sizes;
641 uint8_t *picture_size_pos;
642 int picture_idx, err = 0;
644 int pkt_size =
ctx->frame_size_upper_bound;
647 VkMappedMemoryRange invalidate_data;
676 if (transfer_slices) {
678 VK_BUFFER_USAGE_TRANSFER_DST_BIT));
684 for (picture_idx = 0; picture_idx <
ctx->pictures_per_frame; picture_idx++) {
690 invalidate_data = (VkMappedMemoryRange) {
691 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
693 .size = VK_WHOLE_SIZE,
695 if (!(frame_size_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
696 invalidate_data.memory = frame_size_buf->
mem;
697 vk->InvalidateMappedMemoryRanges(vkctx->
hwctx->
act_dev, 1, &invalidate_data);
701 picture_size_pos = buf + 1;
702 bytestream_put_byte(&buf, 0x40);
704 bytestream_put_be16(&buf,
ctx->slices_per_picture);
705 bytestream_put_byte(&buf,
av_log2(
ctx->mbs_per_slice) << 4);
709 buf +=
ctx->slices_per_picture * 2;
714 if (transfer_slices) {
718 vk->CmdCopyBuffer(transfer_exec->
buf, out_data_buf->
buf, mapped_buf->
buf, 1, & (VkBufferCopy) {
720 .dstOffset = mapped_buf->virtual_offset + slice_sizes - pkt->data,
721 .size = buf - slice_sizes,
725 if (!(out_data_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
726 invalidate_data.memory = out_data_buf->
mem;
727 vk->InvalidateMappedMemoryRanges(vkctx->
hwctx->
act_dev, 1, &invalidate_data);
729 memcpy(slice_sizes, out_data_buf->
mapped_mem, buf - slice_sizes);
734 picture_size = buf - (picture_size_pos - 1);
735 bytestream_put_be32(&picture_size_pos, picture_size);
752 if (transfer_slices) {
807 if (
ctx->pictures_per_frame > 1)
912 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
913 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
914 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
915 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
918 for (
i = 0;
i < 64;
i++) {
924 for (
i = 0;
i < 64;
i++) {
934 #define OFFSET(x) offsetof(ProresVulkanContext, x)
935 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
938 {
"mbs_per_slice",
"macroblocks per slice",
OFFSET(
ctx.mbs_per_slice),
944 0, 0,
VE, .unit =
"profile" },
946 0, 0,
VE, .unit =
"profile" },
948 0, 0,
VE, .unit =
"profile" },
950 0, 0,
VE, .unit =
"profile" },
952 0, 0,
VE, .unit =
"profile" },
954 0, 0,
VE, .unit =
"profile" },
956 0, 0,
VE, .unit =
"profile" },
957 {
"vendor",
"vendor ID",
OFFSET(
ctx.vendor),
959 {
"bits_per_mb",
"desired bits per macroblock",
OFFSET(
ctx.bits_per_mb),
964 0, 0,
VE, .unit =
"quant_mat" },
966 0, 0,
VE, .unit =
"quant_mat" },
968 0, 0,
VE, .unit =
"quant_mat" },
970 0, 0,
VE, .unit =
"quant_mat" },
972 0, 0,
VE, .unit =
"quant_mat" },
974 0, 0,
VE, .unit =
"quant_mat" },
976 { .i64 = 16 }, 0, 16,
VE },
978 { .i64 = 1 }, 1, INT_MAX,
VE },
996 .
p.
name =
"prores_ks_vulkan",