40 #define RGB_LINECACHE 4
188 AVFrame *enc_in, VkImageView *enc_in_views,
189 FFVkBuffer *slice_data_buf, uint32_t slice_data_size,
200 0, slice_data_size*
f->slice_count,
201 VK_FORMAT_UNDEFINED);
203 enc_in, enc_in_views,
205 VK_IMAGE_LAYOUT_GENERAL,
210 VK_SHADER_STAGE_COMPUTE_BIT,
219 AVFrame *enc_in, VkImageView *enc_in_views,
229 enc_in, enc_in_views,
231 VK_IMAGE_LAYOUT_GENERAL,
236 0, fltmap_size*
f->slice_count,
237 VK_FORMAT_UNDEFINED);
241 VK_SHADER_STAGE_COMPUTE_BIT,
250 AVFrame *enc_in, VkImageView *enc_in_views,
260 enc_in, enc_in_views,
262 VK_IMAGE_LAYOUT_GENERAL,
267 0, units_size*
f->slice_count,
268 VK_FORMAT_UNDEFINED);
272 VK_SHADER_STAGE_COMPUTE_BIT,
293 uint32_t plane_state_size;
294 uint32_t slice_state_size;
295 uint32_t slice_data_size;
299 uint32_t remap_data_size = 0;
307 int has_inter = avctx->
gop_size > 1;
308 uint32_t context_count =
f->context_count[
f->context_model];
310 VkImageMemoryBarrier2 img_bar[37];
312 VkBufferMemoryBarrier2 buf_bar[8];
316 f->cur_enc_frame = pict;
325 f->slice_count =
f->max_slice_count;
329 plane_state_size = 8;
333 plane_state_size *= context_count;
334 slice_state_size = plane_state_size*
f->plane_count;
336 slice_data_size = 256;
337 slice_state_size += slice_data_size;
338 slice_state_size =
FFALIGN(slice_state_size, 8);
343 if (!slice_data_buf) {
346 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
347 NULL, slice_state_size*
f->slice_count,
348 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
361 remap_data_size = 4*(1 <<
desc->comp[0].depth)*
sizeof(uint32_t);
366 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
367 NULL, remap_data_size*
f->slice_count,
368 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
378 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
379 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
381 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
387 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
388 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
389 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
391 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
396 VK_BUFFER_USAGE_TRANSFER_DST_BIT,
398 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
425 .plane_state_size = plane_state_size,
426 .key_frame =
f->key_frame,
428 .micro_version =
f->micro_version,
436 .slice_size_max = (out_data_buf->
size /
f->slice_count) & ~(
size_t)15,
440 for (
int i = 0;
i <
f->quant_table_count;
i++) {
443 f->quant_tables[
i][4][127];
450 memcpy(pd.
fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
469 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
470 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
473 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
474 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
479 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
480 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
481 VK_ACCESS_SHADER_READ_BIT,
482 VK_IMAGE_LAYOUT_GENERAL,
483 VK_QUEUE_FAMILY_IGNORED);
485 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
486 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
487 .pImageMemoryBarriers = img_bar,
488 .imageMemoryBarrierCount = nb_img_bar,
496 slice_data_buf, slice_data_size, &pd));
500 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
501 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
502 0, slice_data_size*
f->slice_count);
508 remap_data_buf, remap_data_size, &pd));
511 remap_data_buf, remap_data_size, &pd));
516 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
517 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
518 0, remap_data_size*
f->slice_count);
522 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
523 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
524 .pBufferMemoryBarriers = buf_bar,
525 .bufferMemoryBarrierCount = nb_buf_bar,
534 0, slice_data_size*
f->slice_count,
535 VK_FORMAT_UNDEFINED);
540 0, remap_data_size*
f->slice_count,
541 VK_FORMAT_UNDEFINED);
545 VK_SHADER_STAGE_COMPUTE_BIT,
553 vkf->
layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
554 vkf->
access[0] = VK_ACCESS_2_NONE;
561 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
562 VK_PIPELINE_STAGE_2_CLEAR_BIT,
563 VK_ACCESS_2_TRANSFER_WRITE_BIT,
564 VK_IMAGE_LAYOUT_GENERAL,
565 VK_QUEUE_FAMILY_IGNORED);
566 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
567 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
568 .pImageMemoryBarriers = img_bar,
569 .imageMemoryBarrierCount = nb_img_bar,
573 vk->CmdClearColorImage(exec->
buf, vkf->
img[0], VK_IMAGE_LAYOUT_GENERAL,
574 &((VkClearColorValue) { 0 }),
575 1, &((VkImageSubresourceRange) {
576 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
587 0, slice_data_size*
f->slice_count,
588 VK_FORMAT_UNDEFINED);
594 VK_FORMAT_UNDEFINED);
598 VK_SHADER_STAGE_COMPUTE_BIT,
607 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
608 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
609 0, slice_data_size*
f->slice_count);
615 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
616 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
617 0, remap_data_size*
f->slice_count);
620 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
621 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
622 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
625 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
626 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
627 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
630 fv->
optimize_rct ? VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT :
631 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
632 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
633 VK_ACCESS_SHADER_READ_BIT,
634 VK_IMAGE_LAYOUT_GENERAL,
635 VK_QUEUE_FAMILY_IGNORED);
639 VK_PIPELINE_STAGE_2_CLEAR_BIT,
640 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
641 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
642 VK_IMAGE_LAYOUT_GENERAL,
643 VK_QUEUE_FAMILY_IGNORED);
645 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
646 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
647 .pImageMemoryBarriers = img_bar,
648 .imageMemoryBarrierCount = nb_img_bar,
649 .pBufferMemoryBarriers = buf_bar,
650 .bufferMemoryBarrierCount = nb_buf_bar,
659 0, slice_data_size*
f->slice_count,
660 VK_FORMAT_UNDEFINED);
664 fd->
idx*
f->max_slice_count*
sizeof(uint32_t),
665 f->slice_count*
sizeof(uint32_t),
666 VK_FORMAT_UNDEFINED);
672 VK_FORMAT_UNDEFINED);
676 VK_IMAGE_LAYOUT_GENERAL,
682 VK_IMAGE_LAYOUT_GENERAL,
688 0, remap_data_size*
f->slice_count,
689 VK_FORMAT_UNDEFINED);
693 VK_SHADER_STAGE_COMPUTE_BIT,
701 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
702 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
705 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
706 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
708 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
709 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
710 .pBufferMemoryBarriers = buf_bar,
711 .bufferMemoryBarrierCount = nb_buf_bar,
717 .compacted = gathered_buf->
address,
718 .slot_size = (uint32_t)((out_data_buf->
size /
f->slice_count) & ~(size_t)15),
722 fd->
idx*
f->max_slice_count*
sizeof(uint32_t),
723 f->slice_count*
sizeof(uint32_t),
724 VK_FORMAT_UNDEFINED);
727 VK_SHADER_STAGE_COMPUTE_BIT,
728 0,
sizeof(gather_pd), &gather_pd);
729 vk->CmdDispatch(exec->
buf,
f->slice_count, 1, 1);
735 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
736 TRANSFER_BIT, TRANSFER_READ_BIT, NONE_KHR,
738 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
739 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
740 .pBufferMemoryBarriers = buf_bar,
741 .bufferMemoryBarrierCount = nb_buf_bar,
745 vk->CmdCopyBuffer(exec->
buf, gathered_buf->
buf, compacted_buf->
buf,
746 1, &(VkBufferCopy) { .size = maxsize });
792 uint32_t rb_off = fd->
idx*
f->max_slice_count*
sizeof(uint32_t);
794 VkMappedMemoryRange invalidate_data = {
795 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
798 .size =
f->slice_count*
sizeof(uint32_t),
801 1, &invalidate_data);
807 for (
int i = 0;
i <
f->slice_count;
i++) {
808 uint32_t sl_len =
AV_RN32(rb +
i*4);
815 if (!(compacted_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
816 VkMappedMemoryRange invalidate_data = {
817 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
818 .memory = compacted_buf->
mem,
820 .size = VK_WHOLE_SIZE,
823 1, &invalidate_data);
926 vk_frames = frames_ctx->
hwctx;
927 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
928 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
929 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
930 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
950 (uint32_t []) { 32, 32, 1 }, 0);
953 VK_SHADER_STAGE_COMPUTE_BIT);
957 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
958 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
965 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
966 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
969 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
970 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
994 (uint32_t []) { wg_x, 1, 1 }, 0);
997 VK_SHADER_STAGE_COMPUTE_BIT);
1001 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1002 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1009 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1010 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1013 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1014 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1018 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1019 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1041 (uint32_t []) { 32, 32, 1 }, 0);
1044 VK_SHADER_STAGE_COMPUTE_BIT);
1048 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1049 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1056 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1057 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1060 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1061 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1065 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1066 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1088 (uint32_t []) { 1, 1, 1 }, 0);
1091 VK_SHADER_STAGE_COMPUTE_BIT);
1095 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1096 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1103 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1104 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1107 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1108 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1129 int wg_dim =
FFMIN(fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0], 1024);
1132 (uint32_t []) { wg_dim, 1, 1 }, 0);
1135 VK_SHADER_STAGE_COMPUTE_BIT);
1139 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1140 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1147 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1148 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1151 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1152 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1181 (uint32_t []) { wg_x, 1, 1 }, 0);
1184 VK_SHADER_STAGE_COMPUTE_BIT);
1188 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1189 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1192 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1193 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1196 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1197 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1204 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1205 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1208 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1209 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1212 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1213 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1216 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1217 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1221 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1222 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1225 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1226 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1230 4 + fv->
is_rgb + !!
f->remap_mode, 0);
1241 }
else if (
f->remap_mode) {
1283 (uint32_t []) { 256, 1, 1 }, 0);
1286 VK_SHADER_STAGE_COMPUTE_BIT);
1290 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1291 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1325 f->version =
f->bayer ? 4 : 3;
1332 if (
f->bits_per_raw_sample > (
f->version > 3 ? 16 : 8)) {
1335 "forcing range coder\n");
1340 if (
f->version < 4 && avctx->
gop_size > 1) {
1351 if (
f->version == 4)
1352 f->micro_version =
f->bayer ? 10 : (
f->remap_mode ? 9 : 3);
1357 if (
f->num_h_slices <= 0 &&
f->num_v_slices <= 0) {
1363 f->num_h_slices = 32;
1364 f->num_v_slices = 32;
1366 }
else if (
f->num_h_slices &&
f->num_v_slices <= 0) {
1368 }
else if (
f->num_v_slices &&
f->num_h_slices <= 0) {
1372 f->num_h_slices =
FFMIN(
f->num_h_slices, avctx->
width);
1377 "by the standard is %i\n",
1382 f->max_slice_count =
f->num_h_slices *
f->num_v_slices;
1387 if (
f->version < 4) {
1388 if (((
f->chroma_h_shift > 0) && (avctx->
width % (64 <<
f->chroma_h_shift))) ||
1389 ((
f->chroma_v_shift > 0) && (avctx->
height % (64 <<
f->chroma_v_shift)))) {
1391 "dimensions is only supported in version 4 (-level 4)\n");
1397 if (
f->version < 4) {
1418 if (maxsize > fv->
s.
props_11.maxMemoryAllocationSize) {
1420 "than maximum device allocation (%"PRIu64
"), clipping\n",
1421 maxsize, fv->
s.
props_11.maxMemoryAllocationSize);
1422 maxsize = fv->
s.
props_11.maxMemoryAllocationSize;
1425 av_log(avctx,
AV_LOG_INFO,
"Async buffers: %zuMiB per context, %zuMiB total, depth: %i\n",
1426 2*maxsize / (1024*1024),
1448 uint32_t mw = (avctx->
width +
f->num_h_slices - 1) /
f->num_h_slices;
1449 uint32_t
mh = (avctx->
height +
f->num_v_slices - 1) /
f->num_v_slices;
1452 uint32_t pn = mw*
mh;
1480 if (
f->remap_mode) {
1520 &fv->
setup, 0, 0, 0,
1522 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
1523 VK_FORMAT_UNDEFINED));
1529 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
1530 VK_FORMAT_UNDEFINED));
1534 256*
sizeof(uint32_t) + 512*
sizeof(uint8_t),
1536 VK_FORMAT_UNDEFINED));
1540 0, 256*
sizeof(uint32_t),
1541 VK_FORMAT_UNDEFINED));
1560 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
1561 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1562 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
1613 #define OFFSET(x) offsetof(VulkanEncodeFFv1Context, x)
1614 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1617 { .i64 = -1 }, -1, 2,
VE },
1619 { .i64 = 0 }, 0, 1,
VE },
1629 { .i64 = -1 }, -1, 2,
VE , .unit =
"qtable"},
1633 { .i64 =
QTABLE_8BIT }, INT_MIN, INT_MAX,
VE, .unit =
"qtable" },
1643 { .i64 = 0 }, 0, 1,
VE },
1645 {
"rct_search",
"Run a search for RCT parameters (level 4 only)",
OFFSET(optimize_rct),
AV_OPT_TYPE_BOOL,
1646 { .i64 = 1 }, 0, 1,
VE },
1649 { .i64 = 1 }, 1, INT_MAX,
VE },
1652 { .i64 = -1 }, -1, 2,
VE, .unit =
"remap_mode" },
1654 { .i64 = -1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1656 { .i64 = 0 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1658 { .i64 = 1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1660 { .i64 = 2 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1683 .
p.
name =
"ffv1_vulkan",
1701 .p.wrapper_name =
"vulkan",