• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2017 Advanced Micro Devices, Inc.
4  *
5  * SPDX-License-Identifier: MIT
6  *
7  **************************************************************************/
8 
9 #include "radeon_vcn_dec.h"
10 
11 #include "pipe/p_video_codec.h"
12 #include "radeonsi/si_pipe.h"
13 #include "util/u_memory.h"
14 #include "util/u_video.h"
15 #include "vl/vl_mpeg12_decoder.h"
16 #include "vl/vl_probs_table.h"
17 #include "pspdecryptionparam.h"
18 
19 #include <assert.h>
20 #include <stdio.h>
21 
22 #include "ac_vcn_av1_default.h"
23 #include "ac_debug.h"
24 
25 #define FB_BUFFER_OFFSET             0x2000
26 #define FB_BUFFER_SIZE               2048
27 #define IT_SCALING_TABLE_SIZE        992
28 #define VP9_PROBS_TABLE_SIZE         (RDECODE_VP9_PROBS_DATA_SIZE + 256)
29 
30 #define NUM_MPEG2_REFS 6
31 #define NUM_H264_REFS  17
32 #define NUM_VC1_REFS   5
33 #define NUM_VP9_REFS   8
34 #define NUM_AV1_REFS   8
35 #define NUM_AV1_REFS_PER_FRAME 7
36 
37 static enum pipe_format get_buffer_format(struct radeon_decoder *dec);
38 static unsigned calc_dpb_size(struct radeon_decoder *dec);
39 static unsigned calc_ctx_size_h264_perf(struct radeon_decoder *dec);
40 static unsigned calc_ctx_size_h265_main(struct radeon_decoder *dec);
41 static unsigned calc_ctx_size_h265_main10(struct radeon_decoder *dec,
42                                           struct pipe_h265_picture_desc *pic);
43 
radeon_dec_destroy_associated_data(void * data)44 static void radeon_dec_destroy_associated_data(void *data)
45 {
46    /* NOOP, since we only use an intptr */
47 }
48 
get_current_pic_index(struct radeon_decoder * dec,struct pipe_video_buffer * target,unsigned char * curr_pic_idx)49 static void get_current_pic_index(struct radeon_decoder *dec,
50                                     struct pipe_video_buffer *target,
51                                     unsigned char *curr_pic_idx)
52 {
53    for (int i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
54       if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
55          if (target->codec != NULL)
56             *curr_pic_idx = (uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
57          else {
58             *curr_pic_idx = i;
59             vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
60                                                 &radeon_dec_destroy_associated_data);
61          }
62          break;
63       } else if (!dec->render_pic_list[i]) {
64          dec->render_pic_list[i] = target;
65          *curr_pic_idx = i;
66          vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
67                                              &radeon_dec_destroy_associated_data);
68          break;
69       }
70    }
71 }
72 
get_h264_msg(struct radeon_decoder * dec,struct pipe_video_buffer * target,struct pipe_h264_picture_desc * pic)73 static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec,
74                                            struct pipe_video_buffer *target,
75                                            struct pipe_h264_picture_desc *pic)
76 {
77    rvcn_dec_message_avc_t result;
78    unsigned i, j, k;
79 
80    memset(&result, 0, sizeof(result));
81    switch (pic->base.profile) {
82    case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
83    case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
84       result.profile = RDECODE_H264_PROFILE_BASELINE;
85       break;
86 
87    case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
88       result.profile = RDECODE_H264_PROFILE_MAIN;
89       break;
90 
91    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
92       result.profile = RDECODE_H264_PROFILE_HIGH;
93       break;
94 
95    default:
96       assert(0);
97       break;
98    }
99 
100    result.level = dec->base.level;
101 
102    result.sps_info_flags = 0;
103    result.sps_info_flags |= pic->pps->sps->direct_8x8_inference_flag << 0;
104    result.sps_info_flags |= pic->pps->sps->mb_adaptive_frame_field_flag << 1;
105    result.sps_info_flags |= pic->pps->sps->frame_mbs_only_flag << 2;
106    result.sps_info_flags |= pic->pps->sps->delta_pic_order_always_zero_flag << 3;
107    result.sps_info_flags |= ((dec->dpb_type == DPB_DYNAMIC_TIER_2) ? 0 : 1)
108                               << RDECODE_SPS_INFO_H264_EXTENSION_SUPPORT_FLAG_SHIFT;
109 
110    result.bit_depth_luma_minus8 = pic->pps->sps->bit_depth_luma_minus8;
111    result.bit_depth_chroma_minus8 = pic->pps->sps->bit_depth_chroma_minus8;
112    result.log2_max_frame_num_minus4 = pic->pps->sps->log2_max_frame_num_minus4;
113    result.pic_order_cnt_type = pic->pps->sps->pic_order_cnt_type;
114    result.log2_max_pic_order_cnt_lsb_minus4 = pic->pps->sps->log2_max_pic_order_cnt_lsb_minus4;
115 
116    switch (dec->base.chroma_format) {
117    case PIPE_VIDEO_CHROMA_FORMAT_NONE:
118       break;
119    case PIPE_VIDEO_CHROMA_FORMAT_400:
120       result.chroma_format = 0;
121       break;
122    case PIPE_VIDEO_CHROMA_FORMAT_420:
123       result.chroma_format = 1;
124       break;
125    case PIPE_VIDEO_CHROMA_FORMAT_422:
126       result.chroma_format = 2;
127       break;
128    case PIPE_VIDEO_CHROMA_FORMAT_444:
129       result.chroma_format = 3;
130       break;
131    case PIPE_VIDEO_CHROMA_FORMAT_440:
132       result.chroma_format = 4;
133       break;
134    }
135 
136    result.pps_info_flags = 0;
137    result.pps_info_flags |= pic->pps->transform_8x8_mode_flag << 0;
138    result.pps_info_flags |= pic->pps->redundant_pic_cnt_present_flag << 1;
139    result.pps_info_flags |= pic->pps->constrained_intra_pred_flag << 2;
140    result.pps_info_flags |= pic->pps->deblocking_filter_control_present_flag << 3;
141    result.pps_info_flags |= pic->pps->weighted_bipred_idc << 4;
142    result.pps_info_flags |= pic->pps->weighted_pred_flag << 6;
143    result.pps_info_flags |= pic->pps->bottom_field_pic_order_in_frame_present_flag << 7;
144    result.pps_info_flags |= pic->pps->entropy_coding_mode_flag << 8;
145 
146    result.num_slice_groups_minus1 = pic->pps->num_slice_groups_minus1;
147    result.slice_group_map_type = pic->pps->slice_group_map_type;
148    result.slice_group_change_rate_minus1 = pic->pps->slice_group_change_rate_minus1;
149    result.pic_init_qp_minus26 = pic->pps->pic_init_qp_minus26;
150    result.chroma_qp_index_offset = pic->pps->chroma_qp_index_offset;
151    result.second_chroma_qp_index_offset = pic->pps->second_chroma_qp_index_offset;
152 
153    memcpy(result.scaling_list_4x4, pic->pps->ScalingList4x4, 6 * 16);
154    memcpy(result.scaling_list_8x8, pic->pps->ScalingList8x8, 2 * 64);
155 
156    memcpy(dec->it, result.scaling_list_4x4, 6 * 16);
157    memcpy((dec->it + 96), result.scaling_list_8x8, 2 * 64);
158 
159    result.num_ref_frames = pic->num_ref_frames;
160 
161    result.num_ref_idx_l0_active_minus1 = pic->num_ref_idx_l0_active_minus1;
162    result.num_ref_idx_l1_active_minus1 = pic->num_ref_idx_l1_active_minus1;
163 
164    result.frame_num = pic->frame_num;
165    memcpy(result.frame_num_list, pic->frame_num_list, 4 * 16);
166    result.curr_field_order_cnt_list[0] = pic->field_order_cnt[0];
167    result.curr_field_order_cnt_list[1] = pic->field_order_cnt[1];
168    memcpy(result.field_order_cnt_list, pic->field_order_cnt_list, 4 * 16 * 2);
169    result.non_existing_frame_flags = 0;
170    result.used_for_reference_flags = 0;
171 
172    if (dec->dpb_type != DPB_DYNAMIC_TIER_2) {
173       result.decoded_pic_idx = pic->frame_num;
174       goto end;
175    }
176 
177    for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {
178       for (j = 0; (j < ARRAY_SIZE(pic->ref) && (pic->ref[j] != NULL)); j++) {
179          if (dec->render_pic_list[i] == pic->ref[j])
180             break;
181          if (j == ARRAY_SIZE(pic->ref) - 1)
182             dec->render_pic_list[i] = NULL;
183          else if (pic->ref[j + 1] == NULL)
184             dec->render_pic_list[i] = NULL;
185       }
186    }
187    for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
188       if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
189          if (target->codec != NULL){
190             result.decoded_pic_idx =
191                (uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
192          } else {
193             result.decoded_pic_idx = i;
194             vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
195                   &radeon_dec_destroy_associated_data);
196          }
197          break;
198       }
199    }
200    if (i == ARRAY_SIZE(dec->render_pic_list)) {
201       for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
202          if (!dec->render_pic_list[i]) {
203             dec->render_pic_list[i] = target;
204             result.decoded_pic_idx = i;
205             vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
206                   &radeon_dec_destroy_associated_data);
207             break;
208          }
209       }
210    }
211    for (i = 0; i < ARRAY_SIZE(result.ref_frame_list); i++) {
212       result.ref_frame_list[i] = pic->ref[i] ?
213               (uintptr_t)vl_video_buffer_get_associated_data(pic->ref[i], &dec->base) : 0xff;
214 
215       if (result.ref_frame_list[i] != 0xff) {
216          if (pic->top_is_reference[i])
217             result.used_for_reference_flags |= (1 << (2 * i));
218          if (pic->bottom_is_reference[i])
219             result.used_for_reference_flags |= (1 << (2 * i + 1));
220 
221          if (pic->is_long_term[i])
222             result.ref_frame_list[i] |= 0x80;
223 
224          result.curr_pic_ref_frame_num++;
225 
226          for (j = 0; j < ARRAY_SIZE(dec->h264_valid_ref_num); j++) {
227             if ((dec->h264_valid_ref_num[j] != (unsigned)-1)
228                 && (dec->h264_valid_ref_num[j] == result.frame_num_list[i]))
229                break;
230          }
231 
232          for (k = 0; k < ARRAY_SIZE(dec->h264_valid_poc_num); k++) {
233             if ((dec->h264_valid_poc_num[k] != (unsigned)-1)
234                   && ((dec->h264_valid_poc_num[k] == result.field_order_cnt_list[i][0])
235                     || dec->h264_valid_poc_num[k] == result.field_order_cnt_list[i][1]))
236                break;
237          }
238          if ((j == ARRAY_SIZE(dec->h264_valid_ref_num)) && (k == ARRAY_SIZE(dec->h264_valid_poc_num))) {
239             result.non_existing_frame_flags |= 1 << i;
240             result.curr_pic_ref_frame_num--;
241             result.ref_frame_list[i] = 0xff;
242          }
243       }
244    }
245 
246    /* need at least one reference for P/B frames */
247    if (result.curr_pic_ref_frame_num == 0 && pic->slice_parameter.slice_info_present) {
248       for (i = 0; i < pic->slice_count; i++) {
249          if (pic->slice_parameter.slice_type[i] % 5 != 2) {
250             result.curr_pic_ref_frame_num++;
251             result.ref_frame_list[0] = 0;
252             result.non_existing_frame_flags &= ~1;
253             break;
254          }
255       }
256    }
257 
258    for (i = 0; i < ARRAY_SIZE(result.ref_frame_list); i++) {
259       if (result.ref_frame_list[i] != 0xff) {
260          dec->h264_valid_ref_num[i]         = result.frame_num_list[i];
261          dec->h264_valid_poc_num[2 * i]     = pic->top_is_reference[i] ?
262                       result.field_order_cnt_list[i][0] : (unsigned) -1;
263          dec->h264_valid_poc_num[2 * i + 1] = pic->bottom_is_reference[i] ?
264                       result.field_order_cnt_list[i][1] : (unsigned) -1;
265       } else {
266          dec->h264_valid_ref_num[i]         =
267          dec->h264_valid_poc_num[2 * i]     =
268          dec->h264_valid_poc_num[2 * i + 1] = (unsigned) -1;
269       }
270    }
271 
272    dec->h264_valid_ref_num[ARRAY_SIZE(dec->h264_valid_ref_num) - 1] = result.frame_num;
273    dec->h264_valid_poc_num[ARRAY_SIZE(dec->h264_valid_poc_num) - 2] =
274                      pic->field_pic_flag && pic->bottom_field_flag ?
275                      (unsigned) -1 : result.curr_field_order_cnt_list[0];
276    dec->h264_valid_poc_num[ARRAY_SIZE(dec->h264_valid_poc_num) - 1] =
277                      pic->field_pic_flag && !pic->bottom_field_flag ?
278                      (unsigned) -1 : result.curr_field_order_cnt_list[1];
279 
280    if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {
281       dec->ref_codec.bts = CODEC_8_BITS;
282       dec->ref_codec.index = result.decoded_pic_idx;
283       dec->ref_codec.ref_size = 16;
284       dec->ref_codec.num_refs = result.curr_pic_ref_frame_num;
285       STATIC_ASSERT(sizeof(dec->ref_codec.ref_list) == sizeof(result.ref_frame_list));
286       memcpy(dec->ref_codec.ref_list, result.ref_frame_list, sizeof(result.ref_frame_list));
287    }
288 
289 end:
290    return result;
291 }
292 
get_h265_msg(struct radeon_decoder * dec,struct pipe_video_buffer * target,struct pipe_h265_picture_desc * pic)293 static rvcn_dec_message_hevc_t get_h265_msg(struct radeon_decoder *dec,
294                                             struct pipe_video_buffer *target,
295                                             struct pipe_h265_picture_desc *pic)
296 {
297    rvcn_dec_message_hevc_t result;
298    unsigned i, j, num_refs = 0;
299 
300    memset(&result, 0, sizeof(result));
301    result.sps_info_flags = 0;
302    result.sps_info_flags |= pic->pps->sps->scaling_list_enabled_flag << 0;
303    result.sps_info_flags |= pic->pps->sps->amp_enabled_flag << 1;
304    result.sps_info_flags |= pic->pps->sps->sample_adaptive_offset_enabled_flag << 2;
305    result.sps_info_flags |= pic->pps->sps->pcm_enabled_flag << 3;
306    result.sps_info_flags |= pic->pps->sps->pcm_loop_filter_disabled_flag << 4;
307    result.sps_info_flags |= pic->pps->sps->long_term_ref_pics_present_flag << 5;
308    result.sps_info_flags |= pic->pps->sps->sps_temporal_mvp_enabled_flag << 6;
309    result.sps_info_flags |= pic->pps->sps->strong_intra_smoothing_enabled_flag << 7;
310    result.sps_info_flags |= pic->pps->sps->separate_colour_plane_flag << 8;
311    if (((struct si_screen *)dec->screen)->info.family == CHIP_CARRIZO)
312       result.sps_info_flags |= 1 << 9;
313    if (pic->UseRefPicList == true) {
314       result.sps_info_flags |= 1 << 10;
315       result.sps_info_flags |= 1 << 12;
316    }
317    if (pic->UseStRpsBits == true && pic->pps->st_rps_bits != 0) {
318       result.sps_info_flags |= 1 << 11;
319       result.st_rps_bits = pic->pps->st_rps_bits;
320    }
321 
322    result.chroma_format = pic->pps->sps->chroma_format_idc;
323    result.bit_depth_luma_minus8 = pic->pps->sps->bit_depth_luma_minus8;
324    result.bit_depth_chroma_minus8 = pic->pps->sps->bit_depth_chroma_minus8;
325    result.log2_max_pic_order_cnt_lsb_minus4 = pic->pps->sps->log2_max_pic_order_cnt_lsb_minus4;
326    result.sps_max_dec_pic_buffering_minus1 = pic->pps->sps->sps_max_dec_pic_buffering_minus1;
327    result.log2_min_luma_coding_block_size_minus3 =
328       pic->pps->sps->log2_min_luma_coding_block_size_minus3;
329    result.log2_diff_max_min_luma_coding_block_size =
330       pic->pps->sps->log2_diff_max_min_luma_coding_block_size;
331    result.log2_min_transform_block_size_minus2 =
332       pic->pps->sps->log2_min_transform_block_size_minus2;
333    result.log2_diff_max_min_transform_block_size =
334       pic->pps->sps->log2_diff_max_min_transform_block_size;
335    result.max_transform_hierarchy_depth_inter = pic->pps->sps->max_transform_hierarchy_depth_inter;
336    result.max_transform_hierarchy_depth_intra = pic->pps->sps->max_transform_hierarchy_depth_intra;
337    result.pcm_sample_bit_depth_luma_minus1 = pic->pps->sps->pcm_sample_bit_depth_luma_minus1;
338    result.pcm_sample_bit_depth_chroma_minus1 = pic->pps->sps->pcm_sample_bit_depth_chroma_minus1;
339    result.log2_min_pcm_luma_coding_block_size_minus3 =
340       pic->pps->sps->log2_min_pcm_luma_coding_block_size_minus3;
341    result.log2_diff_max_min_pcm_luma_coding_block_size =
342       pic->pps->sps->log2_diff_max_min_pcm_luma_coding_block_size;
343    result.num_short_term_ref_pic_sets = pic->pps->sps->num_short_term_ref_pic_sets;
344 
345    result.pps_info_flags = 0;
346    result.pps_info_flags |= pic->pps->dependent_slice_segments_enabled_flag << 0;
347    result.pps_info_flags |= pic->pps->output_flag_present_flag << 1;
348    result.pps_info_flags |= pic->pps->sign_data_hiding_enabled_flag << 2;
349    result.pps_info_flags |= pic->pps->cabac_init_present_flag << 3;
350    result.pps_info_flags |= pic->pps->constrained_intra_pred_flag << 4;
351    result.pps_info_flags |= pic->pps->transform_skip_enabled_flag << 5;
352    result.pps_info_flags |= pic->pps->cu_qp_delta_enabled_flag << 6;
353    result.pps_info_flags |= pic->pps->pps_slice_chroma_qp_offsets_present_flag << 7;
354    result.pps_info_flags |= pic->pps->weighted_pred_flag << 8;
355    result.pps_info_flags |= pic->pps->weighted_bipred_flag << 9;
356    result.pps_info_flags |= pic->pps->transquant_bypass_enabled_flag << 10;
357    result.pps_info_flags |= pic->pps->tiles_enabled_flag << 11;
358    result.pps_info_flags |= pic->pps->entropy_coding_sync_enabled_flag << 12;
359    result.pps_info_flags |= pic->pps->uniform_spacing_flag << 13;
360    result.pps_info_flags |= pic->pps->loop_filter_across_tiles_enabled_flag << 14;
361    result.pps_info_flags |= pic->pps->pps_loop_filter_across_slices_enabled_flag << 15;
362    result.pps_info_flags |= pic->pps->deblocking_filter_override_enabled_flag << 16;
363    result.pps_info_flags |= pic->pps->pps_deblocking_filter_disabled_flag << 17;
364    result.pps_info_flags |= pic->pps->lists_modification_present_flag << 18;
365    result.pps_info_flags |= pic->pps->slice_segment_header_extension_present_flag << 19;
366 
367    result.num_extra_slice_header_bits = pic->pps->num_extra_slice_header_bits;
368    result.num_long_term_ref_pic_sps = pic->pps->sps->num_long_term_ref_pics_sps;
369    result.num_ref_idx_l0_default_active_minus1 = pic->pps->num_ref_idx_l0_default_active_minus1;
370    result.num_ref_idx_l1_default_active_minus1 = pic->pps->num_ref_idx_l1_default_active_minus1;
371    result.pps_cb_qp_offset = pic->pps->pps_cb_qp_offset;
372    result.pps_cr_qp_offset = pic->pps->pps_cr_qp_offset;
373    result.pps_beta_offset_div2 = pic->pps->pps_beta_offset_div2;
374    result.pps_tc_offset_div2 = pic->pps->pps_tc_offset_div2;
375    result.diff_cu_qp_delta_depth = pic->pps->diff_cu_qp_delta_depth;
376    result.num_tile_columns_minus1 = pic->pps->num_tile_columns_minus1;
377    result.num_tile_rows_minus1 = pic->pps->num_tile_rows_minus1;
378    result.log2_parallel_merge_level_minus2 = pic->pps->log2_parallel_merge_level_minus2;
379    result.init_qp_minus26 = pic->pps->init_qp_minus26;
380 
381    for (i = 0; i < 19; ++i)
382       result.column_width_minus1[i] = pic->pps->column_width_minus1[i];
383 
384    for (i = 0; i < 21; ++i)
385       result.row_height_minus1[i] = pic->pps->row_height_minus1[i];
386 
387    result.num_delta_pocs_ref_rps_idx = pic->NumDeltaPocsOfRefRpsIdx;
388    result.curr_poc = pic->CurrPicOrderCntVal;
389 
390    for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {
391       for (j = 0;
392            (j < ARRAY_SIZE(pic->ref) && (pic->ref[j] != NULL));
393            j++) {
394          if (dec->render_pic_list[i] == pic->ref[j])
395             break;
396          if (j == ARRAY_SIZE(pic->ref) - 1)
397             dec->render_pic_list[i] = NULL;
398          else if (pic->ref[j + 1] == NULL)
399             dec->render_pic_list[i] = NULL;
400       }
401    }
402    for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {
403       if (dec->render_pic_list[i] == NULL) {
404          dec->render_pic_list[i] = target;
405          result.curr_idx = i;
406          break;
407       }
408    }
409 
410    vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)result.curr_idx,
411                                        &radeon_dec_destroy_associated_data);
412 
413    for (i = 0; i < 16; ++i) {
414       struct pipe_video_buffer *ref = pic->ref[i];
415       uintptr_t ref_pic = 0;
416 
417       result.poc_list[i] = pic->PicOrderCntVal[i];
418 
419       if (ref) {
420          ref_pic = (uintptr_t)vl_video_buffer_get_associated_data(ref, &dec->base);
421          num_refs++;
422       } else
423          ref_pic = 0x7F;
424       result.ref_pic_list[i] = ref_pic;
425    }
426 
427    for (i = 0; i < 8; ++i) {
428       result.ref_pic_set_st_curr_before[i] = 0xFF;
429       result.ref_pic_set_st_curr_after[i] = 0xFF;
430       result.ref_pic_set_lt_curr[i] = 0xFF;
431    }
432 
433    for (i = 0; i < pic->NumPocStCurrBefore; ++i)
434       result.ref_pic_set_st_curr_before[i] = pic->RefPicSetStCurrBefore[i];
435 
436    for (i = 0; i < pic->NumPocStCurrAfter; ++i)
437       result.ref_pic_set_st_curr_after[i] = pic->RefPicSetStCurrAfter[i];
438 
439    for (i = 0; i < pic->NumPocLtCurr; ++i)
440       result.ref_pic_set_lt_curr[i] = pic->RefPicSetLtCurr[i];
441 
442    for (i = 0; i < 6; ++i)
443       result.ucScalingListDCCoefSizeID2[i] = pic->pps->sps->ScalingListDCCoeff16x16[i];
444 
445    for (i = 0; i < 2; ++i)
446       result.ucScalingListDCCoefSizeID3[i] = pic->pps->sps->ScalingListDCCoeff32x32[i];
447 
448    memcpy(dec->it, pic->pps->sps->ScalingList4x4, 6 * 16);
449    memcpy(dec->it + 96, pic->pps->sps->ScalingList8x8, 6 * 64);
450    memcpy(dec->it + 480, pic->pps->sps->ScalingList16x16, 6 * 64);
451    memcpy(dec->it + 864, pic->pps->sps->ScalingList32x32, 2 * 64);
452 
453    for (i = 0; i < 2; i++) {
454       for (j = 0; j < 15; j++)
455          result.direct_reflist[i][j] = pic->RefPicList[0][i][j];
456    }
457 
458    if (pic->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10) {
459       if (target->buffer_format == PIPE_FORMAT_P010 || target->buffer_format == PIPE_FORMAT_P016) {
460          result.p010_mode = 1;
461          result.msb_mode = 1;
462       } else {
463          result.p010_mode = 0;
464          result.luma_10to8 = 5;
465          result.chroma_10to8 = 5;
466          result.hevc_reserved[0] = 4; /* sclr_luma10to8 */
467          result.hevc_reserved[1] = 4; /* sclr_chroma10to8 */
468       }
469    }
470 
471    if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {
472       dec->ref_codec.bts = (pic->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10) ?
473          CODEC_10_BITS : CODEC_8_BITS;
474       dec->ref_codec.index = result.curr_idx;
475       dec->ref_codec.ref_size = 15;
476       dec->ref_codec.num_refs = num_refs;
477       STATIC_ASSERT(sizeof(dec->ref_codec.ref_list) == sizeof(result.ref_pic_list));
478       memcpy(dec->ref_codec.ref_list, result.ref_pic_list, sizeof(result.ref_pic_list));
479    }
480    return result;
481 }
482 
fill_probs_table(void * ptr)483 static void fill_probs_table(void *ptr)
484 {
485    rvcn_dec_vp9_probs_t *probs = (rvcn_dec_vp9_probs_t *)ptr;
486 
487    memcpy(&probs->coef_probs[0], default_coef_probs_4x4, sizeof(default_coef_probs_4x4));
488    memcpy(&probs->coef_probs[1], default_coef_probs_8x8, sizeof(default_coef_probs_8x8));
489    memcpy(&probs->coef_probs[2], default_coef_probs_16x16, sizeof(default_coef_probs_16x16));
490    memcpy(&probs->coef_probs[3], default_coef_probs_32x32, sizeof(default_coef_probs_32x32));
491    memcpy(probs->y_mode_prob, default_if_y_probs, sizeof(default_if_y_probs));
492    memcpy(probs->uv_mode_prob, default_if_uv_probs, sizeof(default_if_uv_probs));
493    memcpy(probs->single_ref_prob, default_single_ref_p, sizeof(default_single_ref_p));
494    memcpy(probs->switchable_interp_prob, default_switchable_interp_prob,
495           sizeof(default_switchable_interp_prob));
496    memcpy(probs->partition_prob, default_partition_probs, sizeof(default_partition_probs));
497    memcpy(probs->inter_mode_probs, default_inter_mode_probs, sizeof(default_inter_mode_probs));
498    memcpy(probs->mbskip_probs, default_skip_probs, sizeof(default_skip_probs));
499    memcpy(probs->intra_inter_prob, default_intra_inter_p, sizeof(default_intra_inter_p));
500    memcpy(probs->comp_inter_prob, default_comp_inter_p, sizeof(default_comp_inter_p));
501    memcpy(probs->comp_ref_prob, default_comp_ref_p, sizeof(default_comp_ref_p));
502    memcpy(probs->tx_probs_32x32, default_tx_probs_32x32, sizeof(default_tx_probs_32x32));
503    memcpy(probs->tx_probs_16x16, default_tx_probs_16x16, sizeof(default_tx_probs_16x16));
504    memcpy(probs->tx_probs_8x8, default_tx_probs_8x8, sizeof(default_tx_probs_8x8));
505    memcpy(probs->mv_joints, default_nmv_joints, sizeof(default_nmv_joints));
506    memcpy(&probs->mv_comps[0], default_nmv_components, sizeof(default_nmv_components));
507    memset(&probs->nmvc_mask, 0, sizeof(rvcn_dec_vp9_nmv_ctx_mask_t));
508 }
509 
get_vp9_msg(struct radeon_decoder * dec,struct pipe_video_buffer * target,struct pipe_vp9_picture_desc * pic)510 static rvcn_dec_message_vp9_t get_vp9_msg(struct radeon_decoder *dec,
511                                           struct pipe_video_buffer *target,
512                                           struct pipe_vp9_picture_desc *pic)
513 {
514    rvcn_dec_message_vp9_t result;
515    unsigned i, j, num_refs = 0;
516 
517    memset(&result, 0, sizeof(result));
518 
519    /* segment table */
520    rvcn_dec_vp9_probs_segment_t *prbs = (rvcn_dec_vp9_probs_segment_t *)(dec->probs);
521 
522    if (pic->picture_parameter.pic_fields.segmentation_enabled) {
523       for (i = 0; i < 8; ++i) {
524          prbs->seg.feature_data[i] =
525             (pic->slice_parameter.seg_param[i].alt_quant & 0xffff) |
526             ((pic->slice_parameter.seg_param[i].alt_lf & 0xff) << 16) |
527             ((pic->slice_parameter.seg_param[i].segment_flags.segment_reference & 0xf) << 24);
528          prbs->seg.feature_mask[i] =
529             (pic->slice_parameter.seg_param[i].alt_quant_enabled << 0) |
530             (pic->slice_parameter.seg_param[i].alt_lf_enabled << 1) |
531             (pic->slice_parameter.seg_param[i].segment_flags.segment_reference_enabled << 2) |
532             (pic->slice_parameter.seg_param[i].segment_flags.segment_reference_skipped << 3);
533       }
534 
535       for (i = 0; i < 7; ++i)
536          prbs->seg.tree_probs[i] = pic->picture_parameter.mb_segment_tree_probs[i];
537 
538       for (i = 0; i < 3; ++i)
539          prbs->seg.pred_probs[i] = pic->picture_parameter.segment_pred_probs[i];
540 
541       prbs->seg.abs_delta = pic->picture_parameter.abs_delta;
542    } else
543       memset(prbs->segment_data, 0, sizeof(prbs->segment_data));
544 
545    result.frame_header_flags = (pic->picture_parameter.pic_fields.frame_type
546                                 << RDECODE_FRAME_HDR_INFO_VP9_FRAME_TYPE_SHIFT) &
547                                RDECODE_FRAME_HDR_INFO_VP9_FRAME_TYPE_MASK;
548 
549    result.frame_header_flags |= (pic->picture_parameter.pic_fields.error_resilient_mode
550                                  << RDECODE_FRAME_HDR_INFO_VP9_ERROR_RESILIENT_MODE_SHIFT) &
551                                 RDECODE_FRAME_HDR_INFO_VP9_ERROR_RESILIENT_MODE_MASK;
552 
553    result.frame_header_flags |= (pic->picture_parameter.pic_fields.intra_only
554                                  << RDECODE_FRAME_HDR_INFO_VP9_INTRA_ONLY_SHIFT) &
555                                 RDECODE_FRAME_HDR_INFO_VP9_INTRA_ONLY_MASK;
556 
557    result.frame_header_flags |= (pic->picture_parameter.pic_fields.allow_high_precision_mv
558                                  << RDECODE_FRAME_HDR_INFO_VP9_ALLOW_HIGH_PRECISION_MV_SHIFT) &
559                                 RDECODE_FRAME_HDR_INFO_VP9_ALLOW_HIGH_PRECISION_MV_MASK;
560 
561    result.frame_header_flags |= (pic->picture_parameter.pic_fields.frame_parallel_decoding_mode
562                                  << RDECODE_FRAME_HDR_INFO_VP9_FRAME_PARALLEL_DECODING_MODE_SHIFT) &
563                                 RDECODE_FRAME_HDR_INFO_VP9_FRAME_PARALLEL_DECODING_MODE_MASK;
564 
565    result.frame_header_flags |= (pic->picture_parameter.pic_fields.refresh_frame_context
566                                  << RDECODE_FRAME_HDR_INFO_VP9_REFRESH_FRAME_CONTEXT_SHIFT) &
567                                 RDECODE_FRAME_HDR_INFO_VP9_REFRESH_FRAME_CONTEXT_MASK;
568 
569    result.frame_header_flags |= (pic->picture_parameter.pic_fields.segmentation_enabled
570                                  << RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_ENABLED_SHIFT) &
571                                 RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_ENABLED_MASK;
572 
573    result.frame_header_flags |= (pic->picture_parameter.pic_fields.segmentation_update_map
574                                  << RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_UPDATE_MAP_SHIFT) &
575                                 RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_UPDATE_MAP_MASK;
576 
577    result.frame_header_flags |= (pic->picture_parameter.pic_fields.segmentation_temporal_update
578                                  << RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_TEMPORAL_UPDATE_SHIFT) &
579                                 RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_TEMPORAL_UPDATE_MASK;
580 
581    result.frame_header_flags |= (pic->picture_parameter.mode_ref_delta_enabled
582                                  << RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_ENABLED_SHIFT) &
583                                 RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_ENABLED_MASK;
584 
585    result.frame_header_flags |= (pic->picture_parameter.mode_ref_delta_update
586                                  << RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_UPDATE_SHIFT) &
587                                 RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_UPDATE_MASK;
588 
589    result.frame_header_flags |=
590       ((dec->show_frame && !pic->picture_parameter.pic_fields.error_resilient_mode &&
591         dec->last_width == dec->base.width && dec->last_height == dec->base.height)
592        << RDECODE_FRAME_HDR_INFO_VP9_USE_PREV_IN_FIND_MV_REFS_SHIFT) &
593       RDECODE_FRAME_HDR_INFO_VP9_USE_PREV_IN_FIND_MV_REFS_MASK;
594    dec->show_frame = pic->picture_parameter.pic_fields.show_frame;
595 
596    result.frame_header_flags |=  (1 << RDECODE_FRAME_HDR_INFO_VP9_USE_UNCOMPRESSED_HEADER_SHIFT) &
597                                  RDECODE_FRAME_HDR_INFO_VP9_USE_UNCOMPRESSED_HEADER_MASK;
598 
599    result.interp_filter = pic->picture_parameter.pic_fields.mcomp_filter_type;
600 
601    result.frame_context_idx = pic->picture_parameter.pic_fields.frame_context_idx;
602    result.reset_frame_context = pic->picture_parameter.pic_fields.reset_frame_context;
603 
604    result.filter_level = pic->picture_parameter.filter_level;
605    result.sharpness_level = pic->picture_parameter.sharpness_level;
606 
607    for (i = 0; i < 8; ++i)
608       memcpy(result.lf_adj_level[i], pic->slice_parameter.seg_param[i].filter_level, 4 * 2);
609 
610    if (pic->picture_parameter.pic_fields.lossless_flag) {
611       result.base_qindex = 0;
612       result.y_dc_delta_q = 0;
613       result.uv_ac_delta_q = 0;
614       result.uv_dc_delta_q = 0;
615    } else {
616       result.base_qindex = pic->picture_parameter.base_qindex;
617       result.y_dc_delta_q = pic->picture_parameter.y_dc_delta_q;
618       result.uv_ac_delta_q = pic->picture_parameter.uv_ac_delta_q;
619       result.uv_dc_delta_q = pic->picture_parameter.uv_dc_delta_q;
620    }
621 
622    result.log2_tile_cols = pic->picture_parameter.log2_tile_columns;
623    result.log2_tile_rows = pic->picture_parameter.log2_tile_rows;
624    result.chroma_format = 1;
625    result.bit_depth_luma_minus8 = result.bit_depth_chroma_minus8 =
626       (pic->picture_parameter.bit_depth - 8);
627 
628    result.vp9_frame_size = align(dec->bs_size, 128);
629    result.uncompressed_header_size = pic->picture_parameter.frame_header_length_in_bytes;
630    result.compressed_header_size = pic->picture_parameter.first_partition_size;
631 
632    assert(dec->base.max_references + 1 <= ARRAY_SIZE(dec->render_pic_list));
633 
634    //clear the dec->render list if it is not used as a reference
635    for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {
636       if (dec->render_pic_list[i]) {
637          for (j=0;j<8;j++) {
638             if (dec->render_pic_list[i] == pic->ref[j])
639                break;
640          }
641          if (j == 8)
642             dec->render_pic_list[i] = NULL;
643       }
644    }
645 
646    get_current_pic_index(dec, target, &result.curr_pic_idx);
647 
648    for (i = 0; i < 8; i++) {
649       uintptr_t ref_frame;
650       if (pic->ref[i]) {
651          ref_frame = (uintptr_t)vl_video_buffer_get_associated_data(pic->ref[i], &dec->base);
652          num_refs++;
653       } else
654          ref_frame = 0x7f;
655       result.ref_frame_map[i] = ref_frame;
656    }
657 
658    result.frame_refs[0] = result.ref_frame_map[pic->picture_parameter.pic_fields.last_ref_frame];
659    result.ref_frame_sign_bias[0] = pic->picture_parameter.pic_fields.last_ref_frame_sign_bias;
660    result.frame_refs[1] = result.ref_frame_map[pic->picture_parameter.pic_fields.golden_ref_frame];
661    result.ref_frame_sign_bias[1] = pic->picture_parameter.pic_fields.golden_ref_frame_sign_bias;
662    result.frame_refs[2] = result.ref_frame_map[pic->picture_parameter.pic_fields.alt_ref_frame];
663    result.ref_frame_sign_bias[2] = pic->picture_parameter.pic_fields.alt_ref_frame_sign_bias;
664 
665    if (pic->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2) {
666       if (target->buffer_format == PIPE_FORMAT_P010 || target->buffer_format == PIPE_FORMAT_P016) {
667          result.p010_mode = 1;
668          result.msb_mode = 1;
669       } else {
670          result.p010_mode = 0;
671          result.luma_10to8 = 1;
672          result.chroma_10to8 = 1;
673       }
674    }
675 
676    if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {
677       dec->ref_codec.bts = (pic->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2) ?
678          CODEC_10_BITS : CODEC_8_BITS;
679       dec->ref_codec.index = result.curr_pic_idx;
680       dec->ref_codec.ref_size = 8;
681       dec->ref_codec.num_refs = num_refs;
682       memset(dec->ref_codec.ref_list, 0x7f, sizeof(dec->ref_codec.ref_list));
683       memcpy(dec->ref_codec.ref_list, result.ref_frame_map, sizeof(result.ref_frame_map));
684    }
685 
686    dec->last_width = dec->base.width;
687    dec->last_height = dec->base.height;
688 
689    return result;
690 }
691 
get_h265_reflist(rvcn_dec_message_hevc_direct_ref_list_t * hevc_reflist,struct pipe_h265_picture_desc * pic)692 static void get_h265_reflist(rvcn_dec_message_hevc_direct_ref_list_t *hevc_reflist,
693                              struct pipe_h265_picture_desc *pic)
694 {
695    hevc_reflist->num_direct_reflist = pic->slice_parameter.slice_count;
696    for (int i = 0; i <hevc_reflist->num_direct_reflist; i++) {
697       for (int j = 0; j < 2; j++) {
698          for (int k = 0; k < 15; k++)
699             hevc_reflist->multi_direct_reflist[i][j][k] = pic->RefPicList[i][j][k];
700       }
701    }
702 }
703 
set_drm_keys(rvcn_dec_message_drm_t * drm,DECRYPT_PARAMETERS * decrypted)704 static void set_drm_keys(rvcn_dec_message_drm_t *drm, DECRYPT_PARAMETERS *decrypted)
705 {
706    int cbc = decrypted->u.s.cbc;
707    int ctr = decrypted->u.s.ctr;
708    int id = decrypted->u.s.drm_id;
709    int ekc = 1;
710    int data1 = 1;
711    int data2 = 1;
712 
713    drm->drm_cmd = 0;
714    drm->drm_cntl = 0;
715 
716    drm->drm_cntl = 1 << DRM_CNTL_BYPASS_SHIFT;
717 
718    if (cbc || ctr) {
719       drm->drm_cntl = 0 << DRM_CNTL_BYPASS_SHIFT;
720       drm->drm_cmd |= 0xff << DRM_CMD_BYTE_MASK_SHIFT;
721 
722       if (ctr)
723          drm->drm_cmd |= 0x00 << DRM_CMD_ALGORITHM_SHIFT;
724       else if (cbc)
725          drm->drm_cmd |= 0x02 << DRM_CMD_ALGORITHM_SHIFT;
726 
727       drm->drm_cmd |= 1 << DRM_CMD_GEN_MASK_SHIFT;
728       drm->drm_cmd |= ekc << DRM_CMD_UNWRAP_KEY_SHIFT;
729       drm->drm_cmd |= 0 << DRM_CMD_OFFSET_SHIFT;
730       drm->drm_cmd |= data2 << DRM_CMD_CNT_DATA_SHIFT;
731       drm->drm_cmd |= data1 << DRM_CMD_CNT_KEY_SHIFT;
732       drm->drm_cmd |= ekc << DRM_CMD_KEY_SHIFT;
733       drm->drm_cmd |= id << DRM_CMD_SESSION_SEL_SHIFT;
734 
735       if (ekc)
736          memcpy(drm->drm_wrapped_key, decrypted->encrypted_key, 16);
737       if (data1)
738          memcpy(drm->drm_key, decrypted->session_iv, 16);
739       if (data2)
740          memcpy(drm->drm_counter, decrypted->encrypted_iv, 16);
741       drm->drm_offset = 0;
742    }
743 }
744 
rvcn_dec_av1_film_grain_surface(struct pipe_video_buffer ** target,struct pipe_av1_picture_desc * pic)745 static void rvcn_dec_av1_film_grain_surface(struct pipe_video_buffer **target,
746                                             struct pipe_av1_picture_desc *pic)
747 {
748    if (!pic->picture_parameter.film_grain_info.film_grain_info_fields.apply_grain ||
749        !pic->film_grain_target)
750       return;
751 
752    *target = pic->film_grain_target;
753 }
754 
get_av1_msg(struct radeon_decoder * dec,struct pipe_video_buffer * target,struct pipe_av1_picture_desc * pic)755 static rvcn_dec_message_av1_t get_av1_msg(struct radeon_decoder *dec,
756                                           struct pipe_video_buffer *target,
757                                           struct pipe_av1_picture_desc *pic)
758 {
759    rvcn_dec_message_av1_t result;
760    unsigned i, j, num_refs = 0;
761    uint16_t tile_count = pic->picture_parameter.tile_cols * pic->picture_parameter.tile_rows;
762 
763    memset(&result, 0, sizeof(result));
764 
765    result.frame_header_flags = (pic->picture_parameter.pic_info_fields.show_frame
766                                 << RDECODE_FRAME_HDR_INFO_AV1_SHOW_FRAME_SHIFT) &
767                                 RDECODE_FRAME_HDR_INFO_AV1_SHOW_FRAME_MASK;
768 
769    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.disable_cdf_update
770                                  << RDECODE_FRAME_HDR_INFO_AV1_DISABLE_CDF_UPDATE_SHIFT) &
771                                  RDECODE_FRAME_HDR_INFO_AV1_DISABLE_CDF_UPDATE_MASK;
772 
773    result.frame_header_flags |= ((!pic->picture_parameter.pic_info_fields.disable_frame_end_update_cdf)
774                                  << RDECODE_FRAME_HDR_INFO_AV1_REFRESH_FRAME_CONTEXT_SHIFT) &
775                                  RDECODE_FRAME_HDR_INFO_AV1_REFRESH_FRAME_CONTEXT_MASK;
776 
777    result.frame_header_flags |= ((pic->picture_parameter.pic_info_fields.frame_type ==
778                                  2 /* INTRA_ONLY_FRAME */) << RDECODE_FRAME_HDR_INFO_AV1_INTRA_ONLY_SHIFT) &
779                                  RDECODE_FRAME_HDR_INFO_AV1_INTRA_ONLY_MASK;
780 
781    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_intrabc
782                                  << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_INTRABC_SHIFT) &
783                                  RDECODE_FRAME_HDR_INFO_AV1_ALLOW_INTRABC_MASK;
784 
785    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_high_precision_mv
786                                  << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_HIGH_PRECISION_MV_SHIFT) &
787                                  RDECODE_FRAME_HDR_INFO_AV1_ALLOW_HIGH_PRECISION_MV_MASK;
788 
789    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.mono_chrome
790                                  << RDECODE_FRAME_HDR_INFO_AV1_MONOCHROME_SHIFT) &
791                                  RDECODE_FRAME_HDR_INFO_AV1_MONOCHROME_MASK;
792 
793    result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.skip_mode_present
794                                  << RDECODE_FRAME_HDR_INFO_AV1_SKIP_MODE_FLAG_SHIFT) &
795                                  RDECODE_FRAME_HDR_INFO_AV1_SKIP_MODE_FLAG_MASK;
796 
797    result.frame_header_flags |= (((pic->picture_parameter.qmatrix_fields.qm_y == 0xf) ? 0 : 1)
798                                  << RDECODE_FRAME_HDR_INFO_AV1_USING_QMATRIX_SHIFT) &
799                                  RDECODE_FRAME_HDR_INFO_AV1_USING_QMATRIX_MASK;
800 
801    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_filter_intra
802                                  << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_FILTER_INTRA_SHIFT) &
803                                  RDECODE_FRAME_HDR_INFO_AV1_ENABLE_FILTER_INTRA_MASK;
804 
805    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_intra_edge_filter
806                                  << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTRA_EDGE_FILTER_SHIFT) &
807                                  RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTRA_EDGE_FILTER_MASK;
808 
809    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_interintra_compound
810                                  << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTERINTRA_COMPOUND_SHIFT) &
811                                  RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTERINTRA_COMPOUND_MASK;
812 
813    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_masked_compound
814                                  << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_MASKED_COMPOUND_SHIFT) &
815                                  RDECODE_FRAME_HDR_INFO_AV1_ENABLE_MASKED_COMPOUND_MASK;
816 
817    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_warped_motion
818                                  << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_WARPED_MOTION_SHIFT) &
819                                  RDECODE_FRAME_HDR_INFO_AV1_ALLOW_WARPED_MOTION_MASK;
820 
821    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_dual_filter
822                                  << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_DUAL_FILTER_SHIFT) &
823                                  RDECODE_FRAME_HDR_INFO_AV1_ENABLE_DUAL_FILTER_MASK;
824 
825    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_order_hint
826                                  << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_ORDER_HINT_SHIFT) &
827                                  RDECODE_FRAME_HDR_INFO_AV1_ENABLE_ORDER_HINT_MASK;
828 
829    result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_jnt_comp
830                                  << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_JNT_COMP_SHIFT) &
831                                  RDECODE_FRAME_HDR_INFO_AV1_ENABLE_JNT_COMP_MASK;
832 
833    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.use_ref_frame_mvs
834                                  << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_REF_FRAME_MVS_SHIFT) &
835                                  RDECODE_FRAME_HDR_INFO_AV1_ALLOW_REF_FRAME_MVS_MASK;
836 
837    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_screen_content_tools
838                                  << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_SCREEN_CONTENT_TOOLS_SHIFT) &
839                                  RDECODE_FRAME_HDR_INFO_AV1_ALLOW_SCREEN_CONTENT_TOOLS_MASK;
840 
841    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.force_integer_mv
842                                  << RDECODE_FRAME_HDR_INFO_AV1_CUR_FRAME_FORCE_INTEGER_MV_SHIFT) &
843                                  RDECODE_FRAME_HDR_INFO_AV1_CUR_FRAME_FORCE_INTEGER_MV_MASK;
844 
845    result.frame_header_flags |= (pic->picture_parameter.loop_filter_info_fields.mode_ref_delta_enabled
846                                  << RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_ENABLED_SHIFT) &
847                                  RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_ENABLED_MASK;
848 
849    result.frame_header_flags |= (pic->picture_parameter.loop_filter_info_fields.mode_ref_delta_update
850                                  << RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_UPDATE_SHIFT) &
851                                  RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_UPDATE_MASK;
852 
853    result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.delta_q_present_flag
854                                  << RDECODE_FRAME_HDR_INFO_AV1_DELTA_Q_PRESENT_FLAG_SHIFT) &
855                                  RDECODE_FRAME_HDR_INFO_AV1_DELTA_Q_PRESENT_FLAG_MASK;
856 
857    result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.delta_lf_present_flag
858                                  << RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_PRESENT_FLAG_SHIFT) &
859                                  RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_PRESENT_FLAG_MASK;
860 
861    result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.reduced_tx_set_used
862                                  << RDECODE_FRAME_HDR_INFO_AV1_REDUCED_TX_SET_USED_SHIFT) &
863                                  RDECODE_FRAME_HDR_INFO_AV1_REDUCED_TX_SET_USED_MASK;
864 
865    result.frame_header_flags |= (pic->picture_parameter.seg_info.segment_info_fields.enabled
866                                  << RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_ENABLED_SHIFT) &
867                                  RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_ENABLED_MASK;
868 
869    result.frame_header_flags |= (pic->picture_parameter.seg_info.segment_info_fields.update_map
870                                  << RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_UPDATE_MAP_SHIFT) &
871                                  RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_UPDATE_MAP_MASK;
872 
873    result.frame_header_flags |= (pic->picture_parameter.seg_info.segment_info_fields.temporal_update
874                                  << RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_TEMPORAL_UPDATE_SHIFT) &
875                                  RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_TEMPORAL_UPDATE_MASK;
876 
877    result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.delta_lf_multi
878                                  << RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_MULTI_SHIFT) &
879                                  RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_MULTI_MASK;
880 
881    result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.is_motion_mode_switchable
882                                  << RDECODE_FRAME_HDR_INFO_AV1_SWITCHABLE_SKIP_MODE_SHIFT) &
883                                  RDECODE_FRAME_HDR_INFO_AV1_SWITCHABLE_SKIP_MODE_MASK;
884 
885    result.frame_header_flags |= ((!pic->picture_parameter.refresh_frame_flags)
886                                  << RDECODE_FRAME_HDR_INFO_AV1_SKIP_REFERENCE_UPDATE_SHIFT) &
887                                  RDECODE_FRAME_HDR_INFO_AV1_SKIP_REFERENCE_UPDATE_MASK;
888 
889    result.frame_header_flags |= ((!pic->picture_parameter.seq_info_fields.ref_frame_mvs)
890                                  << RDECODE_FRAME_HDR_INFO_AV1_DISABLE_REF_FRAME_MVS_SHIFT) &
891                                  RDECODE_FRAME_HDR_INFO_AV1_DISABLE_REF_FRAME_MVS_MASK;
892 
893    result.current_frame_id = pic->picture_parameter.current_frame_id;
894    result.frame_offset = pic->picture_parameter.order_hint;
895 
896    result.profile = pic->picture_parameter.profile;
897    result.is_annexb = 0;
898    result.frame_type = pic->picture_parameter.pic_info_fields.frame_type;
899    result.primary_ref_frame = pic->picture_parameter.primary_ref_frame;
900 
901    get_current_pic_index(dec, target, &result.curr_pic_idx);
902 
903    result.sb_size = pic->picture_parameter.seq_info_fields.use_128x128_superblock;
904    result.interp_filter = pic->picture_parameter.interp_filter;
905    for (i = 0; i < 2; ++i)
906       result.filter_level[i] = pic->picture_parameter.filter_level[i];
907    result.filter_level_u = pic->picture_parameter.filter_level_u;
908    result.filter_level_v = pic->picture_parameter.filter_level_v;
909    result.sharpness_level = pic->picture_parameter.loop_filter_info_fields.sharpness_level;
910    for (i = 0; i < 8; ++i)
911       result.ref_deltas[i] = pic->picture_parameter.ref_deltas[i];
912    for (i = 0; i < 2; ++i)
913       result.mode_deltas[i] = pic->picture_parameter.mode_deltas[i];
914    result.base_qindex = pic->picture_parameter.base_qindex;
915    result.y_dc_delta_q = pic->picture_parameter.y_dc_delta_q;
916    result.u_dc_delta_q = pic->picture_parameter.u_dc_delta_q;
917    result.v_dc_delta_q = pic->picture_parameter.v_dc_delta_q;
918    result.u_ac_delta_q = pic->picture_parameter.u_ac_delta_q;
919    result.v_ac_delta_q = pic->picture_parameter.v_ac_delta_q;
920    result.qm_y = pic->picture_parameter.qmatrix_fields.qm_y | 0xf0;
921    result.qm_u = pic->picture_parameter.qmatrix_fields.qm_u | 0xf0;
922    result.qm_v = pic->picture_parameter.qmatrix_fields.qm_v | 0xf0;
923    result.delta_q_res = 1 << pic->picture_parameter.mode_control_fields.log2_delta_q_res;
924    result.delta_lf_res = 1 << pic->picture_parameter.mode_control_fields.log2_delta_lf_res;
925 
926    result.tile_cols = pic->picture_parameter.tile_cols;
927    result.tile_rows = pic->picture_parameter.tile_rows;
928    result.tx_mode = pic->picture_parameter.mode_control_fields.tx_mode;
929    result.reference_mode = (pic->picture_parameter.mode_control_fields.reference_select == 1) ? 2 : 0;
930    result.chroma_format = pic->picture_parameter.seq_info_fields.mono_chrome ? 0 : 1;
931    result.tile_size_bytes = 0xff;
932    result.context_update_tile_id = pic->picture_parameter.context_update_tile_id;
933    for (i = 0; i < 65; ++i) {
934       result.tile_col_start_sb[i] = pic->picture_parameter.tile_col_start_sb[i];
935       result.tile_row_start_sb[i] = pic->picture_parameter.tile_row_start_sb[i];
936    }
937    result.max_width = pic->picture_parameter.max_width;
938    result.max_height = pic->picture_parameter.max_height;
939    if (pic->picture_parameter.pic_info_fields.use_superres) {
940       result.width = (pic->picture_parameter.frame_width * 8 + pic->picture_parameter.superres_scale_denominator / 2) /
941          pic->picture_parameter.superres_scale_denominator;
942       result.superres_scale_denominator = pic->picture_parameter.superres_scale_denominator;
943    } else {
944       result.width = pic->picture_parameter.frame_width;
945       result.superres_scale_denominator = pic->picture_parameter.superres_scale_denominator;
946    }
947    result.height = pic->picture_parameter.frame_height;
948    result.superres_upscaled_width = pic->picture_parameter.frame_width;
949    result.order_hint_bits = pic->picture_parameter.order_hint_bits_minus_1 + 1;
950 
951    /* Limit to target size in case applications try to decode into smaller
952     * target buffer. */
953    result.width = MIN2(target->width, result.width);
954    result.height = MIN2(target->height, result.height);
955    result.superres_upscaled_width = MIN2(target->width, result.superres_upscaled_width);
956 
957    for (i = 0; i < NUM_AV1_REFS; ++i) {
958       uintptr_t ref_frame;
959       if (pic->ref[i]) {
960          ref_frame = (uintptr_t)vl_video_buffer_get_associated_data(pic->ref[i], &dec->base);
961          num_refs++;
962       } else
963          ref_frame = 0x7f;
964       result.ref_frame_map[i] = ref_frame;
965    }
966    for (i = 0; i < NUM_AV1_REFS_PER_FRAME; ++i)
967        result.frame_refs[i] = result.ref_frame_map[pic->picture_parameter.ref_frame_idx[i]];
968 
969    result.bit_depth_luma_minus8 = result.bit_depth_chroma_minus8 = pic->picture_parameter.bit_depth_idx << 1;
970 
971    for (i = 0; i < 8; ++i) {
972       for (j = 0; j < 8; ++j)
973          result.feature_data[i][j] = pic->picture_parameter.seg_info.feature_data[i][j];
974       result.feature_mask[i] = pic->picture_parameter.seg_info.feature_mask[i];
975    }
976    memcpy(dec->probs, &pic->picture_parameter.seg_info.feature_data, 128);
977    memcpy((dec->probs + 128), &pic->picture_parameter.seg_info.feature_mask, 8);
978 
979    result.cdef_damping = pic->picture_parameter.cdef_damping_minus_3 + 3;
980    result.cdef_bits = pic->picture_parameter.cdef_bits;
981    for (i = 0; i < 8; ++i) {
982       result.cdef_strengths[i] = pic->picture_parameter.cdef_y_strengths[i];
983       result.cdef_uv_strengths[i] = pic->picture_parameter.cdef_uv_strengths[i];
984    }
985    result.frame_restoration_type[0] = pic->picture_parameter.loop_restoration_fields.yframe_restoration_type;
986    result.frame_restoration_type[1] = pic->picture_parameter.loop_restoration_fields.cbframe_restoration_type;
987    result.frame_restoration_type[2] = pic->picture_parameter.loop_restoration_fields.crframe_restoration_type;
988    for (i = 0; i < 3; ++i) {
989       int log2_num = 0;
990       int unit_size = pic->picture_parameter.lr_unit_size[i];
991       if (unit_size) {
992          while (unit_size >>= 1)
993             log2_num++;
994          result.log2_restoration_unit_size_minus5[i] = log2_num - 5;
995       } else {
996          result.log2_restoration_unit_size_minus5[i] = 0;
997       }
998    }
999 
1000    if (pic->picture_parameter.bit_depth_idx) {
1001       if (target->buffer_format == PIPE_FORMAT_P010 ||
1002           target->buffer_format == PIPE_FORMAT_P012 ||
1003           target->buffer_format == PIPE_FORMAT_P016) {
1004          result.p010_mode = 1;
1005          result.msb_mode = 1;
1006       } else {
1007          result.luma_10to8 = 1;
1008          result.chroma_10to8 = 1;
1009       }
1010    }
1011 
1012    result.preskip_segid = 0;
1013    result.last_active_segid = 0;
1014    for (i = 0; i < 8; i++) {
1015       for (j = 0; j < 8; j++) {
1016          if (pic->picture_parameter.seg_info.feature_mask[i] & (1 << j)) {
1017             result.last_active_segid = i;
1018             if (j >= 5)
1019                result.preskip_segid = 1;
1020          }
1021       }
1022    }
1023 
1024    result.seg_lossless_flag = 0;
1025    for (i = 0; i < 8; ++i) {
1026       int av1_get_qindex, qindex;
1027       int segfeature_active = pic->picture_parameter.seg_info.feature_mask[i] & (1 << 0);
1028       if (segfeature_active) {
1029          int seg_qindex = pic->picture_parameter.base_qindex +
1030                           pic->picture_parameter.seg_info.feature_data[i][0];
1031          av1_get_qindex = seg_qindex < 0 ? 0 : (seg_qindex > 255 ? 255 : seg_qindex);
1032       } else {
1033          av1_get_qindex = pic->picture_parameter.base_qindex;
1034       }
1035       qindex = pic->picture_parameter.seg_info.segment_info_fields.enabled ?
1036                av1_get_qindex :
1037                pic->picture_parameter.base_qindex;
1038       result.seg_lossless_flag |= (((qindex == 0) && result.y_dc_delta_q == 0 &&
1039                                     result.u_dc_delta_q == 0 && result.v_dc_delta_q == 0 &&
1040                                     result.u_ac_delta_q == 0 && result.v_ac_delta_q == 0) << i);
1041    }
1042 
1043    rvcn_dec_film_grain_params_t* fg_params = &result.film_grain;
1044    fg_params->apply_grain = pic->picture_parameter.film_grain_info.film_grain_info_fields.apply_grain;
1045    if (fg_params->apply_grain) {
1046       rvcn_dec_av1_fg_init_buf_t *fg_buf = (rvcn_dec_av1_fg_init_buf_t *)(dec->probs + 256);
1047 
1048       fg_params->random_seed = pic->picture_parameter.film_grain_info.grain_seed;
1049       fg_params->grain_scale_shift =
1050          pic->picture_parameter.film_grain_info.film_grain_info_fields.grain_scale_shift;
1051       fg_params->scaling_shift =
1052          pic->picture_parameter.film_grain_info.film_grain_info_fields.grain_scaling_minus_8 + 8;
1053       fg_params->chroma_scaling_from_luma =
1054          pic->picture_parameter.film_grain_info.film_grain_info_fields.chroma_scaling_from_luma;
1055       fg_params->num_y_points = pic->picture_parameter.film_grain_info.num_y_points;
1056       fg_params->num_cb_points = pic->picture_parameter.film_grain_info.num_cb_points;
1057       fg_params->num_cr_points = pic->picture_parameter.film_grain_info.num_cr_points;
1058       fg_params->cb_mult = pic->picture_parameter.film_grain_info.cb_mult;
1059       fg_params->cb_luma_mult = pic->picture_parameter.film_grain_info.cb_luma_mult;
1060       fg_params->cb_offset = pic->picture_parameter.film_grain_info.cb_offset;
1061       fg_params->cr_mult = pic->picture_parameter.film_grain_info.cr_mult;
1062       fg_params->cr_luma_mult = pic->picture_parameter.film_grain_info.cr_luma_mult;
1063       fg_params->cr_offset = pic->picture_parameter.film_grain_info.cr_offset;
1064       fg_params->bit_depth_minus_8 = pic->picture_parameter.bit_depth_idx << 1;
1065 
1066       for (i = 0; i < fg_params->num_y_points; ++i) {
1067          fg_params->scaling_points_y[i][0] = pic->picture_parameter.film_grain_info.point_y_value[i];
1068          fg_params->scaling_points_y[i][1] = pic->picture_parameter.film_grain_info.point_y_scaling[i];
1069       }
1070       for (i = 0; i < fg_params->num_cb_points; ++i) {
1071          fg_params->scaling_points_cb[i][0] = pic->picture_parameter.film_grain_info.point_cb_value[i];
1072          fg_params->scaling_points_cb[i][1] = pic->picture_parameter.film_grain_info.point_cb_scaling[i];
1073       }
1074       for (i = 0; i < fg_params->num_cr_points; ++i) {
1075          fg_params->scaling_points_cr[i][0] = pic->picture_parameter.film_grain_info.point_cr_value[i];
1076          fg_params->scaling_points_cr[i][1] = pic->picture_parameter.film_grain_info.point_cr_scaling[i];
1077       }
1078 
1079       fg_params->ar_coeff_lag = pic->picture_parameter.film_grain_info.film_grain_info_fields.ar_coeff_lag;
1080       fg_params->ar_coeff_shift =
1081          pic->picture_parameter.film_grain_info.film_grain_info_fields.ar_coeff_shift_minus_6 + 6;
1082 
1083       for (i = 0; i < 24; ++i)
1084          fg_params->ar_coeffs_y[i] = pic->picture_parameter.film_grain_info.ar_coeffs_y[i];
1085 
1086       for (i = 0; i < 25; ++i) {
1087          fg_params->ar_coeffs_cb[i] = pic->picture_parameter.film_grain_info.ar_coeffs_cb[i];
1088          fg_params->ar_coeffs_cr[i] = pic->picture_parameter.film_grain_info.ar_coeffs_cr[i];
1089       }
1090 
1091       fg_params->overlap_flag = pic->picture_parameter.film_grain_info.film_grain_info_fields.overlap_flag;
1092       fg_params->clip_to_restricted_range =
1093          pic->picture_parameter.film_grain_info.film_grain_info_fields.clip_to_restricted_range;
1094 
1095       ac_vcn_av1_init_film_grain_buffer(fg_params, fg_buf);
1096    }
1097 
1098    result.uncompressed_header_size = 0;
1099    for (i = 0; i < 7; ++i) {
1100       result.global_motion[i + 1].wmtype = (rvcn_dec_transformation_type_e)pic->picture_parameter.wm[i].wmtype;
1101       for (j = 0; j < 6; ++j)
1102          result.global_motion[i + 1].wmmat[j] = pic->picture_parameter.wm[i].wmmat[j];
1103    }
1104    for (i = 0; i < tile_count && i < 256; ++i) {
1105       result.tile_info[i].offset = pic->slice_parameter.slice_data_offset[i];
1106       result.tile_info[i].size = pic->slice_parameter.slice_data_size[i];
1107    }
1108 
1109    if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {
1110       dec->ref_codec.bts = pic->picture_parameter.bit_depth_idx;
1111       dec->ref_codec.index = result.curr_pic_idx;
1112       dec->ref_codec.ref_size = 8;
1113       dec->ref_codec.num_refs = num_refs;
1114       memset(dec->ref_codec.ref_list, 0x7f, sizeof(dec->ref_codec.ref_list));
1115       memcpy(dec->ref_codec.ref_list, result.ref_frame_map, sizeof(result.ref_frame_map));
1116    }
1117 
1118    return result;
1119 }
1120 
calc_ctx_size_h265_main(struct radeon_decoder * dec)1121 static unsigned calc_ctx_size_h265_main(struct radeon_decoder *dec)
1122 {
1123    unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);
1124    unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);
1125 
1126    unsigned max_references = dec->base.max_references + 1;
1127 
1128    if (dec->base.width * dec->base.height >= 4096 * 2000)
1129       max_references = MAX2(max_references, 8);
1130    else
1131       max_references = MAX2(max_references, 17);
1132 
1133    width = align(width, 16);
1134    height = align(height, 16);
1135    return ((width + 255) / 16) * ((height + 255) / 16) * 16 * max_references + 52 * 1024;
1136 }
1137 
calc_ctx_size_h265_main10(struct radeon_decoder * dec,struct pipe_h265_picture_desc * pic)1138 static unsigned calc_ctx_size_h265_main10(struct radeon_decoder *dec,
1139                                           struct pipe_h265_picture_desc *pic)
1140 {
1141    unsigned log2_ctb_size, width_in_ctb, height_in_ctb, num_16x16_block_per_ctb;
1142    unsigned context_buffer_size_per_ctb_row, cm_buffer_size, max_mb_address, db_left_tile_pxl_size;
1143    unsigned db_left_tile_ctx_size = 4096 / 16 * (32 + 16 * 4);
1144 
1145    unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);
1146    unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);
1147    unsigned coeff_10bit =
1148       (pic->pps->sps->bit_depth_luma_minus8 || pic->pps->sps->bit_depth_chroma_minus8) ? 2 : 1;
1149 
1150    unsigned max_references = dec->base.max_references + 1;
1151 
1152    if (dec->base.width * dec->base.height >= 4096 * 2000)
1153       max_references = MAX2(max_references, 8);
1154    else
1155       max_references = MAX2(max_references, 17);
1156 
1157    log2_ctb_size = pic->pps->sps->log2_min_luma_coding_block_size_minus3 + 3 +
1158                    pic->pps->sps->log2_diff_max_min_luma_coding_block_size;
1159 
1160    width_in_ctb = (width + ((1 << log2_ctb_size) - 1)) >> log2_ctb_size;
1161    height_in_ctb = (height + ((1 << log2_ctb_size) - 1)) >> log2_ctb_size;
1162 
1163    num_16x16_block_per_ctb = ((1 << log2_ctb_size) >> 4) * ((1 << log2_ctb_size) >> 4);
1164    context_buffer_size_per_ctb_row = align(width_in_ctb * num_16x16_block_per_ctb * 16, 256);
1165    max_mb_address = (unsigned)ceil(height * 8 / 2048.0);
1166 
1167    cm_buffer_size = max_references * context_buffer_size_per_ctb_row * height_in_ctb;
1168    db_left_tile_pxl_size = coeff_10bit * (max_mb_address * 2 * 2048 + 1024);
1169 
1170    return cm_buffer_size + db_left_tile_ctx_size + db_left_tile_pxl_size;
1171 }
1172 
get_vc1_msg(struct pipe_vc1_picture_desc * pic)1173 static rvcn_dec_message_vc1_t get_vc1_msg(struct pipe_vc1_picture_desc *pic)
1174 {
1175    rvcn_dec_message_vc1_t result;
1176 
1177    memset(&result, 0, sizeof(result));
1178    switch (pic->base.profile) {
1179    case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
1180       result.profile = RDECODE_VC1_PROFILE_SIMPLE;
1181       result.level = 1;
1182       break;
1183 
1184    case PIPE_VIDEO_PROFILE_VC1_MAIN:
1185       result.profile = RDECODE_VC1_PROFILE_MAIN;
1186       result.level = 2;
1187       break;
1188 
1189    case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
1190       result.profile = RDECODE_VC1_PROFILE_ADVANCED;
1191       result.level = 4;
1192       break;
1193 
1194    default:
1195       assert(0);
1196    }
1197 
1198    result.sps_info_flags |= pic->postprocflag << 7;
1199    result.sps_info_flags |= pic->pulldown << 6;
1200    result.sps_info_flags |= pic->interlace << 5;
1201    result.sps_info_flags |= pic->tfcntrflag << 4;
1202    result.sps_info_flags |= pic->finterpflag << 3;
1203    result.sps_info_flags |= pic->psf << 1;
1204 
1205    result.pps_info_flags |= pic->range_mapy_flag << 31;
1206    result.pps_info_flags |= pic->range_mapy << 28;
1207    result.pps_info_flags |= pic->range_mapuv_flag << 27;
1208    result.pps_info_flags |= pic->range_mapuv << 24;
1209    result.pps_info_flags |= pic->multires << 21;
1210    result.pps_info_flags |= pic->maxbframes << 16;
1211    result.pps_info_flags |= pic->overlap << 11;
1212    result.pps_info_flags |= pic->quantizer << 9;
1213    result.pps_info_flags |= pic->panscan_flag << 7;
1214    result.pps_info_flags |= pic->refdist_flag << 6;
1215    result.pps_info_flags |= pic->vstransform << 0;
1216 
1217    if (pic->base.profile != PIPE_VIDEO_PROFILE_VC1_SIMPLE) {
1218       result.pps_info_flags |= pic->syncmarker << 20;
1219       result.pps_info_flags |= pic->rangered << 19;
1220       result.pps_info_flags |= pic->loopfilter << 5;
1221       result.pps_info_flags |= pic->fastuvmc << 4;
1222       result.pps_info_flags |= pic->extended_mv << 3;
1223       result.pps_info_flags |= pic->extended_dmv << 8;
1224       result.pps_info_flags |= pic->dquant << 1;
1225    }
1226 
1227    result.chroma_format = 1;
1228 
1229    return result;
1230 }
1231 
get_ref_pic_idx(struct radeon_decoder * dec,struct pipe_video_buffer * ref)1232 static uint32_t get_ref_pic_idx(struct radeon_decoder *dec, struct pipe_video_buffer *ref)
1233 {
1234    uint32_t min = MAX2(dec->frame_number, NUM_MPEG2_REFS) - NUM_MPEG2_REFS;
1235    uint32_t max = MAX2(dec->frame_number, 1) - 1;
1236    uintptr_t frame;
1237 
1238    /* seems to be the most sane fallback */
1239    if (!ref)
1240       return max;
1241 
1242    /* get the frame number from the associated data */
1243    frame = (uintptr_t)vl_video_buffer_get_associated_data(ref, &dec->base);
1244 
1245    /* limit the frame number to a valid range */
1246    return MAX2(MIN2(frame, max), min);
1247 }
1248 
get_mpeg2_msg(struct radeon_decoder * dec,struct pipe_mpeg12_picture_desc * pic)1249 static rvcn_dec_message_mpeg2_vld_t get_mpeg2_msg(struct radeon_decoder *dec,
1250                                                   struct pipe_mpeg12_picture_desc *pic)
1251 {
1252    const int *zscan = pic->alternate_scan ? vl_zscan_alternate : vl_zscan_normal;
1253    rvcn_dec_message_mpeg2_vld_t result;
1254    unsigned i;
1255 
1256    memset(&result, 0, sizeof(result));
1257    result.decoded_pic_idx = dec->frame_number;
1258 
1259    result.forward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[0]);
1260    result.backward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[1]);
1261 
1262    if (pic->intra_matrix) {
1263       result.load_intra_quantiser_matrix = 1;
1264       for (i = 0; i < 64; ++i) {
1265          result.intra_quantiser_matrix[i] = pic->intra_matrix[zscan[i]];
1266       }
1267    }
1268    if (pic->non_intra_matrix) {
1269       result.load_nonintra_quantiser_matrix = 1;
1270       for (i = 0; i < 64; ++i) {
1271          result.nonintra_quantiser_matrix[i] = pic->non_intra_matrix[zscan[i]];
1272       }
1273    }
1274 
1275    result.profile_and_level_indication = 0;
1276    result.chroma_format = 0x1;
1277 
1278    result.picture_coding_type = pic->picture_coding_type;
1279    result.f_code[0][0] = pic->f_code[0][0] + 1;
1280    result.f_code[0][1] = pic->f_code[0][1] + 1;
1281    result.f_code[1][0] = pic->f_code[1][0] + 1;
1282    result.f_code[1][1] = pic->f_code[1][1] + 1;
1283    result.intra_dc_precision = pic->intra_dc_precision;
1284    result.pic_structure = pic->picture_structure;
1285    result.top_field_first = pic->top_field_first;
1286    result.frame_pred_frame_dct = pic->frame_pred_frame_dct;
1287    result.concealment_motion_vectors = pic->concealment_motion_vectors;
1288    result.q_scale_type = pic->q_scale_type;
1289    result.intra_vlc_format = pic->intra_vlc_format;
1290    result.alternate_scan = pic->alternate_scan;
1291 
1292    return result;
1293 }
1294 
get_mpeg4_msg(struct radeon_decoder * dec,struct pipe_mpeg4_picture_desc * pic)1295 static rvcn_dec_message_mpeg4_asp_vld_t get_mpeg4_msg(struct radeon_decoder *dec,
1296                                                       struct pipe_mpeg4_picture_desc *pic)
1297 {
1298    rvcn_dec_message_mpeg4_asp_vld_t result;
1299    unsigned i;
1300 
1301    memset(&result, 0, sizeof(result));
1302    result.decoded_pic_idx = dec->frame_number;
1303 
1304    result.forward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[0]);
1305    result.backward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[1]);
1306 
1307    result.variant_type = 0;
1308    result.profile_and_level_indication = 0xF0;
1309 
1310    result.video_object_layer_verid = 0x5;
1311    result.video_object_layer_shape = 0x0;
1312 
1313    result.video_object_layer_width = dec->base.width;
1314    result.video_object_layer_height = dec->base.height;
1315 
1316    result.vop_time_increment_resolution = pic->vop_time_increment_resolution;
1317 
1318    result.short_video_header = pic->short_video_header;
1319    result.interlaced = pic->interlaced;
1320    result.load_intra_quant_mat = 1;
1321    result.load_nonintra_quant_mat = 1;
1322    result.quarter_sample = pic->quarter_sample;
1323    result.complexity_estimation_disable = 1;
1324    result.resync_marker_disable = pic->resync_marker_disable;
1325    result.newpred_enable = 0;
1326    result.reduced_resolution_vop_enable = 0;
1327 
1328    result.quant_type = pic->quant_type;
1329 
1330    for (i = 0; i < 64; ++i) {
1331       result.intra_quant_mat[i] = pic->intra_matrix[vl_zscan_normal[i]];
1332       result.nonintra_quant_mat[i] = pic->non_intra_matrix[vl_zscan_normal[i]];
1333    }
1334 
1335    return result;
1336 }
1337 
rvcn_dec_message_create(struct radeon_decoder * dec)1338 static void rvcn_dec_message_create(struct radeon_decoder *dec)
1339 {
1340    rvcn_dec_message_header_t *header = dec->msg;
1341    rvcn_dec_message_create_t *create = dec->msg + sizeof(rvcn_dec_message_header_t);
1342    unsigned sizes = sizeof(rvcn_dec_message_header_t) + sizeof(rvcn_dec_message_create_t);
1343 
1344    memset(dec->msg, 0, sizes);
1345    header->header_size = sizeof(rvcn_dec_message_header_t);
1346    header->total_size = sizes;
1347    header->num_buffers = 1;
1348    header->msg_type = RDECODE_MSG_CREATE;
1349    header->stream_handle = dec->stream_handle;
1350    header->status_report_feedback_number = 0;
1351 
1352    header->index[0].message_id = RDECODE_MESSAGE_CREATE;
1353    header->index[0].offset = sizeof(rvcn_dec_message_header_t);
1354    header->index[0].size = sizeof(rvcn_dec_message_create_t);
1355    header->index[0].filled = 0;
1356 
1357    create->stream_type = dec->stream_type;
1358    create->session_flags = 0;
1359    create->width_in_samples = dec->base.width;
1360    create->height_in_samples = dec->base.height;
1361 }
1362 
rvcn_dec_dynamic_dpb_t2_message(struct radeon_decoder * dec,rvcn_dec_message_decode_t * decode,rvcn_dec_message_dynamic_dpb_t2_t * dynamic_dpb_t2,bool encrypted)1363 static unsigned rvcn_dec_dynamic_dpb_t2_message(struct radeon_decoder *dec, rvcn_dec_message_decode_t *decode,
1364       rvcn_dec_message_dynamic_dpb_t2_t *dynamic_dpb_t2, bool encrypted)
1365 {
1366    struct rvcn_dec_dynamic_dpb_t2 *dpb = NULL;
1367    struct si_resource *res;
1368    unsigned width, height;
1369    uint64_t addr;
1370    int i;
1371 
1372    width = align(decode->width_in_samples, dec->db_alignment);
1373    height = align(decode->height_in_samples, dec->db_alignment);
1374 
1375    list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {
1376       bool found = false;
1377 
1378       res = &(((struct si_texture *)((struct vl_video_buffer *)d->vbuf)->resources[0])->buffer);
1379       for (i = 0; i < dec->ref_codec.ref_size; ++i) {
1380          if (((dec->ref_codec.ref_list[i] & 0x7f) != 0x7f) && (d->index == (dec->ref_codec.ref_list[i] & 0x7f))) {
1381             addr = dec->ws->buffer_get_virtual_address(res->buf);
1382             dec->ws->cs_add_buffer(&dec->cs, res->buf, RADEON_USAGE_READWRITE | RADEON_USAGE_SYNCHRONIZED, RADEON_DOMAIN_VRAM);
1383             dynamic_dpb_t2->dpbAddrLo[i] = addr;
1384             dynamic_dpb_t2->dpbAddrHi[i] = addr >> 32;
1385             ++dynamic_dpb_t2->dpbArraySize;
1386             found = true;
1387          }
1388       }
1389       if (!found) {
1390          if (d->vbuf->width != width || d->vbuf->height != height) {
1391             list_del(&d->list);
1392             list_addtail(&d->list, &dec->dpb_unref_list);
1393          } else {
1394             d->index = 0x7f;
1395          }
1396       }
1397    }
1398 
1399    list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {
1400       if (d->vbuf->width == width && d->vbuf->height == height && d->index == dec->ref_codec.index) {
1401          dpb = d;
1402          break;
1403       }
1404    }
1405 
1406    if (!dpb) {
1407       list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {
1408          if (d->index == 0x7f) {
1409             d->index = dec->ref_codec.index;
1410             dpb = d;
1411             break;
1412          }
1413       }
1414    }
1415 
1416    list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_unref_list, list) {
1417       list_del(&d->list);
1418       d->vbuf->destroy(d->vbuf);
1419       FREE(d);
1420    }
1421 
1422    if (!dpb) {
1423       dpb = CALLOC_STRUCT(rvcn_dec_dynamic_dpb_t2);
1424       if (!dpb)
1425          return 1;
1426       dpb->index = dec->ref_codec.index;
1427 
1428       struct pipe_video_buffer templat;
1429       memset(&templat, 0, sizeof(templat));
1430       templat.buffer_format = get_buffer_format(dec);
1431       templat.width = width;
1432       templat.height = height;
1433       templat.bind = PIPE_BIND_VIDEO_DECODE_DPB;
1434       if (encrypted)
1435          templat.bind |= PIPE_BIND_PROTECTED;
1436       dpb->vbuf = dec->base.context->create_video_buffer(dec->base.context, &templat);
1437 
1438       if (!dpb->vbuf) {
1439          RADEON_DEC_ERR("Can't allocate dpb buffer.\n");
1440          FREE(dpb);
1441          return 1;
1442       }
1443       list_addtail(&dpb->list, &dec->dpb_ref_list);
1444    }
1445 
1446    if (dynamic_dpb_t2->dpbArraySize < dec->ref_codec.num_refs) {
1447       struct rvcn_dec_dynamic_dpb_t2 *d =
1448          list_first_entry(&dec->dpb_ref_list, struct rvcn_dec_dynamic_dpb_t2, list);
1449 
1450       res = &(((struct si_texture *)((struct vl_video_buffer *)d->vbuf)->resources[0])->buffer);
1451       addr = dec->ws->buffer_get_virtual_address(res->buf);
1452       for (i = 0; i < dec->ref_codec.num_refs; ++i) {
1453          if (dynamic_dpb_t2->dpbAddrLo[i] || dynamic_dpb_t2->dpbAddrHi[i])
1454             continue;
1455          dynamic_dpb_t2->dpbAddrLo[i] = addr;
1456          dynamic_dpb_t2->dpbAddrHi[i] = addr >> 32;
1457          ++dynamic_dpb_t2->dpbArraySize;
1458       }
1459       assert(dynamic_dpb_t2->dpbArraySize == dec->ref_codec.num_refs);
1460    }
1461 
1462    struct si_texture *dpb_luma, *dpb_chroma;
1463 
1464    dpb_luma   = (struct si_texture *)((struct vl_video_buffer *)dpb->vbuf)->resources[0];
1465    dpb_chroma = (struct si_texture *)((struct vl_video_buffer *)dpb->vbuf)->resources[1];
1466 
1467    decode->db_swizzle_mode = dpb_luma->surface.u.gfx9.swizzle_mode;
1468 
1469    dec->ws->cs_add_buffer(&dec->cs, (dpb_luma->buffer).buf, RADEON_USAGE_READWRITE | RADEON_USAGE_SYNCHRONIZED, RADEON_DOMAIN_VRAM);
1470    addr = dec->ws->buffer_get_virtual_address((dpb_luma->buffer).buf);
1471 
1472    dynamic_dpb_t2->dpbLumaPitch = dpb_luma->surface.u.gfx9.surf_pitch;
1473    dynamic_dpb_t2->dpbLumaAlignedHeight = dpb_luma->surface.u.gfx9.surf_height;
1474    dynamic_dpb_t2->dpbLumaAlignedSize = dpb_luma->surface.u.gfx9.surf_slice_size;
1475    dynamic_dpb_t2->dpbChromaPitch = dpb_chroma->surface.u.gfx9.surf_pitch;
1476    dynamic_dpb_t2->dpbChromaAlignedHeight = dpb_chroma->surface.u.gfx9.surf_height;
1477    dynamic_dpb_t2->dpbChromaAlignedSize = dpb_chroma->surface.u.gfx9.surf_slice_size;
1478 
1479    dynamic_dpb_t2->dpbCurrLo = addr;
1480    dynamic_dpb_t2->dpbCurrHi = addr >> 32;
1481    decode->decode_flags = 1;
1482    dynamic_dpb_t2->dpbConfigFlags = 0;
1483 
1484    return 0;
1485 }
1486 
rvcn_dec_message_decode(struct radeon_decoder * dec,struct pipe_video_buffer * target,struct pipe_picture_desc * picture)1487 static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec,
1488                                                       struct pipe_video_buffer *target,
1489                                                       struct pipe_picture_desc *picture)
1490 {
1491    DECRYPT_PARAMETERS *decrypt = (DECRYPT_PARAMETERS *)picture->decrypt_key;
1492    bool encrypted = picture->protected_playback;
1493    struct si_texture *luma;
1494    struct si_texture *chroma;
1495    struct pipe_video_buffer *out_surf = target;
1496    ASSERTED struct si_screen *sscreen = (struct si_screen *)dec->screen;
1497    rvcn_dec_message_header_t *header;
1498    rvcn_dec_message_index_t *index_codec;
1499    rvcn_dec_message_index_t *index_drm = NULL;
1500    rvcn_dec_message_index_t *index_dynamic_dpb = NULL;
1501    rvcn_dec_message_index_t *index_hevc_direct_reflist = NULL;
1502    rvcn_dec_message_decode_t *decode;
1503    unsigned sizes = 0, offset_decode, offset_codec;
1504    unsigned offset_drm = 0, offset_dynamic_dpb = 0, offset_hevc_direct_reflist = 0;
1505    void *codec;
1506    rvcn_dec_message_drm_t *drm = NULL;
1507    rvcn_dec_message_dynamic_dpb_t *dynamic_dpb = NULL;
1508    rvcn_dec_message_dynamic_dpb_t2_t *dynamic_dpb_t2 = NULL;
1509    rvcn_dec_message_hevc_direct_ref_list_t *hevc_reflist = NULL;
1510    bool dpb_resize = false;
1511    header = dec->msg;
1512    sizes += sizeof(rvcn_dec_message_header_t);
1513 
1514    index_codec = (void*)header + sizes;
1515    sizes += sizeof(rvcn_dec_message_index_t);
1516 
1517    if (encrypted) {
1518       index_drm = (void*)header + sizes;
1519       sizes += sizeof(rvcn_dec_message_index_t);
1520    }
1521 
1522    if (dec->dpb_type >= DPB_DYNAMIC_TIER_1) {
1523       index_dynamic_dpb = (void*)header + sizes;
1524       sizes += sizeof(rvcn_dec_message_index_t);
1525    }
1526 
1527    if (u_reduce_video_profile(picture->profile) == PIPE_VIDEO_FORMAT_HEVC) {
1528       index_hevc_direct_reflist = (void*)header + sizes;
1529       sizes += sizeof(rvcn_dec_message_index_t);
1530    }
1531 
1532    offset_decode = sizes;
1533    decode = (void*)header + sizes;
1534    sizes += sizeof(rvcn_dec_message_decode_t);
1535 
1536    if (encrypted) {
1537       offset_drm = sizes;
1538       drm = (void*)header + sizes;
1539       sizes += sizeof(rvcn_dec_message_drm_t);
1540    }
1541 
1542    if (dec->dpb_type >= DPB_DYNAMIC_TIER_1) {
1543       offset_dynamic_dpb = sizes;
1544       if (dec->dpb_type == DPB_DYNAMIC_TIER_1) {
1545          dynamic_dpb = (void*)header + sizes;
1546          sizes += sizeof(rvcn_dec_message_dynamic_dpb_t);
1547       }
1548       else if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {
1549          dynamic_dpb_t2 = (void*)header + sizes;
1550          sizes += sizeof(rvcn_dec_message_dynamic_dpb_t2_t);
1551       }
1552    }
1553 
1554    if (u_reduce_video_profile(picture->profile) == PIPE_VIDEO_FORMAT_HEVC) {
1555       offset_hevc_direct_reflist = sizes;
1556       hevc_reflist = (void*)header + sizes;
1557       sizes += align((4 + 2 * 15 * ((struct pipe_h265_picture_desc *)picture)->slice_parameter.slice_count), 4);
1558    }
1559 
1560    offset_codec = sizes;
1561    codec = (void*)header + sizes;
1562 
1563    memset(dec->msg, 0, sizes);
1564    header->header_size = sizeof(rvcn_dec_message_header_t);
1565    header->total_size = sizes;
1566    header->msg_type = RDECODE_MSG_DECODE;
1567    header->stream_handle = dec->stream_handle;
1568    header->status_report_feedback_number = dec->frame_number;
1569 
1570    header->index[0].message_id = RDECODE_MESSAGE_DECODE;
1571    header->index[0].offset = offset_decode;
1572    header->index[0].size = sizeof(rvcn_dec_message_decode_t);
1573    header->index[0].filled = 0;
1574    header->num_buffers = 1;
1575 
1576    index_codec->offset = offset_codec;
1577    index_codec->size = 0;
1578    index_codec->filled = 0;
1579    ++header->num_buffers;
1580 
1581    if (encrypted) {
1582       index_drm->message_id = RDECODE_MESSAGE_DRM;
1583       index_drm->offset = offset_drm;
1584       index_drm->size = sizeof(rvcn_dec_message_drm_t);
1585       index_drm->filled = 0;
1586       ++header->num_buffers;
1587    }
1588 
1589    if (dec->dpb_type >= DPB_DYNAMIC_TIER_1) {
1590       index_dynamic_dpb->message_id = RDECODE_MESSAGE_DYNAMIC_DPB;
1591       index_dynamic_dpb->offset = offset_dynamic_dpb;
1592       index_dynamic_dpb->filled = 0;
1593       ++header->num_buffers;
1594       if (dec->dpb_type == DPB_DYNAMIC_TIER_1)
1595          index_dynamic_dpb->size = sizeof(rvcn_dec_message_dynamic_dpb_t);
1596       else if (dec->dpb_type == DPB_DYNAMIC_TIER_2)
1597          index_dynamic_dpb->size = sizeof(rvcn_dec_message_dynamic_dpb_t2_t);
1598    }
1599 
1600    if (u_reduce_video_profile(picture->profile) == PIPE_VIDEO_FORMAT_HEVC) {
1601       index_hevc_direct_reflist->message_id = RDECODE_MESSAGE_HEVC_DIRECT_REF_LIST;
1602       index_hevc_direct_reflist->offset = offset_hevc_direct_reflist;
1603       index_hevc_direct_reflist->size = align((4 + 2 * 15 * ((struct pipe_h265_picture_desc *)picture)->slice_parameter.slice_count), 4);
1604       index_hevc_direct_reflist->filled = 0;
1605       ++header->num_buffers;
1606    }
1607 
1608    decode->stream_type = dec->stream_type;
1609    decode->decode_flags = 0;
1610    decode->width_in_samples = dec->base.width;
1611    decode->height_in_samples = dec->base.height;
1612 
1613    decode->bsd_size = align(dec->bs_size, 128);
1614 
1615    if (dec->dpb_type != DPB_DYNAMIC_TIER_2) {
1616       bool r;
1617       if (!dec->dpb.res && dec->dpb_size) {
1618          if (encrypted) {
1619             r = si_vid_create_tmz_buffer(dec->screen, &dec->dpb, dec->dpb_size, PIPE_USAGE_DEFAULT);
1620          } else {
1621             r = si_vid_create_buffer(dec->screen, &dec->dpb, dec->dpb_size, PIPE_USAGE_DEFAULT);
1622          }
1623          assert(encrypted == (bool)(dec->dpb.res->flags & RADEON_FLAG_ENCRYPTED));
1624          if (!r) {
1625             RADEON_DEC_ERR("Can't allocate dpb.\n");
1626             return NULL;
1627          }
1628       } else if (dec->dpb_type == DPB_DYNAMIC_TIER_1 && dec->dpb.res &&
1629                  (dec->max_width < dec->base.width || dec->max_height < dec->base.height)) {
1630          struct rvid_buf_offset_info buf_offset_info;
1631 
1632          buf_offset_info.num_units = (NUM_VP9_REFS + 1);
1633          buf_offset_info.old_offset = (align(dec->max_width, dec->db_alignment) *
1634             align(dec->max_height, dec->db_alignment) * 3 / 2);
1635          buf_offset_info.new_offset = (align(dec->base.width, dec->db_alignment) *
1636             align(dec->base.height, dec->db_alignment) * 3 / 2);
1637 
1638          dec->dpb_size = calc_dpb_size(dec);
1639          r = si_vid_resize_buffer(dec->base.context, &dec->cs, &dec->dpb, dec->dpb_size, &buf_offset_info);
1640          if (!r) {
1641             RADEON_DEC_ERR("Can't resize dpb.\n");
1642             return NULL;
1643          }
1644          dec->max_width = dec->base.width;
1645          dec->max_height = dec->base.height;
1646          dpb_resize = true;
1647       }
1648    }
1649 
1650    if (!dec->ctx.res) {
1651       enum pipe_video_format fmt = u_reduce_video_profile(picture->profile);
1652       if (dec->stream_type == RDECODE_CODEC_H264_PERF) {
1653          unsigned ctx_size = calc_ctx_size_h264_perf(dec);
1654          bool r;
1655          if (encrypted && dec->tmz_ctx) {
1656             r = si_vid_create_tmz_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);
1657          } else {
1658             r = si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);
1659          }
1660          assert((encrypted && dec->tmz_ctx) == (bool)(dec->ctx.res->flags & RADEON_FLAG_ENCRYPTED));
1661 
1662          if (!r) {
1663             RADEON_DEC_ERR("Can't allocate context buffer.\n");
1664             return NULL;
1665          }
1666       } else if (fmt == PIPE_VIDEO_FORMAT_VP9) {
1667          unsigned ctx_size;
1668          uint8_t *ptr;
1669          bool r;
1670 
1671          /* default probability + probability data */
1672          ctx_size = 2304 * 5;
1673 
1674          if (((struct si_screen *)dec->screen)->info.vcn_ip_version >= VCN_2_0_0) {
1675             /* SRE collocated context data */
1676             ctx_size += 32 * 2 * 128 * 68;
1677             /* SMP collocated context data */
1678             ctx_size += 9 * 64 * 2 * 128 * 68;
1679             /* SDB left tile pixel */
1680             ctx_size += 8 * 2 * 2 * 8192;
1681          } else {
1682             ctx_size += 32 * 2 * 64 * 64;
1683             ctx_size += 9 * 64 * 2 * 64 * 64;
1684             ctx_size += 8 * 2 * 4096;
1685          }
1686 
1687          if (dec->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2)
1688             ctx_size += 8 * 2 * 4096;
1689 
1690          if (encrypted && dec->tmz_ctx) {
1691             r = si_vid_create_tmz_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);
1692          } else {
1693             r = si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);
1694          }
1695          if (!r) {
1696             RADEON_DEC_ERR("Can't allocate context buffer.\n");
1697             return NULL;
1698          }
1699 
1700          /* ctx needs probs table */
1701          ptr = dec->ws->buffer_map(dec->ws, dec->ctx.res->buf, &dec->cs,
1702                                    PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
1703          fill_probs_table(ptr);
1704          dec->ws->buffer_unmap(dec->ws, dec->ctx.res->buf);
1705          dec->bs_ptr = NULL;
1706       } else if (fmt == PIPE_VIDEO_FORMAT_HEVC) {
1707          unsigned ctx_size;
1708          bool r;
1709          if (dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10)
1710             ctx_size = calc_ctx_size_h265_main10(dec, (struct pipe_h265_picture_desc *)picture);
1711          else
1712             ctx_size = calc_ctx_size_h265_main(dec);
1713 
1714          if (encrypted && dec->tmz_ctx) {
1715             r = si_vid_create_tmz_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);
1716          } else {
1717             r = si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);
1718          }
1719          if (!r) {
1720             RADEON_DEC_ERR("Can't allocate context buffer.\n");
1721             return NULL;
1722          }
1723       }
1724    }
1725    if (encrypted != dec->ws->cs_is_secure(&dec->cs)) {
1726       dec->ws->cs_flush(&dec->cs, RADEON_FLUSH_TOGGLE_SECURE_SUBMISSION, NULL);
1727    }
1728 
1729    if (dec->stream_type == RDECODE_CODEC_AV1)
1730       rvcn_dec_av1_film_grain_surface(&out_surf, (struct pipe_av1_picture_desc *)picture);
1731 
1732    luma   = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[0];
1733    chroma = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[1];
1734 
1735    decode->dpb_size = (dec->dpb_type != DPB_DYNAMIC_TIER_2) ? dec->dpb.res->buf->size : 0;
1736 
1737    /* When texture being created, the bo will be created with total size of planes,
1738     * and all planes point to the same buffer */
1739    assert(si_resource(((struct vl_video_buffer *)out_surf)->resources[0])->buf->size ==
1740       si_resource(((struct vl_video_buffer *)out_surf)->resources[1])->buf->size);
1741 
1742    decode->dt_size = si_resource(((struct vl_video_buffer *)out_surf)->resources[0])->buf->size;
1743 
1744    decode->sct_size = 0;
1745    decode->sc_coeff_size = 0;
1746 
1747    decode->sw_ctxt_size = RDECODE_SESSION_CONTEXT_SIZE;
1748    decode->db_pitch = align(dec->base.width, dec->db_alignment);
1749 
1750    if ((((struct si_screen*)dec->screen)->info.vcn_ip_version >= VCN_3_0_0) &&
1751        (dec->stream_type == RDECODE_CODEC_VP9 || dec->stream_type == RDECODE_CODEC_AV1 ||
1752         dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10))
1753       decode->db_aligned_height = align(dec->base.height, 64);
1754 
1755    decode->db_surf_tile_config = 0;
1756    decode->db_array_mode = dec->addr_gfx_mode;
1757 
1758    decode->dt_pitch = luma->surface.u.gfx9.surf_pitch * luma->surface.blk_w;
1759    decode->dt_uv_pitch = chroma->surface.u.gfx9.surf_pitch * chroma->surface.blk_w;
1760 
1761    if (luma->surface.meta_offset) {
1762       RADEON_DEC_ERR("DCC surfaces not supported.\n");
1763       return NULL;
1764    }
1765 
1766    decode->dt_tiling_mode = 0;
1767    decode->dt_swizzle_mode = luma->surface.u.gfx9.swizzle_mode;
1768    decode->dt_array_mode = dec->addr_gfx_mode;
1769    decode->dt_field_mode = ((struct vl_video_buffer *)out_surf)->base.interlaced;
1770    decode->dt_surf_tile_config = 0;
1771    decode->dt_uv_surf_tile_config = 0;
1772 
1773    decode->dt_luma_top_offset = luma->surface.u.gfx9.surf_offset;
1774    decode->dt_chroma_top_offset = chroma->surface.u.gfx9.surf_offset;
1775    if (decode->dt_field_mode) {
1776       decode->dt_luma_bottom_offset =
1777          luma->surface.u.gfx9.surf_offset + luma->surface.u.gfx9.surf_slice_size;
1778       decode->dt_chroma_bottom_offset =
1779          chroma->surface.u.gfx9.surf_offset + chroma->surface.u.gfx9.surf_slice_size;
1780    } else {
1781       decode->dt_luma_bottom_offset = decode->dt_luma_top_offset;
1782       decode->dt_chroma_bottom_offset = decode->dt_chroma_top_offset;
1783    }
1784    decode->mif_wrc_en = sscreen->info.vcn_ip_version >= VCN_3_0_0;
1785    if (dec->stream_type == RDECODE_CODEC_AV1)
1786       decode->db_pitch_uv = chroma->surface.u.gfx9.surf_pitch * chroma->surface.blk_w;
1787 
1788    if (encrypted) {
1789       assert(sscreen->info.has_tmz_support);
1790       set_drm_keys(drm, decrypt);
1791    }
1792 
1793    if (dec->dpb_type == DPB_DYNAMIC_TIER_1) {
1794       decode->decode_flags |= (RDECODE_FLAGS_USE_DYNAMIC_DPB_MASK | RDECODE_FLAGS_USE_PAL_MASK);
1795       // Add decode flag for RESIZE_DPB ,when we do resize
1796       if (dpb_resize == true)
1797         decode->decode_flags |= RDECODE_FLAGS_DPB_RESIZE_MASK;
1798 
1799       dynamic_dpb->dpbArraySize = NUM_VP9_REFS + 1;
1800       dynamic_dpb->dpbLumaPitch = align(dec->max_width, dec->db_alignment);
1801       dynamic_dpb->dpbLumaAlignedHeight = align(dec->max_height, dec->db_alignment);
1802       dynamic_dpb->dpbLumaAlignedSize =
1803          dynamic_dpb->dpbLumaPitch * dynamic_dpb->dpbLumaAlignedHeight;
1804       dynamic_dpb->dpbChromaPitch = dynamic_dpb->dpbLumaPitch >> 1;
1805       dynamic_dpb->dpbChromaAlignedHeight = dynamic_dpb->dpbLumaAlignedHeight >> 1;
1806       dynamic_dpb->dpbChromaAlignedSize =
1807          dynamic_dpb->dpbChromaPitch * dynamic_dpb->dpbChromaAlignedHeight * 2;
1808       dynamic_dpb->dpbReserved0[0] = dec->db_alignment;
1809 
1810       if (dec->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2) {
1811          dynamic_dpb->dpbLumaAlignedSize = dynamic_dpb->dpbLumaAlignedSize * 3 / 2;
1812          dynamic_dpb->dpbChromaAlignedSize = dynamic_dpb->dpbChromaAlignedSize * 3 / 2;
1813       }
1814    }
1815 
1816    if (u_reduce_video_profile(picture->profile) == PIPE_VIDEO_FORMAT_HEVC)
1817       get_h265_reflist(hevc_reflist, (struct pipe_h265_picture_desc *)picture);
1818 
1819    switch (u_reduce_video_profile(picture->profile)) {
1820    case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
1821       rvcn_dec_message_avc_t avc = get_h264_msg(dec, target, (struct pipe_h264_picture_desc *)picture);
1822       memcpy(codec, (void *)&avc, sizeof(rvcn_dec_message_avc_t));
1823       index_codec->message_id = RDECODE_MESSAGE_AVC;
1824       index_codec->size = sizeof(rvcn_dec_message_avc_t);
1825       break;
1826    }
1827    case PIPE_VIDEO_FORMAT_HEVC: {
1828       rvcn_dec_message_hevc_t hevc =
1829          get_h265_msg(dec, target, (struct pipe_h265_picture_desc *)picture);
1830 
1831       memcpy(codec, (void *)&hevc, sizeof(rvcn_dec_message_hevc_t));
1832       index_codec->message_id = RDECODE_MESSAGE_HEVC;
1833       index_codec->size = sizeof(rvcn_dec_message_hevc_t);
1834       break;
1835    }
1836    case PIPE_VIDEO_FORMAT_VC1: {
1837       rvcn_dec_message_vc1_t vc1 = get_vc1_msg((struct pipe_vc1_picture_desc *)picture);
1838 
1839       memcpy(codec, (void *)&vc1, sizeof(rvcn_dec_message_vc1_t));
1840       if ((picture->profile == PIPE_VIDEO_PROFILE_VC1_SIMPLE) ||
1841           (picture->profile == PIPE_VIDEO_PROFILE_VC1_MAIN)) {
1842          decode->width_in_samples = align(decode->width_in_samples, 16) / 16;
1843          decode->height_in_samples = align(decode->height_in_samples, 16) / 16;
1844       }
1845       index_codec->message_id = RDECODE_MESSAGE_VC1;
1846       index_codec->size = sizeof(rvcn_dec_message_vc1_t);
1847       break;
1848    }
1849    case PIPE_VIDEO_FORMAT_MPEG12: {
1850       rvcn_dec_message_mpeg2_vld_t mpeg2 =
1851          get_mpeg2_msg(dec, (struct pipe_mpeg12_picture_desc *)picture);
1852 
1853       memcpy(codec, (void *)&mpeg2, sizeof(rvcn_dec_message_mpeg2_vld_t));
1854       index_codec->message_id = RDECODE_MESSAGE_MPEG2_VLD;
1855       index_codec->size = sizeof(rvcn_dec_message_mpeg2_vld_t);
1856       break;
1857    }
1858    case PIPE_VIDEO_FORMAT_MPEG4: {
1859       rvcn_dec_message_mpeg4_asp_vld_t mpeg4 =
1860          get_mpeg4_msg(dec, (struct pipe_mpeg4_picture_desc *)picture);
1861 
1862       memcpy(codec, (void *)&mpeg4, sizeof(rvcn_dec_message_mpeg4_asp_vld_t));
1863       index_codec->message_id = RDECODE_MESSAGE_MPEG4_ASP_VLD;
1864       index_codec->size = sizeof(rvcn_dec_message_mpeg4_asp_vld_t);
1865       break;
1866    }
1867    case PIPE_VIDEO_FORMAT_VP9: {
1868       rvcn_dec_message_vp9_t vp9 =
1869          get_vp9_msg(dec, target, (struct pipe_vp9_picture_desc *)picture);
1870 
1871       memcpy(codec, (void *)&vp9, sizeof(rvcn_dec_message_vp9_t));
1872       index_codec->message_id = RDECODE_MESSAGE_VP9;
1873       index_codec->size = sizeof(rvcn_dec_message_vp9_t);
1874       break;
1875    }
1876    case PIPE_VIDEO_FORMAT_AV1: {
1877       rvcn_dec_message_av1_t av1 =
1878          get_av1_msg(dec, target, (struct pipe_av1_picture_desc *)picture);
1879 
1880       memcpy(codec, (void *)&av1, sizeof(rvcn_dec_message_av1_t));
1881       index_codec->message_id = RDECODE_MESSAGE_AV1;
1882       index_codec->size = sizeof(rvcn_dec_message_av1_t);
1883 
1884       if (dec->ctx.res == NULL) {
1885          unsigned ctx_size = ac_vcn_dec_calc_ctx_size_av1(dec->av1_version);
1886          uint8_t *ptr;
1887 
1888          if (!si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT))
1889             RADEON_DEC_ERR("Can't allocate context buffer.\n");
1890 
1891          ptr = dec->ws->buffer_map(dec->ws, dec->ctx.res->buf, &dec->cs, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
1892 
1893          ac_vcn_av1_init_probs(dec->av1_version, ptr);
1894          dec->ws->buffer_unmap(dec->ws, dec->ctx.res->buf);
1895       }
1896 
1897       break;
1898    }
1899    default:
1900       assert(0);
1901       return NULL;
1902    }
1903 
1904    header->total_size += index_codec->size;
1905 
1906    if (dec->ctx.res)
1907       decode->hw_ctxt_size = dec->ctx.res->buf->size;
1908 
1909    if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {
1910       if (rvcn_dec_dynamic_dpb_t2_message(dec, decode, dynamic_dpb_t2, encrypted))
1911          return NULL;
1912    } else if (((struct si_screen *)dec->screen)->info.vcn_ip_version == VCN_5_0_0 &&
1913                 dec->dpb_type == DPB_MAX_RES)
1914       decode->db_swizzle_mode = RDECODE_VCN5_256B_D;
1915 
1916    return luma->buffer.buf;
1917 }
1918 
rvcn_dec_message_destroy(struct radeon_decoder * dec)1919 static void rvcn_dec_message_destroy(struct radeon_decoder *dec)
1920 {
1921    rvcn_dec_message_header_t *header = dec->msg;
1922 
1923    memset(dec->msg, 0, sizeof(rvcn_dec_message_header_t));
1924    header->header_size = sizeof(rvcn_dec_message_header_t);
1925    header->total_size = sizeof(rvcn_dec_message_header_t) - sizeof(rvcn_dec_message_index_t);
1926    header->num_buffers = 0;
1927    header->msg_type = RDECODE_MSG_DESTROY;
1928    header->stream_handle = dec->stream_handle;
1929    header->status_report_feedback_number = 0;
1930 }
1931 
rvcn_dec_message_feedback(struct radeon_decoder * dec)1932 static void rvcn_dec_message_feedback(struct radeon_decoder *dec)
1933 {
1934    rvcn_dec_feedback_header_t *header = (void *)dec->fb;
1935 
1936    header->header_size = sizeof(rvcn_dec_feedback_header_t);
1937    header->total_size = sizeof(rvcn_dec_feedback_header_t);
1938    header->num_buffers = 0;
1939 }
1940 
rvcn_dec_sq_tail(struct radeon_decoder * dec)1941 static void rvcn_dec_sq_tail(struct radeon_decoder *dec)
1942 {
1943    if (dec->vcn_dec_sw_ring == false)
1944       return;
1945 
1946    rvcn_sq_tail(&dec->cs, &dec->sq);
1947 }
1948 /* flush IB to the hardware */
flush(struct radeon_decoder * dec,unsigned flags,struct pipe_fence_handle ** fence)1949 static int flush(struct radeon_decoder *dec, unsigned flags,
1950                  struct pipe_fence_handle **fence)
1951 {
1952    struct si_screen *sscreen = (struct si_screen *)dec->screen;
1953 
1954    rvcn_dec_sq_tail(dec);
1955 
1956    if (sscreen->debug_flags & DBG(IB)) {
1957       struct ac_ib_parser ib_parser = {
1958          .f = stderr,
1959          .ib = dec->cs.current.buf,
1960          .num_dw = dec->cs.current.cdw,
1961          .gfx_level = sscreen->info.gfx_level,
1962          .vcn_version = sscreen->info.vcn_ip_version,
1963          .family = sscreen->info.family,
1964          .ip_type = dec->stream_type == RDECODE_CODEC_JPEG ? AMD_IP_VCN_JPEG :
1965                     dec->vcn_dec_sw_ring ? AMD_IP_VCN_ENC : AMD_IP_VCN_DEC,
1966       };
1967       ac_parse_ib(&ib_parser, "IB");
1968    }
1969 
1970    return dec->ws->cs_flush(&dec->cs, flags, fence);
1971 }
1972 
1973 /* add a new set register command to the IB */
set_reg(struct radeon_decoder * dec,unsigned reg,uint32_t val)1974 static void set_reg(struct radeon_decoder *dec, unsigned reg, uint32_t val)
1975 {
1976    radeon_emit(&dec->cs, RDECODE_PKT0(reg >> 2, 0));
1977    radeon_emit(&dec->cs, val);
1978 }
1979 
1980 /* send a command to the VCPU through the GPCOM registers */
send_cmd(struct radeon_decoder * dec,unsigned cmd,struct pb_buffer_lean * buf,uint32_t off,unsigned usage,enum radeon_bo_domain domain)1981 static void send_cmd(struct radeon_decoder *dec, unsigned cmd, struct pb_buffer_lean *buf, uint32_t off,
1982                      unsigned usage, enum radeon_bo_domain domain)
1983 {
1984    uint64_t addr;
1985 
1986    dec->ws->cs_add_buffer(&dec->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED, domain);
1987    addr = dec->ws->buffer_get_virtual_address(buf);
1988    addr = addr + off;
1989 
1990    if (dec->vcn_dec_sw_ring == false) {
1991       set_reg(dec, dec->reg.data0, addr);
1992       set_reg(dec, dec->reg.data1, addr >> 32);
1993       set_reg(dec, dec->reg.cmd, cmd << 1);
1994       return;
1995    }
1996 
1997    if (!dec->cs.current.cdw) {
1998       rvcn_sq_header(&dec->cs, &dec->sq, false);
1999       rvcn_decode_ib_package_t *ib_header =
2000          (rvcn_decode_ib_package_t *)&(dec->cs.current.buf[dec->cs.current.cdw]);
2001 
2002       ib_header->package_size = sizeof(struct rvcn_decode_buffer_s) +
2003          sizeof(struct rvcn_decode_ib_package_s);
2004       dec->cs.current.cdw++;
2005       ib_header->package_type = (RDECODE_IB_PARAM_DECODE_BUFFER);
2006       dec->cs.current.cdw++;
2007 
2008       dec->decode_buffer =
2009          (rvcn_decode_buffer_t *)&(dec->cs.current.buf[dec->cs.current.cdw]);
2010 
2011       dec->cs.current.cdw += sizeof(struct rvcn_decode_buffer_s) / 4;
2012       memset(dec->decode_buffer, 0, sizeof(struct rvcn_decode_buffer_s));
2013    }
2014 
2015    switch(cmd) {
2016       case RDECODE_CMD_MSG_BUFFER:
2017             dec->decode_buffer->valid_buf_flag |= RDECODE_CMDBUF_FLAGS_MSG_BUFFER;
2018             dec->decode_buffer->msg_buffer_address_hi = (addr >> 32);
2019             dec->decode_buffer->msg_buffer_address_lo = (addr);
2020          break;
2021       case RDECODE_CMD_DPB_BUFFER:
2022             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_DPB_BUFFER);
2023             dec->decode_buffer->dpb_buffer_address_hi = (addr >> 32);
2024             dec->decode_buffer->dpb_buffer_address_lo = (addr);
2025          break;
2026       case RDECODE_CMD_DECODING_TARGET_BUFFER:
2027             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_DECODING_TARGET_BUFFER);
2028             dec->decode_buffer->target_buffer_address_hi = (addr >> 32);
2029             dec->decode_buffer->target_buffer_address_lo = (addr);
2030          break;
2031       case RDECODE_CMD_FEEDBACK_BUFFER:
2032             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_FEEDBACK_BUFFER);
2033             dec->decode_buffer->feedback_buffer_address_hi = (addr >> 32);
2034             dec->decode_buffer->feedback_buffer_address_lo = (addr);
2035          break;
2036       case RDECODE_CMD_PROB_TBL_BUFFER:
2037             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_PROB_TBL_BUFFER);
2038             dec->decode_buffer->prob_tbl_buffer_address_hi = (addr >> 32);
2039             dec->decode_buffer->prob_tbl_buffer_address_lo = (addr);
2040          break;
2041       case RDECODE_CMD_SESSION_CONTEXT_BUFFER:
2042             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_SESSION_CONTEXT_BUFFER);
2043             dec->decode_buffer->session_contex_buffer_address_hi = (addr >> 32);
2044             dec->decode_buffer->session_contex_buffer_address_lo = (addr);
2045          break;
2046       case RDECODE_CMD_BITSTREAM_BUFFER:
2047             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_BITSTREAM_BUFFER);
2048             dec->decode_buffer->bitstream_buffer_address_hi = (addr >> 32);
2049             dec->decode_buffer->bitstream_buffer_address_lo = (addr);
2050          break;
2051       case RDECODE_CMD_IT_SCALING_TABLE_BUFFER:
2052             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_IT_SCALING_BUFFER);
2053             dec->decode_buffer->it_sclr_table_buffer_address_hi = (addr >> 32);
2054             dec->decode_buffer->it_sclr_table_buffer_address_lo = (addr);
2055          break;
2056       case RDECODE_CMD_CONTEXT_BUFFER:
2057             dec->decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_CONTEXT_BUFFER);
2058             dec->decode_buffer->context_buffer_address_hi = (addr >> 32);
2059             dec->decode_buffer->context_buffer_address_lo = (addr);
2060          break;
2061       default:
2062             printf("Not Support!");
2063    }
2064 }
2065 
2066 /* do the codec needs an IT buffer ?*/
have_it(struct radeon_decoder * dec)2067 static bool have_it(struct radeon_decoder *dec)
2068 {
2069    return dec->stream_type == RDECODE_CODEC_H264_PERF || dec->stream_type == RDECODE_CODEC_H265;
2070 }
2071 
2072 /* do the codec needs an probs buffer? */
have_probs(struct radeon_decoder * dec)2073 static bool have_probs(struct radeon_decoder *dec)
2074 {
2075    return (dec->stream_type == RDECODE_CODEC_VP9 || dec->stream_type == RDECODE_CODEC_AV1);
2076 }
2077 
2078 /* map the next available message/feedback/itscaling buffer */
map_msg_fb_it_probs_buf(struct radeon_decoder * dec)2079 static void map_msg_fb_it_probs_buf(struct radeon_decoder *dec)
2080 {
2081    struct rvid_buffer *buf;
2082    uint8_t *ptr;
2083 
2084    /* grab the current message/feedback buffer */
2085    buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];
2086 
2087    /* and map it for CPU access */
2088    ptr =
2089       dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
2090 
2091    /* calc buffer offsets */
2092    dec->msg = ptr;
2093 
2094    dec->fb = (uint32_t *)(ptr + FB_BUFFER_OFFSET);
2095    if (have_it(dec))
2096       dec->it = (uint8_t *)(ptr + FB_BUFFER_OFFSET + FB_BUFFER_SIZE);
2097    else if (have_probs(dec))
2098       dec->probs = (uint8_t *)(ptr + FB_BUFFER_OFFSET + FB_BUFFER_SIZE);
2099 }
2100 
2101 /* unmap and send a message command to the VCPU */
send_msg_buf(struct radeon_decoder * dec)2102 static void send_msg_buf(struct radeon_decoder *dec)
2103 {
2104    struct rvid_buffer *buf;
2105 
2106    /* ignore the request if message/feedback buffer isn't mapped */
2107    if (!dec->msg || !dec->fb)
2108       return;
2109 
2110    /* grab the current message buffer */
2111    buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];
2112 
2113    /* unmap the buffer */
2114    dec->ws->buffer_unmap(dec->ws, buf->res->buf);
2115    dec->bs_ptr = NULL;
2116    dec->msg = NULL;
2117    dec->fb = NULL;
2118    dec->it = NULL;
2119    dec->probs = NULL;
2120 
2121    if (dec->sessionctx.res)
2122       send_cmd(dec, RDECODE_CMD_SESSION_CONTEXT_BUFFER, dec->sessionctx.res->buf, 0,
2123                RADEON_USAGE_READWRITE, RADEON_DOMAIN_VRAM);
2124 
2125    /* and send it to the hardware */
2126    send_cmd(dec, RDECODE_CMD_MSG_BUFFER, buf->res->buf, 0, RADEON_USAGE_READ, RADEON_DOMAIN_GTT);
2127 }
2128 
2129 /* cycle to the next set of buffers */
next_buffer(struct radeon_decoder * dec)2130 static void next_buffer(struct radeon_decoder *dec)
2131 {
2132    ++dec->cur_buffer;
2133    dec->cur_buffer %= dec->num_dec_bufs;
2134 }
2135 
calc_ctx_size_h264_perf(struct radeon_decoder * dec)2136 static unsigned calc_ctx_size_h264_perf(struct radeon_decoder *dec)
2137 {
2138    unsigned width_in_mb, height_in_mb, ctx_size;
2139    unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);
2140    unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);
2141 
2142    unsigned max_references = dec->base.max_references + 1;
2143 
2144    // picture width & height in 16 pixel units
2145    width_in_mb = width / VL_MACROBLOCK_WIDTH;
2146    height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);
2147 
2148    unsigned fs_in_mb = width_in_mb * height_in_mb;
2149    unsigned num_dpb_buffer_lean;
2150    switch (dec->base.level) {
2151    case 30:
2152       num_dpb_buffer_lean = 8100 / fs_in_mb;
2153       break;
2154    case 31:
2155       num_dpb_buffer_lean = 18000 / fs_in_mb;
2156       break;
2157    case 32:
2158       num_dpb_buffer_lean = 20480 / fs_in_mb;
2159       break;
2160    case 41:
2161       num_dpb_buffer_lean = 32768 / fs_in_mb;
2162       break;
2163    case 42:
2164       num_dpb_buffer_lean = 34816 / fs_in_mb;
2165       break;
2166    case 50:
2167       num_dpb_buffer_lean = 110400 / fs_in_mb;
2168       break;
2169    case 51:
2170       num_dpb_buffer_lean = 184320 / fs_in_mb;
2171       break;
2172    default:
2173       num_dpb_buffer_lean = 184320 / fs_in_mb;
2174       break;
2175    }
2176    num_dpb_buffer_lean++;
2177    max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer_lean), max_references);
2178    ctx_size = max_references * align(width_in_mb * height_in_mb * 192, 256);
2179 
2180    return ctx_size;
2181 }
2182 
2183 /* calculate size of reference picture buffer */
calc_dpb_size(struct radeon_decoder * dec)2184 static unsigned calc_dpb_size(struct radeon_decoder *dec)
2185 {
2186    unsigned width_in_mb, height_in_mb, image_size, dpb_size;
2187 
2188    // always align them to MB size for dpb calculation
2189    unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);
2190    unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);
2191 
2192    // always one more for currently decoded picture
2193    unsigned max_references = dec->base.max_references + 1;
2194 
2195    // aligned size of a single frame
2196    image_size = align(width, dec->db_alignment) * align(height, dec->db_alignment);
2197    image_size += image_size / 2;
2198    image_size = align(image_size, 1024);
2199 
2200    // picture width & height in 16 pixel units
2201    width_in_mb = width / VL_MACROBLOCK_WIDTH;
2202    height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);
2203 
2204    switch (u_reduce_video_profile(dec->base.profile)) {
2205    case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
2206       unsigned fs_in_mb = width_in_mb * height_in_mb;
2207       unsigned num_dpb_buffer_lean;
2208 
2209       switch (dec->base.level) {
2210       case 30:
2211          num_dpb_buffer_lean = 8100 / fs_in_mb;
2212          break;
2213       case 31:
2214          num_dpb_buffer_lean = 18000 / fs_in_mb;
2215          break;
2216       case 32:
2217          num_dpb_buffer_lean = 20480 / fs_in_mb;
2218          break;
2219       case 41:
2220          num_dpb_buffer_lean = 32768 / fs_in_mb;
2221          break;
2222       case 42:
2223          num_dpb_buffer_lean = 34816 / fs_in_mb;
2224          break;
2225       case 50:
2226          num_dpb_buffer_lean = 110400 / fs_in_mb;
2227          break;
2228       case 51:
2229          num_dpb_buffer_lean = 184320 / fs_in_mb;
2230          break;
2231       default:
2232          num_dpb_buffer_lean = 184320 / fs_in_mb;
2233          break;
2234       }
2235       num_dpb_buffer_lean++;
2236       max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer_lean), max_references);
2237       dpb_size = image_size * max_references;
2238       break;
2239    }
2240 
2241    case PIPE_VIDEO_FORMAT_HEVC:
2242       if (dec->base.width * dec->base.height >= 4096 * 2000)
2243          max_references = MAX2(max_references, 8);
2244       else
2245          max_references = MAX2(max_references, 17);
2246 
2247       if (dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10)
2248          dpb_size = align((align(width, dec->db_alignment) *
2249                     align(height, dec->db_alignment) * 9) / 4, 256) * max_references;
2250       else
2251          dpb_size = align((align(width, dec->db_alignment) *
2252                     align(height, dec->db_alignment) * 3) / 2, 256) * max_references;
2253       break;
2254 
2255    case PIPE_VIDEO_FORMAT_VC1:
2256       // the firmware seems to always assume a minimum of ref frames
2257       max_references = MAX2(NUM_VC1_REFS, max_references);
2258 
2259       // reference picture buffer
2260       dpb_size = image_size * max_references;
2261 
2262       // CONTEXT_BUFFER
2263       dpb_size += width_in_mb * height_in_mb * 128;
2264 
2265       // IT surface buffer
2266       dpb_size += width_in_mb * 64;
2267 
2268       // DB surface buffer
2269       dpb_size += width_in_mb * 128;
2270 
2271       // BP
2272       dpb_size += align(MAX2(width_in_mb, height_in_mb) * 7 * 16, 64);
2273       break;
2274 
2275    case PIPE_VIDEO_FORMAT_MPEG12:
2276       // reference picture buffer, must be big enough for all frames
2277       dpb_size = image_size * NUM_MPEG2_REFS;
2278       break;
2279 
2280    case PIPE_VIDEO_FORMAT_MPEG4:
2281       // reference picture buffer
2282       dpb_size = image_size * max_references;
2283 
2284       // CM
2285       dpb_size += width_in_mb * height_in_mb * 64;
2286 
2287       // IT surface buffer
2288       dpb_size += align(width_in_mb * height_in_mb * 32, 64);
2289 
2290       dpb_size = MAX2(dpb_size, 30 * 1024 * 1024);
2291       break;
2292 
2293    case PIPE_VIDEO_FORMAT_VP9:
2294       max_references = MAX2(max_references, 9);
2295 
2296       if (dec->dpb_type == DPB_MAX_RES)
2297          dpb_size = (((struct si_screen *)dec->screen)->info.vcn_ip_version >= VCN_2_0_0)
2298             ? (8192 * 4320 * 3 / 2) * max_references
2299             : (4096 * 3000 * 3 / 2) * max_references;
2300       else
2301          dpb_size = (align(dec->base.width, dec->db_alignment) *
2302             align(dec->base.height, dec->db_alignment) * 3 / 2) * max_references;
2303 
2304       if (dec->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2)
2305          dpb_size = dpb_size * 3 / 2;
2306       break;
2307 
2308    case PIPE_VIDEO_FORMAT_AV1:
2309       max_references = MAX2(max_references, 9);
2310       dpb_size = 8192 * 4320 * 3 / 2 * max_references * 3 / 2;
2311       break;
2312 
2313    case PIPE_VIDEO_FORMAT_JPEG:
2314       dpb_size = 0;
2315       break;
2316 
2317    default:
2318       // something is missing here
2319       assert(0);
2320 
2321       // at least use a sane default value
2322       dpb_size = 32 * 1024 * 1024;
2323       break;
2324    }
2325    return dpb_size;
2326 }
2327 
2328 /**
2329  * destroy this video decoder
2330  */
radeon_dec_destroy(struct pipe_video_codec * decoder)2331 static void radeon_dec_destroy(struct pipe_video_codec *decoder)
2332 {
2333    struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
2334    unsigned i;
2335 
2336    assert(decoder);
2337 
2338    if (dec->bs_ptr) {
2339       dec->ws->buffer_unmap(dec->ws, dec->bs_buffers[dec->cur_buffer].res->buf);
2340       dec->bs_ptr = NULL;
2341    }
2342 
2343    if (dec->msg) {
2344       dec->ws->buffer_unmap(dec->ws, dec->msg_fb_it_probs_buffers[dec->cur_buffer].res->buf);
2345       dec->msg = NULL;
2346    }
2347 
2348    if (dec->stream_type != RDECODE_CODEC_JPEG) {
2349       struct pipe_fence_handle *fence = NULL;
2350       map_msg_fb_it_probs_buf(dec);
2351       rvcn_dec_message_destroy(dec);
2352       send_msg_buf(dec);
2353       flush(dec, 0, &fence);
2354       dec->ws->fence_wait(dec->ws, fence, OS_TIMEOUT_INFINITE);
2355       dec->ws->fence_reference(dec->ws, &fence, NULL);
2356    }
2357 
2358    dec->ws->cs_destroy(&dec->cs);
2359    if (dec->ectx)
2360       dec->ectx->destroy(dec->ectx);
2361 
2362    if (dec->stream_type == RDECODE_CODEC_JPEG) {
2363       for (i = 0; i < dec->njctx; i++) {
2364          dec->ws->cs_destroy(&dec->jcs[i]);
2365          dec->ws->ctx_destroy(dec->jctx[i]);
2366       }
2367    }
2368 
2369    if (dec->msg_fb_it_probs_buffers && dec->bs_buffers) {
2370       for (i = 0; i < dec->num_dec_bufs; ++i) {
2371             si_vid_destroy_buffer(&dec->msg_fb_it_probs_buffers[i]);
2372             si_vid_destroy_buffer(&dec->bs_buffers[i]);
2373       }
2374       FREE(dec->msg_fb_it_probs_buffers);
2375       FREE(dec->bs_buffers);
2376    }
2377    dec->num_dec_bufs = 0;
2378 
2379    if (dec->dpb_type != DPB_DYNAMIC_TIER_2) {
2380       si_vid_destroy_buffer(&dec->dpb);
2381    } else {
2382       list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {
2383          list_del(&d->list);
2384          d->vbuf->destroy(d->vbuf);
2385          FREE(d);
2386       }
2387    }
2388    si_vid_destroy_buffer(&dec->ctx);
2389    si_vid_destroy_buffer(&dec->sessionctx);
2390 
2391    FREE(dec->jcs);
2392    FREE(dec->jctx);
2393    FREE(dec);
2394 }
2395 
2396 /**
2397  * start decoding of a new frame
2398  */
radeon_dec_begin_frame(struct pipe_video_codec * decoder,struct pipe_video_buffer * target,struct pipe_picture_desc * picture)2399 static void radeon_dec_begin_frame(struct pipe_video_codec *decoder,
2400                                    struct pipe_video_buffer *target,
2401                                    struct pipe_picture_desc *picture)
2402 {
2403    struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
2404    uintptr_t frame;
2405 
2406    assert(decoder);
2407 
2408    if (dec->error)
2409       return;
2410 
2411    switch (dec->stream_type) {
2412    case RDECODE_CODEC_VP9: {
2413       struct pipe_vp9_picture_desc *pic = (struct pipe_vp9_picture_desc *)picture;
2414       /* Only 10 bit is supported for Profile 2 */
2415       if (pic->picture_parameter.bit_depth > 10) {
2416          dec->error = true;
2417          return;
2418       }
2419       break;
2420    }
2421    case RDECODE_CODEC_AV1: {
2422       struct pipe_av1_picture_desc *pic = (struct pipe_av1_picture_desc *)picture;
2423       /* Only 4:2:0 is supported for Profile 2 */
2424       if (!pic->picture_parameter.seq_info_fields.subsampling_x ||
2425           !pic->picture_parameter.seq_info_fields.subsampling_y) {
2426          dec->error = true;
2427          return;
2428       }
2429       break;
2430    }
2431    default:
2432       break;
2433    }
2434 
2435    frame = ++dec->frame_number;
2436    if (dec->stream_type != RDECODE_CODEC_VP9 && dec->stream_type != RDECODE_CODEC_AV1
2437                                              && dec->stream_type != RDECODE_CODEC_H264_PERF)
2438       vl_video_buffer_set_associated_data(target, decoder, (void *)frame,
2439                                           &radeon_dec_destroy_associated_data);
2440 
2441    dec->bs_size = 0;
2442    dec->bs_ptr = dec->ws->buffer_map(dec->ws, dec->bs_buffers[dec->cur_buffer].res->buf, &dec->cs,
2443                                      PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
2444 }
2445 
2446 /**
2447  * decode a macroblock
2448  */
radeon_dec_decode_macroblock(struct pipe_video_codec * decoder,struct pipe_video_buffer * target,struct pipe_picture_desc * picture,const struct pipe_macroblock * macroblocks,unsigned num_macroblocks)2449 static void radeon_dec_decode_macroblock(struct pipe_video_codec *decoder,
2450                                          struct pipe_video_buffer *target,
2451                                          struct pipe_picture_desc *picture,
2452                                          const struct pipe_macroblock *macroblocks,
2453                                          unsigned num_macroblocks)
2454 {
2455    /* not supported (yet) */
2456    assert(0);
2457 }
2458 
2459 /**
2460  * decode a bitstream
2461  */
radeon_dec_decode_bitstream(struct pipe_video_codec * decoder,struct pipe_video_buffer * target,struct pipe_picture_desc * picture,unsigned num_buffers,const void * const * buffers,const unsigned * sizes)2462 static void radeon_dec_decode_bitstream(struct pipe_video_codec *decoder,
2463                                         struct pipe_video_buffer *target,
2464                                         struct pipe_picture_desc *picture, unsigned num_buffers,
2465                                         const void *const *buffers, const unsigned *sizes)
2466 {
2467    struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
2468    unsigned i;
2469 
2470    assert(decoder);
2471 
2472    if (dec->error)
2473       return;
2474 
2475    if (!dec->bs_ptr) {
2476       RADEON_DEC_ERR("Invalid bitstream ptr!\n");
2477       return;
2478    }
2479 
2480    unsigned long total_bs_size = dec->bs_size;
2481    for (i = 0; i < num_buffers; ++i)
2482       total_bs_size += sizes[i];
2483 
2484    struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer];
2485 
2486    if (total_bs_size > buf->res->buf->size) {
2487       dec->ws->buffer_unmap(dec->ws, buf->res->buf);
2488       dec->bs_ptr = NULL;
2489 
2490       total_bs_size = align(total_bs_size, 128);
2491 
2492       if (!dec->bs_size) {
2493          struct rvid_buffer old_buf = *buf;
2494          if (!si_vid_create_buffer(dec->screen, buf, total_bs_size, buf->usage)) {
2495             RADEON_DEC_ERR("Can't create bitstream buffer!");
2496             return;
2497          }
2498          si_vid_destroy_buffer(&old_buf);
2499       } else if (!si_vid_resize_buffer(dec->base.context, &dec->cs, buf, total_bs_size, NULL)) {
2500          RADEON_DEC_ERR("Can't resize bitstream buffer!");
2501          return;
2502       }
2503 
2504       dec->bs_ptr = dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs,
2505                                           PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
2506       if (!dec->bs_ptr)
2507          return;
2508 
2509       dec->bs_ptr += dec->bs_size;
2510    }
2511 
2512    for (i = 0; i < num_buffers; ++i) {
2513       memcpy(dec->bs_ptr, buffers[i], sizes[i]);
2514       dec->bs_size += sizes[i];
2515       dec->bs_ptr += sizes[i];
2516    }
2517 }
2518 
2519 /**
2520  * send cmd for vcn dec
2521  */
send_cmd_dec(struct radeon_decoder * dec,struct pipe_video_buffer * target,struct pipe_picture_desc * picture)2522 bool send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target,
2523                   struct pipe_picture_desc *picture)
2524 {
2525    struct pb_buffer_lean *dt;
2526    struct rvid_buffer *msg_fb_it_probs_buf, *bs_buf;
2527 
2528    msg_fb_it_probs_buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];
2529    bs_buf = &dec->bs_buffers[dec->cur_buffer];
2530 
2531    memset(dec->bs_ptr, 0, align(dec->bs_size, 128) - dec->bs_size);
2532    dec->ws->buffer_unmap(dec->ws, bs_buf->res->buf);
2533    dec->bs_ptr = NULL;
2534 
2535    map_msg_fb_it_probs_buf(dec);
2536    dt = rvcn_dec_message_decode(dec, target, picture);
2537    if (!dt)
2538       return false;
2539    rvcn_dec_message_feedback(dec);
2540    send_msg_buf(dec);
2541 
2542    if (dec->dpb_type != DPB_DYNAMIC_TIER_2)
2543       send_cmd(dec, RDECODE_CMD_DPB_BUFFER, dec->dpb.res->buf, 0, RADEON_USAGE_READWRITE,
2544             RADEON_DOMAIN_VRAM);
2545    if (dec->ctx.res)
2546       send_cmd(dec, RDECODE_CMD_CONTEXT_BUFFER, dec->ctx.res->buf, 0, RADEON_USAGE_READWRITE,
2547                RADEON_DOMAIN_VRAM);
2548    send_cmd(dec, RDECODE_CMD_BITSTREAM_BUFFER, bs_buf->res->buf, 0, RADEON_USAGE_READ,
2549             RADEON_DOMAIN_GTT);
2550    send_cmd(dec, RDECODE_CMD_DECODING_TARGET_BUFFER, dt, 0, RADEON_USAGE_WRITE, RADEON_DOMAIN_VRAM);
2551    send_cmd(dec, RDECODE_CMD_FEEDBACK_BUFFER, msg_fb_it_probs_buf->res->buf, FB_BUFFER_OFFSET,
2552             RADEON_USAGE_WRITE, RADEON_DOMAIN_GTT);
2553    if (have_it(dec))
2554       send_cmd(dec, RDECODE_CMD_IT_SCALING_TABLE_BUFFER, msg_fb_it_probs_buf->res->buf,
2555                FB_BUFFER_OFFSET + FB_BUFFER_SIZE, RADEON_USAGE_READ, RADEON_DOMAIN_GTT);
2556    else if (have_probs(dec))
2557       send_cmd(dec, RDECODE_CMD_PROB_TBL_BUFFER, msg_fb_it_probs_buf->res->buf,
2558                FB_BUFFER_OFFSET + FB_BUFFER_SIZE, RADEON_USAGE_READ, RADEON_DOMAIN_GTT);
2559 
2560    if (dec->vcn_dec_sw_ring == false)
2561       set_reg(dec, dec->reg.cntl, 1);
2562 
2563    return true;
2564 }
2565 
2566 /**
2567  * end decoding of the current frame
2568  */
radeon_dec_end_frame(struct pipe_video_codec * decoder,struct pipe_video_buffer * target,struct pipe_picture_desc * picture)2569 static int radeon_dec_end_frame(struct pipe_video_codec *decoder, struct pipe_video_buffer *target,
2570                                 struct pipe_picture_desc *picture)
2571 {
2572    struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
2573 
2574    assert(decoder);
2575 
2576    if (dec->error)
2577       return 1;
2578 
2579    if (!dec->send_cmd(dec, target, picture))
2580       return 1;
2581 
2582    flush(dec, picture->flush_flags, picture->fence);
2583 
2584    next_buffer(dec);
2585    return 0;
2586 }
2587 
radeon_dec_jpeg_check_format(struct radeon_decoder * dec,enum pipe_format format,unsigned sampling_factor)2588 static bool radeon_dec_jpeg_check_format(struct radeon_decoder *dec, enum pipe_format format,
2589                                          unsigned sampling_factor)
2590 {
2591    enum pipe_format expected_format;
2592 
2593    switch (sampling_factor) {
2594    case 0x221111:
2595       expected_format = PIPE_FORMAT_NV12;
2596       break;
2597    case 0x211111:
2598    case 0x221212:
2599    case 0x222121:
2600       expected_format = PIPE_FORMAT_YUYV;
2601       break;
2602    case 0x111111:
2603    case 0x222222:
2604    case 0x444444:
2605       expected_format = PIPE_FORMAT_Y8_U8_V8_444_UNORM;
2606       break;
2607    case 0x121111:
2608       expected_format = PIPE_FORMAT_Y8_U8_V8_440_UNORM;
2609       break;
2610    case 0x11:
2611    case 0x44:
2612       expected_format = PIPE_FORMAT_Y8_400_UNORM;
2613       break;
2614    default:
2615       RADEON_DEC_ERR("Unsupported sampling factor 0x%x\n", sampling_factor);
2616       return false;
2617    }
2618 
2619    /* Format conversion */
2620    if (format == PIPE_FORMAT_R8G8B8A8_UNORM ||
2621        format == PIPE_FORMAT_A8R8G8B8_UNORM ||
2622        format == PIPE_FORMAT_R8_G8_B8_UNORM)
2623       return true;
2624 
2625    return expected_format == format;
2626 }
2627 
2628 /**
2629  * end decoding of the current jpeg frame
2630  */
radeon_dec_jpeg_end_frame(struct pipe_video_codec * decoder,struct pipe_video_buffer * target,struct pipe_picture_desc * picture)2631 static int radeon_dec_jpeg_end_frame(struct pipe_video_codec *decoder, struct pipe_video_buffer *target,
2632                                      struct pipe_picture_desc *picture)
2633 {
2634    struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
2635    struct pipe_mjpeg_picture_desc *pic = (struct pipe_mjpeg_picture_desc *)picture;
2636 
2637    assert(decoder);
2638 
2639    if (!radeon_dec_jpeg_check_format(dec, target->buffer_format, pic->picture_parameter.sampling_factor))
2640       RADEON_DEC_ERR("Decode format check failed\n");
2641 
2642    if (dec->error)
2643       return 1;
2644 
2645    dec->jpg.crop_x = ROUND_DOWN_TO(pic->picture_parameter.crop_x, VL_MACROBLOCK_WIDTH);
2646    dec->jpg.crop_y = ROUND_DOWN_TO(pic->picture_parameter.crop_y, VL_MACROBLOCK_HEIGHT);
2647    dec->jpg.crop_width = align(pic->picture_parameter.crop_width, VL_MACROBLOCK_WIDTH);
2648    dec->jpg.crop_height = align(pic->picture_parameter.crop_height, VL_MACROBLOCK_HEIGHT);
2649    if (dec->jpg.crop_x + dec->jpg.crop_width > pic->picture_parameter.picture_width)
2650       dec->jpg.crop_width = 0;
2651    if (dec->jpg.crop_y + dec->jpg.crop_height > pic->picture_parameter.picture_height)
2652       dec->jpg.crop_height = 0;
2653    dec->send_cmd(dec, target, picture);
2654    dec->ws->cs_flush(&dec->jcs[dec->cb_idx], picture->flush_flags, NULL);
2655    next_buffer(dec);
2656    dec->cb_idx = (dec->cb_idx+1) % dec->njctx;
2657    return 0;
2658 }
2659 
2660 /**
2661  * flush any outstanding command buffers to the hardware
2662  */
radeon_dec_flush(struct pipe_video_codec * decoder)2663 static void radeon_dec_flush(struct pipe_video_codec *decoder)
2664 {
2665 }
2666 
radeon_dec_fence_wait(struct pipe_video_codec * decoder,struct pipe_fence_handle * fence,uint64_t timeout)2667 static int radeon_dec_fence_wait(struct pipe_video_codec *decoder,
2668                                  struct pipe_fence_handle *fence,
2669                                  uint64_t timeout)
2670 {
2671    struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
2672 
2673    return dec->ws->fence_wait(dec->ws, fence, timeout);
2674 }
2675 
radeon_dec_destroy_fence(struct pipe_video_codec * decoder,struct pipe_fence_handle * fence)2676 static void radeon_dec_destroy_fence(struct pipe_video_codec *decoder,
2677                                      struct pipe_fence_handle *fence)
2678 {
2679    struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
2680 
2681    dec->ws->fence_reference(dec->ws, &fence, NULL);
2682 }
2683 
2684 /**
2685  * create and HW decoder
2686  */
radeon_create_decoder(struct pipe_context * context,const struct pipe_video_codec * templ)2687 struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context,
2688                                                const struct pipe_video_codec *templ)
2689 {
2690    struct si_context *sctx = (struct si_context *)context;
2691    struct radeon_winsys *ws = sctx->ws;
2692    unsigned width = templ->width, height = templ->height;
2693    unsigned bs_buf_size, stream_type = 0, ring = AMD_IP_VCN_DEC;
2694    struct radeon_decoder *dec;
2695    int r, i;
2696 
2697    switch (u_reduce_video_profile(templ->profile)) {
2698    case PIPE_VIDEO_FORMAT_MPEG12:
2699       if (templ->entrypoint > PIPE_VIDEO_ENTRYPOINT_BITSTREAM)
2700          return vl_create_mpeg12_decoder(context, templ);
2701       stream_type = RDECODE_CODEC_MPEG2_VLD;
2702       break;
2703    case PIPE_VIDEO_FORMAT_MPEG4:
2704       width = align(width, VL_MACROBLOCK_WIDTH);
2705       height = align(height, VL_MACROBLOCK_HEIGHT);
2706       stream_type = RDECODE_CODEC_MPEG4;
2707       break;
2708    case PIPE_VIDEO_FORMAT_VC1:
2709       stream_type = RDECODE_CODEC_VC1;
2710       break;
2711    case PIPE_VIDEO_FORMAT_MPEG4_AVC:
2712       width = align(width, VL_MACROBLOCK_WIDTH);
2713       height = align(height, VL_MACROBLOCK_HEIGHT);
2714       stream_type = RDECODE_CODEC_H264_PERF;
2715       break;
2716    case PIPE_VIDEO_FORMAT_HEVC:
2717       stream_type = RDECODE_CODEC_H265;
2718       break;
2719    case PIPE_VIDEO_FORMAT_VP9:
2720       stream_type = RDECODE_CODEC_VP9;
2721       break;
2722    case PIPE_VIDEO_FORMAT_AV1:
2723       stream_type = RDECODE_CODEC_AV1;
2724       break;
2725    case PIPE_VIDEO_FORMAT_JPEG:
2726       stream_type = RDECODE_CODEC_JPEG;
2727       ring = AMD_IP_VCN_JPEG;
2728       break;
2729    default:
2730       assert(0);
2731       break;
2732    }
2733 
2734    dec = CALLOC_STRUCT(radeon_decoder);
2735 
2736    if (!dec)
2737       return NULL;
2738 
2739    if (sctx->vcn_has_ctx) {
2740       dec->ectx = context->screen->context_create(context->screen, NULL, PIPE_CONTEXT_COMPUTE_ONLY);
2741       if (!dec->ectx)
2742          sctx->vcn_has_ctx = false;
2743    }
2744 
2745    dec->base = *templ;
2746    dec->base.context = (sctx->vcn_has_ctx) ? dec->ectx : context;
2747    dec->base.width = width;
2748    dec->base.height = height;
2749    dec->max_width = width;
2750    dec->max_height = height;
2751    dec->base.destroy = radeon_dec_destroy;
2752    dec->base.begin_frame = radeon_dec_begin_frame;
2753    dec->base.decode_macroblock = radeon_dec_decode_macroblock;
2754    dec->base.decode_bitstream = radeon_dec_decode_bitstream;
2755    dec->base.end_frame = radeon_dec_end_frame;
2756    dec->base.flush = radeon_dec_flush;
2757    dec->base.fence_wait = radeon_dec_fence_wait;
2758    dec->base.destroy_fence = radeon_dec_destroy_fence;
2759 
2760    dec->stream_type = stream_type;
2761    dec->stream_handle = si_vid_alloc_stream_handle();
2762    dec->screen = context->screen;
2763    dec->ws = ws;
2764 
2765    if (u_reduce_video_profile(templ->profile) != PIPE_VIDEO_FORMAT_JPEG &&
2766        (sctx->vcn_ip_ver >= VCN_4_0_0)) {
2767       dec->vcn_dec_sw_ring = true;
2768       ring = AMD_IP_VCN_UNIFIED;
2769    }
2770 
2771    dec->sq.signature_ib_total_size_in_dw = NULL;
2772    dec->sq.signature_ib_checksum = NULL;
2773    dec->sq.engine_ib_size_of_packages = NULL;
2774 
2775    if (!ws->cs_create(&dec->cs,
2776                       (sctx->vcn_has_ctx) ? ((struct si_context *)dec->ectx)->ctx : sctx->ctx,
2777                       ring, NULL, NULL)) {
2778       RADEON_DEC_ERR("Can't get command submission context.\n");
2779       goto error;
2780    }
2781 
2782    if (dec->stream_type == RDECODE_CODEC_JPEG) {
2783 
2784       if (((struct si_screen*)dec->screen)->info.ip[AMD_IP_VCN_JPEG].num_instances > 1 &&
2785           ((struct si_screen*)dec->screen)->info.ip[AMD_IP_VCN_JPEG].num_instances <= MAX_JPEG_INST)
2786          dec->njctx = ((struct si_screen*)dec->screen)->info.ip[AMD_IP_VCN_JPEG].num_instances;
2787       else
2788          dec->njctx = 1;
2789 
2790       dec->jctx = (struct radeon_winsys_ctx **) CALLOC(dec->njctx,
2791                                                        sizeof(struct radeon_winsys_ctx *));
2792       dec->jcs = (struct radeon_cmdbuf *) CALLOC(dec->njctx, sizeof(struct radeon_cmdbuf));
2793       if(!dec->jctx || !dec->jcs)
2794          goto err;
2795       for (i = 0; i < dec->njctx; i++) {
2796       /* Initialize the context handle and the command stream. */
2797          dec->jctx[i] = dec->ws->ctx_create(dec->ws, RADEON_CTX_PRIORITY_MEDIUM,
2798                                             sctx->context_flags & PIPE_CONTEXT_LOSE_CONTEXT_ON_RESET);
2799          if (!sctx->ctx)
2800             goto error;
2801          if (!dec->ws->cs_create(&dec->jcs[i], dec->jctx[i], ring, NULL, NULL)) {
2802             RADEON_DEC_ERR("Can't get additional command submission context for mJPEG.\n");
2803             goto error;
2804          }
2805       }
2806       dec->base.end_frame = radeon_dec_jpeg_end_frame;
2807       dec->cb_idx = 0;
2808    }
2809 
2810    for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++)
2811       dec->render_pic_list[i] = NULL;
2812 
2813    if ((sctx->vcn_ip_ver >= VCN_3_0_0) && (stream_type == RDECODE_CODEC_H264_PERF)) {
2814       for (i = 0; i < ARRAY_SIZE(dec->h264_valid_ref_num); i++)
2815          dec->h264_valid_ref_num[i] = (unsigned) -1;
2816       for (i = 0; i < ARRAY_SIZE(dec->h264_valid_poc_num); i++)
2817          dec->h264_valid_poc_num[i] = (unsigned) -1;
2818    }
2819 
2820    if (dec->stream_type == RDECODE_CODEC_JPEG) {
2821       if (sctx->vcn_ip_ver == VCN_4_0_3)
2822          dec->num_dec_bufs = dec->njctx;
2823       else
2824          dec->num_dec_bufs = dec->njctx * NUM_BUFFERS;
2825    } else
2826       dec->num_dec_bufs = NUM_BUFFERS;
2827 
2828    bs_buf_size = align(width * height / 32, 128);
2829    dec->msg_fb_it_probs_buffers = (struct rvid_buffer *) CALLOC(dec->num_dec_bufs, sizeof(struct rvid_buffer));
2830    dec->bs_buffers = (struct rvid_buffer *) CALLOC(dec->num_dec_bufs, sizeof(struct rvid_buffer));
2831    if(!dec->msg_fb_it_probs_buffers || !dec->bs_buffers)
2832       goto error;
2833 
2834    for (i = 0; i < dec->num_dec_bufs; ++i) {
2835       unsigned msg_fb_it_probs_size = FB_BUFFER_OFFSET + FB_BUFFER_SIZE;
2836       if (have_it(dec))
2837          msg_fb_it_probs_size += IT_SCALING_TABLE_SIZE;
2838       else if (have_probs(dec))
2839          msg_fb_it_probs_size += (dec->stream_type == RDECODE_CODEC_VP9) ?
2840                                  VP9_PROBS_TABLE_SIZE :
2841                                  sizeof(rvcn_dec_av1_segment_fg_t);
2842       /* use vram to improve performance, workaround an unknown bug */
2843       if (!si_vid_create_buffer(dec->screen, &dec->msg_fb_it_probs_buffers[i], msg_fb_it_probs_size,
2844                                 PIPE_USAGE_DEFAULT)) {
2845          RADEON_DEC_ERR("Can't allocate message buffers.\n");
2846          goto error;
2847       }
2848 
2849       if (!si_vid_create_buffer(dec->screen, &dec->bs_buffers[i], bs_buf_size,
2850                                 PIPE_USAGE_STAGING)) {
2851          RADEON_DEC_ERR("Can't allocate bitstream buffers.\n");
2852          goto error;
2853       }
2854 
2855       if (have_probs(dec) && dec->stream_type == RDECODE_CODEC_VP9) {
2856          struct rvid_buffer *buf;
2857          void *ptr;
2858 
2859          buf = &dec->msg_fb_it_probs_buffers[i];
2860          ptr = dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs,
2861                                    PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
2862          ptr += FB_BUFFER_OFFSET + FB_BUFFER_SIZE;
2863          fill_probs_table(ptr);
2864          dec->ws->buffer_unmap(dec->ws, buf->res->buf);
2865          dec->bs_ptr = NULL;
2866       }
2867    }
2868 
2869    if ((sctx->vcn_ip_ver >= VCN_3_0_0) &&
2870          (stream_type == RDECODE_CODEC_VP9 ||
2871           stream_type == RDECODE_CODEC_AV1 ||
2872         ((stream_type == RDECODE_CODEC_H265) && templ->expect_chunked_decode) ||
2873         ((stream_type == RDECODE_CODEC_H264_PERF) && templ->expect_chunked_decode)))
2874       dec->dpb_type = DPB_DYNAMIC_TIER_2;
2875    else if (sctx->vcn_ip_ver <= VCN_2_6_0 && stream_type == RDECODE_CODEC_VP9)
2876       dec->dpb_type = DPB_DYNAMIC_TIER_1;
2877    else
2878       dec->dpb_type = DPB_MAX_RES;
2879 
2880    dec->db_alignment = (sctx->vcn_ip_ver >= VCN_2_0_0 &&
2881                    dec->base.width > 32 && (dec->stream_type == RDECODE_CODEC_VP9 ||
2882                    dec->stream_type == RDECODE_CODEC_AV1 ||
2883                    dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10)) ? 64 : 32;
2884 
2885    if (sctx->vcn_ip_ver >= VCN_5_0_0) {
2886       if (stream_type == RDECODE_CODEC_VP9 ||
2887           stream_type == RDECODE_CODEC_AV1 ||
2888           stream_type == RDECODE_CODEC_H265 ||
2889           stream_type == RDECODE_CODEC_H264_PERF)
2890          dec->db_alignment = 64;
2891    }
2892 
2893    if (dec->dpb_type != DPB_DYNAMIC_TIER_2)
2894       dec->dpb_size = calc_dpb_size(dec);
2895 
2896    if (!si_vid_create_buffer(dec->screen, &dec->sessionctx, RDECODE_SESSION_CONTEXT_SIZE,
2897                              PIPE_USAGE_DEFAULT)) {
2898       RADEON_DEC_ERR("Can't allocate session ctx.\n");
2899       goto error;
2900    }
2901 
2902    dec->addr_gfx_mode = RDECODE_ARRAY_MODE_LINEAR;
2903    dec->av1_version = RDECODE_AV1_VER_0;
2904 
2905    switch (sctx->vcn_ip_ver) {
2906    case VCN_1_0_0:
2907    case VCN_1_0_1:
2908       dec->reg.data0 = RDECODE_VCN1_GPCOM_VCPU_DATA0;
2909       dec->reg.data1 = RDECODE_VCN1_GPCOM_VCPU_DATA1;
2910       dec->reg.cmd = RDECODE_VCN1_GPCOM_VCPU_CMD;
2911       dec->reg.cntl = RDECODE_VCN1_ENGINE_CNTL;
2912       dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V1;
2913       break;
2914    case VCN_2_0_0:
2915    case VCN_2_0_2:
2916    case VCN_2_0_3:
2917    case VCN_2_2_0:
2918       dec->reg.data0 = RDECODE_VCN2_GPCOM_VCPU_DATA0;
2919       dec->reg.data1 = RDECODE_VCN2_GPCOM_VCPU_DATA1;
2920       dec->reg.cmd = RDECODE_VCN2_GPCOM_VCPU_CMD;
2921       dec->reg.cntl = RDECODE_VCN2_ENGINE_CNTL;
2922       dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V2;
2923       break;
2924    case VCN_2_5_0:
2925    case VCN_2_6_0:
2926    case VCN_3_0_0:
2927    case VCN_3_0_2:
2928    case VCN_3_0_16:
2929    case VCN_3_0_33:
2930    case VCN_3_1_1:
2931    case VCN_3_1_2:
2932       dec->reg.data0 = RDECODE_VCN2_5_GPCOM_VCPU_DATA0;
2933       dec->reg.data1 = RDECODE_VCN2_5_GPCOM_VCPU_DATA1;
2934       dec->reg.cmd = RDECODE_VCN2_5_GPCOM_VCPU_CMD;
2935       dec->reg.cntl = RDECODE_VCN2_5_ENGINE_CNTL;
2936       dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V2;
2937       break;
2938    case VCN_4_0_3:
2939       dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V3;
2940       dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX9;
2941       dec->av1_version = RDECODE_AV1_VER_1;
2942       break;
2943    case VCN_4_0_0:
2944    case VCN_4_0_2:
2945    case VCN_4_0_4:
2946    case VCN_4_0_5:
2947    case VCN_4_0_6:
2948       dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V2;
2949       dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX11;
2950       dec->av1_version = RDECODE_AV1_VER_1;
2951       break;
2952    case VCN_5_0_0:
2953       dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V3;
2954       dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX11;
2955       dec->av1_version = RDECODE_AV1_VER_1;
2956       break;
2957    case VCN_5_0_1:
2958       dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V3;
2959       dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX9;
2960       dec->av1_version = RDECODE_AV1_VER_1;
2961       break;
2962    default:
2963       RADEON_DEC_ERR("VCN is not supported.\n");
2964       goto error;
2965    }
2966 
2967    if (dec->stream_type != RDECODE_CODEC_JPEG) {
2968       map_msg_fb_it_probs_buf(dec);
2969       rvcn_dec_message_create(dec);
2970       send_msg_buf(dec);
2971       r = flush(dec, 0, NULL);
2972       if (r)
2973          goto error;
2974    } else if (dec->jpg_reg.version != RDECODE_JPEG_REG_VER_V1) {
2975       dec->jpg_reg.jrbc_ib_cond_rd_timer = vcnipUVD_JRBC_IB_COND_RD_TIMER;
2976       dec->jpg_reg.jrbc_ib_ref_data = vcnipUVD_JRBC_IB_REF_DATA;
2977       dec->jpg_reg.jpeg_rb_base = vcnipUVD_JPEG_RB_BASE;
2978       dec->jpg_reg.jpeg_rb_size = vcnipUVD_JPEG_RB_SIZE;
2979       dec->jpg_reg.jpeg_rb_wptr = vcnipUVD_JPEG_RB_WPTR;
2980       dec->jpg_reg.jpeg_int_en = vcnipUVD_JPEG_INT_EN;
2981       dec->jpg_reg.jpeg_cntl = vcnipUVD_JPEG_CNTL;
2982       dec->jpg_reg.jpeg_rb_rptr = vcnipUVD_JPEG_RB_RPTR;
2983       if (dec->jpg_reg.version == RDECODE_JPEG_REG_VER_V2) {
2984          dec->jpg_reg.jpeg_dec_soft_rst = vcnipUVD_JPEG_DEC_SOFT_RST;
2985          dec->jpg_reg.lmi_jpeg_read_64bit_bar_high = vcnipUVD_LMI_JPEG_READ_64BIT_BAR_HIGH;
2986          dec->jpg_reg.lmi_jpeg_read_64bit_bar_low = vcnipUVD_LMI_JPEG_READ_64BIT_BAR_LOW;
2987          dec->jpg_reg.jpeg_pitch = vcnipUVD_JPEG_PITCH;
2988          dec->jpg_reg.jpeg_uv_pitch = vcnipUVD_JPEG_UV_PITCH;
2989          dec->jpg_reg.dec_addr_mode = vcnipJPEG_DEC_ADDR_MODE;
2990          dec->jpg_reg.dec_y_gfx10_tiling_surface = vcnipJPEG_DEC_Y_GFX10_TILING_SURFACE;
2991          dec->jpg_reg.dec_uv_gfx10_tiling_surface = vcnipJPEG_DEC_UV_GFX10_TILING_SURFACE;
2992          dec->jpg_reg.lmi_jpeg_write_64bit_bar_high = vcnipUVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH;
2993          dec->jpg_reg.lmi_jpeg_write_64bit_bar_low = vcnipUVD_LMI_JPEG_WRITE_64BIT_BAR_LOW;
2994          dec->jpg_reg.jpeg_tier_cntl2 = vcnipUVD_JPEG_TIER_CNTL2;
2995          dec->jpg_reg.jpeg_outbuf_cntl = vcnipUVD_JPEG_OUTBUF_CNTL;
2996          dec->jpg_reg.jpeg_outbuf_rptr = vcnipUVD_JPEG_OUTBUF_RPTR;
2997          dec->jpg_reg.jpeg_outbuf_wptr = vcnipUVD_JPEG_OUTBUF_WPTR;
2998          dec->jpg_reg.jpeg_index = vcnipUVD_JPEG_INDEX;
2999          dec->jpg_reg.jpeg_data = vcnipUVD_JPEG_DATA;
3000       } else {
3001          dec->jpg_reg.jpeg_dec_soft_rst = vcnipUVD_JPEG_DEC_SOFT_RST_1;
3002          dec->jpg_reg.lmi_jpeg_read_64bit_bar_high = vcnipUVD_LMI_JPEG_READ_64BIT_BAR_HIGH_1;
3003          dec->jpg_reg.lmi_jpeg_read_64bit_bar_low = vcnipUVD_LMI_JPEG_READ_64BIT_BAR_LOW_1;
3004          dec->jpg_reg.jpeg_pitch = vcnipUVD_JPEG_PITCH_1;
3005          dec->jpg_reg.jpeg_uv_pitch = vcnipUVD_JPEG_UV_PITCH_1;
3006          dec->jpg_reg.dec_addr_mode = vcnipJPEG_DEC_ADDR_MODE_1;
3007          dec->jpg_reg.dec_y_gfx10_tiling_surface = vcnipJPEG_DEC_Y_GFX10_TILING_SURFACE_1;
3008          dec->jpg_reg.dec_uv_gfx10_tiling_surface = vcnipJPEG_DEC_UV_GFX10_TILING_SURFACE_1;
3009          dec->jpg_reg.lmi_jpeg_write_64bit_bar_high = vcnipUVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_1;
3010          dec->jpg_reg.lmi_jpeg_write_64bit_bar_low = vcnipUVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_1;
3011          dec->jpg_reg.jpeg_tier_cntl2 = vcnipUVD_JPEG_TIER_CNTL2_1;
3012          dec->jpg_reg.jpeg_outbuf_cntl = vcnipUVD_JPEG_OUTBUF_CNTL_1;
3013          dec->jpg_reg.jpeg_outbuf_rptr = vcnipUVD_JPEG_OUTBUF_RPTR_1;
3014          dec->jpg_reg.jpeg_outbuf_wptr = vcnipUVD_JPEG_OUTBUF_WPTR_1;
3015          dec->jpg_reg.jpeg_luma_base0_0 = vcnipUVD_JPEG_LUMA_BASE0_0;
3016          dec->jpg_reg.jpeg_chroma_base0_0 = vcnipUVD_JPEG_CHROMA_BASE0_0;
3017          dec->jpg_reg.jpeg_chromav_base0_0 = vcnipUVD_JPEG_CHROMAV_BASE0_0;
3018       }
3019    }
3020 
3021    next_buffer(dec);
3022 
3023    if (stream_type == RDECODE_CODEC_JPEG)
3024       dec->send_cmd = send_cmd_jpeg;
3025    else
3026       dec->send_cmd = send_cmd_dec;
3027 
3028 
3029    if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {
3030       list_inithead(&dec->dpb_ref_list);
3031       list_inithead(&dec->dpb_unref_list);
3032    }
3033 
3034    dec->tmz_ctx = sctx->vcn_ip_ver < VCN_2_2_0 && sctx->vcn_ip_ver != VCN_UNKNOWN;
3035 
3036    return &dec->base;
3037 
3038 error:
3039    dec->ws->cs_destroy(&dec->cs);
3040    if (dec->ectx)
3041       dec->ectx->destroy(dec->ectx);
3042 
3043    if (dec->stream_type == RDECODE_CODEC_JPEG) {
3044       for (i = 0; i < dec->njctx; i++) {
3045          dec->ws->cs_destroy(&dec->jcs[i]);
3046          dec->ws->ctx_destroy(dec->jctx[i]);
3047       }
3048    }
3049 
3050    if (dec->msg_fb_it_probs_buffers && dec->bs_buffers) {
3051       for (i = 0; i < dec->num_dec_bufs; ++i) {
3052             si_vid_destroy_buffer(&dec->msg_fb_it_probs_buffers[i]);
3053             si_vid_destroy_buffer(&dec->bs_buffers[i]);
3054       }
3055       FREE(dec->msg_fb_it_probs_buffers);
3056       FREE(dec->bs_buffers);
3057    }
3058 
3059    if (dec->dpb_type != DPB_DYNAMIC_TIER_2)
3060       si_vid_destroy_buffer(&dec->dpb);
3061    si_vid_destroy_buffer(&dec->ctx);
3062    si_vid_destroy_buffer(&dec->sessionctx);
3063 
3064 err:
3065    if (dec->jcs)
3066       FREE(dec->jcs);
3067    if (dec->jctx)
3068       FREE(dec->jctx);
3069    FREE(dec);
3070 
3071    return NULL;
3072 }
3073 
get_buffer_format(struct radeon_decoder * dec)3074 static enum pipe_format get_buffer_format(struct radeon_decoder *dec)
3075 {
3076    switch (dec->ref_codec.bts) {
3077    case CODEC_10_BITS:
3078       return PIPE_FORMAT_P010;
3079    case CODEC_12_BITS:
3080       return PIPE_FORMAT_P012;
3081    default:
3082       return PIPE_FORMAT_NV12;
3083    }
3084 }
3085