1 /*
2 * Copyright (c) 2024 Lynne <dev@lynne.ee>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
23
28
29 #define RGB_LINECACHE 2
30
38
42 .queue_flags = VK_QUEUE_COMPUTE_BIT,
43 };
44
47
52
56
60
63
67
71
76
80
84
88
106
108 {
109 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
110 GLSLC(1, u8buf slice_data; );
111 GLSLC(1, u8buf slice_state; );
113 GLSLC(1, ivec4 fmt_lut; );
114 GLSLC(1, uvec2 img_size; );
115 GLSLC(1, uvec2 chroma_shift; );
117 GLSLC(1, uint plane_state_size; );
118 GLSLC(1, uint32_t crcref; );
119 GLSLC(1,
int rct_offset; );
121 GLSLC(1, uint8_t extend_lookup[8]; );
122 GLSLC(1, uint8_t bits_per_raw_sample; );
123 GLSLC(1, uint8_t quant_table_count; );
125 GLSLC(1, uint8_t micro_version; );
126 GLSLC(1, uint8_t key_frame; );
128 GLSLC(1, uint8_t codec_planes; );
129 GLSLC(1, uint8_t color_planes; );
130 GLSLC(1, uint8_t transparency; );
131 GLSLC(1, uint8_t planar_rgb; );
132 GLSLC(1, uint8_t colorspace; );
133 GLSLC(1, uint8_t ec; );
134 GLSLC(1, uint8_t golomb; );
135 GLSLC(1, uint8_t check_crc; );
136 GLSLC(1, uint8_t padding[3]; );
139 VK_SHADER_STAGE_COMPUTE_BIT);
140 }
141
146 {
147 int err;
152
155
158
159 int max_contexts;
162
164
165 max_contexts = 0;
166 for (
int i = 0;
i <
f->quant_table_count;
i++)
167 max_contexts =
FFMAX(
f->context_count[
i], max_contexts);
168
169 /* Allocate slice buffer data */
172 else
174
177
178 fp->
slice_data_size = 256;
/* Overestimation for the SliceContext struct */
181
183
184 /* Host map the input slices data if supported */
187 buffer_ref,
188 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
189 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
190
191 /* Allocate slice state data */
195 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
196 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
198 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
199 if (err < 0)
200 return err;
201 } else {
206 }
207
208 /* Allocate slice offsets buffer */
211 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
212 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
213 NULL, 2*
f->slice_count*
sizeof(uint32_t),
214 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
215 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
216 if (err < 0)
217 return err;
218
219 /* Allocate slice status buffer */
222 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
223 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
224 NULL, 2*
f->slice_count*
sizeof(uint32_t),
225 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
226 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
227 if (err < 0)
228 return err;
229
230 /* Prepare frame to be used */
233 if (err < 0)
234 return err;
235
236 /* Create a temporaty frame for RGB */
237 if (is_rgb) {
241
244 if (err < 0)
245 return err;
246 }
247
248 return 0;
249 }
250
254 {
256
259
262
263 if (slices_buf && slices_buf->host_ref) {
265 data - slices_buf->mapped_mem);
268
270 } else {
274 if (err < 0)
275 return err;
276
281 }
282
283 return 0;
284 }
285
287 {
288 int err;
292
297
300
301 int bits =
f->avctx->bits_per_raw_sample > 0 ?
f->avctx->bits_per_raw_sample : 8;
305
308
311
316
318
320 VkImageView *decode_dst_view = is_rgb ? rct_image_views : vp->
view.
out;
321
322 VkImageMemoryBarrier2 img_bar[37];
323 int nb_img_bar = 0;
324 VkBufferMemoryBarrier2 buf_bar[8];
325 int nb_buf_bar = 0;
326
329
330 /* Prepare deps */
332 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
333 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
334
337 if (err < 0)
338 return err;
339
340 if (is_rgb) {
344 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
345 VK_PIPELINE_STAGE_2_CLEAR_BIT));
347 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
348 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
349 VK_ACCESS_2_TRANSFER_WRITE_BIT,
350 VK_IMAGE_LAYOUT_GENERAL,
351 VK_QUEUE_FAMILY_IGNORED);
352 }
353
357
358 /* Wait on the previous frame */
360 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT));
361 }
362
369
370 /* Entry barrier for the slice state */
371 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
372 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
373 .srcStageMask = slice_state->stage,
374 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
375 .srcAccessMask = slice_state->access,
376 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
377 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
378 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
379 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
380 .buffer = slice_state->buf,
381 .offset = 0,
383 };
384
385 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
386 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
387 .pImageMemoryBarriers = img_bar,
388 .imageMemoryBarrierCount = nb_img_bar,
389 .pBufferMemoryBarriers = buf_bar,
390 .bufferMemoryBarrierCount = nb_buf_bar,
391 });
392 slice_state->stage = buf_bar[0].dstStageMask;
393 slice_state->access = buf_bar[0].dstAccessMask;
394 nb_buf_bar = 0;
395 nb_img_bar = 0;
396
397 /* Setup shader */
399 1, 0, 0,
400 slice_state,
402 VK_FORMAT_UNDEFINED);
404 1, 1, 0,
405 slice_offset,
406 0, 2*
f->slice_count*
sizeof(uint32_t),
407 VK_FORMAT_UNDEFINED);
409 1, 2, 0,
410 slice_status,
411 0, 2*
f->slice_count*
sizeof(uint32_t),
412 VK_FORMAT_UNDEFINED);
413
418
419 .img_size[0] =
f->picture.f->width,
420 .img_size[1] =
f->picture.f->height,
421 .chroma_shift[0] =
f->chroma_h_shift,
422 .chroma_shift[1] =
f->chroma_v_shift,
423
426 .rct_offset = 1 <<
bits,
427
428 .bits_per_raw_sample =
bits,
429 .quant_table_count =
f->quant_table_count,
430 .version =
f->version,
431 .micro_version =
f->micro_version,
434 .codec_planes =
f->plane_count,
435 .color_planes = color_planes,
436 .transparency =
f->transparency,
439 .colorspace =
f->colorspace,
443 };
444 for (
int i = 0;
i <
f->quant_table_count;
i++)
446 (
f->quant_tables[
i][4][127] != 0);
447
448
449 /* For some reason the C FFv1 encoder/decoder treats these differently */
452 memcpy(pd.
fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
454 memcpy(pd.
fmt_lut, (
int [4]) { 0, 2, 1, 3 }, 4*
sizeof(
int));
455 else
457
459 VK_SHADER_STAGE_COMPUTE_BIT,
460 0, sizeof(pd), &pd);
461
462 vk->CmdDispatch(exec->
buf,
f->num_h_slices,
f->num_v_slices, 1);
463
464 if (is_rgb) {
466 for (
int i = 0;
i < color_planes;
i++)
467 vk->CmdClearColorImage(exec->
buf, vkf->
img[
i], VK_IMAGE_LAYOUT_GENERAL,
468 &((VkClearColorValue) { 0 }),
469 1, &((VkImageSubresourceRange) {
470 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
471 .levelCount = 1,
472 .layerCount = 1,
473 }));
474 }
475
476 /* Reset shader */
479 1, 0, 0,
480 slice_state,
482 VK_FORMAT_UNDEFINED);
483
485
489 .codec_planes =
f->plane_count,
491 .version =
f->version,
492 .micro_version =
f->micro_version,
493 };
494 for (
int i = 0;
i <
f->quant_table_count;
i++)
496
498 VK_SHADER_STAGE_COMPUTE_BIT,
499 0, sizeof(pd_reset), &pd_reset);
500
501 /* Sync between setup and reset shaders */
502 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
503 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
504 .srcStageMask = slice_state->stage,
505 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
506 .srcAccessMask = slice_state->access,
507 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT,
508 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
509 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
510 .buffer = slice_state->buf,
511 .offset = 0,
513 };
514 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
515 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
516 .pImageMemoryBarriers = img_bar,
517 .imageMemoryBarrierCount = nb_img_bar,
518 .pBufferMemoryBarriers = buf_bar,
519 .bufferMemoryBarrierCount = nb_buf_bar,
520 });
521 slice_state->stage = buf_bar[0].dstStageMask;
522 slice_state->access = buf_bar[0].dstAccessMask;
523 nb_buf_bar = 0;
524 nb_img_bar = 0;
525
526 vk->CmdDispatch(exec->
buf,
f->num_h_slices,
f->num_v_slices,
528
529 /* Decode */
532 1, 0, 0,
533 slice_state,
535 VK_FORMAT_UNDEFINED);
537 decode_dst, decode_dst_view,
538 1, 1,
539 VK_IMAGE_LAYOUT_GENERAL,
540 VK_NULL_HANDLE);
542 1, 2, 0,
543 slice_status,
544 0, 2*
f->slice_count*
sizeof(uint32_t),
545 VK_FORMAT_UNDEFINED);
546 if (is_rgb)
549 1, 3,
550 VK_IMAGE_LAYOUT_GENERAL,
551 VK_NULL_HANDLE);
552
555 VK_SHADER_STAGE_COMPUTE_BIT,
556 0, sizeof(pd), &pd);
557
558 /* Sync between reset and decode shaders */
559 buf_bar[nb_buf_bar++] = (VkBufferMemoryBarrier2) {
560 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
561 .srcStageMask = slice_state->stage,
562 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
563 .srcAccessMask = slice_state->access,
564 .dstAccessMask = VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
565 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
566 .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
567 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
568 .buffer = slice_state->buf,
571 };
572
573 /* Input frame barrier */
575 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
576 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
577 VK_ACCESS_SHADER_WRITE_BIT |
578 (!is_rgb ? VK_ACCESS_SHADER_READ_BIT : 0),
579 VK_IMAGE_LAYOUT_GENERAL,
580 VK_QUEUE_FAMILY_IGNORED);
581 if (is_rgb)
583 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
584 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
585 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
586 VK_IMAGE_LAYOUT_GENERAL,
587 VK_QUEUE_FAMILY_IGNORED);
588
589 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
590 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
591 .pImageMemoryBarriers = img_bar,
592 .imageMemoryBarrierCount = nb_img_bar,
593 .pBufferMemoryBarriers = buf_bar,
594 .bufferMemoryBarrierCount = nb_buf_bar,
595 });
596 slice_state->stage = buf_bar[0].dstStageMask;
597 slice_state->access = buf_bar[0].dstAccessMask;
598 nb_img_bar = 0;
599 nb_buf_bar = 0;
600
601 vk->CmdDispatch(exec->
buf,
f->num_h_slices,
f->num_v_slices, 1);
602
604 if (err < 0)
605 return err;
606
607 /* We don't need the temporary frame after decoding */
609
611 return 0;
612 }
613
615 {
616 int smp_bits = use32bit ? 32 : 16;
617
619
623
624 GLSLF(0, #define
TYPE int%i_t ,smp_bits);
625 GLSLF(0, #define VTYPE2
i%ivec2 ,smp_bits);
626 GLSLF(0, #define VTYPE3
i%ivec3 ,smp_bits);
629 }
630
634 {
635 int err;
637
638 uint8_t *spv_data;
639 size_t spv_len;
640 void *spv_opaque =
NULL;
641
643 VK_SHADER_STAGE_COMPUTE_BIT,
644 (const char *[]) { "GL_EXT_buffer_reference",
645 "GL_EXT_buffer_reference2" }, 2,
646 1, 1, 1,
647 0));
648
649 /* Common codec header */
651
653
657
659 {
660 .
name =
"rangecoder_static_buf",
661 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
662 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
663 .mem_layout = "scalar",
664 .buf_content = "uint8_t zero_one_state[512];",
665 },
666 {
667 .name = "crc_ieee_buf",
668 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
669 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
670 .mem_layout = "scalar",
671 .buf_content = "uint32_t crc_ieee[256];",
672 },
673 {
674 .name = "quant_buf",
675 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
676 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
677 .mem_layout = "scalar",
678 .buf_content = "int16_t quant_table[MAX_QUANT_TABLES]"
679 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
680 },
681 };
682
684
686
688 {
689 .
name =
"slice_data_buf",
690 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
691 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
692 .buf_content = "SliceContext slice_ctx",
693 .buf_elems =
f->max_slice_count,
694 },
695 {
696 .name = "slice_offsets_buf",
697 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
698 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
699 .mem_quali = "readonly",
700 .buf_content = "u32vec2 slice_offsets",
701 .buf_elems = 2*
f->max_slice_count,
702 },
703 {
704 .name = "slice_status_buf",
705 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
706 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
707 .mem_quali = "writeonly",
708 .buf_content = "uint32_t slice_status",
709 .buf_elems = 2*
f->max_slice_count,
710 },
711 };
713
715
717 &spv_opaque));
719
721
723 if (spv_opaque)
725
726 return err;
727 }
728
732 {
733 int err;
735
736 uint8_t *spv_data;
737 size_t spv_len;
738 void *spv_opaque =
NULL;
739 int wg_dim =
FFMIN(
s->props.properties.limits.maxComputeWorkGroupSize[0], 1024);
740
742 VK_SHADER_STAGE_COMPUTE_BIT,
743 (const char *[]) { "GL_EXT_buffer_reference",
744 "GL_EXT_buffer_reference2" }, 2,
745 wg_dim, 1, 1,
746 0));
747
750
751 /* Common codec header */
753
754 GLSLC(0,
layout(push_constant, scalar) uniform pushConstants { );
756 GLSLC(1, u8buf slice_state; );
757 GLSLC(1, uint plane_state_size; );
758 GLSLC(1, uint8_t codec_planes; );
759 GLSLC(1, uint8_t key_frame; );
761 GLSLC(1, uint8_t micro_version; );
762 GLSLC(1, uint8_t padding[1]; );
765 VK_SHADER_STAGE_COMPUTE_BIT);
766
770
772 {
773 .
name =
"rangecoder_static_buf",
774 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
775 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
776 .mem_layout = "scalar",
777 .buf_content = "uint8_t zero_one_state[512];",
778 },
779 {
780 .name = "quant_buf",
781 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
782 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
783 .mem_layout = "scalar",
784 .buf_content = "int16_t quant_table[MAX_QUANT_TABLES]"
785 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
786 },
787 };
789
793
795 {
796 .
name =
"slice_data_buf",
797 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
798 .mem_quali = "readonly",
799 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
800 .buf_content = "SliceContext slice_ctx",
801 .buf_elems =
f->max_slice_count,
802 },
803 };
805
807
809 &spv_opaque));
811
813
815 if (spv_opaque)
817
818 return err;
819 }
820
826 int use32bit,
int ac,
int rgb)
827 {
828 int err;
830
831 uint8_t *spv_data;
832 size_t spv_len;
833 void *spv_opaque =
NULL;
835 s->driver_props.driverID == VK_DRIVER_ID_MESA_RADV;
836
838 VK_SHADER_STAGE_COMPUTE_BIT,
839 (const char *[]) { "GL_EXT_buffer_reference",
840 "GL_EXT_buffer_reference2" }, 2,
842 0));
843
846
849
850 if (use_cached_reader)
852
853 /* Common codec header */
855
857
861
863 {
864 .
name =
"rangecoder_static_buf",
865 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
866 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
867 .mem_layout = "scalar",
868 .buf_content = "uint8_t zero_one_state[512];",
869 },
870 {
871 .name = "quant_buf",
872 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
873 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
874 .mem_layout = "scalar",
875 .buf_content = "int16_t quant_table[MAX_QUANT_TABLES]"
876 "[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];",
877 },
878 };
879
881
885
887 {
888 .
name =
"slice_data_buf",
889 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
890 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
891 .buf_content = "SliceContext slice_ctx",
892 .buf_elems =
f->max_slice_count,
893 },
894 {
895 .name = "dec",
896 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
897 .dimensions = 2,
901 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
902 },
903 {
904 .name = "slice_status_buf",
905 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
906 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
907 .mem_quali = "writeonly",
908 .buf_content = "uint32_t slice_status",
909 .buf_elems = 2*
f->max_slice_count,
910 },
911 {
912 .name = "dst",
913 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
914 .dimensions = 2,
917 .mem_quali = "writeonly",
919 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
920 },
921 };
923
925
927 &spv_opaque));
929
931
933 if (spv_opaque)
935
936 return err;
937 }
938
941 {
942 int err;
946
950
954 frames_ctx->
width =
s->frames->width;
956
957 vk_frames = frames_ctx->
hwctx;
958 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
959 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
960 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
961 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
962
964 if (err < 0) {
968 return err;
969 }
970
971 return 0;
972 }
973
975 {
977
979
980 for (
int i = 0;
i < 2;
i++)
/* 16/32 bit */
982
983 for (
int i = 0;
i < 2;
i++)
/* AC/Golomb */
985
986 for (
int i = 0;
i < 2;
i++)
/* 16/32 bit */
987 for (int j = 0; j < 2; j++) /* AC/Golomb */
988 for (int k = 0; k < 2; k++) /* Normal/RGB */
990
994
998
1000 }
1001
1003 {
1004 int err;
1010
1011 if (
f->version < 3 ||
1012 (
f->version == 4 &&
f->micro_version > 3))
1014
1015 spv = ff_vk_spirv_init();
1016 if (!spv) {
1019 }
1020
1022 if (err < 0)
1023 return err;
1025
1027 if (!fv) {
1030 }
1031
1033
1034 /* Intermediate frame pool for RCT */
1035 for (
int i = 0;
i < 2;
i++) {
/* 16/32 bit */
1038 }
1039
1040 /* Setup shader */
1042
1043 /* Reset shaders */
1044 for (
int i = 0;
i < 2;
i++) {
/* AC/Golomb */
1047 }
1048
1049 /* Decode shaders */
1050 for (
int i = 0;
i < 2;
i++) {
/* 16/32 bit */
1051 for (int j = 0; j < 2; j++) { /* AC/Golomb */
1052 for (int k = 0; k < 2; k++) { /* Normal/RGB */
1058 dec_frames_ctx,
1062 k));
1063 }
1064 }
1065 }
1066
1067 /* Range coder data */
1071
1072 /* Quantization table data */
1076
1077 /* CRC table buffer */
1081
1082 /* Update setup global descriptors */
1084 &fv->
setup, 0, 0, 0,
1087 VK_FORMAT_UNDEFINED));
1089 &fv->
setup, 0, 1, 0,
1092 VK_FORMAT_UNDEFINED));
1093
1094 /* Update decode global descriptors */
1095 for (
int i = 0;
i < 2;
i++) {
/* 16/32 bit */
1096 for (int j = 0; j < 2; j++) { /* AC/Golomb */
1097 for (int k = 0; k < 2; k++) { /* Normal/RGB */
1099 &fv->
decode[
i][j][k], 0, 0, 0,
1102 VK_FORMAT_UNDEFINED));
1104 &fv->
decode[
i][j][k], 0, 1, 0,
1107 VK_FORMAT_UNDEFINED));
1108 }
1109 }
1110 }
1111
1114
1115 return err;
1116 }
1117
1119 {
1122
1126
1128
1129 /* Invalidate slice/output data if needed */
1130 if (!(slice_status->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
1131 VkMappedMemoryRange invalidate_data = {
1132 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1133 .memory = slice_status->
mem,
1134 .offset = 0,
1135 .size = 2*fp->
slice_num*
sizeof(uint32_t),
1136 };
1138 1, &invalidate_data);
1139 }
1140
1142 uint32_t crc_res = 0;
1149 }
1150
1155 }
1156
1158 .
p.
name =
"ffv1_vulkan",
1175 };