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,
247 memcpy(pd.fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
252 VK_SHADER_STAGE_COMPUTE_BIT,
275 uint32_t plane_state_size;
276 uint32_t slice_state_size;
277 uint32_t slice_data_size;
286 int has_inter = avctx->
gop_size > 1;
287 uint32_t context_count =
f->context_count[
f->context_model];
296 VkImageMemoryBarrier2 img_bar[37];
298 VkBufferMemoryBarrier2 buf_bar[8];
305 f->cur_enc_frame = pict;
314 f->slice_count =
f->max_slice_count;
318 plane_state_size = 8;
322 plane_state_size *= context_count;
323 slice_state_size = plane_state_size*
f->plane_count;
325 slice_data_size = 256;
326 slice_state_size += slice_data_size;
327 slice_state_size =
FFALIGN(slice_state_size, 8);
331 if (!slice_data_ref) {
334 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
335 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
336 NULL, slice_state_size*
f->slice_count,
337 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
349 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
350 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
351 NULL, 2*
f->slice_count*
sizeof(uint64_t),
352 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
353 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
364 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
365 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
366 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
368 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
369 (maxsize < fv->max_heap_size ?
370 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT : 0x0) |
372 VK_MEMORY_PROPERTY_HOST_CACHED_BIT : 0x0)));
378 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
379 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
384 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
385 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
386 VK_ACCESS_SHADER_READ_BIT,
387 VK_IMAGE_LAYOUT_GENERAL,
388 VK_QUEUE_FAMILY_IGNORED);
400 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
401 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
411 0, slice_data_size*
f->slice_count,
412 VK_FORMAT_UNDEFINED);
416 VK_IMAGE_LAYOUT_GENERAL,
421 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
422 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
423 .srcStageMask = slice_data_buf->
stage,
424 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
425 .srcAccessMask = slice_data_buf->
access,
426 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
427 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
428 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
429 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
430 .buffer = slice_data_buf->
buf,
431 .size = VK_WHOLE_SIZE,
439 slice_data_buf, slice_data_size));
441 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
442 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
443 .srcStageMask = slice_data_buf->
stage,
444 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
445 .srcAccessMask = slice_data_buf->
access,
446 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
447 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
448 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
449 .buffer = slice_data_buf->
buf,
450 .size = slice_data_size*
f->slice_count,
455 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
456 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
457 .pImageMemoryBarriers = img_bar,
458 .imageMemoryBarrierCount = nb_img_bar,
459 .pBufferMemoryBarriers = buf_bar,
460 .bufferMemoryBarrierCount = nb_buf_bar,
464 slice_data_buf->
stage = buf_bar[0].dstStageMask;
465 slice_data_buf->
access = buf_bar[0].dstAccessMask;
473 .out_data = out_data_buf->
address,
474 .bits_per_raw_sample =
f->bits_per_raw_sample,
477 .chroma_shift[0] =
f->chroma_h_shift,
478 .chroma_shift[1] =
f->chroma_v_shift,
479 .plane_state_size = plane_state_size,
480 .context_count = context_count,
482 .rct_offset = 1 <<
f->bits_per_raw_sample,
483 .slice_size_max = out_data_buf->
size /
f->slice_count,
485 .version =
f->version,
486 .micro_version =
f->micro_version,
488 .key_frame =
f->key_frame,
491 .codec_planes =
f->plane_count,
494 .transparency =
f->transparency,
495 .colorspace =
f->colorspace,
507 memcpy(pd.
fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
511 for (
int i = 0;
i <
f->quant_table_count;
i++)
513 (
f->quant_tables[
i][4][127] != 0);
515 VK_SHADER_STAGE_COMPUTE_BIT,
522 vk->CmdClearColorImage(exec->
buf, vkf->
img[0], VK_IMAGE_LAYOUT_GENERAL,
523 &((VkClearColorValue) { 0 }),
524 1, &((VkImageSubresourceRange) {
525 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
532 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
533 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
534 .srcStageMask = slice_data_buf->
stage,
535 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
536 .srcAccessMask = slice_data_buf->
access,
537 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
538 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
539 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
540 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
541 .buffer = slice_data_buf->
buf,
542 .size = slice_data_size*
f->slice_count,
546 if (
f->key_frame ||
f->version > 3) {
552 0, slice_data_size*
f->slice_count,
553 VK_FORMAT_UNDEFINED);
559 .plane_state_size = plane_state_size,
560 .codec_planes =
f->plane_count,
561 .key_frame =
f->key_frame,
563 for (
int i = 0;
i <
f->quant_table_count;
i++)
567 VK_SHADER_STAGE_COMPUTE_BIT,
568 0,
sizeof(pd_reset), &pd_reset);
571 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
572 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
573 .pBufferMemoryBarriers = buf_bar,
574 .bufferMemoryBarrierCount = nb_buf_bar,
576 slice_data_buf->
stage = buf_bar[0].dstStageMask;
577 slice_data_buf->
access = buf_bar[0].dstAccessMask;
585 if (
f->key_frame ||
f->version > 3) {
587 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
588 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
589 .srcStageMask = slice_data_buf->
stage,
590 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
591 .srcAccessMask = slice_data_buf->
access,
592 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
593 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
594 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
595 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
596 .buffer = slice_data_buf->
buf,
597 .size = slice_data_buf->
size - slice_data_size*
f->slice_count,
598 .offset = slice_data_size*
f->slice_count,
604 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
605 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
606 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
607 VK_IMAGE_LAYOUT_GENERAL,
608 VK_QUEUE_FAMILY_IGNORED);
612 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
613 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
614 .pImageMemoryBarriers = img_bar,
615 .imageMemoryBarrierCount = nb_img_bar,
616 .pBufferMemoryBarriers = buf_bar,
617 .bufferMemoryBarrierCount = nb_buf_bar,
621 slice_data_buf->
stage = buf_bar[0].dstStageMask;
622 slice_data_buf->
access = buf_bar[0].dstAccessMask;
630 0, slice_data_size*
f->slice_count,
631 VK_FORMAT_UNDEFINED);
635 VK_IMAGE_LAYOUT_GENERAL,
640 0, results_data_buf->
size,
641 VK_FORMAT_UNDEFINED);
646 VK_IMAGE_LAYOUT_GENERAL,
651 VK_SHADER_STAGE_COMPUTE_BIT,
675 VkBufferCopy *buf_regions,
int nb_regions,
689 VkBufferMemoryBarrier2 buf_bar[8];
693 VK_BUFFER_USAGE_TRANSFER_DST_BIT);
710 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
711 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
712 .srcStageMask = out_data_buf->
stage,
713 .dstStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT,
714 .srcAccessMask = out_data_buf->
access,
715 .dstAccessMask = VK_ACCESS_2_TRANSFER_READ_BIT,
716 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
717 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
718 .buffer = out_data_buf->
buf,
719 .size = VK_WHOLE_SIZE,
722 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
723 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
724 .pBufferMemoryBarriers = buf_bar,
725 .bufferMemoryBarrierCount = nb_buf_bar,
727 out_data_buf->
stage = buf_bar[0].dstStageMask;
728 out_data_buf->
access = buf_bar[0].dstAccessMask;
731 for (
int i = 0;
i < nb_regions;
i++)
732 buf_regions[
i].dstOffset += mapped_buf->virtual_offset;
734 vk->CmdCopyBuffer(exec->
buf,
735 out_data_buf->
buf, mapped_buf->buf,
736 nb_regions, buf_regions);
766 if (!(results_data_buf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
767 VkMappedMemoryRange invalidate_data = {
768 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
769 .memory = results_data_buf->mem,
771 .size = VK_WHOLE_SIZE,
774 1, &invalidate_data);
779 for (
int i = 0;
i <
f->slice_count;
i++) {
780 sc = &((uint64_t *)results_data_buf->mapped_mem)[
i*2];
782 "src offset = %"PRIu64
"\n",
819 if (!(out_data_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
820 VkMappedMemoryRange invalidate_data = {
821 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
822 .memory = out_data_buf->
mem,
824 .size = VK_WHOLE_SIZE,
827 1, &invalidate_data);
831 for (
int i = 0;
i <
f->slice_count;
i++) {
833 memcpy(
pkt->
data + region->dstOffset,
915 vk_frames = frames_ctx->
hwctx;
916 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
917 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
918 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
919 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
998 GLSLF(0, #define
TYPE int%i_t ,smp_bits);
999 GLSLF(0, #define VTYPE2
i%ivec2 ,smp_bits);
1000 GLSLF(0, #define VTYPE3
i%ivec3 ,smp_bits);
1019 void *spv_opaque =
NULL;
1022 VK_SHADER_STAGE_COMPUTE_BIT,
1023 (
const char *[]) {
"GL_EXT_buffer_reference",
1024 "GL_EXT_buffer_reference2",
1025 "GL_EXT_null_initializer" }, 3,
1032 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
1033 GLSLC(1, ivec4 fmt_lut; );
1034 GLSLC(1,
int rct_offset; );
1035 GLSLC(1, uint8_t planar_rgb; );
1036 GLSLC(1, uint8_t transparency; );
1037 GLSLC(1, uint8_t key_frame; );
1038 GLSLC(1, uint8_t force_pcm; );
1040 GLSLC(1, uint8_t micro_version; );
1041 GLSLC(1, uint8_t padding[3]; );
1044 VK_SHADER_STAGE_COMPUTE_BIT);
1053 .
name =
"rangecoder_static_buf",
1054 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1055 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1056 .mem_layout =
"scalar",
1057 .buf_content =
"uint8_t zero_one_state[512];",
1060 .name =
"quant_buf",
1061 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1062 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1063 .mem_layout =
"scalar",
1064 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1065 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1074 .
name =
"slice_data_buf",
1075 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1076 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1077 .buf_content =
"SliceContext slice_ctx",
1078 .buf_elems =
f->max_slice_count,
1082 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1087 .mem_quali =
"readonly",
1088 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1118 void *spv_opaque =
NULL;
1121 VK_SHADER_STAGE_COMPUTE_BIT,
1122 (
const char *[]) {
"GL_EXT_buffer_reference",
1123 "GL_EXT_buffer_reference2" }, 2,
1138 .
name =
"rangecoder_static_buf",
1139 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1140 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1141 .mem_layout =
"scalar",
1142 .buf_content =
"uint8_t zero_one_state[512];",
1145 .name =
"quant_buf",
1146 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1147 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1148 .mem_layout =
"scalar",
1149 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1150 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1159 .
name =
"slice_data_buf",
1160 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1161 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1162 .buf_content =
"SliceContext slice_ctx",
1163 .buf_elems =
f->max_slice_count,
1167 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1172 .mem_quali =
"readonly",
1173 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1203 void *spv_opaque =
NULL;
1204 int wg_dim =
FFMIN(fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0], 1024);
1207 VK_SHADER_STAGE_COMPUTE_BIT,
1208 (
const char *[]) {
"GL_EXT_buffer_reference",
1209 "GL_EXT_buffer_reference2" }, 2,
1216 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
1218 GLSLC(1, u8buf slice_state; );
1219 GLSLC(1, uint plane_state_size; );
1220 GLSLC(1, uint8_t codec_planes; );
1221 GLSLC(1, uint8_t key_frame; );
1223 GLSLC(1, uint8_t micro_version; );
1224 GLSLC(1, uint8_t padding[1]; );
1227 VK_SHADER_STAGE_COMPUTE_BIT);
1235 .
name =
"rangecoder_static_buf",
1236 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1237 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1238 .mem_layout =
"scalar",
1239 .buf_content =
"uint8_t zero_one_state[512];",
1242 .name =
"quant_buf",
1243 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1244 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1245 .mem_layout =
"scalar",
1246 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1247 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1256 .
name =
"slice_data_buf",
1257 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1258 .mem_quali =
"readonly",
1259 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1260 .buf_content =
"SliceContext slice_ctx",
1261 .buf_elems =
f->max_slice_count,
1291 void *spv_opaque =
NULL;
1296 VK_SHADER_STAGE_COMPUTE_BIT,
1297 (
const char *[]) {
"GL_EXT_buffer_reference",
1298 "GL_EXT_buffer_reference2" }, 2,
1311 if (use_cached_reader)
1316 .
name =
"rangecoder_static_buf",
1317 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1318 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1319 .mem_layout =
"scalar",
1320 .buf_content =
"uint8_t zero_one_state[512];",
1323 .name =
"quant_buf",
1324 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1325 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1326 .mem_layout =
"scalar",
1327 .buf_content =
"int16_t quant_table[MAX_QUANT_TABLES]"
1328 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
1331 .name =
"crc_ieee_buf",
1332 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1333 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1334 .mem_layout =
"scalar",
1335 .buf_content =
"uint32_t crc_ieee[256];",
1345 .
name =
"slice_data_buf",
1346 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1347 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1348 .buf_content =
"SliceContext slice_ctx",
1349 .buf_elems =
f->max_slice_count,
1353 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1358 .mem_quali =
"readonly",
1359 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1362 .name =
"results_data_buf",
1363 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1364 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1365 .mem_quali =
"writeonly",
1366 .buf_content =
"uint64_t slice_results[2048];",
1369 .name =
"placeholder",
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",