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,
294 uint32_t plane_state_size;
295 uint32_t slice_state_size;
296 uint32_t slice_data_size;
301 uint32_t remap_data_size = 0;
310 int has_inter = avctx->
gop_size > 1;
311 uint32_t context_count =
f->context_count[
f->context_model];
313 VkImageMemoryBarrier2 img_bar[37];
315 VkBufferMemoryBarrier2 buf_bar[8];
319 f->cur_enc_frame = pict;
328 f->slice_count =
f->max_slice_count;
332 plane_state_size = 8;
336 plane_state_size *= context_count;
337 slice_state_size = plane_state_size*
f->plane_count;
339 slice_data_size = 256;
340 slice_state_size += slice_data_size;
341 slice_state_size =
FFALIGN(slice_state_size, 8);
345 if (!slice_data_ref) {
348 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
349 NULL, slice_state_size*
f->slice_count,
350 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
364 remap_data_size = 4*(1 <<
desc->comp[0].depth)*
sizeof(uint32_t);
369 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
370 NULL, remap_data_size*
f->slice_count,
371 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
382 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
383 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
385 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
391 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
392 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
393 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
395 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
401 VK_BUFFER_USAGE_TRANSFER_DST_BIT,
403 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
430 .plane_state_size = plane_state_size,
431 .key_frame =
f->key_frame,
433 .micro_version =
f->micro_version,
441 .slice_size_max = (out_data_buf->
size /
f->slice_count) & ~(
size_t)15,
445 for (
int i = 0;
i <
f->quant_table_count;
i++) {
448 f->quant_tables[
i][4][127];
455 memcpy(pd.
fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
477 remap_data_ref =
NULL;
481 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
482 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
485 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
486 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
491 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
492 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
493 VK_ACCESS_SHADER_READ_BIT,
494 VK_IMAGE_LAYOUT_GENERAL,
495 VK_QUEUE_FAMILY_IGNORED);
497 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
498 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
499 .pImageMemoryBarriers = img_bar,
500 .imageMemoryBarrierCount = nb_img_bar,
508 slice_data_buf, slice_data_size, &pd));
512 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
513 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
514 0, slice_data_size*
f->slice_count);
520 remap_data_buf, remap_data_size, &pd));
523 remap_data_buf, remap_data_size, &pd));
528 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
529 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
530 0, remap_data_size*
f->slice_count);
534 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
535 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
536 .pBufferMemoryBarriers = buf_bar,
537 .bufferMemoryBarrierCount = nb_buf_bar,
546 0, slice_data_size*
f->slice_count,
547 VK_FORMAT_UNDEFINED);
552 0, remap_data_size*
f->slice_count,
553 VK_FORMAT_UNDEFINED);
557 VK_SHADER_STAGE_COMPUTE_BIT,
565 vkf->
layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
566 vkf->
access[0] = VK_ACCESS_2_NONE;
573 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
574 VK_PIPELINE_STAGE_2_CLEAR_BIT,
575 VK_ACCESS_2_TRANSFER_WRITE_BIT,
576 VK_IMAGE_LAYOUT_GENERAL,
577 VK_QUEUE_FAMILY_IGNORED);
578 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
579 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
580 .pImageMemoryBarriers = img_bar,
581 .imageMemoryBarrierCount = nb_img_bar,
585 vk->CmdClearColorImage(exec->
buf, vkf->
img[0], VK_IMAGE_LAYOUT_GENERAL,
586 &((VkClearColorValue) { 0 }),
587 1, &((VkImageSubresourceRange) {
588 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
599 0, slice_data_size*
f->slice_count,
600 VK_FORMAT_UNDEFINED);
606 VK_FORMAT_UNDEFINED);
610 VK_SHADER_STAGE_COMPUTE_BIT,
619 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
620 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
621 0, slice_data_size*
f->slice_count);
627 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
628 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
629 0, remap_data_size*
f->slice_count);
632 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
633 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
634 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
637 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
638 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
639 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
642 fv->
optimize_rct ? VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT :
643 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
644 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
645 VK_ACCESS_SHADER_READ_BIT,
646 VK_IMAGE_LAYOUT_GENERAL,
647 VK_QUEUE_FAMILY_IGNORED);
651 VK_PIPELINE_STAGE_2_CLEAR_BIT,
652 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
653 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
654 VK_IMAGE_LAYOUT_GENERAL,
655 VK_QUEUE_FAMILY_IGNORED);
657 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
658 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
659 .pImageMemoryBarriers = img_bar,
660 .imageMemoryBarrierCount = nb_img_bar,
661 .pBufferMemoryBarriers = buf_bar,
662 .bufferMemoryBarrierCount = nb_buf_bar,
671 0, slice_data_size*
f->slice_count,
672 VK_FORMAT_UNDEFINED);
676 fd->
idx*
f->max_slice_count*
sizeof(uint32_t),
677 f->slice_count*
sizeof(uint32_t),
678 VK_FORMAT_UNDEFINED);
684 VK_FORMAT_UNDEFINED);
688 VK_IMAGE_LAYOUT_GENERAL,
694 VK_IMAGE_LAYOUT_GENERAL,
700 0, remap_data_size*
f->slice_count,
701 VK_FORMAT_UNDEFINED);
705 VK_SHADER_STAGE_COMPUTE_BIT,
713 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
714 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
717 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
718 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
720 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
721 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
722 .pBufferMemoryBarriers = buf_bar,
723 .bufferMemoryBarrierCount = nb_buf_bar,
729 .compacted = gathered_buf->
address,
730 .slot_size = (uint32_t)((out_data_buf->
size /
f->slice_count) & ~(size_t)15),
734 fd->
idx*
f->max_slice_count*
sizeof(uint32_t),
735 f->slice_count*
sizeof(uint32_t),
736 VK_FORMAT_UNDEFINED);
739 VK_SHADER_STAGE_COMPUTE_BIT,
740 0,
sizeof(gather_pd), &gather_pd);
741 vk->CmdDispatch(exec->
buf,
f->slice_count, 1, 1);
747 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
748 TRANSFER_BIT, TRANSFER_READ_BIT, NONE_KHR,
750 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
751 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
752 .pBufferMemoryBarriers = buf_bar,
753 .bufferMemoryBarrierCount = nb_buf_bar,
757 vk->CmdCopyBuffer(exec->
buf, gathered_buf->
buf, compacted_buf->
buf,
758 1, &(VkBufferCopy) { .size = maxsize });
801 uint32_t rb_off = fd->
idx*
f->max_slice_count*
sizeof(uint32_t);
803 VkMappedMemoryRange invalidate_data = {
804 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
807 .size =
f->slice_count*
sizeof(uint32_t),
810 1, &invalidate_data);
816 for (
int i = 0;
i <
f->slice_count;
i++) {
817 uint32_t sl_len =
AV_RN32(rb +
i*4);
824 if (!(compacted_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
825 VkMappedMemoryRange invalidate_data = {
826 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
827 .memory = compacted_buf->
mem,
829 .size = VK_WHOLE_SIZE,
832 1, &invalidate_data);
935 vk_frames = frames_ctx->
hwctx;
936 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
937 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
938 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
939 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
959 (uint32_t []) { 32, 32, 1 }, 0);
962 VK_SHADER_STAGE_COMPUTE_BIT);
966 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
967 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
974 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
975 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
978 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
979 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1003 (uint32_t []) { wg_x, 1, 1 }, 0);
1006 VK_SHADER_STAGE_COMPUTE_BIT);
1010 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1011 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1018 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1019 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1022 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1023 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1027 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1028 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1050 (uint32_t []) { 32, 32, 1 }, 0);
1053 VK_SHADER_STAGE_COMPUTE_BIT);
1057 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1058 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1065 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1066 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1069 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1070 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1074 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1075 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1097 (uint32_t []) { 1, 1, 1 }, 0);
1100 VK_SHADER_STAGE_COMPUTE_BIT);
1104 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1105 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1112 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1113 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1116 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1117 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1138 int wg_dim =
FFMIN(fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0], 1024);
1141 (uint32_t []) { wg_dim, 1, 1 }, 0);
1144 VK_SHADER_STAGE_COMPUTE_BIT);
1148 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1149 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1156 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1157 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1160 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1161 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1190 (uint32_t []) { wg_x, 1, 1 }, 0);
1193 VK_SHADER_STAGE_COMPUTE_BIT);
1197 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1198 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1201 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1202 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1205 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1206 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1213 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1214 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1217 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1218 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1221 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1222 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1225 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1226 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1230 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1231 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1234 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1235 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1239 4 + fv->
is_rgb + !!
f->remap_mode, 0);
1250 }
else if (
f->remap_mode) {
1292 (uint32_t []) { 256, 1, 1 }, 0);
1295 VK_SHADER_STAGE_COMPUTE_BIT);
1299 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1300 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1334 f->version =
f->bayer ? 4 : 3;
1341 if (
f->bits_per_raw_sample > (
f->version > 3 ? 16 : 8)) {
1344 "forcing range coder\n");
1349 if (
f->version < 4 && avctx->
gop_size > 1) {
1360 if (
f->version == 4)
1361 f->micro_version =
f->bayer ? 10 : (
f->remap_mode ? 9 : 3);
1366 if (
f->num_h_slices <= 0 &&
f->num_v_slices <= 0) {
1372 f->num_h_slices = 32;
1373 f->num_v_slices = 32;
1375 }
else if (
f->num_h_slices &&
f->num_v_slices <= 0) {
1377 }
else if (
f->num_v_slices &&
f->num_h_slices <= 0) {
1381 f->num_h_slices =
FFMIN(
f->num_h_slices, avctx->
width);
1386 "by the standard is %i\n",
1391 f->max_slice_count =
f->num_h_slices *
f->num_v_slices;
1396 if (
f->version < 4) {
1397 if (((
f->chroma_h_shift > 0) && (avctx->
width % (64 <<
f->chroma_h_shift))) ||
1398 ((
f->chroma_v_shift > 0) && (avctx->
height % (64 <<
f->chroma_v_shift)))) {
1400 "dimensions is only supported in version 4 (-level 4)\n");
1406 if (
f->version < 4) {
1427 if (maxsize > fv->
s.
props_11.maxMemoryAllocationSize) {
1429 "than maximum device allocation (%"PRIu64
"), clipping\n",
1430 maxsize, fv->
s.
props_11.maxMemoryAllocationSize);
1431 maxsize = fv->
s.
props_11.maxMemoryAllocationSize;
1434 av_log(avctx,
AV_LOG_INFO,
"Async buffers: %zuMiB per context, %zuMiB total, depth: %i\n",
1435 2*maxsize / (1024*1024),
1457 uint32_t mw = (avctx->
width +
f->num_h_slices - 1) /
f->num_h_slices;
1458 uint32_t
mh = (avctx->
height +
f->num_v_slices - 1) /
f->num_v_slices;
1461 uint32_t pn = mw*
mh;
1489 if (
f->remap_mode) {
1529 &fv->
setup, 0, 0, 0,
1531 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
1532 VK_FORMAT_UNDEFINED));
1538 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
1539 VK_FORMAT_UNDEFINED));
1543 256*
sizeof(uint32_t) + 512*
sizeof(uint8_t),
1545 VK_FORMAT_UNDEFINED));
1549 0, 256*
sizeof(uint32_t),
1550 VK_FORMAT_UNDEFINED));
1569 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
1570 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1571 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
1622 #define OFFSET(x) offsetof(VulkanEncodeFFv1Context, x)
1623 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1626 { .i64 = -1 }, -1, 2,
VE },
1628 { .i64 = 0 }, 0, 1,
VE },
1638 { .i64 = -1 }, -1, 2,
VE , .unit =
"qtable"},
1642 { .i64 =
QTABLE_8BIT }, INT_MIN, INT_MAX,
VE, .unit =
"qtable" },
1652 { .i64 = 0 }, 0, 1,
VE },
1654 {
"rct_search",
"Run a search for RCT parameters (level 4 only)",
OFFSET(optimize_rct),
AV_OPT_TYPE_BOOL,
1655 { .i64 = 1 }, 0, 1,
VE },
1658 { .i64 = 1 }, 1, INT_MAX,
VE },
1661 { .i64 = -1 }, -1, 2,
VE, .unit =
"remap_mode" },
1663 { .i64 = -1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1665 { .i64 = 0 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1667 { .i64 = 1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1669 { .i64 = 2 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1692 .
p.
name =
"ffv1_vulkan",
1710 .p.wrapper_name =
"vulkan",