158 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
159 GLSLC(1, u8buf slice_state; );
160 GLSLC(1, u8buf scratch_data; );
161 GLSLC(1, u8buf out_data; );
163 GLSLC(1, ivec2 sar; );
164 GLSLC(1, uvec2 chroma_shift; );
166 GLSLC(1, uint plane_state_size; );
167 GLSLC(1, uint context_count; );
168 GLSLC(1, uint32_t crcref; );
169 GLSLC(1, uint32_t slice_size_max; );
171 GLSLC(1, uint8_t bits_per_raw_sample; );
172 GLSLC(1, uint8_t context_model; );
174 GLSLC(1, uint8_t micro_version; );
175 GLSLC(1, uint8_t force_pcm; );
176 GLSLC(1, uint8_t key_frame; );
177 GLSLC(1, uint8_t components; );
179 GLSLC(1, uint8_t codec_planes; );
180 GLSLC(1, uint8_t transparency; );
181 GLSLC(1, uint8_t colorspace; );
182 GLSLC(1, uint8_t pic_mode; );
183 GLSLC(1, uint8_t ec; );
184 GLSLC(1, uint8_t ppi; );
185 GLSLC(1, uint8_t chunks; );
186 GLSLC(1, uint8_t padding[1]; );
189 VK_SHADER_STAGE_COMPUTE_BIT);
193 AVFrame *enc_in, VkImageView *enc_in_views,
194 AVFrame **intermediate_frame, VkImageView *intermediate_views,
195 VkImageMemoryBarrier2 *img_bar,
int *nb_img_bar,
196 VkBufferMemoryBarrier2 *buf_bar,
int *nb_buf_bar,
197 FFVkBuffer *slice_data_buf, uint32_t slice_data_size)
208 if (!(*intermediate_frame))
212 *intermediate_frame, 0));
215 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
216 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
225 0, slice_data_size*
f->slice_count,
226 VK_FORMAT_UNDEFINED);
228 enc_in, enc_in_views,
230 VK_IMAGE_LAYOUT_GENERAL,
233 *intermediate_frame, intermediate_views,
235 VK_IMAGE_LAYOUT_GENERAL,
239 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
240 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
241 VK_ACCESS_SHADER_WRITE_BIT,
242 VK_IMAGE_LAYOUT_GENERAL,
243 VK_QUEUE_FAMILY_IGNORED);
246 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
247 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
248 .pImageMemoryBarriers = img_bar,
249 .imageMemoryBarrierCount = *nb_img_bar,
250 .pBufferMemoryBarriers = buf_bar,
251 .bufferMemoryBarrierCount = *nb_buf_bar,
255 slice_data_buf->
stage = buf_bar[0].dstStageMask;
256 slice_data_buf->
access = buf_bar[0].dstAccessMask;
263 .offset = 1 <<
f->bits_per_raw_sample,
264 .bits =
f->bits_per_raw_sample,
267 .transparency =
f->transparency,
274 memcpy(pd.fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
279 VK_SHADER_STAGE_COMPUTE_BIT,
286 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
287 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
288 VK_ACCESS_SHADER_READ_BIT,
289 VK_IMAGE_LAYOUT_GENERAL,
290 VK_QUEUE_FAMILY_IGNORED);
311 size_t tmp_data_size;
318 uint32_t plane_state_size;
319 uint32_t slice_state_size;
320 uint32_t slice_data_size;
329 int has_inter = avctx->
gop_size > 1;
330 uint32_t context_count =
f->context_count[
f->context_model];
337 VkImageView *enc_in_views = in_views;
339 VkImageMemoryBarrier2 img_bar[37];
341 VkBufferMemoryBarrier2 buf_bar[8];
348 f->cur_enc_frame = pict;
357 f->slice_count =
f->max_slice_count;
363 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
364 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
366 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
372 plane_state_size = 8;
376 plane_state_size *= context_count;
377 slice_state_size = plane_state_size*
f->plane_count;
379 slice_data_size = 256;
380 slice_state_size += slice_data_size;
381 slice_state_size =
FFALIGN(slice_state_size, 8);
385 if (!slice_data_ref) {
388 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
389 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
390 NULL, slice_state_size*
f->slice_count,
391 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
403 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
404 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
405 NULL, 2*
f->slice_count*
sizeof(uint64_t),
406 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
407 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
418 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
419 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
420 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
422 maxsize < fv->max_heap_size ?
423 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT : 0x0));
429 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
430 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
435 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
436 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
437 VK_ACCESS_SHADER_READ_BIT,
438 VK_IMAGE_LAYOUT_GENERAL,
439 VK_QUEUE_FAMILY_IGNORED);
445 0, slice_data_size*
f->slice_count,
446 VK_FORMAT_UNDEFINED);
448 enc_in, enc_in_views,
450 VK_IMAGE_LAYOUT_GENERAL,
455 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
456 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
457 .srcStageMask = slice_data_buf->
stage,
458 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
459 .srcAccessMask = slice_data_buf->
access,
460 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
461 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
462 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
463 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
464 .buffer = slice_data_buf->
buf,
465 .size = VK_WHOLE_SIZE,
470 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
471 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
472 .pImageMemoryBarriers = img_bar,
473 .imageMemoryBarrierCount = nb_img_bar,
474 .pBufferMemoryBarriers = buf_bar,
475 .bufferMemoryBarrierCount = nb_buf_bar,
479 slice_data_buf->
stage = buf_bar[0].dstStageMask;
480 slice_data_buf->
access = buf_bar[0].dstAccessMask;
488 .scratch_data = tmp_data_buf->
address,
489 .out_data = out_data_buf->
address,
490 .bits_per_raw_sample =
f->bits_per_raw_sample,
493 .chroma_shift[0] =
f->chroma_h_shift,
494 .chroma_shift[1] =
f->chroma_v_shift,
495 .plane_state_size = plane_state_size,
496 .context_count = context_count,
498 .slice_size_max = out_data_buf->
size /
f->slice_count,
500 .version =
f->version,
501 .micro_version =
f->micro_version,
503 .key_frame =
f->key_frame,
506 .codec_planes =
f->plane_count,
507 .transparency =
f->transparency,
508 .colorspace =
f->colorspace,
516 VK_SHADER_STAGE_COMPUTE_BIT,
521 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
522 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
523 .srcStageMask = slice_data_buf->
stage,
524 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
525 .srcAccessMask = slice_data_buf->
access,
526 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
527 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
528 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
529 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
530 .buffer = slice_data_buf->
buf,
531 .size = slice_data_size*
f->slice_count,
535 if (
f->key_frame ||
f->version > 3) {
541 0, slice_data_size*
f->slice_count,
542 VK_FORMAT_UNDEFINED);
548 .plane_state_size = plane_state_size,
549 .codec_planes =
f->plane_count,
550 .key_frame =
f->key_frame,
552 for (
int i = 0;
i <
f->quant_table_count;
i++)
556 VK_SHADER_STAGE_COMPUTE_BIT,
557 0,
sizeof(pd_reset), &pd_reset);
560 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
561 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
562 .pBufferMemoryBarriers = buf_bar,
563 .bufferMemoryBarrierCount = nb_buf_bar,
565 slice_data_buf->
stage = buf_bar[0].dstStageMask;
566 slice_data_buf->
access = buf_bar[0].dstAccessMask;
576 enc_in, enc_in_views,
577 &intermediate_frame, intermediate_views,
578 img_bar, &nb_img_bar, buf_bar, &nb_buf_bar,
579 slice_data_buf, slice_data_size));
582 enc_in = intermediate_frame;
583 enc_in_views = intermediate_views;
587 if (
f->key_frame ||
f->version > 3) {
589 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
590 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
591 .srcStageMask = slice_data_buf->
stage,
592 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
593 .srcAccessMask = slice_data_buf->
access,
594 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
595 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
596 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
597 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
598 .buffer = slice_data_buf->
buf,
599 .size = slice_data_buf->
size - slice_data_size*
f->slice_count,
600 .offset = slice_data_size*
f->slice_count,
605 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
606 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
607 .pImageMemoryBarriers = img_bar,
608 .imageMemoryBarrierCount = nb_img_bar,
609 .pBufferMemoryBarriers = buf_bar,
610 .bufferMemoryBarrierCount = nb_buf_bar,
614 slice_data_buf->
stage = buf_bar[0].dstStageMask;
615 slice_data_buf->
access = buf_bar[0].dstAccessMask;
623 0, slice_data_size*
f->slice_count,
624 VK_FORMAT_UNDEFINED);
626 enc_in, enc_in_views,
628 VK_IMAGE_LAYOUT_GENERAL,
633 0, results_data_buf->
size,
634 VK_FORMAT_UNDEFINED);
638 VK_SHADER_STAGE_COMPUTE_BIT,
662 VkBufferCopy *buf_regions,
int nb_regions,
674 VkBufferMemoryBarrier2 buf_bar[8];
687 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
688 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
689 .srcStageMask = out_data_buf->
stage,
690 .dstStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT,
691 .srcAccessMask = out_data_buf->
access,
692 .dstAccessMask = VK_ACCESS_2_TRANSFER_READ_BIT,
693 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
694 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
695 .buffer = out_data_buf->
buf,
696 .size = VK_WHOLE_SIZE,
699 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
700 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
701 .pBufferMemoryBarriers = buf_bar,
702 .bufferMemoryBarrierCount = nb_buf_bar,
704 out_data_buf->
stage = buf_bar[0].dstStageMask;
705 out_data_buf->
access = buf_bar[0].dstAccessMask;
708 vk->CmdCopyBuffer(exec->
buf,
709 out_data_buf->
buf, pkt_data_buf->buf,
710 nb_regions, buf_regions);
721 if (!(pkt_data_buf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
722 VkMappedMemoryRange invalidate_data = {
723 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
724 .memory = pkt_data_buf->mem,
726 .size = VK_WHOLE_SIZE,
729 1, &invalidate_data);
756 if (!(results_data_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
757 VkMappedMemoryRange invalidate_data = {
758 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
759 .memory = results_data_buf->
mem,
761 .size = VK_WHOLE_SIZE,
764 1, &invalidate_data);
769 for (
int i = 0;
i <
f->slice_count;
i++) {
770 sc = &((uint64_t *)results_data_buf->
mapped_mem)[
i*2];
772 "src offset = %"PRIu64
"\n",
788 VK_BUFFER_USAGE_TRANSFER_DST_BIT,
790 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
791 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
886 vk_frames = frames_ctx->
hwctx;
887 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
888 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT;
889 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
964 GLSLF(0, #define
TYPE int%i_t ,smp_bits);
965 GLSLF(0, #define VTYPE2
i%ivec2 ,smp_bits);
966 GLSLF(0, #define VTYPE3
i%ivec3 ,smp_bits);
984 void *spv_opaque =
NULL;
987 VK_SHADER_STAGE_COMPUTE_BIT,
988 (
const char *[]) {
"GL_EXT_buffer_reference",
989 "GL_EXT_buffer_reference2" }, 2,
1003 .
name =
"rangecoder_static_buf",
1004 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1005 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1006 .mem_layout =
"scalar",
1007 .buf_content =
"uint8_t zero_one_state[512];",
1010 .name =
"quant_buf",
1011 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1012 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1013 .mem_layout =
"scalar",
1014 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1015 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1024 .
name =
"slice_data_buf",
1025 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1026 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1027 .buf_content =
"SliceContext slice_ctx[1024];",
1031 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1036 .mem_quali =
"readonly",
1037 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1066 void *spv_opaque =
NULL;
1067 int wg_dim =
FFMIN(fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0], 1024);
1070 VK_SHADER_STAGE_COMPUTE_BIT,
1071 (
const char *[]) {
"GL_EXT_buffer_reference",
1072 "GL_EXT_buffer_reference2" }, 2,
1079 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
1081 GLSLC(1, u8buf slice_state; );
1082 GLSLC(1, uint plane_state_size; );
1083 GLSLC(1, uint8_t codec_planes; );
1084 GLSLC(1, uint8_t key_frame; );
1086 GLSLC(1, uint8_t micro_version; );
1087 GLSLC(1, uint8_t padding[1]; );
1090 VK_SHADER_STAGE_COMPUTE_BIT);
1098 .
name =
"rangecoder_static_buf",
1099 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1100 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1101 .mem_layout =
"scalar",
1102 .buf_content =
"uint8_t zero_one_state[512];",
1105 .name =
"quant_buf",
1106 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1107 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1108 .mem_layout =
"scalar",
1109 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1110 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1119 .
name =
"slice_data_buf",
1120 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1121 .mem_quali =
"readonly",
1122 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1123 .buf_content =
"SliceContext slice_ctx[1024];",
1152 void *spv_opaque =
NULL;
1153 int wg_count = sqrt(fv->
s.
props.properties.limits.maxComputeWorkGroupInvocations);
1158 "pixel format for RCT buffer!\n");
1165 VK_SHADER_STAGE_COMPUTE_BIT,
1166 (
const char *[]) {
"GL_EXT_buffer_reference",
1167 "GL_EXT_buffer_reference2" }, 2,
1168 wg_count, wg_count, 1,
1174 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
1175 GLSLC(1, ivec4 fmt_lut; );
1178 GLSLC(1, uint8_t planar_rgb; );
1179 GLSLC(1, uint8_t color_planes; );
1180 GLSLC(1, uint8_t transparency; );
1182 GLSLC(1, uint8_t micro_version; );
1183 GLSLC(1, uint8_t padding[2]; );
1186 VK_SHADER_STAGE_COMPUTE_BIT);
1194 .
name =
"rangecoder_static_buf",
1195 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1196 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1197 .mem_layout =
"scalar",
1198 .buf_content =
"uint8_t zero_one_state[512];",
1201 .name =
"quant_buf",
1202 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1203 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1204 .mem_layout =
"scalar",
1205 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1206 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1215 .
name =
"slice_data_buf",
1216 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1217 .mem_quali =
"readonly",
1218 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1219 .buf_content =
"SliceContext slice_ctx[1024];",
1223 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1228 .mem_quali =
"readonly",
1229 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1233 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1238 .mem_quali =
"writeonly",
1239 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1273 void *spv_opaque =
NULL;
1276 VK_SHADER_STAGE_COMPUTE_BIT,
1277 (
const char *[]) {
"GL_EXT_buffer_reference",
1278 "GL_EXT_buffer_reference2" }, 2,
1293 .
name =
"rangecoder_static_buf",
1294 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1295 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1296 .mem_layout =
"scalar",
1297 .buf_content =
"uint8_t zero_one_state[512];",
1300 .name =
"quant_buf",
1301 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1302 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1303 .mem_layout =
"scalar",
1304 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1305 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1308 .name =
"crc_ieee_buf",
1309 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1310 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1311 .mem_layout =
"scalar",
1312 .buf_content =
"uint32_t crc_ieee[256];",
1322 .
name =
"slice_data_buf",
1323 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1324 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1325 .buf_content =
"SliceContext slice_ctx[1024];",
1329 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1334 .mem_quali =
"readonly",
1335 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1338 .name =
"results_data_buf",
1339 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1340 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1341 .mem_quali =
"writeonly",
1342 .buf_content =
"uint64_t slice_results[2048];",
1376 size_t maxsize, max_heap_size, max_host_size;
1399 if (
f->bits_per_raw_sample > (
f->version > 3 ? 16 : 8)) {
1402 "forcing range coder\n");
1407 if (
f->version < 4 && avctx->
gop_size > 1) {
1418 if (
f->version == 4 &&
f->micro_version > 4)
1419 f->micro_version = 3;
1447 f->num_h_slices = w_sl;
1448 f->num_v_slices = h_sl;
1456 if (
f->num_h_slices <= 0 &&
f->num_v_slices <= 0) {
1462 f->num_h_slices = 32;
1463 f->num_v_slices = 32;
1465 }
else if (
f->num_h_slices &&
f->num_v_slices <= 0) {
1466 f->num_v_slices = 1024 /
f->num_h_slices;
1467 }
else if (
f->num_v_slices &&
f->num_h_slices <= 0) {
1468 f->num_h_slices = 1024 /
f->num_v_slices;
1471 f->num_h_slices =
FFMIN(
f->num_h_slices, avctx->
width);
1474 if (
f->num_h_slices *
f->num_v_slices > 1024) {
1476 "by the standard is 1024\n",
1477 f->num_h_slices *
f->num_v_slices);
1485 if (
f->version < 4) {
1486 if (((
f->chroma_h_shift > 0) && (avctx->
width % (64 <<
f->chroma_h_shift))) ||
1487 ((
f->chroma_v_shift > 0) && (avctx->
height % (64 <<
f->chroma_v_shift)))) {
1489 "dimensions is only supported in version 4 (-level 4)\n");
1495 if (
f->version < 4) {
1518 for (
int i = 0;
i < fv->
s.
mprops.memoryHeapCount;
i++) {
1519 if (fv->
s.
mprops.memoryHeaps[
i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
1522 if (!(fv->
s.
mprops.memoryHeaps[
i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT))
1523 max_host_size =
FFMAX(max_host_size,
1529 if (maxsize > fv->
s.
props_11.maxMemoryAllocationSize) {
1531 "than maximum device allocation (%zu), clipping\n",
1532 maxsize, fv->
s.
props_11.maxMemoryAllocationSize);
1533 maxsize = fv->
s.
props_11.maxMemoryAllocationSize;
1536 if (max_heap_size < maxsize) {
1538 "using host memory (slower)\n",
1542 max_heap_size = max_host_size - (max_host_size >> 1);
1545 max_heap_size = max_heap_size - (max_heap_size >> 3);
1548 av_log(avctx,
AV_LOG_INFO,
"Async buffers: %zuMiB per context, %zuMiB total, depth: %i\n",
1549 maxsize / (1024*1024),
1571 spv = ff_vk_spirv_init();
1584 if (!fv->
is_rgb &&
f->bits_per_raw_sample > 8)
1642 &fv->
setup, 0, 0, 0,
1645 VK_FORMAT_UNDEFINED));
1652 VK_FORMAT_UNDEFINED));
1657 VK_FORMAT_UNDEFINED));
1662 VK_FORMAT_UNDEFINED));
1677 f->max_slice_count =
f->num_h_slices *
f->num_v_slices;
1730 #define OFFSET(x) offsetof(VulkanEncodeFFv1Context, x)
1731 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1734 { .i64 = -1 }, -1, 1,
VE },
1736 { .i64 = 0 }, 0, 1,
VE },
1746 { .i64 = -1 }, -1, 2,
VE , .unit =
"qtable"},
1750 { .i64 =
QTABLE_8BIT }, INT_MIN, INT_MAX,
VE, .unit =
"qtable" },
1755 { .i64 = -1 }, -1, 1024,
VE },
1757 { .i64 = -1 }, -1, 1024,
VE },
1760 { .i64 = 0 }, 0, 1,
VE },
1763 { .i64 = 1 }, 1, INT_MAX,
VE },
1786 .
p.
name =
"ffv1_vulkan",
1804 .p.wrapper_name =
"vulkan",