40 #define RGB_LINECACHE 4
186 AVFrame *enc_in, VkImageView *enc_in_views,
187 FFVkBuffer *slice_data_buf, uint32_t slice_data_size,
198 0, slice_data_size*
f->slice_count,
199 VK_FORMAT_UNDEFINED);
201 enc_in, enc_in_views,
203 VK_IMAGE_LAYOUT_GENERAL,
208 VK_SHADER_STAGE_COMPUTE_BIT,
217 AVFrame *enc_in, VkImageView *enc_in_views,
227 enc_in, enc_in_views,
229 VK_IMAGE_LAYOUT_GENERAL,
234 0, fltmap_size*
f->slice_count,
235 VK_FORMAT_UNDEFINED);
239 VK_SHADER_STAGE_COMPUTE_BIT,
248 AVFrame *enc_in, VkImageView *enc_in_views,
258 enc_in, enc_in_views,
260 VK_IMAGE_LAYOUT_GENERAL,
265 0, units_size*
f->slice_count,
266 VK_FORMAT_UNDEFINED);
270 VK_SHADER_STAGE_COMPUTE_BIT,
292 uint32_t plane_state_size;
293 uint32_t slice_state_size;
294 uint32_t slice_data_size;
299 uint32_t remap_data_size = 0;
306 int has_inter = avctx->
gop_size > 1;
307 uint32_t context_count =
f->context_count[
f->context_model];
309 VkImageMemoryBarrier2 img_bar[37];
311 VkBufferMemoryBarrier2 buf_bar[8];
315 f->cur_enc_frame = pict;
324 f->slice_count =
f->max_slice_count;
328 plane_state_size = 8;
332 plane_state_size *= context_count;
333 slice_state_size = plane_state_size*
f->plane_count;
335 slice_data_size = 256;
336 slice_state_size += slice_data_size;
337 slice_state_size =
FFALIGN(slice_state_size, 8);
341 if (!slice_data_ref) {
344 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
345 NULL, slice_state_size*
f->slice_count,
346 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
360 remap_data_size = 4*(1 <<
desc->comp[0].depth)*
sizeof(uint32_t);
365 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
366 NULL, remap_data_size*
f->slice_count,
367 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
377 VkMemoryPropertyFlagBits out_buf_flags;
378 if (maxsize < fv->max_heap_size)
379 out_buf_flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
381 out_buf_flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
386 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
387 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
388 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
389 NULL, maxsize, out_buf_flags));
395 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
396 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_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));
470 remap_data_ref =
NULL;
474 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
475 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
478 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
479 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
484 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
485 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
486 VK_ACCESS_SHADER_READ_BIT,
487 VK_IMAGE_LAYOUT_GENERAL,
488 VK_QUEUE_FAMILY_IGNORED);
490 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
491 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
492 .pImageMemoryBarriers = img_bar,
493 .imageMemoryBarrierCount = nb_img_bar,
501 slice_data_buf, slice_data_size, &pd));
505 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
506 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
507 0, slice_data_size*
f->slice_count);
513 remap_data_buf, remap_data_size, &pd));
516 remap_data_buf, remap_data_size, &pd));
521 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
522 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
523 0, remap_data_size*
f->slice_count);
527 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
528 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
529 .pBufferMemoryBarriers = buf_bar,
530 .bufferMemoryBarrierCount = nb_buf_bar,
539 0, slice_data_size*
f->slice_count,
540 VK_FORMAT_UNDEFINED);
545 0, remap_data_size*
f->slice_count,
546 VK_FORMAT_UNDEFINED);
550 VK_SHADER_STAGE_COMPUTE_BIT,
558 vkf->
layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
559 vkf->
access[0] = VK_ACCESS_2_NONE;
566 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
567 VK_PIPELINE_STAGE_2_CLEAR_BIT,
568 VK_ACCESS_2_TRANSFER_WRITE_BIT,
569 VK_IMAGE_LAYOUT_GENERAL,
570 VK_QUEUE_FAMILY_IGNORED);
571 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
572 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
573 .pImageMemoryBarriers = img_bar,
574 .imageMemoryBarrierCount = nb_img_bar,
578 vk->CmdClearColorImage(exec->
buf, vkf->
img[0], VK_IMAGE_LAYOUT_GENERAL,
579 &((VkClearColorValue) { 0 }),
580 1, &((VkImageSubresourceRange) {
581 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
592 0, slice_data_size*
f->slice_count,
593 VK_FORMAT_UNDEFINED);
599 VK_FORMAT_UNDEFINED);
603 VK_SHADER_STAGE_COMPUTE_BIT,
612 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
613 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
614 0, slice_data_size*
f->slice_count);
620 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
621 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
622 0, remap_data_size*
f->slice_count);
625 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
626 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
627 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
630 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
631 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
632 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
635 fv->
optimize_rct ? VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT :
636 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
637 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
638 VK_ACCESS_SHADER_READ_BIT,
639 VK_IMAGE_LAYOUT_GENERAL,
640 VK_QUEUE_FAMILY_IGNORED);
644 VK_PIPELINE_STAGE_2_CLEAR_BIT,
645 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
646 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
647 VK_IMAGE_LAYOUT_GENERAL,
648 VK_QUEUE_FAMILY_IGNORED);
650 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
651 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
652 .pImageMemoryBarriers = img_bar,
653 .imageMemoryBarrierCount = nb_img_bar,
654 .pBufferMemoryBarriers = buf_bar,
655 .bufferMemoryBarrierCount = nb_buf_bar,
664 0, slice_data_size*
f->slice_count,
665 VK_FORMAT_UNDEFINED);
669 fd->
idx*
f->max_slice_count*
sizeof(uint32_t),
670 f->slice_count*
sizeof(uint32_t),
671 VK_FORMAT_UNDEFINED);
677 VK_FORMAT_UNDEFINED);
681 VK_IMAGE_LAYOUT_GENERAL,
687 VK_IMAGE_LAYOUT_GENERAL,
693 0, remap_data_size*
f->slice_count,
694 VK_FORMAT_UNDEFINED);
698 VK_SHADER_STAGE_COMPUTE_BIT,
706 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
707 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
710 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
711 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
713 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
714 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
715 .pBufferMemoryBarriers = buf_bar,
716 .bufferMemoryBarrierCount = nb_buf_bar,
722 .compacted = compacted_buf->
address,
723 .slot_size = (uint32_t)((out_data_buf->
size /
f->slice_count) & ~(size_t)15),
727 fd->
idx*
f->max_slice_count*
sizeof(uint32_t),
728 f->slice_count*
sizeof(uint32_t),
729 VK_FORMAT_UNDEFINED);
732 VK_SHADER_STAGE_COMPUTE_BIT,
733 0,
sizeof(gather_pd), &gather_pd);
734 vk->CmdDispatch(exec->
buf,
f->slice_count, 1, 1);
776 uint32_t rb_off = fd->
idx*
f->max_slice_count*
sizeof(uint32_t);
778 VkMappedMemoryRange invalidate_data = {
779 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
782 .size =
f->slice_count*
sizeof(uint32_t),
785 1, &invalidate_data);
791 for (
int i = 0;
i <
f->slice_count;
i++) {
792 uint32_t sl_len =
AV_RN32(rb +
i*4);
799 if (!(compacted_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
800 VkMappedMemoryRange invalidate_data = {
801 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
802 .memory = compacted_buf->
mem,
804 .size = VK_WHOLE_SIZE,
807 1, &invalidate_data);
910 vk_frames = frames_ctx->
hwctx;
911 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
912 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
913 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
914 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
934 (uint32_t []) { 32, 32, 1 }, 0);
937 VK_SHADER_STAGE_COMPUTE_BIT);
941 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
942 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
949 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
950 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
953 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
954 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
978 (uint32_t []) { wg_x, 1, 1 }, 0);
981 VK_SHADER_STAGE_COMPUTE_BIT);
985 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
986 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
993 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
994 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
997 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
998 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1002 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1003 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1025 (uint32_t []) { 32, 32, 1 }, 0);
1028 VK_SHADER_STAGE_COMPUTE_BIT);
1032 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1033 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1040 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1041 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1044 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1045 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1049 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1050 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1072 (uint32_t []) { 1, 1, 1 }, 0);
1075 VK_SHADER_STAGE_COMPUTE_BIT);
1079 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1080 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1087 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1088 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1091 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1092 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1113 int wg_dim =
FFMIN(fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0], 1024);
1116 (uint32_t []) { wg_dim, 1, 1 }, 0);
1119 VK_SHADER_STAGE_COMPUTE_BIT);
1123 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1124 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1131 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1132 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1135 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1136 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1165 (uint32_t []) { wg_x, 1, 1 }, 0);
1168 VK_SHADER_STAGE_COMPUTE_BIT);
1172 .
type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1173 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1176 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1177 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1180 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1181 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1188 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1189 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1192 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1193 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1196 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1197 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1200 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1201 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1205 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1206 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1209 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1210 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1214 4 + fv->
is_rgb + !!
f->remap_mode, 0, 0);
1225 }
else if (
f->remap_mode) {
1267 (uint32_t []) { 256, 1, 1 }, 0);
1270 VK_SHADER_STAGE_COMPUTE_BIT);
1274 .
type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1275 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1293 size_t maxsize, max_heap_size, max_host_size;
1309 f->version =
f->bayer ? 4 : 3;
1316 if (
f->bits_per_raw_sample > (
f->version > 3 ? 16 : 8)) {
1319 "forcing range coder\n");
1324 if (
f->version < 4 && avctx->
gop_size > 1) {
1335 if (
f->version == 4)
1336 f->micro_version =
f->bayer ? 10 : (
f->remap_mode ? 9 : 3);
1341 if (
f->num_h_slices <= 0 &&
f->num_v_slices <= 0) {
1347 f->num_h_slices = 32;
1348 f->num_v_slices = 32;
1350 }
else if (
f->num_h_slices &&
f->num_v_slices <= 0) {
1352 }
else if (
f->num_v_slices &&
f->num_h_slices <= 0) {
1356 f->num_h_slices =
FFMIN(
f->num_h_slices, avctx->
width);
1361 "by the standard is %i\n",
1366 f->max_slice_count =
f->num_h_slices *
f->num_v_slices;
1371 if (
f->version < 4) {
1372 if (((
f->chroma_h_shift > 0) && (avctx->
width % (64 <<
f->chroma_h_shift))) ||
1373 ((
f->chroma_v_shift > 0) && (avctx->
height % (64 <<
f->chroma_v_shift)))) {
1375 "dimensions is only supported in version 4 (-level 4)\n");
1381 if (
f->version < 4) {
1404 for (
int i = 0;
i < fv->
s.
mprops.memoryHeapCount;
i++) {
1405 if (fv->
s.
mprops.memoryHeaps[
i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
1408 if (!(fv->
s.
mprops.memoryHeaps[
i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT))
1409 max_host_size =
FFMAX(max_host_size,
1415 if (maxsize > fv->
s.
props_11.maxMemoryAllocationSize) {
1417 "than maximum device allocation (%"PRIu64
"), clipping\n",
1418 maxsize, fv->
s.
props_11.maxMemoryAllocationSize);
1419 maxsize = fv->
s.
props_11.maxMemoryAllocationSize;
1422 if (max_heap_size < maxsize) {
1424 "using host memory (slower)\n",
1428 max_heap_size = max_host_size - (max_host_size >> 1);
1431 max_heap_size = max_heap_size - (max_heap_size >> 3);
1434 av_log(avctx,
AV_LOG_INFO,
"Async buffers: %zuMiB per context, %zuMiB total, depth: %i\n",
1435 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));
1621 #define OFFSET(x) offsetof(VulkanEncodeFFv1Context, x)
1622 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1625 { .i64 = -1 }, -1, 2,
VE },
1627 { .i64 = 0 }, 0, 1,
VE },
1637 { .i64 = -1 }, -1, 2,
VE , .unit =
"qtable"},
1641 { .i64 =
QTABLE_8BIT }, INT_MIN, INT_MAX,
VE, .unit =
"qtable" },
1651 { .i64 = 0 }, 0, 1,
VE },
1653 {
"rct_search",
"Run a search for RCT parameters (level 4 only)",
OFFSET(optimize_rct),
AV_OPT_TYPE_BOOL,
1654 { .i64 = 1 }, 0, 1,
VE },
1657 { .i64 = 1 }, 1, INT_MAX,
VE },
1660 { .i64 = -1 }, -1, 2,
VE, .unit =
"remap_mode" },
1662 { .i64 = -1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1664 { .i64 = 0 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1666 { .i64 = 1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1668 { .i64 = 2 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1691 .
p.
name =
"ffv1_vulkan",
1709 .p.wrapper_name =
"vulkan",