41 #define RGB_LINECACHE 4
159 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
160 GLSLC(1, u8buf slice_state; );
161 GLSLC(1, u8buf scratch_data; );
162 GLSLC(1, u8buf out_data; );
164 GLSLC(1, ivec4 fmt_lut; );
165 GLSLC(1, ivec2 sar; );
166 GLSLC(1, uvec2 chroma_shift; );
168 GLSLC(1, uint plane_state_size; );
169 GLSLC(1, uint context_count; );
170 GLSLC(1, uint32_t crcref; );
171 GLSLC(1, uint32_t slice_size_max; );
172 GLSLC(1,
int rct_offset; );
174 GLSLC(1, uint8_t extend_lookup[8]; );
175 GLSLC(1, uint8_t bits_per_raw_sample; );
176 GLSLC(1, uint8_t context_model; );
178 GLSLC(1, uint8_t micro_version; );
179 GLSLC(1, uint8_t force_pcm; );
180 GLSLC(1, uint8_t key_frame; );
181 GLSLC(1, uint8_t components; );
183 GLSLC(1, uint8_t codec_planes; );
184 GLSLC(1, uint8_t planar_rgb; );
185 GLSLC(1, uint8_t transparency; );
186 GLSLC(1, uint8_t colorspace; );
187 GLSLC(1, uint8_t pic_mode; );
188 GLSLC(1, uint8_t ec; );
189 GLSLC(1, uint8_t ppi; );
190 GLSLC(1, uint8_t chunks; );
191 GLSLC(1, uint8_t rct_search; );
192 GLSLC(1, uint8_t padding[3]; );
195 VK_SHADER_STAGE_COMPUTE_BIT);
211 AVFrame *enc_in, VkImageView *enc_in_views,
212 FFVkBuffer *slice_data_buf, uint32_t slice_data_size)
224 0, slice_data_size*
f->slice_count,
225 VK_FORMAT_UNDEFINED);
227 enc_in, enc_in_views,
229 VK_IMAGE_LAYOUT_GENERAL,
235 .rct_offset = 1 <<
f->bits_per_raw_sample,
238 .transparency =
f->transparency,
239 .key_frame =
f->key_frame,
241 .version =
f->version,
242 .micro_version =
f->micro_version,
248 memcpy(pd.fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
253 VK_SHADER_STAGE_COMPUTE_BIT,
276 uint32_t plane_state_size;
277 uint32_t slice_state_size;
278 uint32_t slice_data_size;
287 int has_inter = avctx->
gop_size > 1;
288 uint32_t context_count =
f->context_count[
f->context_model];
297 VkImageMemoryBarrier2 img_bar[37];
299 VkBufferMemoryBarrier2 buf_bar[8];
306 f->cur_enc_frame = pict;
315 f->slice_count =
f->max_slice_count;
319 plane_state_size = 8;
323 plane_state_size *= context_count;
324 slice_state_size = plane_state_size*
f->plane_count;
326 slice_data_size = 256;
327 slice_state_size += slice_data_size;
328 slice_state_size =
FFALIGN(slice_state_size, 8);
332 if (!slice_data_ref) {
335 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
336 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
337 NULL, slice_state_size*
f->slice_count,
338 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
350 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
351 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
352 NULL, 2*
f->slice_count*
sizeof(uint64_t),
353 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
354 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
365 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
366 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
367 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
369 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
370 (maxsize < fv->max_heap_size ?
371 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT : 0x0) |
373 VK_MEMORY_PROPERTY_HOST_CACHED_BIT : 0x0)));
379 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
380 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
385 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
386 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
387 VK_ACCESS_SHADER_READ_BIT,
388 VK_IMAGE_LAYOUT_GENERAL,
389 VK_QUEUE_FAMILY_IGNORED);
401 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
402 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
412 0, slice_data_size*
f->slice_count,
413 VK_FORMAT_UNDEFINED);
417 VK_IMAGE_LAYOUT_GENERAL,
422 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
423 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
424 .srcStageMask = slice_data_buf->
stage,
425 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
426 .srcAccessMask = slice_data_buf->
access,
427 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
428 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
429 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
430 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
431 .buffer = slice_data_buf->
buf,
432 .size = VK_WHOLE_SIZE,
440 slice_data_buf, slice_data_size));
442 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
443 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
444 .srcStageMask = slice_data_buf->
stage,
445 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
446 .srcAccessMask = slice_data_buf->
access,
447 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
448 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
449 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
450 .buffer = slice_data_buf->
buf,
451 .size = slice_data_size*
f->slice_count,
456 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
457 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
458 .pImageMemoryBarriers = img_bar,
459 .imageMemoryBarrierCount = nb_img_bar,
460 .pBufferMemoryBarriers = buf_bar,
461 .bufferMemoryBarrierCount = nb_buf_bar,
465 slice_data_buf->
stage = buf_bar[0].dstStageMask;
466 slice_data_buf->
access = buf_bar[0].dstAccessMask;
474 .out_data = out_data_buf->
address,
475 .bits_per_raw_sample =
f->bits_per_raw_sample,
478 .chroma_shift[0] =
f->chroma_h_shift,
479 .chroma_shift[1] =
f->chroma_v_shift,
480 .plane_state_size = plane_state_size,
481 .context_count = context_count,
483 .rct_offset = 1 <<
f->bits_per_raw_sample,
484 .slice_size_max = out_data_buf->
size /
f->slice_count,
486 .version =
f->version,
487 .micro_version =
f->micro_version,
489 .key_frame =
f->key_frame,
492 .codec_planes =
f->plane_count,
495 .transparency =
f->transparency,
496 .colorspace =
f->colorspace,
509 memcpy(pd.
fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
513 for (
int i = 0;
i <
f->quant_table_count;
i++)
515 (
f->quant_tables[
i][4][127] != 0);
517 VK_SHADER_STAGE_COMPUTE_BIT,
524 vk->CmdClearColorImage(exec->
buf, vkf->
img[0], VK_IMAGE_LAYOUT_GENERAL,
525 &((VkClearColorValue) { 0 }),
526 1, &((VkImageSubresourceRange) {
527 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
534 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
535 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
536 .srcStageMask = slice_data_buf->
stage,
537 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
538 .srcAccessMask = slice_data_buf->
access,
539 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
540 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
541 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
542 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
543 .buffer = slice_data_buf->
buf,
544 .size = slice_data_size*
f->slice_count,
548 if (
f->key_frame ||
f->version > 3) {
554 0, slice_data_size*
f->slice_count,
555 VK_FORMAT_UNDEFINED);
561 .plane_state_size = plane_state_size,
562 .codec_planes =
f->plane_count,
563 .key_frame =
f->key_frame,
565 for (
int i = 0;
i <
f->quant_table_count;
i++)
569 VK_SHADER_STAGE_COMPUTE_BIT,
570 0,
sizeof(pd_reset), &pd_reset);
573 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
574 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
575 .pBufferMemoryBarriers = buf_bar,
576 .bufferMemoryBarrierCount = nb_buf_bar,
578 slice_data_buf->
stage = buf_bar[0].dstStageMask;
579 slice_data_buf->
access = buf_bar[0].dstAccessMask;
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,
606 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
607 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
608 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
609 VK_IMAGE_LAYOUT_GENERAL,
610 VK_QUEUE_FAMILY_IGNORED);
614 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
615 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
616 .pImageMemoryBarriers = img_bar,
617 .imageMemoryBarrierCount = nb_img_bar,
618 .pBufferMemoryBarriers = buf_bar,
619 .bufferMemoryBarrierCount = nb_buf_bar,
623 slice_data_buf->
stage = buf_bar[0].dstStageMask;
624 slice_data_buf->
access = buf_bar[0].dstAccessMask;
632 0, slice_data_size*
f->slice_count,
633 VK_FORMAT_UNDEFINED);
637 VK_IMAGE_LAYOUT_GENERAL,
642 0, results_data_buf->
size,
643 VK_FORMAT_UNDEFINED);
648 VK_IMAGE_LAYOUT_GENERAL,
653 VK_SHADER_STAGE_COMPUTE_BIT,
677 VkBufferCopy *buf_regions,
int nb_regions,
691 VkBufferMemoryBarrier2 buf_bar[8];
695 VK_BUFFER_USAGE_TRANSFER_DST_BIT);
712 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
713 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
714 .srcStageMask = out_data_buf->
stage,
715 .dstStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT,
716 .srcAccessMask = out_data_buf->
access,
717 .dstAccessMask = VK_ACCESS_2_TRANSFER_READ_BIT,
718 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
719 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
720 .buffer = out_data_buf->
buf,
721 .size = VK_WHOLE_SIZE,
724 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
725 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
726 .pBufferMemoryBarriers = buf_bar,
727 .bufferMemoryBarrierCount = nb_buf_bar,
729 out_data_buf->
stage = buf_bar[0].dstStageMask;
730 out_data_buf->
access = buf_bar[0].dstAccessMask;
733 for (
int i = 0;
i < nb_regions;
i++)
734 buf_regions[
i].dstOffset += mapped_buf->virtual_offset;
736 vk->CmdCopyBuffer(exec->
buf,
737 out_data_buf->
buf, mapped_buf->buf,
738 nb_regions, buf_regions);
768 if (!(results_data_buf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
769 VkMappedMemoryRange invalidate_data = {
770 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
771 .memory = results_data_buf->mem,
773 .size = VK_WHOLE_SIZE,
776 1, &invalidate_data);
781 for (
int i = 0;
i <
f->slice_count;
i++) {
782 sc = &((uint64_t *)results_data_buf->mapped_mem)[
i*2];
784 "src offset = %"PRIu64
"\n",
821 if (!(out_data_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
822 VkMappedMemoryRange invalidate_data = {
823 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
824 .memory = out_data_buf->
mem,
826 .size = VK_WHOLE_SIZE,
829 1, &invalidate_data);
833 for (
int i = 0;
i <
f->slice_count;
i++) {
835 memcpy(
pkt->
data + region->dstOffset,
917 vk_frames = frames_ctx->
hwctx;
918 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
919 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
920 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
921 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
1000 GLSLF(0, #define
TYPE int%i_t ,smp_bits);
1001 GLSLF(0, #define VTYPE2
i%ivec2 ,smp_bits);
1002 GLSLF(0, #define VTYPE3
i%ivec3 ,smp_bits);
1021 void *spv_opaque =
NULL;
1024 VK_SHADER_STAGE_COMPUTE_BIT,
1025 (
const char *[]) {
"GL_EXT_buffer_reference",
1026 "GL_EXT_buffer_reference2",
1027 "GL_EXT_null_initializer" }, 3,
1034 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
1035 GLSLC(1, ivec4 fmt_lut; );
1036 GLSLC(1,
int rct_offset; );
1037 GLSLC(1, uint8_t planar_rgb; );
1038 GLSLC(1, uint8_t transparency; );
1039 GLSLC(1, uint8_t key_frame; );
1040 GLSLC(1, uint8_t force_pcm; );
1042 GLSLC(1, uint8_t micro_version; );
1043 GLSLC(1, uint8_t padding[3]; );
1046 VK_SHADER_STAGE_COMPUTE_BIT);
1055 .
name =
"rangecoder_static_buf",
1056 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1057 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1058 .mem_layout =
"scalar",
1059 .buf_content =
"uint8_t zero_one_state[512];",
1062 .name =
"quant_buf",
1063 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1064 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1065 .mem_layout =
"scalar",
1066 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1067 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1076 .
name =
"slice_data_buf",
1077 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1078 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1079 .buf_content =
"SliceContext slice_ctx",
1080 .buf_elems =
f->max_slice_count,
1084 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1089 .mem_quali =
"readonly",
1090 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1120 void *spv_opaque =
NULL;
1123 VK_SHADER_STAGE_COMPUTE_BIT,
1124 (
const char *[]) {
"GL_EXT_buffer_reference",
1125 "GL_EXT_buffer_reference2" }, 2,
1140 .
name =
"rangecoder_static_buf",
1141 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1142 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1143 .mem_layout =
"scalar",
1144 .buf_content =
"uint8_t zero_one_state[512];",
1147 .name =
"quant_buf",
1148 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1149 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1150 .mem_layout =
"scalar",
1151 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1152 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1161 .
name =
"slice_data_buf",
1162 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1163 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1164 .buf_content =
"SliceContext slice_ctx",
1165 .buf_elems =
f->max_slice_count,
1169 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1174 .mem_quali =
"readonly",
1175 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1205 void *spv_opaque =
NULL;
1206 int wg_dim =
FFMIN(fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0], 1024);
1209 VK_SHADER_STAGE_COMPUTE_BIT,
1210 (
const char *[]) {
"GL_EXT_buffer_reference",
1211 "GL_EXT_buffer_reference2" }, 2,
1218 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
1220 GLSLC(1, u8buf slice_state; );
1221 GLSLC(1, uint plane_state_size; );
1222 GLSLC(1, uint8_t codec_planes; );
1223 GLSLC(1, uint8_t key_frame; );
1225 GLSLC(1, uint8_t micro_version; );
1226 GLSLC(1, uint8_t padding[1]; );
1229 VK_SHADER_STAGE_COMPUTE_BIT);
1237 .
name =
"rangecoder_static_buf",
1238 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1239 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1240 .mem_layout =
"scalar",
1241 .buf_content =
"uint8_t zero_one_state[512];",
1244 .name =
"quant_buf",
1245 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1246 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1247 .mem_layout =
"scalar",
1248 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1249 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1258 .
name =
"slice_data_buf",
1259 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1260 .mem_quali =
"readonly",
1261 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1262 .buf_content =
"SliceContext slice_ctx",
1263 .buf_elems =
f->max_slice_count,
1293 void *spv_opaque =
NULL;
1297 VK_SHADER_STAGE_COMPUTE_BIT,
1298 (
const char *[]) {
"GL_EXT_buffer_reference",
1299 "GL_EXT_buffer_reference2" }, 2,
1312 if (use_cached_reader)
1317 .
name =
"rangecoder_static_buf",
1318 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1319 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1320 .mem_layout =
"scalar",
1321 .buf_content =
"uint8_t zero_one_state[512];",
1324 .name =
"quant_buf",
1325 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1326 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1327 .mem_layout =
"scalar",
1328 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1329 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1332 .name =
"crc_ieee_buf",
1333 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1334 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1335 .mem_layout =
"scalar",
1336 .buf_content =
"uint32_t crc_ieee[256];",
1346 .
name =
"slice_data_buf",
1347 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1348 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1349 .buf_content =
"SliceContext slice_ctx",
1350 .buf_elems =
f->max_slice_count,
1354 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1359 .mem_quali =
"readonly",
1360 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1363 .name =
"results_data_buf",
1364 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1365 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1366 .mem_quali =
"writeonly",
1367 .buf_content =
"uint64_t slice_results[2048];",
1377 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1381 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1404 size_t maxsize, max_heap_size, max_host_size;
1427 if (
f->bits_per_raw_sample > (
f->version > 3 ? 16 : 8)) {
1430 "forcing range coder\n");
1435 if (
f->version < 4 && avctx->
gop_size > 1) {
1446 if (
f->version == 4 &&
f->micro_version > 4)
1447 f->micro_version = 3;
1475 f->num_h_slices = w_sl;
1476 f->num_v_slices = h_sl;
1484 if (
f->num_h_slices <= 0 &&
f->num_v_slices <= 0) {
1490 f->num_h_slices = 32;
1491 f->num_v_slices = 32;
1493 }
else if (
f->num_h_slices &&
f->num_v_slices <= 0) {
1495 }
else if (
f->num_v_slices &&
f->num_h_slices <= 0) {
1499 f->num_h_slices =
FFMIN(
f->num_h_slices, avctx->
width);
1504 "by the standard is %i\n",
1510 f->max_slice_count =
f->num_h_slices *
f->num_v_slices;
1515 if (
f->version < 4) {
1516 if (((
f->chroma_h_shift > 0) && (avctx->
width % (64 <<
f->chroma_h_shift))) ||
1517 ((
f->chroma_v_shift > 0) && (avctx->
height % (64 <<
f->chroma_v_shift)))) {
1519 "dimensions is only supported in version 4 (-level 4)\n");
1525 if (
f->version < 4) {
1548 for (
int i = 0;
i < fv->
s.
mprops.memoryHeapCount;
i++) {
1549 if (fv->
s.
mprops.memoryHeaps[
i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
1552 if (!(fv->
s.
mprops.memoryHeaps[
i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT))
1553 max_host_size =
FFMAX(max_host_size,
1559 if (maxsize > fv->
s.
props_11.maxMemoryAllocationSize) {
1561 "than maximum device allocation (%zu), clipping\n",
1562 maxsize, fv->
s.
props_11.maxMemoryAllocationSize);
1563 maxsize = fv->
s.
props_11.maxMemoryAllocationSize;
1566 if (max_heap_size < maxsize) {
1568 "using host memory (slower)\n",
1572 max_heap_size = max_host_size - (max_host_size >> 1);
1575 max_heap_size = max_heap_size - (max_heap_size >> 3);
1578 av_log(avctx,
AV_LOG_INFO,
"Async buffers: %zuMiB per context, %zuMiB total, depth: %i\n",
1579 maxsize / (1024*1024),
1601 spv = ff_vk_spirv_init();
1614 if (!fv->
is_rgb &&
f->bits_per_raw_sample > 8)
1646 "pixel format for RCT buffer!\n");
1685 &fv->
setup, 0, 0, 0,
1688 VK_FORMAT_UNDEFINED));
1695 VK_FORMAT_UNDEFINED));
1700 VK_FORMAT_UNDEFINED));
1705 VK_FORMAT_UNDEFINED));
1770 #define OFFSET(x) offsetof(VulkanEncodeFFv1Context, x)
1771 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1774 { .i64 = -1 }, -1, 2,
VE },
1776 { .i64 = 0 }, 0, 1,
VE },
1786 { .i64 = -1 }, -1, 2,
VE , .unit =
"qtable"},
1790 { .i64 =
QTABLE_8BIT }, INT_MIN, INT_MAX,
VE, .unit =
"qtable" },
1800 { .i64 = 0 }, 0, 1,
VE },
1802 {
"rct_search",
"Run a search for RCT parameters (level 4 only)",
OFFSET(optimize_rct),
AV_OPT_TYPE_BOOL,
1803 { .i64 = 1 }, 0, 1,
VE },
1806 { .i64 = 1 }, 1, INT_MAX,
VE },
1829 .
p.
name =
"ffv1_vulkan",
1847 .p.wrapper_name =
"vulkan",