Path: blob/21.2-virgl/src/gallium/drivers/radeon/radeon_vcn_dec.c
4570 views
/**************************************************************************1*2* Copyright 2017 Advanced Micro Devices, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627#include "radeon_vcn_dec.h"2829#include "pipe/p_video_codec.h"30#include "radeon_video.h"31#include "radeonsi/si_pipe.h"32#include "util/u_memory.h"33#include "util/u_video.h"34#include "vl/vl_mpeg12_decoder.h"35#include "vl/vl_probs_table.h"36#include "pspdecryptionparam.h"3738#include <assert.h>39#include <stdio.h>4041#include "radeon_vcn_av1_default.h"4243#define FB_BUFFER_OFFSET 0x100044#define FB_BUFFER_SIZE 204845#define IT_SCALING_TABLE_SIZE 99246#define VP9_PROBS_TABLE_SIZE (RDECODE_VP9_PROBS_DATA_SIZE + 256)47#define RDECODE_SESSION_CONTEXT_SIZE (128 * 1024)4849#define RDECODE_VCN1_GPCOM_VCPU_CMD 0x2070c50#define RDECODE_VCN1_GPCOM_VCPU_DATA0 0x2071051#define RDECODE_VCN1_GPCOM_VCPU_DATA1 0x2071452#define RDECODE_VCN1_ENGINE_CNTL 0x207185354#define RDECODE_VCN2_GPCOM_VCPU_CMD (0x503 << 2)55#define RDECODE_VCN2_GPCOM_VCPU_DATA0 (0x504 << 2)56#define RDECODE_VCN2_GPCOM_VCPU_DATA1 (0x505 << 2)57#define RDECODE_VCN2_ENGINE_CNTL (0x506 << 2)5859#define RDECODE_VCN2_5_GPCOM_VCPU_CMD 0x3c60#define RDECODE_VCN2_5_GPCOM_VCPU_DATA0 0x4061#define RDECODE_VCN2_5_GPCOM_VCPU_DATA1 0x4462#define RDECODE_VCN2_5_ENGINE_CNTL 0x9b46364#define NUM_MPEG2_REFS 665#define NUM_H264_REFS 1766#define NUM_VC1_REFS 567#define NUM_VP9_REFS 868#define NUM_AV1_REFS 869#define NUM_AV1_REFS_PER_FRAME 77071static unsigned calc_dpb_size(struct radeon_decoder *dec);72static unsigned calc_ctx_size_h264_perf(struct radeon_decoder *dec);73static unsigned calc_ctx_size_h265_main(struct radeon_decoder *dec);74static unsigned calc_ctx_size_h265_main10(struct radeon_decoder *dec,75struct pipe_h265_picture_desc *pic);7677static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec,78struct pipe_h264_picture_desc *pic)79{80rvcn_dec_message_avc_t result;8182memset(&result, 0, sizeof(result));83switch (pic->base.profile) {84case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:85case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:86result.profile = RDECODE_H264_PROFILE_BASELINE;87break;8889case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:90result.profile = RDECODE_H264_PROFILE_MAIN;91break;9293case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:94result.profile = RDECODE_H264_PROFILE_HIGH;95break;9697default:98assert(0);99break;100}101102result.level = dec->base.level;103104result.sps_info_flags = 0;105result.sps_info_flags |= pic->pps->sps->direct_8x8_inference_flag << 0;106result.sps_info_flags |= pic->pps->sps->mb_adaptive_frame_field_flag << 1;107result.sps_info_flags |= pic->pps->sps->frame_mbs_only_flag << 2;108result.sps_info_flags |= pic->pps->sps->delta_pic_order_always_zero_flag << 3;109result.sps_info_flags |= 1 << RDECODE_SPS_INFO_H264_EXTENSION_SUPPORT_FLAG_SHIFT;110111result.bit_depth_luma_minus8 = pic->pps->sps->bit_depth_luma_minus8;112result.bit_depth_chroma_minus8 = pic->pps->sps->bit_depth_chroma_minus8;113result.log2_max_frame_num_minus4 = pic->pps->sps->log2_max_frame_num_minus4;114result.pic_order_cnt_type = pic->pps->sps->pic_order_cnt_type;115result.log2_max_pic_order_cnt_lsb_minus4 = pic->pps->sps->log2_max_pic_order_cnt_lsb_minus4;116117switch (dec->base.chroma_format) {118case PIPE_VIDEO_CHROMA_FORMAT_NONE:119break;120case PIPE_VIDEO_CHROMA_FORMAT_400:121result.chroma_format = 0;122break;123case PIPE_VIDEO_CHROMA_FORMAT_420:124result.chroma_format = 1;125break;126case PIPE_VIDEO_CHROMA_FORMAT_422:127result.chroma_format = 2;128break;129case PIPE_VIDEO_CHROMA_FORMAT_444:130result.chroma_format = 3;131break;132}133134result.pps_info_flags = 0;135result.pps_info_flags |= pic->pps->transform_8x8_mode_flag << 0;136result.pps_info_flags |= pic->pps->redundant_pic_cnt_present_flag << 1;137result.pps_info_flags |= pic->pps->constrained_intra_pred_flag << 2;138result.pps_info_flags |= pic->pps->deblocking_filter_control_present_flag << 3;139result.pps_info_flags |= pic->pps->weighted_bipred_idc << 4;140result.pps_info_flags |= pic->pps->weighted_pred_flag << 6;141result.pps_info_flags |= pic->pps->bottom_field_pic_order_in_frame_present_flag << 7;142result.pps_info_flags |= pic->pps->entropy_coding_mode_flag << 8;143144result.num_slice_groups_minus1 = pic->pps->num_slice_groups_minus1;145result.slice_group_map_type = pic->pps->slice_group_map_type;146result.slice_group_change_rate_minus1 = pic->pps->slice_group_change_rate_minus1;147result.pic_init_qp_minus26 = pic->pps->pic_init_qp_minus26;148result.chroma_qp_index_offset = pic->pps->chroma_qp_index_offset;149result.second_chroma_qp_index_offset = pic->pps->second_chroma_qp_index_offset;150151memcpy(result.scaling_list_4x4, pic->pps->ScalingList4x4, 6 * 16);152memcpy(result.scaling_list_8x8, pic->pps->ScalingList8x8, 2 * 64);153154memcpy(dec->it, result.scaling_list_4x4, 6 * 16);155memcpy((dec->it + 96), result.scaling_list_8x8, 2 * 64);156157result.num_ref_frames = pic->num_ref_frames;158159result.num_ref_idx_l0_active_minus1 = pic->num_ref_idx_l0_active_minus1;160result.num_ref_idx_l1_active_minus1 = pic->num_ref_idx_l1_active_minus1;161162result.frame_num = pic->frame_num;163memcpy(result.frame_num_list, pic->frame_num_list, 4 * 16);164result.curr_field_order_cnt_list[0] = pic->field_order_cnt[0];165result.curr_field_order_cnt_list[1] = pic->field_order_cnt[1];166memcpy(result.field_order_cnt_list, pic->field_order_cnt_list, 4 * 16 * 2);167168result.decoded_pic_idx = pic->frame_num;169170return result;171}172173static void radeon_dec_destroy_associated_data(void *data)174{175/* NOOP, since we only use an intptr */176}177178static rvcn_dec_message_hevc_t get_h265_msg(struct radeon_decoder *dec,179struct pipe_video_buffer *target,180struct pipe_h265_picture_desc *pic)181{182rvcn_dec_message_hevc_t result;183unsigned i, j;184185memset(&result, 0, sizeof(result));186result.sps_info_flags = 0;187result.sps_info_flags |= pic->pps->sps->scaling_list_enabled_flag << 0;188result.sps_info_flags |= pic->pps->sps->amp_enabled_flag << 1;189result.sps_info_flags |= pic->pps->sps->sample_adaptive_offset_enabled_flag << 2;190result.sps_info_flags |= pic->pps->sps->pcm_enabled_flag << 3;191result.sps_info_flags |= pic->pps->sps->pcm_loop_filter_disabled_flag << 4;192result.sps_info_flags |= pic->pps->sps->long_term_ref_pics_present_flag << 5;193result.sps_info_flags |= pic->pps->sps->sps_temporal_mvp_enabled_flag << 6;194result.sps_info_flags |= pic->pps->sps->strong_intra_smoothing_enabled_flag << 7;195result.sps_info_flags |= pic->pps->sps->separate_colour_plane_flag << 8;196if (((struct si_screen *)dec->screen)->info.family == CHIP_CARRIZO)197result.sps_info_flags |= 1 << 9;198if (pic->UseRefPicList == true)199result.sps_info_flags |= 1 << 10;200if (pic->UseStRpsBits == true && pic->pps->st_rps_bits != 0) {201result.sps_info_flags |= 1 << 11;202result.st_rps_bits = pic->pps->st_rps_bits;203}204205result.chroma_format = pic->pps->sps->chroma_format_idc;206result.bit_depth_luma_minus8 = pic->pps->sps->bit_depth_luma_minus8;207result.bit_depth_chroma_minus8 = pic->pps->sps->bit_depth_chroma_minus8;208result.log2_max_pic_order_cnt_lsb_minus4 = pic->pps->sps->log2_max_pic_order_cnt_lsb_minus4;209result.sps_max_dec_pic_buffering_minus1 = pic->pps->sps->sps_max_dec_pic_buffering_minus1;210result.log2_min_luma_coding_block_size_minus3 =211pic->pps->sps->log2_min_luma_coding_block_size_minus3;212result.log2_diff_max_min_luma_coding_block_size =213pic->pps->sps->log2_diff_max_min_luma_coding_block_size;214result.log2_min_transform_block_size_minus2 =215pic->pps->sps->log2_min_transform_block_size_minus2;216result.log2_diff_max_min_transform_block_size =217pic->pps->sps->log2_diff_max_min_transform_block_size;218result.max_transform_hierarchy_depth_inter = pic->pps->sps->max_transform_hierarchy_depth_inter;219result.max_transform_hierarchy_depth_intra = pic->pps->sps->max_transform_hierarchy_depth_intra;220result.pcm_sample_bit_depth_luma_minus1 = pic->pps->sps->pcm_sample_bit_depth_luma_minus1;221result.pcm_sample_bit_depth_chroma_minus1 = pic->pps->sps->pcm_sample_bit_depth_chroma_minus1;222result.log2_min_pcm_luma_coding_block_size_minus3 =223pic->pps->sps->log2_min_pcm_luma_coding_block_size_minus3;224result.log2_diff_max_min_pcm_luma_coding_block_size =225pic->pps->sps->log2_diff_max_min_pcm_luma_coding_block_size;226result.num_short_term_ref_pic_sets = pic->pps->sps->num_short_term_ref_pic_sets;227228result.pps_info_flags = 0;229result.pps_info_flags |= pic->pps->dependent_slice_segments_enabled_flag << 0;230result.pps_info_flags |= pic->pps->output_flag_present_flag << 1;231result.pps_info_flags |= pic->pps->sign_data_hiding_enabled_flag << 2;232result.pps_info_flags |= pic->pps->cabac_init_present_flag << 3;233result.pps_info_flags |= pic->pps->constrained_intra_pred_flag << 4;234result.pps_info_flags |= pic->pps->transform_skip_enabled_flag << 5;235result.pps_info_flags |= pic->pps->cu_qp_delta_enabled_flag << 6;236result.pps_info_flags |= pic->pps->pps_slice_chroma_qp_offsets_present_flag << 7;237result.pps_info_flags |= pic->pps->weighted_pred_flag << 8;238result.pps_info_flags |= pic->pps->weighted_bipred_flag << 9;239result.pps_info_flags |= pic->pps->transquant_bypass_enabled_flag << 10;240result.pps_info_flags |= pic->pps->tiles_enabled_flag << 11;241result.pps_info_flags |= pic->pps->entropy_coding_sync_enabled_flag << 12;242result.pps_info_flags |= pic->pps->uniform_spacing_flag << 13;243result.pps_info_flags |= pic->pps->loop_filter_across_tiles_enabled_flag << 14;244result.pps_info_flags |= pic->pps->pps_loop_filter_across_slices_enabled_flag << 15;245result.pps_info_flags |= pic->pps->deblocking_filter_override_enabled_flag << 16;246result.pps_info_flags |= pic->pps->pps_deblocking_filter_disabled_flag << 17;247result.pps_info_flags |= pic->pps->lists_modification_present_flag << 18;248result.pps_info_flags |= pic->pps->slice_segment_header_extension_present_flag << 19;249250result.num_extra_slice_header_bits = pic->pps->num_extra_slice_header_bits;251result.num_long_term_ref_pic_sps = pic->pps->sps->num_long_term_ref_pics_sps;252result.num_ref_idx_l0_default_active_minus1 = pic->pps->num_ref_idx_l0_default_active_minus1;253result.num_ref_idx_l1_default_active_minus1 = pic->pps->num_ref_idx_l1_default_active_minus1;254result.pps_cb_qp_offset = pic->pps->pps_cb_qp_offset;255result.pps_cr_qp_offset = pic->pps->pps_cr_qp_offset;256result.pps_beta_offset_div2 = pic->pps->pps_beta_offset_div2;257result.pps_tc_offset_div2 = pic->pps->pps_tc_offset_div2;258result.diff_cu_qp_delta_depth = pic->pps->diff_cu_qp_delta_depth;259result.num_tile_columns_minus1 = pic->pps->num_tile_columns_minus1;260result.num_tile_rows_minus1 = pic->pps->num_tile_rows_minus1;261result.log2_parallel_merge_level_minus2 = pic->pps->log2_parallel_merge_level_minus2;262result.init_qp_minus26 = pic->pps->init_qp_minus26;263264for (i = 0; i < 19; ++i)265result.column_width_minus1[i] = pic->pps->column_width_minus1[i];266267for (i = 0; i < 21; ++i)268result.row_height_minus1[i] = pic->pps->row_height_minus1[i];269270result.num_delta_pocs_ref_rps_idx = pic->NumDeltaPocsOfRefRpsIdx;271result.curr_poc = pic->CurrPicOrderCntVal;272273for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {274for (j = 0;275(pic->ref[j] != NULL) && (j < ARRAY_SIZE(dec->render_pic_list));276j++) {277if (dec->render_pic_list[i] == pic->ref[j])278break;279if (j == ARRAY_SIZE(dec->render_pic_list) - 1)280dec->render_pic_list[i] = NULL;281else if (pic->ref[j + 1] == NULL)282dec->render_pic_list[i] = NULL;283}284}285for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {286if (dec->render_pic_list[i] == NULL) {287dec->render_pic_list[i] = target;288result.curr_idx = i;289break;290}291}292293vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)result.curr_idx,294&radeon_dec_destroy_associated_data);295296for (i = 0; i < 16; ++i) {297struct pipe_video_buffer *ref = pic->ref[i];298uintptr_t ref_pic = 0;299300result.poc_list[i] = pic->PicOrderCntVal[i];301302if (ref)303ref_pic = (uintptr_t)vl_video_buffer_get_associated_data(ref, &dec->base);304else305ref_pic = 0x7F;306result.ref_pic_list[i] = ref_pic;307}308309for (i = 0; i < 8; ++i) {310result.ref_pic_set_st_curr_before[i] = 0xFF;311result.ref_pic_set_st_curr_after[i] = 0xFF;312result.ref_pic_set_lt_curr[i] = 0xFF;313}314315for (i = 0; i < pic->NumPocStCurrBefore; ++i)316result.ref_pic_set_st_curr_before[i] = pic->RefPicSetStCurrBefore[i];317318for (i = 0; i < pic->NumPocStCurrAfter; ++i)319result.ref_pic_set_st_curr_after[i] = pic->RefPicSetStCurrAfter[i];320321for (i = 0; i < pic->NumPocLtCurr; ++i)322result.ref_pic_set_lt_curr[i] = pic->RefPicSetLtCurr[i];323324for (i = 0; i < 6; ++i)325result.ucScalingListDCCoefSizeID2[i] = pic->pps->sps->ScalingListDCCoeff16x16[i];326327for (i = 0; i < 2; ++i)328result.ucScalingListDCCoefSizeID3[i] = pic->pps->sps->ScalingListDCCoeff32x32[i];329330memcpy(dec->it, pic->pps->sps->ScalingList4x4, 6 * 16);331memcpy(dec->it + 96, pic->pps->sps->ScalingList8x8, 6 * 64);332memcpy(dec->it + 480, pic->pps->sps->ScalingList16x16, 6 * 64);333memcpy(dec->it + 864, pic->pps->sps->ScalingList32x32, 2 * 64);334335for (i = 0; i < 2; i++) {336for (j = 0; j < 15; j++)337result.direct_reflist[i][j] = pic->RefPicList[i][j];338}339340if (pic->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10) {341if (target->buffer_format == PIPE_FORMAT_P010 || target->buffer_format == PIPE_FORMAT_P016) {342result.p010_mode = 1;343result.msb_mode = 1;344} else {345result.p010_mode = 0;346result.luma_10to8 = 5;347result.chroma_10to8 = 5;348result.hevc_reserved[0] = 4; /* sclr_luma10to8 */349result.hevc_reserved[1] = 4; /* sclr_chroma10to8 */350}351}352353return result;354}355356static void fill_probs_table(void *ptr)357{358rvcn_dec_vp9_probs_t *probs = (rvcn_dec_vp9_probs_t *)ptr;359360memcpy(&probs->coef_probs[0], default_coef_probs_4x4, sizeof(default_coef_probs_4x4));361memcpy(&probs->coef_probs[1], default_coef_probs_8x8, sizeof(default_coef_probs_8x8));362memcpy(&probs->coef_probs[2], default_coef_probs_16x16, sizeof(default_coef_probs_16x16));363memcpy(&probs->coef_probs[3], default_coef_probs_32x32, sizeof(default_coef_probs_32x32));364memcpy(probs->y_mode_prob, default_if_y_probs, sizeof(default_if_y_probs));365memcpy(probs->uv_mode_prob, default_if_uv_probs, sizeof(default_if_uv_probs));366memcpy(probs->single_ref_prob, default_single_ref_p, sizeof(default_single_ref_p));367memcpy(probs->switchable_interp_prob, default_switchable_interp_prob,368sizeof(default_switchable_interp_prob));369memcpy(probs->partition_prob, default_partition_probs, sizeof(default_partition_probs));370memcpy(probs->inter_mode_probs, default_inter_mode_probs, sizeof(default_inter_mode_probs));371memcpy(probs->mbskip_probs, default_skip_probs, sizeof(default_skip_probs));372memcpy(probs->intra_inter_prob, default_intra_inter_p, sizeof(default_intra_inter_p));373memcpy(probs->comp_inter_prob, default_comp_inter_p, sizeof(default_comp_inter_p));374memcpy(probs->comp_ref_prob, default_comp_ref_p, sizeof(default_comp_ref_p));375memcpy(probs->tx_probs_32x32, default_tx_probs_32x32, sizeof(default_tx_probs_32x32));376memcpy(probs->tx_probs_16x16, default_tx_probs_16x16, sizeof(default_tx_probs_16x16));377memcpy(probs->tx_probs_8x8, default_tx_probs_8x8, sizeof(default_tx_probs_8x8));378memcpy(probs->mv_joints, default_nmv_joints, sizeof(default_nmv_joints));379memcpy(&probs->mv_comps[0], default_nmv_components, sizeof(default_nmv_components));380memset(&probs->nmvc_mask, 0, sizeof(rvcn_dec_vp9_nmv_ctx_mask_t));381}382383static rvcn_dec_message_vp9_t get_vp9_msg(struct radeon_decoder *dec,384struct pipe_video_buffer *target,385struct pipe_vp9_picture_desc *pic)386{387rvcn_dec_message_vp9_t result;388unsigned i ,j;389390memset(&result, 0, sizeof(result));391392/* segment table */393rvcn_dec_vp9_probs_segment_t *prbs = (rvcn_dec_vp9_probs_segment_t *)(dec->probs);394395if (pic->picture_parameter.pic_fields.segmentation_enabled) {396for (i = 0; i < 8; ++i) {397prbs->seg.feature_data[i] =398(pic->slice_parameter.seg_param[i].alt_quant & 0xffff) |399((pic->slice_parameter.seg_param[i].alt_lf & 0xff) << 16) |400((pic->slice_parameter.seg_param[i].segment_flags.segment_reference & 0xf) << 24);401prbs->seg.feature_mask[i] =402(pic->slice_parameter.seg_param[i].alt_quant_enabled << 0) |403(pic->slice_parameter.seg_param[i].alt_lf_enabled << 1) |404(pic->slice_parameter.seg_param[i].segment_flags.segment_reference_enabled << 2) |405(pic->slice_parameter.seg_param[i].segment_flags.segment_reference_skipped << 3);406}407408for (i = 0; i < 7; ++i)409prbs->seg.tree_probs[i] = pic->picture_parameter.mb_segment_tree_probs[i];410411for (i = 0; i < 3; ++i)412prbs->seg.pred_probs[i] = pic->picture_parameter.segment_pred_probs[i];413414prbs->seg.abs_delta = pic->picture_parameter.abs_delta;415} else416memset(&prbs->seg, 0, 256);417418result.frame_header_flags = (pic->picture_parameter.pic_fields.frame_type419<< RDECODE_FRAME_HDR_INFO_VP9_FRAME_TYPE_SHIFT) &420RDECODE_FRAME_HDR_INFO_VP9_FRAME_TYPE_MASK;421422result.frame_header_flags |= (pic->picture_parameter.pic_fields.error_resilient_mode423<< RDECODE_FRAME_HDR_INFO_VP9_ERROR_RESILIENT_MODE_SHIFT) &424RDECODE_FRAME_HDR_INFO_VP9_ERROR_RESILIENT_MODE_MASK;425426result.frame_header_flags |= (pic->picture_parameter.pic_fields.intra_only427<< RDECODE_FRAME_HDR_INFO_VP9_INTRA_ONLY_SHIFT) &428RDECODE_FRAME_HDR_INFO_VP9_INTRA_ONLY_MASK;429430result.frame_header_flags |= (pic->picture_parameter.pic_fields.allow_high_precision_mv431<< RDECODE_FRAME_HDR_INFO_VP9_ALLOW_HIGH_PRECISION_MV_SHIFT) &432RDECODE_FRAME_HDR_INFO_VP9_ALLOW_HIGH_PRECISION_MV_MASK;433434result.frame_header_flags |= (pic->picture_parameter.pic_fields.frame_parallel_decoding_mode435<< RDECODE_FRAME_HDR_INFO_VP9_FRAME_PARALLEL_DECODING_MODE_SHIFT) &436RDECODE_FRAME_HDR_INFO_VP9_FRAME_PARALLEL_DECODING_MODE_MASK;437438result.frame_header_flags |= (pic->picture_parameter.pic_fields.refresh_frame_context439<< RDECODE_FRAME_HDR_INFO_VP9_REFRESH_FRAME_CONTEXT_SHIFT) &440RDECODE_FRAME_HDR_INFO_VP9_REFRESH_FRAME_CONTEXT_MASK;441442result.frame_header_flags |= (pic->picture_parameter.pic_fields.segmentation_enabled443<< RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_ENABLED_SHIFT) &444RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_ENABLED_MASK;445446result.frame_header_flags |= (pic->picture_parameter.pic_fields.segmentation_update_map447<< RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_UPDATE_MAP_SHIFT) &448RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_UPDATE_MAP_MASK;449450result.frame_header_flags |= (pic->picture_parameter.pic_fields.segmentation_temporal_update451<< RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_TEMPORAL_UPDATE_SHIFT) &452RDECODE_FRAME_HDR_INFO_VP9_SEGMENTATION_TEMPORAL_UPDATE_MASK;453454result.frame_header_flags |= (pic->picture_parameter.mode_ref_delta_enabled455<< RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_ENABLED_SHIFT) &456RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_ENABLED_MASK;457458result.frame_header_flags |= (pic->picture_parameter.mode_ref_delta_update459<< RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_UPDATE_SHIFT) &460RDECODE_FRAME_HDR_INFO_VP9_MODE_REF_DELTA_UPDATE_MASK;461462result.frame_header_flags |=463((dec->show_frame && !pic->picture_parameter.pic_fields.error_resilient_mode)464<< RDECODE_FRAME_HDR_INFO_VP9_USE_PREV_IN_FIND_MV_REFS_SHIFT) &465RDECODE_FRAME_HDR_INFO_VP9_USE_PREV_IN_FIND_MV_REFS_MASK;466dec->show_frame = pic->picture_parameter.pic_fields.show_frame;467468result.interp_filter = pic->picture_parameter.pic_fields.mcomp_filter_type;469470result.frame_context_idx = pic->picture_parameter.pic_fields.frame_context_idx;471result.reset_frame_context = pic->picture_parameter.pic_fields.reset_frame_context;472473result.filter_level = pic->picture_parameter.filter_level;474result.sharpness_level = pic->picture_parameter.sharpness_level;475476for (i = 0; i < 8; ++i)477memcpy(result.lf_adj_level[i], pic->slice_parameter.seg_param[i].filter_level, 4 * 2);478479if (pic->picture_parameter.pic_fields.lossless_flag) {480result.base_qindex = 0;481result.y_dc_delta_q = 0;482result.uv_ac_delta_q = 0;483result.uv_dc_delta_q = 0;484} else {485result.base_qindex = pic->picture_parameter.base_qindex;486result.y_dc_delta_q = pic->picture_parameter.y_dc_delta_q;487result.uv_ac_delta_q = pic->picture_parameter.uv_ac_delta_q;488result.uv_dc_delta_q = pic->picture_parameter.uv_dc_delta_q;489}490491result.log2_tile_cols = pic->picture_parameter.log2_tile_columns;492result.log2_tile_rows = pic->picture_parameter.log2_tile_rows;493result.chroma_format = 1;494result.bit_depth_luma_minus8 = result.bit_depth_chroma_minus8 =495(pic->picture_parameter.bit_depth - 8);496497result.vp9_frame_size = align(dec->bs_size, 128);498result.uncompressed_header_size = pic->picture_parameter.frame_header_length_in_bytes;499result.compressed_header_size = pic->picture_parameter.first_partition_size;500501assert(dec->base.max_references + 1 <= ARRAY_SIZE(dec->render_pic_list));502503//clear the dec->render list if it is not used as a reference504for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {505if (dec->render_pic_list[i]) {506for (j=0;j<8;j++) {507if (dec->render_pic_list[i] == pic->ref[j])508break;509}510if(j == 8)511dec->render_pic_list[i] = NULL;512}513}514515for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {516if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {517if (target->codec != NULL){518result.curr_pic_idx =(uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);519} else {520result.curr_pic_idx = i;521vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,522&radeon_dec_destroy_associated_data);523}524break;525} else if (!dec->render_pic_list[i]) {526dec->render_pic_list[i] = target;527result.curr_pic_idx = i;528vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,529&radeon_dec_destroy_associated_data);530break;531}532}533534for (i = 0; i < 8; i++) {535result.ref_frame_map[i] =536(pic->ref[i]) ? (uintptr_t)vl_video_buffer_get_associated_data(pic->ref[i], &dec->base)537: 0x7f;538}539540result.frame_refs[0] = result.ref_frame_map[pic->picture_parameter.pic_fields.last_ref_frame];541result.ref_frame_sign_bias[0] = pic->picture_parameter.pic_fields.last_ref_frame_sign_bias;542result.frame_refs[1] = result.ref_frame_map[pic->picture_parameter.pic_fields.golden_ref_frame];543result.ref_frame_sign_bias[1] = pic->picture_parameter.pic_fields.golden_ref_frame_sign_bias;544result.frame_refs[2] = result.ref_frame_map[pic->picture_parameter.pic_fields.alt_ref_frame];545result.ref_frame_sign_bias[2] = pic->picture_parameter.pic_fields.alt_ref_frame_sign_bias;546547if (pic->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2) {548if (target->buffer_format == PIPE_FORMAT_P010 || target->buffer_format == PIPE_FORMAT_P016) {549result.p010_mode = 1;550result.msb_mode = 1;551} else {552result.p010_mode = 0;553result.luma_10to8 = 1;554result.chroma_10to8 = 1;555}556}557558if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {559dec->ref_codec.bts = (pic->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2) ?560CODEC_10_BITS : CODEC_8_BITS;561dec->ref_codec.index = result.curr_pic_idx;562dec->ref_codec.ref_size = 8;563memset(dec->ref_codec.ref_list, 0x7f, sizeof(dec->ref_codec.ref_list));564memcpy(dec->ref_codec.ref_list, result.ref_frame_map, sizeof(result.ref_frame_map));565}566567return result;568}569570static void set_drm_keys(rvcn_dec_message_drm_t *drm, DECRYPT_PARAMETERS *decrypted)571{572int cbc = decrypted->u.s.cbc;573int ctr = decrypted->u.s.ctr;574int id = decrypted->u.s.drm_id;575int ekc = 1;576int data1 = 1;577int data2 = 1;578579drm->drm_cmd = 0;580drm->drm_cntl = 0;581582drm->drm_cntl = 1 << DRM_CNTL_BYPASS_SHIFT;583584if (cbc || ctr) {585drm->drm_cntl = 0 << DRM_CNTL_BYPASS_SHIFT;586drm->drm_cmd |= 0xff << DRM_CMD_BYTE_MASK_SHIFT;587588if (ctr)589drm->drm_cmd |= 0x00 << DRM_CMD_ALGORITHM_SHIFT;590else if (cbc)591drm->drm_cmd |= 0x02 << DRM_CMD_ALGORITHM_SHIFT;592593drm->drm_cmd |= 1 << DRM_CMD_GEN_MASK_SHIFT;594drm->drm_cmd |= ekc << DRM_CMD_UNWRAP_KEY_SHIFT;595drm->drm_cmd |= 0 << DRM_CMD_OFFSET_SHIFT;596drm->drm_cmd |= data2 << DRM_CMD_CNT_DATA_SHIFT;597drm->drm_cmd |= data1 << DRM_CMD_CNT_KEY_SHIFT;598drm->drm_cmd |= ekc << DRM_CMD_KEY_SHIFT;599drm->drm_cmd |= id << DRM_CMD_SESSION_SEL_SHIFT;600601if (ekc)602memcpy(drm->drm_wrapped_key, decrypted->encrypted_key, 16);603if (data1)604memcpy(drm->drm_key, decrypted->session_iv, 16);605if (data2)606memcpy(drm->drm_counter, decrypted->encrypted_iv, 16);607drm->drm_offset = 0;608}609}610611static rvcn_dec_message_av1_t get_av1_msg(struct radeon_decoder *dec,612struct pipe_video_buffer *target,613struct pipe_av1_picture_desc *pic)614{615rvcn_dec_message_av1_t result;616unsigned i, j;617618memset(&result, 0, sizeof(result));619620result.frame_header_flags = (pic->picture_parameter.pic_info_fields.show_frame621<< RDECODE_FRAME_HDR_INFO_AV1_SHOW_FRAME_SHIFT) &622RDECODE_FRAME_HDR_INFO_AV1_SHOW_FRAME_MASK;623624result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.disable_cdf_update625<< RDECODE_FRAME_HDR_INFO_AV1_DISABLE_CDF_UPDATE_SHIFT) &626RDECODE_FRAME_HDR_INFO_AV1_DISABLE_CDF_UPDATE_MASK;627628result.frame_header_flags |= ((!pic->picture_parameter.pic_info_fields.disable_frame_end_update_cdf)629<< RDECODE_FRAME_HDR_INFO_AV1_REFRESH_FRAME_CONTEXT_SHIFT) &630RDECODE_FRAME_HDR_INFO_AV1_REFRESH_FRAME_CONTEXT_MASK;631632result.frame_header_flags |= ((pic->picture_parameter.pic_info_fields.frame_type ==6332 /* INTRA_ONLY_FRAME */) << RDECODE_FRAME_HDR_INFO_AV1_INTRA_ONLY_SHIFT) &634RDECODE_FRAME_HDR_INFO_AV1_INTRA_ONLY_MASK;635636result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_intrabc637<< RDECODE_FRAME_HDR_INFO_AV1_ALLOW_INTRABC_SHIFT) &638RDECODE_FRAME_HDR_INFO_AV1_ALLOW_INTRABC_MASK;639640result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_high_precision_mv641<< RDECODE_FRAME_HDR_INFO_AV1_ALLOW_HIGH_PRECISION_MV_SHIFT) &642RDECODE_FRAME_HDR_INFO_AV1_ALLOW_HIGH_PRECISION_MV_MASK;643644result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.mono_chrome645<< RDECODE_FRAME_HDR_INFO_AV1_MONOCHROME_SHIFT) &646RDECODE_FRAME_HDR_INFO_AV1_MONOCHROME_MASK;647648result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.skip_mode_present649<< RDECODE_FRAME_HDR_INFO_AV1_SKIP_MODE_FLAG_SHIFT) &650RDECODE_FRAME_HDR_INFO_AV1_SKIP_MODE_FLAG_MASK;651652result.frame_header_flags |= (((pic->picture_parameter.qmatrix_fields.qm_y == 0xf) ? 0 : 1)653<< RDECODE_FRAME_HDR_INFO_AV1_USING_QMATRIX_SHIFT) &654RDECODE_FRAME_HDR_INFO_AV1_USING_QMATRIX_MASK;655656result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_filter_intra657<< RDECODE_FRAME_HDR_INFO_AV1_ENABLE_FILTER_INTRA_SHIFT) &658RDECODE_FRAME_HDR_INFO_AV1_ENABLE_FILTER_INTRA_MASK;659660result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_intra_edge_filter661<< RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTRA_EDGE_FILTER_SHIFT) &662RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTRA_EDGE_FILTER_MASK;663664result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_interintra_compound665<< RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTERINTRA_COMPOUND_SHIFT) &666RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTERINTRA_COMPOUND_MASK;667668result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_masked_compound669<< RDECODE_FRAME_HDR_INFO_AV1_ENABLE_MASKED_COMPOUND_SHIFT) &670RDECODE_FRAME_HDR_INFO_AV1_ENABLE_MASKED_COMPOUND_MASK;671672result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_warped_motion673<< RDECODE_FRAME_HDR_INFO_AV1_ALLOW_WARPED_MOTION_SHIFT) &674RDECODE_FRAME_HDR_INFO_AV1_ALLOW_WARPED_MOTION_MASK;675676result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_dual_filter677<< RDECODE_FRAME_HDR_INFO_AV1_ENABLE_DUAL_FILTER_SHIFT) &678RDECODE_FRAME_HDR_INFO_AV1_ENABLE_DUAL_FILTER_MASK;679680result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_order_hint681<< RDECODE_FRAME_HDR_INFO_AV1_ENABLE_ORDER_HINT_SHIFT) &682RDECODE_FRAME_HDR_INFO_AV1_ENABLE_ORDER_HINT_MASK;683684result.frame_header_flags |= (pic->picture_parameter.seq_info_fields.enable_jnt_comp685<< RDECODE_FRAME_HDR_INFO_AV1_ENABLE_JNT_COMP_SHIFT) &686RDECODE_FRAME_HDR_INFO_AV1_ENABLE_JNT_COMP_MASK;687688result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.use_ref_frame_mvs689<< RDECODE_FRAME_HDR_INFO_AV1_ALLOW_REF_FRAME_MVS_SHIFT) &690RDECODE_FRAME_HDR_INFO_AV1_ALLOW_REF_FRAME_MVS_MASK;691692result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.allow_screen_content_tools693<< RDECODE_FRAME_HDR_INFO_AV1_ALLOW_SCREEN_CONTENT_TOOLS_SHIFT) &694RDECODE_FRAME_HDR_INFO_AV1_ALLOW_SCREEN_CONTENT_TOOLS_MASK;695696result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.force_integer_mv697<< RDECODE_FRAME_HDR_INFO_AV1_CUR_FRAME_FORCE_INTEGER_MV_SHIFT) &698RDECODE_FRAME_HDR_INFO_AV1_CUR_FRAME_FORCE_INTEGER_MV_MASK;699700result.frame_header_flags |= (pic->picture_parameter.loop_filter_info_fields.mode_ref_delta_enabled701<< RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_ENABLED_SHIFT) &702RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_ENABLED_MASK;703704result.frame_header_flags |= (pic->picture_parameter.loop_filter_info_fields.mode_ref_delta_update705<< RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_UPDATE_SHIFT) &706RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_UPDATE_MASK;707708result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.delta_q_present_flag709<< RDECODE_FRAME_HDR_INFO_AV1_DELTA_Q_PRESENT_FLAG_SHIFT) &710RDECODE_FRAME_HDR_INFO_AV1_DELTA_Q_PRESENT_FLAG_MASK;711712result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.delta_lf_present_flag713<< RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_PRESENT_FLAG_SHIFT) &714RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_PRESENT_FLAG_MASK;715716result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.reduced_tx_set_used717<< RDECODE_FRAME_HDR_INFO_AV1_REDUCED_TX_SET_USED_SHIFT) &718RDECODE_FRAME_HDR_INFO_AV1_REDUCED_TX_SET_USED_MASK;719720result.frame_header_flags |= (pic->picture_parameter.seg_info.segment_info_fields.enabled721<< RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_ENABLED_SHIFT) &722RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_ENABLED_MASK;723724result.frame_header_flags |= (pic->picture_parameter.seg_info.segment_info_fields.update_map725<< RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_UPDATE_MAP_SHIFT) &726RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_UPDATE_MAP_MASK;727728result.frame_header_flags |= (pic->picture_parameter.seg_info.segment_info_fields.temporal_update729<< RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_TEMPORAL_UPDATE_SHIFT) &730RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_TEMPORAL_UPDATE_MASK;731732result.frame_header_flags |= (pic->picture_parameter.mode_control_fields.delta_lf_multi733<< RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_MULTI_SHIFT) &734RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_MULTI_MASK;735736result.frame_header_flags |= (pic->picture_parameter.pic_info_fields.is_motion_mode_switchable737<< RDECODE_FRAME_HDR_INFO_AV1_SWITCHABLE_SKIP_MODE_SHIFT) &738RDECODE_FRAME_HDR_INFO_AV1_SWITCHABLE_SKIP_MODE_MASK;739740result.frame_header_flags |= ((!pic->picture_parameter.refresh_frame_flags)741<< RDECODE_FRAME_HDR_INFO_AV1_SKIP_REFERENCE_UPDATE_SHIFT) &742RDECODE_FRAME_HDR_INFO_AV1_SKIP_REFERENCE_UPDATE_MASK;743744result.frame_header_flags |= ((!pic->picture_parameter.seq_info_fields.ref_frame_mvs)745<< RDECODE_FRAME_HDR_INFO_AV1_DISABLE_REF_FRAME_MVS_SHIFT) &746RDECODE_FRAME_HDR_INFO_AV1_DISABLE_REF_FRAME_MVS_MASK;747748result.current_frame_id = pic->picture_parameter.current_frame_id;749result.frame_offset = pic->picture_parameter.order_hint;750751result.profile = pic->picture_parameter.profile;752result.is_annexb = 0;753result.frame_type = pic->picture_parameter.pic_info_fields.frame_type;754result.primary_ref_frame = pic->picture_parameter.primary_ref_frame;755for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {756if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {757result.curr_pic_idx = (uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);758break;759} else if (!dec->render_pic_list[i]) {760dec->render_pic_list[i] = target;761result.curr_pic_idx = dec->ref_idx;762vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)dec->ref_idx++,763&radeon_dec_destroy_associated_data);764break;765}766}767768result.sb_size = pic->picture_parameter.seq_info_fields.use_128x128_superblock;769result.interp_filter = pic->picture_parameter.interp_filter;770for (i = 0; i < 2; ++i)771result.filter_level[i] = pic->picture_parameter.filter_level[i];772result.filter_level_u = pic->picture_parameter.filter_level_u;773result.filter_level_v = pic->picture_parameter.filter_level_v;774result.sharpness_level = pic->picture_parameter.loop_filter_info_fields.sharpness_level;775for (i = 0; i < 8; ++i)776result.ref_deltas[i] = pic->picture_parameter.ref_deltas[i];777for (i = 0; i < 2; ++i)778result.mode_deltas[i] = pic->picture_parameter.mode_deltas[i];779result.base_qindex = pic->picture_parameter.base_qindex;780result.y_dc_delta_q = pic->picture_parameter.y_dc_delta_q;781result.u_dc_delta_q = pic->picture_parameter.u_dc_delta_q;782result.v_dc_delta_q = pic->picture_parameter.v_dc_delta_q;783result.u_ac_delta_q = pic->picture_parameter.u_ac_delta_q;784result.v_ac_delta_q = pic->picture_parameter.v_ac_delta_q;785result.qm_y = pic->picture_parameter.qmatrix_fields.qm_y | 0xf0;786result.qm_u = pic->picture_parameter.qmatrix_fields.qm_u | 0xf0;787result.qm_v = pic->picture_parameter.qmatrix_fields.qm_v | 0xf0;788result.delta_q_res = 1 << pic->picture_parameter.mode_control_fields.log2_delta_q_res;789result.delta_lf_res = 1 << pic->picture_parameter.mode_control_fields.log2_delta_lf_res;790791result.tile_cols = pic->picture_parameter.tile_cols;792result.tile_rows = pic->picture_parameter.tile_rows;793result.tx_mode = pic->picture_parameter.mode_control_fields.tx_mode;794result.reference_mode = (pic->picture_parameter.mode_control_fields.reference_select == 1) ? 2 : 0;795result.chroma_format = pic->picture_parameter.seq_info_fields.mono_chrome ? 0 : 1;796result.tile_size_bytes = 0xff;797result.context_update_tile_id = pic->picture_parameter.context_update_tile_id;798for (i = 0; i < 65; ++i) {799result.tile_col_start_sb[i] = pic->picture_parameter.tile_col_start_sb[i];800result.tile_row_start_sb[i] = pic->picture_parameter.tile_row_start_sb[i];801}802result.max_width = pic->picture_parameter.max_width;803result.max_height = pic->picture_parameter.max_height;804if (pic->picture_parameter.pic_info_fields.use_superres) {805result.width = (pic->picture_parameter.frame_width * 8 + pic->picture_parameter.superres_scale_denominator / 2) /806pic->picture_parameter.superres_scale_denominator;807result.superres_scale_denominator = pic->picture_parameter.superres_scale_denominator;808} else {809result.width = pic->picture_parameter.frame_width;810result.superres_scale_denominator = pic->picture_parameter.superres_scale_denominator;811}812result.height = pic->picture_parameter.frame_height;813result.superres_upscaled_width = pic->picture_parameter.frame_width;814result.order_hint_bits = pic->picture_parameter.order_hint_bits_minus_1 + 1;815816for (i = 0; i < NUM_AV1_REFS; ++i) {817result.ref_frame_map[i] =818(pic->ref[i]) ? (uintptr_t)vl_video_buffer_get_associated_data(pic->ref[i], &dec->base)819: 0x7f;820}821for (i = 0; i < NUM_AV1_REFS_PER_FRAME; ++i)822result.frame_refs[i] = result.ref_frame_map[pic->picture_parameter.ref_frame_idx[i]];823824result.bit_depth_luma_minus8 = result.bit_depth_chroma_minus8 = pic->picture_parameter.bit_depth_idx << 1;825826for (i = 0; i < 8; ++i) {827for (j = 0; j < 8; ++j)828result.feature_data[i][j] = pic->picture_parameter.seg_info.feature_data[i][j];829result.feature_mask[i] = pic->picture_parameter.seg_info.feature_mask[i];830}831memcpy(dec->probs, &pic->picture_parameter.seg_info.feature_data, 128);832memcpy((dec->probs + 128), &pic->picture_parameter.seg_info.feature_mask, 8);833834result.cdef_damping = pic->picture_parameter.cdef_damping_minus_3 + 3;835result.cdef_bits = pic->picture_parameter.cdef_bits;836for (i = 0; i < 8; ++i) {837result.cdef_strengths[i] = pic->picture_parameter.cdef_y_strengths[i];838result.cdef_uv_strengths[i] = pic->picture_parameter.cdef_uv_strengths[i];839}840result.frame_restoration_type[0] = pic->picture_parameter.loop_restoration_fields.yframe_restoration_type;841result.frame_restoration_type[1] = pic->picture_parameter.loop_restoration_fields.cbframe_restoration_type;842result.frame_restoration_type[2] = pic->picture_parameter.loop_restoration_fields.crframe_restoration_type;843for (i = 0; i < 3; ++i) {844int log2_num = 0;845int unit_size = pic->picture_parameter.lr_unit_size[i];846if (unit_size) {847while (unit_size >>= 1)848log2_num++;849result.log2_restoration_unit_size_minus5[i] = log2_num - 5;850} else {851result.log2_restoration_unit_size_minus5[i] = 0;852}853}854855result.p010_mode = 0;856result.msb_mode = 0;857if (!pic->picture_parameter.bit_depth_idx) {858result.luma_10to8 = 0;859result.chroma_10to8 = 0;860} else {861result.luma_10to8 = 1;862result.chroma_10to8 = 1;863}864865result.preskip_segid = 0;866result.last_active_segid = 0;867for (i = 0; i < 8; i++) {868for (j = 0; j < 8; j++) {869if (pic->picture_parameter.seg_info.feature_mask[i] & (1 << j)) {870result.last_active_segid = i;871if (j >= 5)872result.preskip_segid = 1;873}874}875}876877result.seg_lossless_flag = 0;878for (i = 0; i < 8; ++i) {879int av1_get_qindex, qindex;880int segfeature_active = pic->picture_parameter.seg_info.feature_mask[i] & (1 << 0);881if (segfeature_active) {882int seg_qindex = pic->picture_parameter.base_qindex +883pic->picture_parameter.seg_info.feature_data[i][0];884av1_get_qindex = seg_qindex < 0 ? 0 : (seg_qindex > 255 ? 255 : seg_qindex);885} else {886av1_get_qindex = pic->picture_parameter.base_qindex;887}888qindex = pic->picture_parameter.seg_info.segment_info_fields.enabled ?889av1_get_qindex :890pic->picture_parameter.base_qindex;891result.seg_lossless_flag |= (((qindex == 0) && result.y_dc_delta_q == 0 &&892result.u_dc_delta_q == 0 && result.v_dc_delta_q == 0 &&893result.u_ac_delta_q == 0 && result.v_ac_delta_q == 0) << i);894}895896rvcn_dec_film_grain_params_t* fg_params = &result.film_grain;897fg_params->apply_grain = pic->picture_parameter.film_grain_info.film_grain_info_fields.apply_grain;898if (fg_params->apply_grain) {899fg_params->random_seed = pic->picture_parameter.film_grain_info.grain_seed;900fg_params->grain_scale_shift =901pic->picture_parameter.film_grain_info.film_grain_info_fields.grain_scale_shift;902fg_params->scaling_shift =903pic->picture_parameter.film_grain_info.film_grain_info_fields.grain_scaling_minus_8 + 8;904fg_params->chroma_scaling_from_luma =905pic->picture_parameter.film_grain_info.film_grain_info_fields.chroma_scaling_from_luma;906fg_params->num_y_points = pic->picture_parameter.film_grain_info.num_y_points;907fg_params->num_cb_points = pic->picture_parameter.film_grain_info.num_cb_points;908fg_params->num_cr_points = pic->picture_parameter.film_grain_info.num_cr_points;909fg_params->cb_mult = pic->picture_parameter.film_grain_info.cb_mult;910fg_params->cb_luma_mult = pic->picture_parameter.film_grain_info.cb_luma_mult;911fg_params->cb_offset = pic->picture_parameter.film_grain_info.cb_offset;912fg_params->cr_mult = pic->picture_parameter.film_grain_info.cr_mult;913fg_params->cr_luma_mult = pic->picture_parameter.film_grain_info.cr_luma_mult;914fg_params->cr_offset = pic->picture_parameter.film_grain_info.cr_offset;915fg_params->bit_depth_minus_8 = pic->picture_parameter.bit_depth_idx << 1;916917for (i = 0; i < fg_params->num_y_points; ++i) {918fg_params->scaling_points_y[i][0] = pic->picture_parameter.film_grain_info.point_y_value[i];919fg_params->scaling_points_y[i][1] = pic->picture_parameter.film_grain_info.point_y_scaling[i];920}921for (i = 0; i < fg_params->num_cb_points; ++i) {922fg_params->scaling_points_cb[i][0] = pic->picture_parameter.film_grain_info.point_cb_value[i];923fg_params->scaling_points_cb[i][1] = pic->picture_parameter.film_grain_info.point_cb_scaling[i];924}925for (i = 0; i < fg_params->num_cr_points; ++i) {926fg_params->scaling_points_cr[i][0] = pic->picture_parameter.film_grain_info.point_cr_value[i];927fg_params->scaling_points_cr[i][1] = pic->picture_parameter.film_grain_info.point_cr_scaling[i];928}929930fg_params->ar_coeff_lag = pic->picture_parameter.film_grain_info.film_grain_info_fields.ar_coeff_lag;931fg_params->ar_coeff_shift =932pic->picture_parameter.film_grain_info.film_grain_info_fields.ar_coeff_shift_minus_6 + 6;933934for (i = 0; i < 24; ++i)935fg_params->ar_coeffs_y[i] = pic->picture_parameter.film_grain_info.ar_coeffs_y[i];936937for (i = 0; i < 25; ++i) {938fg_params->ar_coeffs_cb[i] = pic->picture_parameter.film_grain_info.ar_coeffs_cb[i];939fg_params->ar_coeffs_cr[i] = pic->picture_parameter.film_grain_info.ar_coeffs_cr[i];940}941942fg_params->overlap_flag = pic->picture_parameter.film_grain_info.film_grain_info_fields.overlap_flag;943fg_params->clip_to_restricted_range =944pic->picture_parameter.film_grain_info.film_grain_info_fields.clip_to_restricted_range;945}946947result.uncompressed_header_size = 0;948for (i = 0; i < 7; ++i) {949result.global_motion[i + 1].wmtype = (rvcn_dec_transformation_type_e)pic->picture_parameter.wm[i].wmtype;950for (j = 0; j < 6; ++j)951result.global_motion[i + 1].wmmat[j] = pic->picture_parameter.wm[i].wmmat[j];952}953for (i = 0; i < 256; ++i) {954result.tile_info[i].offset = pic->slice_parameter.slice_data_offset[i];955result.tile_info[i].size = pic->slice_parameter.slice_data_size[i];956}957958if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {959dec->ref_codec.bts = pic->picture_parameter.bit_depth_idx ? CODEC_10_BITS : CODEC_8_BITS;960dec->ref_codec.index = result.curr_pic_idx;961dec->ref_codec.ref_size = 8;962memset(dec->ref_codec.ref_list, 0x7f, sizeof(dec->ref_codec.ref_list));963memcpy(dec->ref_codec.ref_list, result.ref_frame_map, sizeof(result.ref_frame_map));964}965966return result;967}968969static void rvcn_init_mode_probs(void *prob)970{971rvcn_av1_frame_context_t * fc = (rvcn_av1_frame_context_t*)prob;972int i;973974memcpy(fc->palette_y_size_cdf, default_palette_y_size_cdf, sizeof(default_palette_y_size_cdf));975memcpy(fc->palette_uv_size_cdf, default_palette_uv_size_cdf, sizeof(default_palette_uv_size_cdf));976memcpy(fc->palette_y_color_index_cdf, default_palette_y_color_index_cdf, sizeof(default_palette_y_color_index_cdf));977memcpy(fc->palette_uv_color_index_cdf, default_palette_uv_color_index_cdf, sizeof(default_palette_uv_color_index_cdf));978memcpy(fc->kf_y_cdf, default_kf_y_mode_cdf, sizeof(default_kf_y_mode_cdf));979memcpy(fc->angle_delta_cdf, default_angle_delta_cdf, sizeof(default_angle_delta_cdf));980memcpy(fc->comp_inter_cdf, default_comp_inter_cdf, sizeof(default_comp_inter_cdf));981memcpy(fc->comp_ref_type_cdf, default_comp_ref_type_cdf,sizeof(default_comp_ref_type_cdf));982memcpy(fc->uni_comp_ref_cdf, default_uni_comp_ref_cdf, sizeof(default_uni_comp_ref_cdf));983memcpy(fc->palette_y_mode_cdf, default_palette_y_mode_cdf, sizeof(default_palette_y_mode_cdf));984memcpy(fc->palette_uv_mode_cdf, default_palette_uv_mode_cdf, sizeof(default_palette_uv_mode_cdf));985memcpy(fc->comp_ref_cdf, default_comp_ref_cdf, sizeof(default_comp_ref_cdf));986memcpy(fc->comp_bwdref_cdf, default_comp_bwdref_cdf, sizeof(default_comp_bwdref_cdf));987memcpy(fc->single_ref_cdf, default_single_ref_cdf, sizeof(default_single_ref_cdf));988memcpy(fc->txfm_partition_cdf, default_txfm_partition_cdf, sizeof(default_txfm_partition_cdf));989memcpy(fc->compound_index_cdf, default_compound_idx_cdfs, sizeof(default_compound_idx_cdfs));990memcpy(fc->comp_group_idx_cdf, default_comp_group_idx_cdfs, sizeof(default_comp_group_idx_cdfs));991memcpy(fc->newmv_cdf, default_newmv_cdf, sizeof(default_newmv_cdf));992memcpy(fc->zeromv_cdf, default_zeromv_cdf, sizeof(default_zeromv_cdf));993memcpy(fc->refmv_cdf, default_refmv_cdf, sizeof(default_refmv_cdf));994memcpy(fc->drl_cdf, default_drl_cdf, sizeof(default_drl_cdf));995memcpy(fc->motion_mode_cdf, default_motion_mode_cdf, sizeof(default_motion_mode_cdf));996memcpy(fc->obmc_cdf, default_obmc_cdf, sizeof(default_obmc_cdf));997memcpy(fc->inter_compound_mode_cdf, default_inter_compound_mode_cdf, sizeof(default_inter_compound_mode_cdf));998memcpy(fc->compound_type_cdf, default_compound_type_cdf, sizeof(default_compound_type_cdf));999memcpy(fc->wedge_idx_cdf, default_wedge_idx_cdf, sizeof(default_wedge_idx_cdf));1000memcpy(fc->interintra_cdf, default_interintra_cdf, sizeof(default_interintra_cdf));1001memcpy(fc->wedge_interintra_cdf, default_wedge_interintra_cdf, sizeof(default_wedge_interintra_cdf));1002memcpy(fc->interintra_mode_cdf, default_interintra_mode_cdf, sizeof(default_interintra_mode_cdf));1003memcpy(fc->pred_cdf, default_segment_pred_cdf, sizeof(default_segment_pred_cdf));1004memcpy(fc->switchable_restore_cdf, default_switchable_restore_cdf, sizeof(default_switchable_restore_cdf));1005memcpy(fc->wiener_restore_cdf, default_wiener_restore_cdf, sizeof(default_wiener_restore_cdf));1006memcpy(fc->sgrproj_restore_cdf, default_sgrproj_restore_cdf, sizeof(default_sgrproj_restore_cdf));1007memcpy(fc->y_mode_cdf, default_if_y_mode_cdf, sizeof(default_if_y_mode_cdf));1008memcpy(fc->uv_mode_cdf, default_uv_mode_cdf, sizeof(default_uv_mode_cdf));1009memcpy(fc->switchable_interp_cdf, default_switchable_interp_cdf, sizeof(default_switchable_interp_cdf));1010memcpy(fc->partition_cdf, default_partition_cdf, sizeof(default_partition_cdf));1011memcpy(fc->intra_ext_tx_cdf, default_intra_ext_tx_cdf, sizeof(default_intra_ext_tx_cdf));1012memcpy(fc->inter_ext_tx_cdf, default_inter_ext_tx_cdf, sizeof(default_inter_ext_tx_cdf));1013memcpy(fc->skip_cdfs, default_skip_cdfs, sizeof(default_skip_cdfs));1014memcpy(fc->intra_inter_cdf, default_intra_inter_cdf, sizeof(default_intra_inter_cdf));1015memcpy(fc->tree_cdf, default_seg_tree_cdf, sizeof(default_seg_tree_cdf));1016for (i = 0; i < SPATIAL_PREDICTION_PROBS; ++i)1017memcpy(fc->spatial_pred_seg_cdf[i], default_spatial_pred_seg_tree_cdf[i], sizeof(default_spatial_pred_seg_tree_cdf[i]));1018memcpy(fc->tx_size_cdf, default_tx_size_cdf, sizeof(default_tx_size_cdf));1019memcpy(fc->delta_q_cdf, default_delta_q_cdf, sizeof(default_delta_q_cdf));1020memcpy(fc->skip_mode_cdfs, default_skip_mode_cdfs, sizeof(default_skip_mode_cdfs));1021memcpy(fc->delta_lf_cdf, default_delta_lf_cdf, sizeof(default_delta_lf_cdf));1022memcpy(fc->delta_lf_multi_cdf, default_delta_lf_multi_cdf, sizeof(default_delta_lf_multi_cdf));1023memcpy(fc->cfl_sign_cdf, default_cfl_sign_cdf, sizeof(default_cfl_sign_cdf));1024memcpy(fc->cfl_alpha_cdf, default_cfl_alpha_cdf, sizeof(default_cfl_alpha_cdf));1025memcpy(fc->filter_intra_cdfs, default_filter_intra_cdfs, sizeof(default_filter_intra_cdfs));1026memcpy(fc->filter_intra_mode_cdf, default_filter_intra_mode_cdf, sizeof(default_filter_intra_mode_cdf));1027memcpy(fc->intrabc_cdf, default_intrabc_cdf, sizeof(default_intrabc_cdf));1028}10291030static void rvcn_av1_init_mv_probs(void *prob)1031{1032rvcn_av1_frame_context_t * fc = (rvcn_av1_frame_context_t*)prob;10331034memcpy(fc->nmvc_joints_cdf, default_nmv_context.joints_cdf, sizeof(default_nmv_context.joints_cdf));1035memcpy(fc->nmvc_0_bits_cdf, default_nmv_context.comps[0].bits_cdf, sizeof(default_nmv_context.comps[0].bits_cdf));1036memcpy(fc->nmvc_0_class0_cdf, default_nmv_context.comps[0].class0_cdf, sizeof(default_nmv_context.comps[0].class0_cdf));1037memcpy(fc->nmvc_0_class0_fp_cdf, default_nmv_context.comps[0].class0_fp_cdf, sizeof(default_nmv_context.comps[0].class0_fp_cdf));1038memcpy(fc->nmvc_0_class0_hp_cdf, default_nmv_context.comps[0].class0_hp_cdf, sizeof(default_nmv_context.comps[0].class0_hp_cdf));1039memcpy(fc->nmvc_0_classes_cdf, default_nmv_context.comps[0].classes_cdf, sizeof(default_nmv_context.comps[0].classes_cdf));1040memcpy(fc->nmvc_0_fp_cdf, default_nmv_context.comps[0].fp_cdf, sizeof(default_nmv_context.comps[0].fp_cdf));1041memcpy(fc->nmvc_0_hp_cdf, default_nmv_context.comps[0].hp_cdf, sizeof(default_nmv_context.comps[0].hp_cdf));1042memcpy(fc->nmvc_0_sign_cdf, default_nmv_context.comps[0].sign_cdf, sizeof(default_nmv_context.comps[0].sign_cdf));1043memcpy(fc->nmvc_1_bits_cdf, default_nmv_context.comps[1].bits_cdf, sizeof(default_nmv_context.comps[1].bits_cdf));1044memcpy(fc->nmvc_1_class0_cdf, default_nmv_context.comps[1].class0_cdf, sizeof(default_nmv_context.comps[1].class0_cdf));1045memcpy(fc->nmvc_1_class0_fp_cdf, default_nmv_context.comps[1].class0_fp_cdf, sizeof(default_nmv_context.comps[1].class0_fp_cdf));1046memcpy(fc->nmvc_1_class0_hp_cdf, default_nmv_context.comps[1].class0_hp_cdf, sizeof(default_nmv_context.comps[1].class0_hp_cdf));1047memcpy(fc->nmvc_1_classes_cdf, default_nmv_context.comps[1].classes_cdf, sizeof(default_nmv_context.comps[1].classes_cdf));1048memcpy(fc->nmvc_1_fp_cdf, default_nmv_context.comps[1].fp_cdf, sizeof(default_nmv_context.comps[1].fp_cdf));1049memcpy(fc->nmvc_1_hp_cdf, default_nmv_context.comps[1].hp_cdf, sizeof(default_nmv_context.comps[1].hp_cdf));1050memcpy(fc->nmvc_1_sign_cdf, default_nmv_context.comps[1].sign_cdf, sizeof(default_nmv_context.comps[1].sign_cdf));1051memcpy(fc->ndvc_joints_cdf, default_nmv_context.joints_cdf, sizeof(default_nmv_context.joints_cdf));1052memcpy(fc->ndvc_0_bits_cdf, default_nmv_context.comps[0].bits_cdf, sizeof(default_nmv_context.comps[0].bits_cdf));1053memcpy(fc->ndvc_0_class0_cdf, default_nmv_context.comps[0].class0_cdf, sizeof(default_nmv_context.comps[0].class0_cdf));1054memcpy(fc->ndvc_0_class0_fp_cdf, default_nmv_context.comps[0].class0_fp_cdf, sizeof(default_nmv_context.comps[0].class0_fp_cdf));1055memcpy(fc->ndvc_0_class0_hp_cdf, default_nmv_context.comps[0].class0_hp_cdf, sizeof(default_nmv_context.comps[0].class0_hp_cdf));1056memcpy(fc->ndvc_0_classes_cdf, default_nmv_context.comps[0].classes_cdf, sizeof(default_nmv_context.comps[0].classes_cdf));1057memcpy(fc->ndvc_0_fp_cdf, default_nmv_context.comps[0].fp_cdf, sizeof(default_nmv_context.comps[0].fp_cdf));1058memcpy(fc->ndvc_0_hp_cdf, default_nmv_context.comps[0].hp_cdf, sizeof(default_nmv_context.comps[0].hp_cdf));1059memcpy(fc->ndvc_0_sign_cdf, default_nmv_context.comps[0].sign_cdf, sizeof(default_nmv_context.comps[0].sign_cdf));1060memcpy(fc->ndvc_1_bits_cdf, default_nmv_context.comps[1].bits_cdf, sizeof(default_nmv_context.comps[1].bits_cdf));1061memcpy(fc->ndvc_1_class0_cdf, default_nmv_context.comps[1].class0_cdf, sizeof(default_nmv_context.comps[1].class0_cdf));1062memcpy(fc->ndvc_1_class0_fp_cdf, default_nmv_context.comps[1].class0_fp_cdf, sizeof(default_nmv_context.comps[1].class0_fp_cdf));1063memcpy(fc->ndvc_1_class0_hp_cdf, default_nmv_context.comps[1].class0_hp_cdf, sizeof(default_nmv_context.comps[1].class0_hp_cdf));1064memcpy(fc->ndvc_1_classes_cdf, default_nmv_context.comps[1].classes_cdf, sizeof(default_nmv_context.comps[1].classes_cdf));1065memcpy(fc->ndvc_1_fp_cdf, default_nmv_context.comps[1].fp_cdf, sizeof(default_nmv_context.comps[1].fp_cdf));1066memcpy(fc->ndvc_1_hp_cdf, default_nmv_context.comps[1].hp_cdf, sizeof(default_nmv_context.comps[1].hp_cdf));1067memcpy(fc->ndvc_1_sign_cdf, default_nmv_context.comps[1].sign_cdf, sizeof(default_nmv_context.comps[1].sign_cdf));1068}10691070static void rvcn_av1_default_coef_probs(void *prob, int index)1071{1072rvcn_av1_frame_context_t * fc = (rvcn_av1_frame_context_t*)prob;10731074memcpy(fc->txb_skip_cdf, av1_default_txb_skip_cdfs[index], sizeof(av1_default_txb_skip_cdfs[index]));1075memcpy(fc->eob_extra_cdf, av1_default_eob_extra_cdfs[index], sizeof(av1_default_eob_extra_cdfs[index]));1076memcpy(fc->dc_sign_cdf, av1_default_dc_sign_cdfs[index], sizeof(av1_default_dc_sign_cdfs[index]));1077memcpy(fc->coeff_br_cdf, av1_default_coeff_lps_multi_cdfs[index], sizeof(av1_default_coeff_lps_multi_cdfs[index]));1078memcpy(fc->coeff_base_cdf, av1_default_coeff_base_multi_cdfs[index], sizeof(av1_default_coeff_base_multi_cdfs[index]));1079memcpy(fc->coeff_base_eob_cdf, av1_default_coeff_base_eob_multi_cdfs[index], sizeof(av1_default_coeff_base_eob_multi_cdfs[index]));1080memcpy(fc->eob_flag_cdf16, av1_default_eob_multi16_cdfs[index], sizeof(av1_default_eob_multi16_cdfs[index]));1081memcpy(fc->eob_flag_cdf32, av1_default_eob_multi32_cdfs[index], sizeof(av1_default_eob_multi32_cdfs[index]));1082memcpy(fc->eob_flag_cdf64, av1_default_eob_multi64_cdfs[index], sizeof(av1_default_eob_multi64_cdfs[index]));1083memcpy(fc->eob_flag_cdf128, av1_default_eob_multi128_cdfs[index], sizeof(av1_default_eob_multi128_cdfs[index]));1084memcpy(fc->eob_flag_cdf256, av1_default_eob_multi256_cdfs[index], sizeof(av1_default_eob_multi256_cdfs[index]));1085memcpy(fc->eob_flag_cdf512, av1_default_eob_multi512_cdfs[index], sizeof(av1_default_eob_multi512_cdfs[index]));1086memcpy(fc->eob_flag_cdf1024, av1_default_eob_multi1024_cdfs[index], sizeof(av1_default_eob_multi1024_cdfs[index]));1087}10881089static unsigned calc_ctx_size_h265_main(struct radeon_decoder *dec)1090{1091unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);1092unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);10931094unsigned max_references = dec->base.max_references + 1;10951096if (dec->base.width * dec->base.height >= 4096 * 2000)1097max_references = MAX2(max_references, 8);1098else1099max_references = MAX2(max_references, 17);11001101width = align(width, 16);1102height = align(height, 16);1103return ((width + 255) / 16) * ((height + 255) / 16) * 16 * max_references + 52 * 1024;1104}11051106static unsigned calc_ctx_size_h265_main10(struct radeon_decoder *dec,1107struct pipe_h265_picture_desc *pic)1108{1109unsigned log2_ctb_size, width_in_ctb, height_in_ctb, num_16x16_block_per_ctb;1110unsigned context_buffer_size_per_ctb_row, cm_buffer_size, max_mb_address, db_left_tile_pxl_size;1111unsigned db_left_tile_ctx_size = 4096 / 16 * (32 + 16 * 4);11121113unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);1114unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);1115unsigned coeff_10bit =1116(pic->pps->sps->bit_depth_luma_minus8 || pic->pps->sps->bit_depth_chroma_minus8) ? 2 : 1;11171118unsigned max_references = dec->base.max_references + 1;11191120if (dec->base.width * dec->base.height >= 4096 * 2000)1121max_references = MAX2(max_references, 8);1122else1123max_references = MAX2(max_references, 17);11241125log2_ctb_size = pic->pps->sps->log2_min_luma_coding_block_size_minus3 + 3 +1126pic->pps->sps->log2_diff_max_min_luma_coding_block_size;11271128width_in_ctb = (width + ((1 << log2_ctb_size) - 1)) >> log2_ctb_size;1129height_in_ctb = (height + ((1 << log2_ctb_size) - 1)) >> log2_ctb_size;11301131num_16x16_block_per_ctb = ((1 << log2_ctb_size) >> 4) * ((1 << log2_ctb_size) >> 4);1132context_buffer_size_per_ctb_row = align(width_in_ctb * num_16x16_block_per_ctb * 16, 256);1133max_mb_address = (unsigned)ceil(height * 8 / 2048.0);11341135cm_buffer_size = max_references * context_buffer_size_per_ctb_row * height_in_ctb;1136db_left_tile_pxl_size = coeff_10bit * (max_mb_address * 2 * 2048 + 1024);11371138return cm_buffer_size + db_left_tile_ctx_size + db_left_tile_pxl_size;1139}11401141static rvcn_dec_message_vc1_t get_vc1_msg(struct pipe_vc1_picture_desc *pic)1142{1143rvcn_dec_message_vc1_t result;11441145memset(&result, 0, sizeof(result));1146switch (pic->base.profile) {1147case PIPE_VIDEO_PROFILE_VC1_SIMPLE:1148result.profile = RDECODE_VC1_PROFILE_SIMPLE;1149result.level = 1;1150break;11511152case PIPE_VIDEO_PROFILE_VC1_MAIN:1153result.profile = RDECODE_VC1_PROFILE_MAIN;1154result.level = 2;1155break;11561157case PIPE_VIDEO_PROFILE_VC1_ADVANCED:1158result.profile = RDECODE_VC1_PROFILE_ADVANCED;1159result.level = 4;1160break;11611162default:1163assert(0);1164}11651166result.sps_info_flags |= pic->postprocflag << 7;1167result.sps_info_flags |= pic->pulldown << 6;1168result.sps_info_flags |= pic->interlace << 5;1169result.sps_info_flags |= pic->tfcntrflag << 4;1170result.sps_info_flags |= pic->finterpflag << 3;1171result.sps_info_flags |= pic->psf << 1;11721173result.pps_info_flags |= pic->range_mapy_flag << 31;1174result.pps_info_flags |= pic->range_mapy << 28;1175result.pps_info_flags |= pic->range_mapuv_flag << 27;1176result.pps_info_flags |= pic->range_mapuv << 24;1177result.pps_info_flags |= pic->multires << 21;1178result.pps_info_flags |= pic->maxbframes << 16;1179result.pps_info_flags |= pic->overlap << 11;1180result.pps_info_flags |= pic->quantizer << 9;1181result.pps_info_flags |= pic->panscan_flag << 7;1182result.pps_info_flags |= pic->refdist_flag << 6;1183result.pps_info_flags |= pic->vstransform << 0;11841185if (pic->base.profile != PIPE_VIDEO_PROFILE_VC1_SIMPLE) {1186result.pps_info_flags |= pic->syncmarker << 20;1187result.pps_info_flags |= pic->rangered << 19;1188result.pps_info_flags |= pic->loopfilter << 5;1189result.pps_info_flags |= pic->fastuvmc << 4;1190result.pps_info_flags |= pic->extended_mv << 3;1191result.pps_info_flags |= pic->extended_dmv << 8;1192result.pps_info_flags |= pic->dquant << 1;1193}11941195result.chroma_format = 1;11961197return result;1198}11991200static uint32_t get_ref_pic_idx(struct radeon_decoder *dec, struct pipe_video_buffer *ref)1201{1202uint32_t min = MAX2(dec->frame_number, NUM_MPEG2_REFS) - NUM_MPEG2_REFS;1203uint32_t max = MAX2(dec->frame_number, 1) - 1;1204uintptr_t frame;12051206/* seems to be the most sane fallback */1207if (!ref)1208return max;12091210/* get the frame number from the associated data */1211frame = (uintptr_t)vl_video_buffer_get_associated_data(ref, &dec->base);12121213/* limit the frame number to a valid range */1214return MAX2(MIN2(frame, max), min);1215}12161217static rvcn_dec_message_mpeg2_vld_t get_mpeg2_msg(struct radeon_decoder *dec,1218struct pipe_mpeg12_picture_desc *pic)1219{1220const int *zscan = pic->alternate_scan ? vl_zscan_alternate : vl_zscan_normal;1221rvcn_dec_message_mpeg2_vld_t result;1222unsigned i;12231224memset(&result, 0, sizeof(result));1225result.decoded_pic_idx = dec->frame_number;12261227result.forward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[0]);1228result.backward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[1]);12291230if (pic->intra_matrix) {1231result.load_intra_quantiser_matrix = 1;1232for (i = 0; i < 64; ++i) {1233result.intra_quantiser_matrix[i] = pic->intra_matrix[zscan[i]];1234}1235}1236if (pic->non_intra_matrix) {1237result.load_nonintra_quantiser_matrix = 1;1238for (i = 0; i < 64; ++i) {1239result.nonintra_quantiser_matrix[i] = pic->non_intra_matrix[zscan[i]];1240}1241}12421243result.profile_and_level_indication = 0;1244result.chroma_format = 0x1;12451246result.picture_coding_type = pic->picture_coding_type;1247result.f_code[0][0] = pic->f_code[0][0] + 1;1248result.f_code[0][1] = pic->f_code[0][1] + 1;1249result.f_code[1][0] = pic->f_code[1][0] + 1;1250result.f_code[1][1] = pic->f_code[1][1] + 1;1251result.intra_dc_precision = pic->intra_dc_precision;1252result.pic_structure = pic->picture_structure;1253result.top_field_first = pic->top_field_first;1254result.frame_pred_frame_dct = pic->frame_pred_frame_dct;1255result.concealment_motion_vectors = pic->concealment_motion_vectors;1256result.q_scale_type = pic->q_scale_type;1257result.intra_vlc_format = pic->intra_vlc_format;1258result.alternate_scan = pic->alternate_scan;12591260return result;1261}12621263static rvcn_dec_message_mpeg4_asp_vld_t get_mpeg4_msg(struct radeon_decoder *dec,1264struct pipe_mpeg4_picture_desc *pic)1265{1266rvcn_dec_message_mpeg4_asp_vld_t result;1267unsigned i;12681269memset(&result, 0, sizeof(result));1270result.decoded_pic_idx = dec->frame_number;12711272result.forward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[0]);1273result.backward_ref_pic_idx = get_ref_pic_idx(dec, pic->ref[1]);12741275result.variant_type = 0;1276result.profile_and_level_indication = 0xF0;12771278result.video_object_layer_verid = 0x5;1279result.video_object_layer_shape = 0x0;12801281result.video_object_layer_width = dec->base.width;1282result.video_object_layer_height = dec->base.height;12831284result.vop_time_increment_resolution = pic->vop_time_increment_resolution;12851286result.short_video_header = pic->short_video_header;1287result.interlaced = pic->interlaced;1288result.load_intra_quant_mat = 1;1289result.load_nonintra_quant_mat = 1;1290result.quarter_sample = pic->quarter_sample;1291result.complexity_estimation_disable = 1;1292result.resync_marker_disable = pic->resync_marker_disable;1293result.newpred_enable = 0;1294result.reduced_resolution_vop_enable = 0;12951296result.quant_type = pic->quant_type;12971298for (i = 0; i < 64; ++i) {1299result.intra_quant_mat[i] = pic->intra_matrix[vl_zscan_normal[i]];1300result.nonintra_quant_mat[i] = pic->non_intra_matrix[vl_zscan_normal[i]];1301}13021303return result;1304}13051306static void rvcn_dec_message_create(struct radeon_decoder *dec)1307{1308rvcn_dec_message_header_t *header = dec->msg;1309rvcn_dec_message_create_t *create = dec->msg + sizeof(rvcn_dec_message_header_t);1310unsigned sizes = sizeof(rvcn_dec_message_header_t) + sizeof(rvcn_dec_message_create_t);13111312memset(dec->msg, 0, sizes);1313header->header_size = sizeof(rvcn_dec_message_header_t);1314header->total_size = sizes;1315header->num_buffers = 1;1316header->msg_type = RDECODE_MSG_CREATE;1317header->stream_handle = dec->stream_handle;1318header->status_report_feedback_number = 0;13191320header->index[0].message_id = RDECODE_MESSAGE_CREATE;1321header->index[0].offset = sizeof(rvcn_dec_message_header_t);1322header->index[0].size = sizeof(rvcn_dec_message_create_t);1323header->index[0].filled = 0;13241325create->stream_type = dec->stream_type;1326create->session_flags = 0;1327create->width_in_samples = dec->base.width;1328create->height_in_samples = dec->base.height;1329}13301331static unsigned rvcn_dec_dynamic_dpb_t2_message(struct radeon_decoder *dec, rvcn_dec_message_decode_t *decode,1332rvcn_dec_message_dynamic_dpb_t2_t *dynamic_dpb_t2)1333{1334struct rvcn_dec_dynamic_dpb_t2 *dpb = NULL;1335unsigned width, height, size;1336uint64_t addr;1337int i;13381339width = align(decode->width_in_samples, dec->db_alignment);1340height = align(decode->height_in_samples, dec->db_alignment);1341size = align((width * height * 3) / 2, 256);1342if (dec->ref_codec.bts == CODEC_10_BITS)1343size = size * 3 / 2;13441345list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {1346for (i = 0; i < dec->ref_codec.ref_size; ++i) {1347if ((dec->ref_codec.ref_list[i] != 0x7f) && (d->index == (dec->ref_codec.ref_list[i] & 0x7f))) {1348addr = dec->ws->buffer_get_virtual_address(d->dpb.res->buf);1349dynamic_dpb_t2->dpbAddrLo[i] = addr;1350dynamic_dpb_t2->dpbAddrHi[i] = addr >> 32;1351++dynamic_dpb_t2->dpbArraySize;1352break;1353}1354}1355if (i == dec->ref_codec.ref_size) {1356list_del(&d->list);1357list_addtail(&d->list, &dec->dpb_unref_list);1358}1359}13601361list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {1362if (d->dpb.res->b.b.width0 * d->dpb.res->b.b.height0 == size && d->index == dec->ref_codec.index) {1363dpb = d;1364break;1365}1366}13671368if (!dpb) {1369list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_unref_list, list) {1370if (d->dpb.res->b.b.width0 * d->dpb.res->b.b.height0 == size) {1371d->index = dec->ref_codec.index;1372list_del(&d->list);1373list_addtail(&d->list, &dec->dpb_ref_list);1374dpb = d;1375break;1376}1377}1378}13791380list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_unref_list, list) {1381list_del(&d->list);1382si_vid_destroy_buffer(&d->dpb);1383FREE(d);1384}13851386if (!dpb) {1387dpb = CALLOC_STRUCT(rvcn_dec_dynamic_dpb_t2);1388if (!dpb)1389return 1;1390dpb->index = dec->ref_codec.index;1391if (!si_vid_create_buffer(dec->screen, &dpb->dpb, size, PIPE_USAGE_DEFAULT)) {1392RVID_ERR("Can't allocated dpb buffer.\n");1393FREE(dpb);1394return 1;1395}1396list_addtail(&dpb->list, &dec->dpb_ref_list);1397}13981399dec->ws->cs_add_buffer(&dec->cs, dpb->dpb.res->buf,1400RADEON_USAGE_READWRITE | RADEON_USAGE_SYNCHRONIZED, RADEON_DOMAIN_VRAM, 0);1401addr = dec->ws->buffer_get_virtual_address(dpb->dpb.res->buf);1402dynamic_dpb_t2->dpbCurrLo = addr;1403dynamic_dpb_t2->dpbCurrHi = addr >> 32;14041405decode->decode_flags = 1;1406dynamic_dpb_t2->dpbConfigFlags = 0;1407dynamic_dpb_t2->dpbLumaPitch = align(decode->width_in_samples, dec->db_alignment);1408dynamic_dpb_t2->dpbLumaAlignedHeight = align(decode->height_in_samples, dec->db_alignment);1409dynamic_dpb_t2->dpbLumaAlignedSize = dynamic_dpb_t2->dpbLumaPitch *1410dynamic_dpb_t2->dpbLumaAlignedHeight;1411dynamic_dpb_t2->dpbChromaPitch = dynamic_dpb_t2->dpbLumaPitch >> 1;1412dynamic_dpb_t2->dpbChromaAlignedHeight = dynamic_dpb_t2->dpbLumaAlignedHeight >> 1;1413dynamic_dpb_t2->dpbChromaAlignedSize = dynamic_dpb_t2->dpbChromaPitch *1414dynamic_dpb_t2->dpbChromaAlignedHeight * 2;14151416if (dec->ref_codec.bts == CODEC_10_BITS) {1417dynamic_dpb_t2->dpbLumaAlignedSize = dynamic_dpb_t2->dpbLumaAlignedSize * 3 / 2;1418dynamic_dpb_t2->dpbChromaAlignedSize = dynamic_dpb_t2->dpbChromaAlignedSize * 3 / 2;1419}14201421return 0;1422}14231424static struct pb_buffer *rvcn_dec_message_decode(struct radeon_decoder *dec,1425struct pipe_video_buffer *target,1426struct pipe_picture_desc *picture)1427{1428DECRYPT_PARAMETERS *decrypt = (DECRYPT_PARAMETERS *)picture->decrypt_key;1429bool encrypted = (DECRYPT_PARAMETERS *)picture->protected_playback;1430struct si_texture *luma = (struct si_texture *)((struct vl_video_buffer *)target)->resources[0];1431struct si_texture *chroma =1432(struct si_texture *)((struct vl_video_buffer *)target)->resources[1];1433ASSERTED struct si_screen *sscreen = (struct si_screen *)dec->screen;1434rvcn_dec_message_header_t *header;1435rvcn_dec_message_index_t *index_codec;1436rvcn_dec_message_index_t *index_drm = NULL;1437rvcn_dec_message_index_t *index_dynamic_dpb = NULL;1438rvcn_dec_message_decode_t *decode;1439unsigned sizes = 0, offset_decode, offset_codec;1440unsigned offset_drm = 0, offset_dynamic_dpb = 0;1441void *codec;1442rvcn_dec_message_drm_t *drm = NULL;1443rvcn_dec_message_dynamic_dpb_t *dynamic_dpb = NULL;1444rvcn_dec_message_dynamic_dpb_t2_t *dynamic_dpb_t2 = NULL;14451446header = dec->msg;1447sizes += sizeof(rvcn_dec_message_header_t);14481449index_codec = (void*)header + sizes;1450sizes += sizeof(rvcn_dec_message_index_t);14511452if (encrypted) {1453index_drm = (void*)header + sizes;1454sizes += sizeof(rvcn_dec_message_index_t);1455}14561457if (dec->dpb_type >= DPB_DYNAMIC_TIER_1) {1458index_dynamic_dpb = (void*)header + sizes;1459sizes += sizeof(rvcn_dec_message_index_t);1460}14611462offset_decode = sizes;1463decode = (void*)header + sizes;1464sizes += sizeof(rvcn_dec_message_decode_t);14651466if (encrypted) {1467offset_drm = sizes;1468drm = (void*)header + sizes;1469sizes += sizeof(rvcn_dec_message_drm_t);1470}14711472if (dec->dpb_type >= DPB_DYNAMIC_TIER_1) {1473offset_dynamic_dpb = sizes;1474if (dec->dpb_type == DPB_DYNAMIC_TIER_1) {1475dynamic_dpb = (void*)header + sizes;1476sizes += sizeof(rvcn_dec_message_dynamic_dpb_t);1477}1478else if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {1479dynamic_dpb_t2 = (void*)header + sizes;1480sizes += sizeof(rvcn_dec_message_dynamic_dpb_t2_t);1481}1482}14831484offset_codec = sizes;1485codec = (void*)header + sizes;14861487memset(dec->msg, 0, sizes);1488header->header_size = sizeof(rvcn_dec_message_header_t);1489header->total_size = sizes;1490header->msg_type = RDECODE_MSG_DECODE;1491header->stream_handle = dec->stream_handle;1492header->status_report_feedback_number = dec->frame_number;14931494header->index[0].message_id = RDECODE_MESSAGE_DECODE;1495header->index[0].offset = offset_decode;1496header->index[0].size = sizeof(rvcn_dec_message_decode_t);1497header->index[0].filled = 0;1498header->num_buffers = 1;14991500index_codec->offset = offset_codec;1501index_codec->size = sizeof(rvcn_dec_message_avc_t);1502index_codec->filled = 0;1503++header->num_buffers;15041505if (encrypted) {1506index_drm->message_id = RDECODE_MESSAGE_DRM;1507index_drm->offset = offset_drm;1508index_drm->size = sizeof(rvcn_dec_message_drm_t);1509index_drm->filled = 0;1510++header->num_buffers;1511}15121513if (dec->dpb_type >= DPB_DYNAMIC_TIER_1) {1514index_dynamic_dpb->message_id = RDECODE_MESSAGE_DYNAMIC_DPB;1515index_dynamic_dpb->offset = offset_dynamic_dpb;1516index_dynamic_dpb->filled = 0;1517++header->num_buffers;1518if (dec->dpb_type == DPB_DYNAMIC_TIER_1)1519index_dynamic_dpb->size = sizeof(rvcn_dec_message_dynamic_dpb_t);1520else if (dec->dpb_type == DPB_DYNAMIC_TIER_2)1521index_dynamic_dpb->size = sizeof(rvcn_dec_message_dynamic_dpb_t2_t);1522}15231524decode->stream_type = dec->stream_type;1525decode->decode_flags = 0;1526decode->width_in_samples = dec->base.width;1527decode->height_in_samples = dec->base.height;15281529decode->bsd_size = align(dec->bs_size, 128);15301531if (!dec->dpb.res && dec->dpb_type != DPB_DYNAMIC_TIER_2) {1532bool r;1533if (dec->dpb_size) {1534if (encrypted) {1535r = si_vid_create_tmz_buffer(dec->screen, &dec->dpb, dec->dpb_size, PIPE_USAGE_DEFAULT);1536} else {1537r = si_vid_create_buffer(dec->screen, &dec->dpb, dec->dpb_size, PIPE_USAGE_DEFAULT);1538}1539assert(encrypted == (bool)(dec->dpb.res->flags & RADEON_FLAG_ENCRYPTED));1540if (!r) {1541RVID_ERR("Can't allocated dpb.\n");1542return NULL;1543}1544si_vid_clear_buffer(dec->base.context, &dec->dpb);1545}1546}15471548if (!dec->ctx.res) {1549enum pipe_video_format fmt = u_reduce_video_profile(picture->profile);1550if (dec->stream_type == RDECODE_CODEC_H264_PERF) {1551unsigned ctx_size = calc_ctx_size_h264_perf(dec);1552bool r;1553if (encrypted && dec->tmz_ctx) {1554r = si_vid_create_tmz_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);1555} else {1556r = si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);1557}1558assert((encrypted && dec->tmz_ctx) == (bool)(dec->ctx.res->flags & RADEON_FLAG_ENCRYPTED));15591560if (!r) {1561RVID_ERR("Can't allocated context buffer.\n");1562return NULL;1563}1564si_vid_clear_buffer(dec->base.context, &dec->ctx);1565} else if (fmt == PIPE_VIDEO_FORMAT_VP9) {1566unsigned ctx_size;1567uint8_t *ptr;1568bool r;15691570/* default probability + probability data */1571ctx_size = 2304 * 5;15721573if (((struct si_screen *)dec->screen)->info.family >= CHIP_RENOIR) {1574/* SRE collocated context data */1575ctx_size += 32 * 2 * 128 * 68;1576/* SMP collocated context data */1577ctx_size += 9 * 64 * 2 * 128 * 68;1578/* SDB left tile pixel */1579ctx_size += 8 * 2 * 2 * 8192;1580} else {1581ctx_size += 32 * 2 * 64 * 64;1582ctx_size += 9 * 64 * 2 * 64 * 64;1583ctx_size += 8 * 2 * 4096;1584}15851586if (dec->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2)1587ctx_size += 8 * 2 * 4096;15881589if (encrypted && dec->tmz_ctx) {1590r = si_vid_create_tmz_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);1591} else {1592r = si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);1593}1594if (!r) {1595RVID_ERR("Can't allocated context buffer.\n");1596return NULL;1597}1598si_vid_clear_buffer(dec->base.context, &dec->ctx);15991600/* ctx needs probs table */1601ptr = dec->ws->buffer_map(dec->ws, dec->ctx.res->buf, &dec->cs,1602PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);1603fill_probs_table(ptr);1604dec->ws->buffer_unmap(dec->ws, dec->ctx.res->buf);1605dec->bs_ptr = NULL;1606} else if (fmt == PIPE_VIDEO_FORMAT_HEVC) {1607unsigned ctx_size;1608bool r;1609if (dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10)1610ctx_size = calc_ctx_size_h265_main10(dec, (struct pipe_h265_picture_desc *)picture);1611else1612ctx_size = calc_ctx_size_h265_main(dec);16131614if (encrypted && dec->tmz_ctx) {1615r = si_vid_create_tmz_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);1616} else {1617r = si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT);1618}1619if (!r) {1620RVID_ERR("Can't allocated context buffer.\n");1621return NULL;1622}1623si_vid_clear_buffer(dec->base.context, &dec->ctx);1624}1625}1626if (encrypted != dec->ws->cs_is_secure(&dec->cs)) {1627dec->ws->cs_flush(&dec->cs, RADEON_FLUSH_TOGGLE_SECURE_SUBMISSION, NULL);1628}16291630decode->dpb_size = (dec->dpb_type != DPB_DYNAMIC_TIER_2) ? dec->dpb.res->buf->size : 0;1631decode->dt_size = si_resource(((struct vl_video_buffer *)target)->resources[0])->buf->size +1632si_resource(((struct vl_video_buffer *)target)->resources[1])->buf->size;16331634decode->sct_size = 0;1635decode->sc_coeff_size = 0;16361637decode->sw_ctxt_size = RDECODE_SESSION_CONTEXT_SIZE;1638decode->db_pitch = align(dec->base.width, dec->db_alignment);16391640if (((struct si_screen*)dec->screen)->info.family >= CHIP_SIENNA_CICHLID &&1641(dec->stream_type == RDECODE_CODEC_VP9 || dec->stream_type == RDECODE_CODEC_AV1 ||1642dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10))1643decode->db_aligned_height = align(dec->base.height, 64);16441645decode->db_surf_tile_config = 0;16461647decode->dt_pitch = luma->surface.u.gfx9.surf_pitch * luma->surface.blk_w;1648decode->dt_uv_pitch = chroma->surface.u.gfx9.surf_pitch * chroma->surface.blk_w;16491650if (luma->surface.meta_offset) {1651RVID_ERR("DCC surfaces not supported.\n");1652return NULL;1653}16541655decode->dt_tiling_mode = 0;1656decode->dt_swizzle_mode = luma->surface.u.gfx9.swizzle_mode;1657decode->dt_array_mode = RDECODE_ARRAY_MODE_LINEAR;1658decode->dt_field_mode = ((struct vl_video_buffer *)target)->base.interlaced;1659decode->dt_surf_tile_config = 0;1660decode->dt_uv_surf_tile_config = 0;16611662decode->dt_luma_top_offset = luma->surface.u.gfx9.surf_offset;1663decode->dt_chroma_top_offset = chroma->surface.u.gfx9.surf_offset;1664if (decode->dt_field_mode) {1665decode->dt_luma_bottom_offset =1666luma->surface.u.gfx9.surf_offset + luma->surface.u.gfx9.surf_slice_size;1667decode->dt_chroma_bottom_offset =1668chroma->surface.u.gfx9.surf_offset + chroma->surface.u.gfx9.surf_slice_size;1669} else {1670decode->dt_luma_bottom_offset = decode->dt_luma_top_offset;1671decode->dt_chroma_bottom_offset = decode->dt_chroma_top_offset;1672}1673if (dec->stream_type == RDECODE_CODEC_AV1)1674decode->db_pitch_uv = chroma->surface.u.gfx9.surf_pitch * chroma->surface.blk_w;16751676if (encrypted) {1677assert(sscreen->info.has_tmz_support);1678set_drm_keys(drm, decrypt);1679}16801681if (dec->dpb_type == DPB_DYNAMIC_TIER_1) {1682decode->decode_flags = 1;1683dynamic_dpb->dpbArraySize = NUM_VP9_REFS + 1;1684dynamic_dpb->dpbLumaPitch = align(decode->width_in_samples, dec->db_alignment);1685dynamic_dpb->dpbLumaAlignedHeight = align(decode->height_in_samples, dec->db_alignment);1686dynamic_dpb->dpbLumaAlignedSize =1687dynamic_dpb->dpbLumaPitch * dynamic_dpb->dpbLumaAlignedHeight;1688dynamic_dpb->dpbChromaPitch = dynamic_dpb->dpbLumaPitch >> 1;1689dynamic_dpb->dpbChromaAlignedHeight = dynamic_dpb->dpbLumaAlignedHeight >> 1;1690dynamic_dpb->dpbChromaAlignedSize =1691dynamic_dpb->dpbChromaPitch * dynamic_dpb->dpbChromaAlignedHeight * 2;1692dynamic_dpb->dpbReserved0[0] = dec->db_alignment;16931694if (dec->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2) {1695dynamic_dpb->dpbLumaAlignedSize = dynamic_dpb->dpbLumaAlignedSize * 3 / 2;1696dynamic_dpb->dpbChromaAlignedSize = dynamic_dpb->dpbChromaAlignedSize * 3 / 2;1697}1698}16991700switch (u_reduce_video_profile(picture->profile)) {1701case PIPE_VIDEO_FORMAT_MPEG4_AVC: {1702rvcn_dec_message_avc_t avc = get_h264_msg(dec, (struct pipe_h264_picture_desc *)picture);1703memcpy(codec, (void *)&avc, sizeof(rvcn_dec_message_avc_t));1704index_codec->message_id = RDECODE_MESSAGE_AVC;1705break;1706}1707case PIPE_VIDEO_FORMAT_HEVC: {1708rvcn_dec_message_hevc_t hevc =1709get_h265_msg(dec, target, (struct pipe_h265_picture_desc *)picture);17101711memcpy(codec, (void *)&hevc, sizeof(rvcn_dec_message_hevc_t));1712index_codec->message_id = RDECODE_MESSAGE_HEVC;1713break;1714}1715case PIPE_VIDEO_FORMAT_VC1: {1716rvcn_dec_message_vc1_t vc1 = get_vc1_msg((struct pipe_vc1_picture_desc *)picture);17171718memcpy(codec, (void *)&vc1, sizeof(rvcn_dec_message_vc1_t));1719if ((picture->profile == PIPE_VIDEO_PROFILE_VC1_SIMPLE) ||1720(picture->profile == PIPE_VIDEO_PROFILE_VC1_MAIN)) {1721decode->width_in_samples = align(decode->width_in_samples, 16) / 16;1722decode->height_in_samples = align(decode->height_in_samples, 16) / 16;1723}1724index_codec->message_id = RDECODE_MESSAGE_VC1;1725break;1726}1727case PIPE_VIDEO_FORMAT_MPEG12: {1728rvcn_dec_message_mpeg2_vld_t mpeg2 =1729get_mpeg2_msg(dec, (struct pipe_mpeg12_picture_desc *)picture);17301731memcpy(codec, (void *)&mpeg2, sizeof(rvcn_dec_message_mpeg2_vld_t));1732index_codec->message_id = RDECODE_MESSAGE_MPEG2_VLD;1733break;1734}1735case PIPE_VIDEO_FORMAT_MPEG4: {1736rvcn_dec_message_mpeg4_asp_vld_t mpeg4 =1737get_mpeg4_msg(dec, (struct pipe_mpeg4_picture_desc *)picture);17381739memcpy(codec, (void *)&mpeg4, sizeof(rvcn_dec_message_mpeg4_asp_vld_t));1740index_codec->message_id = RDECODE_MESSAGE_MPEG4_ASP_VLD;1741break;1742}1743case PIPE_VIDEO_FORMAT_VP9: {1744rvcn_dec_message_vp9_t vp9 =1745get_vp9_msg(dec, target, (struct pipe_vp9_picture_desc *)picture);17461747memcpy(codec, (void *)&vp9, sizeof(rvcn_dec_message_vp9_t));1748index_codec->message_id = RDECODE_MESSAGE_VP9;1749break;1750}1751case PIPE_VIDEO_FORMAT_AV1: {1752rvcn_dec_message_av1_t av1 =1753get_av1_msg(dec, target, (struct pipe_av1_picture_desc *)picture);17541755memcpy(codec, (void *)&av1, sizeof(rvcn_dec_message_av1_t));1756index_codec->message_id = RDECODE_MESSAGE_AV1;17571758if (dec->ctx.res == NULL) {1759unsigned ctx_size = (9 + 4) * align(sizeof(rvcn_av1_hw_frame_context_t), 2048) +17609 * 64 * 34 * 512 + 9 * 64 * 34 * 256 * 5;1761int num_64x64_CTB_8k = 68;1762int num_128x128_CTB_8k = 34;1763int sdb_pitch_64x64 = align(32 * num_64x64_CTB_8k, 256);1764int sdb_pitch_128x128 = align(32 * num_128x128_CTB_8k, 256);1765int sdb_lf_size_ctb_64x64 = sdb_pitch_64x64 * (1728 / 32);1766int sdb_lf_size_ctb_128x128 = sdb_pitch_128x128 * (3008 / 32);1767int sdb_superres_size_ctb_64x64 = sdb_pitch_64x64 * (3232 / 32);1768int sdb_superres_size_ctb_128x128 = sdb_pitch_128x128 * (6208 / 32);1769int sdb_output_size_ctb_64x64 = sdb_pitch_64x64 * (1312 / 32);1770int sdb_output_size_ctb_128x128 = sdb_pitch_128x128 * (2336 / 32);1771int sdb_fg_avg_luma_size_ctb_64x64 = sdb_pitch_64x64 * (384 / 32);1772int sdb_fg_avg_luma_size_ctb_128x128 = sdb_pitch_128x128 * (640 / 32);1773uint8_t *ptr;1774int i;17751776ctx_size += (MAX2(sdb_lf_size_ctb_64x64, sdb_lf_size_ctb_128x128) +1777MAX2(sdb_superres_size_ctb_64x64, sdb_superres_size_ctb_128x128) +1778MAX2(sdb_output_size_ctb_64x64, sdb_output_size_ctb_128x128) +1779MAX2(sdb_fg_avg_luma_size_ctb_64x64, sdb_fg_avg_luma_size_ctb_128x128)) * 2 + 68 * 512;17801781if (!si_vid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT))1782RVID_ERR("Can't allocated context buffer.\n");1783si_vid_clear_buffer(dec->base.context, &dec->ctx);17841785ptr = dec->ws->buffer_map(dec->ws, dec->ctx.res->buf, &dec->cs, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);17861787for (i = 0; i < 4; ++i) {1788rvcn_init_mode_probs((void*)(ptr + i * align(sizeof(rvcn_av1_frame_context_t), 2048)));1789rvcn_av1_init_mv_probs((void*)(ptr + i * align(sizeof(rvcn_av1_frame_context_t), 2048)));1790rvcn_av1_default_coef_probs((void*)(ptr + i * align(sizeof(rvcn_av1_frame_context_t), 2048)), i);1791}1792dec->ws->buffer_unmap(dec->ws, dec->ctx.res->buf);1793}17941795break;1796}1797default:1798assert(0);1799return NULL;1800}18011802if (dec->ctx.res)1803decode->hw_ctxt_size = dec->ctx.res->buf->size;18041805if (dec->dpb_type == DPB_DYNAMIC_TIER_2)1806if (rvcn_dec_dynamic_dpb_t2_message(dec, decode, dynamic_dpb_t2))1807return NULL;18081809return luma->buffer.buf;1810}18111812static void rvcn_dec_message_destroy(struct radeon_decoder *dec)1813{1814rvcn_dec_message_header_t *header = dec->msg;18151816memset(dec->msg, 0, sizeof(rvcn_dec_message_header_t));1817header->header_size = sizeof(rvcn_dec_message_header_t);1818header->total_size = sizeof(rvcn_dec_message_header_t) - sizeof(rvcn_dec_message_index_t);1819header->num_buffers = 0;1820header->msg_type = RDECODE_MSG_DESTROY;1821header->stream_handle = dec->stream_handle;1822header->status_report_feedback_number = 0;1823}18241825static void rvcn_dec_message_feedback(struct radeon_decoder *dec)1826{1827rvcn_dec_feedback_header_t *header = (void *)dec->fb;18281829header->header_size = sizeof(rvcn_dec_feedback_header_t);1830header->total_size = sizeof(rvcn_dec_feedback_header_t);1831header->num_buffers = 0;1832}18331834/* flush IB to the hardware */1835static int flush(struct radeon_decoder *dec, unsigned flags)1836{1837return dec->ws->cs_flush(&dec->cs, flags, NULL);1838}18391840/* add a new set register command to the IB */1841static void set_reg(struct radeon_decoder *dec, unsigned reg, uint32_t val)1842{1843radeon_emit(&dec->cs, RDECODE_PKT0(reg >> 2, 0));1844radeon_emit(&dec->cs, val);1845}18461847/* send a command to the VCPU through the GPCOM registers */1848static void send_cmd(struct radeon_decoder *dec, unsigned cmd, struct pb_buffer *buf, uint32_t off,1849enum radeon_bo_usage usage, enum radeon_bo_domain domain)1850{1851uint64_t addr;18521853dec->ws->cs_add_buffer(&dec->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED, domain, 0);1854addr = dec->ws->buffer_get_virtual_address(buf);1855addr = addr + off;18561857set_reg(dec, dec->reg.data0, addr);1858set_reg(dec, dec->reg.data1, addr >> 32);1859set_reg(dec, dec->reg.cmd, cmd << 1);1860}18611862/* do the codec needs an IT buffer ?*/1863static bool have_it(struct radeon_decoder *dec)1864{1865return dec->stream_type == RDECODE_CODEC_H264_PERF || dec->stream_type == RDECODE_CODEC_H265;1866}18671868/* do the codec needs an probs buffer? */1869static bool have_probs(struct radeon_decoder *dec)1870{1871return (dec->stream_type == RDECODE_CODEC_VP9 || dec->stream_type == RDECODE_CODEC_AV1);1872}18731874/* map the next available message/feedback/itscaling buffer */1875static void map_msg_fb_it_probs_buf(struct radeon_decoder *dec)1876{1877struct rvid_buffer *buf;1878uint8_t *ptr;18791880/* grab the current message/feedback buffer */1881buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];18821883/* and map it for CPU access */1884ptr =1885dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);18861887/* calc buffer offsets */1888dec->msg = ptr;18891890dec->fb = (uint32_t *)(ptr + FB_BUFFER_OFFSET);1891if (have_it(dec))1892dec->it = (uint8_t *)(ptr + FB_BUFFER_OFFSET + FB_BUFFER_SIZE);1893else if (have_probs(dec))1894dec->probs = (uint8_t *)(ptr + FB_BUFFER_OFFSET + FB_BUFFER_SIZE);1895}18961897/* unmap and send a message command to the VCPU */1898static void send_msg_buf(struct radeon_decoder *dec)1899{1900struct rvid_buffer *buf;19011902/* ignore the request if message/feedback buffer isn't mapped */1903if (!dec->msg || !dec->fb)1904return;19051906/* grab the current message buffer */1907buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];19081909/* unmap the buffer */1910dec->ws->buffer_unmap(dec->ws, buf->res->buf);1911dec->bs_ptr = NULL;1912dec->msg = NULL;1913dec->fb = NULL;1914dec->it = NULL;1915dec->probs = NULL;19161917if (dec->sessionctx.res)1918send_cmd(dec, RDECODE_CMD_SESSION_CONTEXT_BUFFER, dec->sessionctx.res->buf, 0,1919RADEON_USAGE_READWRITE, RADEON_DOMAIN_VRAM);19201921/* and send it to the hardware */1922send_cmd(dec, RDECODE_CMD_MSG_BUFFER, buf->res->buf, 0, RADEON_USAGE_READ, RADEON_DOMAIN_GTT);1923}19241925/* cycle to the next set of buffers */1926static void next_buffer(struct radeon_decoder *dec)1927{1928++dec->cur_buffer;1929dec->cur_buffer %= NUM_BUFFERS;1930}19311932static unsigned calc_ctx_size_h264_perf(struct radeon_decoder *dec)1933{1934unsigned width_in_mb, height_in_mb, ctx_size;1935unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);1936unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);19371938unsigned max_references = dec->base.max_references + 1;19391940// picture width & height in 16 pixel units1941width_in_mb = width / VL_MACROBLOCK_WIDTH;1942height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);19431944unsigned fs_in_mb = width_in_mb * height_in_mb;1945unsigned num_dpb_buffer;1946switch (dec->base.level) {1947case 30:1948num_dpb_buffer = 8100 / fs_in_mb;1949break;1950case 31:1951num_dpb_buffer = 18000 / fs_in_mb;1952break;1953case 32:1954num_dpb_buffer = 20480 / fs_in_mb;1955break;1956case 41:1957num_dpb_buffer = 32768 / fs_in_mb;1958break;1959case 42:1960num_dpb_buffer = 34816 / fs_in_mb;1961break;1962case 50:1963num_dpb_buffer = 110400 / fs_in_mb;1964break;1965case 51:1966num_dpb_buffer = 184320 / fs_in_mb;1967break;1968default:1969num_dpb_buffer = 184320 / fs_in_mb;1970break;1971}1972num_dpb_buffer++;1973max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer), max_references);1974ctx_size = max_references * align(width_in_mb * height_in_mb * 192, 256);19751976return ctx_size;1977}19781979/* calculate size of reference picture buffer */1980static unsigned calc_dpb_size(struct radeon_decoder *dec)1981{1982unsigned width_in_mb, height_in_mb, image_size, dpb_size;19831984// always align them to MB size for dpb calculation1985unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);1986unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);19871988// always one more for currently decoded picture1989unsigned max_references = dec->base.max_references + 1;19901991// aligned size of a single frame1992image_size = align(width, 32) * height;1993image_size += image_size / 2;1994image_size = align(image_size, 1024);19951996// picture width & height in 16 pixel units1997width_in_mb = width / VL_MACROBLOCK_WIDTH;1998height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);19992000switch (u_reduce_video_profile(dec->base.profile)) {2001case PIPE_VIDEO_FORMAT_MPEG4_AVC: {2002unsigned fs_in_mb = width_in_mb * height_in_mb;2003unsigned num_dpb_buffer;20042005switch (dec->base.level) {2006case 30:2007num_dpb_buffer = 8100 / fs_in_mb;2008break;2009case 31:2010num_dpb_buffer = 18000 / fs_in_mb;2011break;2012case 32:2013num_dpb_buffer = 20480 / fs_in_mb;2014break;2015case 41:2016num_dpb_buffer = 32768 / fs_in_mb;2017break;2018case 42:2019num_dpb_buffer = 34816 / fs_in_mb;2020break;2021case 50:2022num_dpb_buffer = 110400 / fs_in_mb;2023break;2024case 51:2025num_dpb_buffer = 184320 / fs_in_mb;2026break;2027default:2028num_dpb_buffer = 184320 / fs_in_mb;2029break;2030}2031num_dpb_buffer++;2032max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer), max_references);2033dpb_size = image_size * max_references;2034break;2035}20362037case PIPE_VIDEO_FORMAT_HEVC:2038if (dec->base.width * dec->base.height >= 4096 * 2000)2039max_references = MAX2(max_references, 8);2040else2041max_references = MAX2(max_references, 17);20422043width = align(width, 16);2044height = align(height, 16);2045if (dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10)2046dpb_size = align((align(width, 64) * align(height, 64) * 9) / 4, 256) * max_references;2047else2048dpb_size = align((align(width, 32) * height * 3) / 2, 256) * max_references;2049break;20502051case PIPE_VIDEO_FORMAT_VC1:2052// the firmware seems to allways assume a minimum of ref frames2053max_references = MAX2(NUM_VC1_REFS, max_references);20542055// reference picture buffer2056dpb_size = image_size * max_references;20572058// CONTEXT_BUFFER2059dpb_size += width_in_mb * height_in_mb * 128;20602061// IT surface buffer2062dpb_size += width_in_mb * 64;20632064// DB surface buffer2065dpb_size += width_in_mb * 128;20662067// BP2068dpb_size += align(MAX2(width_in_mb, height_in_mb) * 7 * 16, 64);2069break;20702071case PIPE_VIDEO_FORMAT_MPEG12:2072// reference picture buffer, must be big enough for all frames2073dpb_size = image_size * NUM_MPEG2_REFS;2074break;20752076case PIPE_VIDEO_FORMAT_MPEG4:2077// reference picture buffer2078dpb_size = image_size * max_references;20792080// CM2081dpb_size += width_in_mb * height_in_mb * 64;20822083// IT surface buffer2084dpb_size += align(width_in_mb * height_in_mb * 32, 64);20852086dpb_size = MAX2(dpb_size, 30 * 1024 * 1024);2087break;20882089case PIPE_VIDEO_FORMAT_VP9:2090max_references = MAX2(max_references, 9);20912092if (dec->dpb_type == DPB_MAX_RES)2093dpb_size = (((struct si_screen *)dec->screen)->info.family >= CHIP_RENOIR)2094? (8192 * 4320 * 3 / 2) * max_references2095: (4096 * 3000 * 3 / 2) * max_references;2096else2097dpb_size = (align(dec->base.width, dec->db_alignment) *2098align(dec->base.height, dec->db_alignment) * 3 / 2) * max_references;20992100if (dec->base.profile == PIPE_VIDEO_PROFILE_VP9_PROFILE2)2101dpb_size = dpb_size * 3 / 2;2102break;21032104case PIPE_VIDEO_FORMAT_AV1:2105max_references = MAX2(max_references, 9);2106dpb_size = 8192 * 4320 * 3 / 2 * max_references * 3 / 2;2107break;21082109case PIPE_VIDEO_FORMAT_JPEG:2110dpb_size = 0;2111break;21122113default:2114// something is missing here2115assert(0);21162117// at least use a sane default value2118dpb_size = 32 * 1024 * 1024;2119break;2120}2121return dpb_size;2122}21232124/**2125* destroy this video decoder2126*/2127static void radeon_dec_destroy(struct pipe_video_codec *decoder)2128{2129struct radeon_decoder *dec = (struct radeon_decoder *)decoder;2130unsigned i;21312132assert(decoder);21332134map_msg_fb_it_probs_buf(dec);2135rvcn_dec_message_destroy(dec);2136send_msg_buf(dec);21372138flush(dec, 0);21392140dec->ws->cs_destroy(&dec->cs);21412142for (i = 0; i < NUM_BUFFERS; ++i) {2143si_vid_destroy_buffer(&dec->msg_fb_it_probs_buffers[i]);2144si_vid_destroy_buffer(&dec->bs_buffers[i]);2145}21462147if (dec->dpb_type != DPB_DYNAMIC_TIER_2) {2148si_vid_destroy_buffer(&dec->dpb);2149} else {2150list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {2151list_del(&d->list);2152si_vid_destroy_buffer(&d->dpb);2153FREE(d);2154}2155}2156si_vid_destroy_buffer(&dec->ctx);2157si_vid_destroy_buffer(&dec->sessionctx);21582159FREE(dec);2160}21612162/**2163* start decoding of a new frame2164*/2165static void radeon_dec_begin_frame(struct pipe_video_codec *decoder,2166struct pipe_video_buffer *target,2167struct pipe_picture_desc *picture)2168{2169struct radeon_decoder *dec = (struct radeon_decoder *)decoder;2170uintptr_t frame;21712172assert(decoder);21732174frame = ++dec->frame_number;2175if (dec->stream_type != RDECODE_CODEC_VP9 && dec->stream_type != RDECODE_CODEC_AV1)2176vl_video_buffer_set_associated_data(target, decoder, (void *)frame,2177&radeon_dec_destroy_associated_data);21782179dec->bs_size = 0;2180dec->bs_ptr = dec->ws->buffer_map(dec->ws, dec->bs_buffers[dec->cur_buffer].res->buf, &dec->cs,2181PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);2182}21832184/**2185* decode a macroblock2186*/2187static void radeon_dec_decode_macroblock(struct pipe_video_codec *decoder,2188struct pipe_video_buffer *target,2189struct pipe_picture_desc *picture,2190const struct pipe_macroblock *macroblocks,2191unsigned num_macroblocks)2192{2193/* not supported (yet) */2194assert(0);2195}21962197/**2198* decode a bitstream2199*/2200static void radeon_dec_decode_bitstream(struct pipe_video_codec *decoder,2201struct pipe_video_buffer *target,2202struct pipe_picture_desc *picture, unsigned num_buffers,2203const void *const *buffers, const unsigned *sizes)2204{2205struct radeon_decoder *dec = (struct radeon_decoder *)decoder;2206unsigned i;22072208assert(decoder);22092210if (!dec->bs_ptr)2211return;22122213for (i = 0; i < num_buffers; ++i) {2214struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer];2215unsigned new_size = dec->bs_size + sizes[i];22162217if (new_size > buf->res->buf->size) {2218dec->ws->buffer_unmap(dec->ws, buf->res->buf);2219dec->bs_ptr = NULL;2220if (!si_vid_resize_buffer(dec->screen, &dec->cs, buf, new_size)) {2221RVID_ERR("Can't resize bitstream buffer!");2222return;2223}22242225dec->bs_ptr = dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs,2226PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);2227if (!dec->bs_ptr)2228return;22292230dec->bs_ptr += dec->bs_size;2231}22322233memcpy(dec->bs_ptr, buffers[i], sizes[i]);2234dec->bs_size += sizes[i];2235dec->bs_ptr += sizes[i];2236}2237}22382239/**2240* send cmd for vcn dec2241*/2242void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target,2243struct pipe_picture_desc *picture)2244{2245struct pb_buffer *dt;2246struct rvid_buffer *msg_fb_it_probs_buf, *bs_buf;22472248msg_fb_it_probs_buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];2249bs_buf = &dec->bs_buffers[dec->cur_buffer];22502251memset(dec->bs_ptr, 0, align(dec->bs_size, 128) - dec->bs_size);2252dec->ws->buffer_unmap(dec->ws, bs_buf->res->buf);2253dec->bs_ptr = NULL;22542255map_msg_fb_it_probs_buf(dec);2256dt = rvcn_dec_message_decode(dec, target, picture);2257rvcn_dec_message_feedback(dec);2258send_msg_buf(dec);22592260if (dec->dpb_type != DPB_DYNAMIC_TIER_2)2261send_cmd(dec, RDECODE_CMD_DPB_BUFFER, dec->dpb.res->buf, 0, RADEON_USAGE_READWRITE,2262RADEON_DOMAIN_VRAM);2263if (dec->ctx.res)2264send_cmd(dec, RDECODE_CMD_CONTEXT_BUFFER, dec->ctx.res->buf, 0, RADEON_USAGE_READWRITE,2265RADEON_DOMAIN_VRAM);2266send_cmd(dec, RDECODE_CMD_BITSTREAM_BUFFER, bs_buf->res->buf, 0, RADEON_USAGE_READ,2267RADEON_DOMAIN_GTT);2268send_cmd(dec, RDECODE_CMD_DECODING_TARGET_BUFFER, dt, 0, RADEON_USAGE_WRITE, RADEON_DOMAIN_VRAM);2269send_cmd(dec, RDECODE_CMD_FEEDBACK_BUFFER, msg_fb_it_probs_buf->res->buf, FB_BUFFER_OFFSET,2270RADEON_USAGE_WRITE, RADEON_DOMAIN_GTT);2271if (have_it(dec))2272send_cmd(dec, RDECODE_CMD_IT_SCALING_TABLE_BUFFER, msg_fb_it_probs_buf->res->buf,2273FB_BUFFER_OFFSET + FB_BUFFER_SIZE, RADEON_USAGE_READ, RADEON_DOMAIN_GTT);2274else if (have_probs(dec))2275send_cmd(dec, RDECODE_CMD_PROB_TBL_BUFFER, msg_fb_it_probs_buf->res->buf,2276FB_BUFFER_OFFSET + FB_BUFFER_SIZE, RADEON_USAGE_READ, RADEON_DOMAIN_GTT);2277set_reg(dec, dec->reg.cntl, 1);2278}22792280/**2281* end decoding of the current frame2282*/2283static void radeon_dec_end_frame(struct pipe_video_codec *decoder, struct pipe_video_buffer *target,2284struct pipe_picture_desc *picture)2285{2286struct radeon_decoder *dec = (struct radeon_decoder *)decoder;22872288assert(decoder);22892290if (!dec->bs_ptr)2291return;22922293dec->send_cmd(dec, target, picture);2294flush(dec, PIPE_FLUSH_ASYNC);2295next_buffer(dec);2296}22972298/**2299* flush any outstanding command buffers to the hardware2300*/2301static void radeon_dec_flush(struct pipe_video_codec *decoder)2302{2303}23042305/**2306* create and HW decoder2307*/2308struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context,2309const struct pipe_video_codec *templ)2310{2311struct si_context *sctx = (struct si_context *)context;2312struct radeon_winsys *ws = sctx->ws;2313unsigned width = templ->width, height = templ->height;2314unsigned bs_buf_size, stream_type = 0, ring = RING_VCN_DEC;2315struct radeon_decoder *dec;2316int r, i;23172318switch (u_reduce_video_profile(templ->profile)) {2319case PIPE_VIDEO_FORMAT_MPEG12:2320if (templ->entrypoint > PIPE_VIDEO_ENTRYPOINT_BITSTREAM)2321return vl_create_mpeg12_decoder(context, templ);2322stream_type = RDECODE_CODEC_MPEG2_VLD;2323break;2324case PIPE_VIDEO_FORMAT_MPEG4:2325width = align(width, VL_MACROBLOCK_WIDTH);2326height = align(height, VL_MACROBLOCK_HEIGHT);2327stream_type = RDECODE_CODEC_MPEG4;2328break;2329case PIPE_VIDEO_FORMAT_VC1:2330stream_type = RDECODE_CODEC_VC1;2331break;2332case PIPE_VIDEO_FORMAT_MPEG4_AVC:2333width = align(width, VL_MACROBLOCK_WIDTH);2334height = align(height, VL_MACROBLOCK_HEIGHT);2335stream_type = RDECODE_CODEC_H264_PERF;2336break;2337case PIPE_VIDEO_FORMAT_HEVC:2338stream_type = RDECODE_CODEC_H265;2339break;2340case PIPE_VIDEO_FORMAT_VP9:2341stream_type = RDECODE_CODEC_VP9;2342break;2343case PIPE_VIDEO_FORMAT_AV1:2344stream_type = RDECODE_CODEC_AV1;2345break;2346case PIPE_VIDEO_FORMAT_JPEG:2347stream_type = RDECODE_CODEC_JPEG;2348ring = RING_VCN_JPEG;2349break;2350default:2351assert(0);2352break;2353}23542355dec = CALLOC_STRUCT(radeon_decoder);23562357if (!dec)2358return NULL;23592360dec->base = *templ;2361dec->base.context = context;2362dec->base.width = width;2363dec->base.height = height;23642365dec->base.destroy = radeon_dec_destroy;2366dec->base.begin_frame = radeon_dec_begin_frame;2367dec->base.decode_macroblock = radeon_dec_decode_macroblock;2368dec->base.decode_bitstream = radeon_dec_decode_bitstream;2369dec->base.end_frame = radeon_dec_end_frame;2370dec->base.flush = radeon_dec_flush;23712372dec->stream_type = stream_type;2373dec->stream_handle = si_vid_alloc_stream_handle();2374dec->screen = context->screen;2375dec->ws = ws;23762377if (!ws->cs_create(&dec->cs, sctx->ctx, ring, NULL, NULL, false)) {2378RVID_ERR("Can't get command submission context.\n");2379goto error;2380}23812382for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++)2383dec->render_pic_list[i] = NULL;2384bs_buf_size = width * height * (512 / (16 * 16));2385for (i = 0; i < NUM_BUFFERS; ++i) {2386unsigned msg_fb_it_probs_size = FB_BUFFER_OFFSET + FB_BUFFER_SIZE;2387if (have_it(dec))2388msg_fb_it_probs_size += IT_SCALING_TABLE_SIZE;2389else if (have_probs(dec))2390msg_fb_it_probs_size += (dec->stream_type == RDECODE_CODEC_VP9) ?2391VP9_PROBS_TABLE_SIZE :2392sizeof(rvcn_dec_av1_segment_fg_t);2393/* use vram to improve performance, workaround an unknown bug */2394if (!si_vid_create_buffer(dec->screen, &dec->msg_fb_it_probs_buffers[i], msg_fb_it_probs_size,2395PIPE_USAGE_DEFAULT)) {2396RVID_ERR("Can't allocated message buffers.\n");2397goto error;2398}23992400if (!si_vid_create_buffer(dec->screen, &dec->bs_buffers[i], bs_buf_size,2401PIPE_USAGE_STAGING)) {2402RVID_ERR("Can't allocated bitstream buffers.\n");2403goto error;2404}24052406si_vid_clear_buffer(context, &dec->msg_fb_it_probs_buffers[i]);2407si_vid_clear_buffer(context, &dec->bs_buffers[i]);24082409if (have_probs(dec) && dec->stream_type == RDECODE_CODEC_VP9) {2410struct rvid_buffer *buf;2411void *ptr;24122413buf = &dec->msg_fb_it_probs_buffers[i];2414ptr = dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs,2415PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);2416ptr += FB_BUFFER_OFFSET + FB_BUFFER_SIZE;2417fill_probs_table(ptr);2418dec->ws->buffer_unmap(dec->ws, buf->res->buf);2419dec->bs_ptr = NULL;2420}2421}24222423if (sctx->family >= CHIP_SIENNA_CICHLID &&2424(stream_type == RDECODE_CODEC_VP9 || stream_type == RDECODE_CODEC_AV1))2425dec->dpb_type = DPB_DYNAMIC_TIER_2;2426else if (sctx->family <= CHIP_NAVI14 && stream_type == RDECODE_CODEC_VP9)2427dec->dpb_type = DPB_DYNAMIC_TIER_1;2428else2429dec->dpb_type = DPB_MAX_RES;24302431dec->db_alignment = (((struct si_screen *)dec->screen)->info.family >= CHIP_RENOIR &&2432dec->base.width > 32 && (dec->stream_type == RDECODE_CODEC_VP9 ||2433dec->stream_type == RDECODE_CODEC_AV1 ||2434dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10)) ? 64 : 32;24352436dec->dpb_size = calc_dpb_size(dec);24372438if (!si_vid_create_buffer(dec->screen, &dec->sessionctx, RDECODE_SESSION_CONTEXT_SIZE,2439PIPE_USAGE_DEFAULT)) {2440RVID_ERR("Can't allocated session ctx.\n");2441goto error;2442}2443si_vid_clear_buffer(context, &dec->sessionctx);24442445switch (sctx->family) {2446case CHIP_RAVEN:2447case CHIP_RAVEN2:2448dec->reg.data0 = RDECODE_VCN1_GPCOM_VCPU_DATA0;2449dec->reg.data1 = RDECODE_VCN1_GPCOM_VCPU_DATA1;2450dec->reg.cmd = RDECODE_VCN1_GPCOM_VCPU_CMD;2451dec->reg.cntl = RDECODE_VCN1_ENGINE_CNTL;2452dec->jpg.direct_reg = false;2453break;2454case CHIP_NAVI10:2455case CHIP_NAVI12:2456case CHIP_NAVI14:2457case CHIP_RENOIR:2458dec->reg.data0 = RDECODE_VCN2_GPCOM_VCPU_DATA0;2459dec->reg.data1 = RDECODE_VCN2_GPCOM_VCPU_DATA1;2460dec->reg.cmd = RDECODE_VCN2_GPCOM_VCPU_CMD;2461dec->reg.cntl = RDECODE_VCN2_ENGINE_CNTL;2462dec->jpg.direct_reg = true;2463break;2464case CHIP_ARCTURUS:2465case CHIP_ALDEBARAN:2466case CHIP_SIENNA_CICHLID:2467case CHIP_NAVY_FLOUNDER:2468case CHIP_DIMGREY_CAVEFISH:2469case CHIP_BEIGE_GOBY:2470case CHIP_VANGOGH:2471case CHIP_YELLOW_CARP:2472dec->reg.data0 = RDECODE_VCN2_5_GPCOM_VCPU_DATA0;2473dec->reg.data1 = RDECODE_VCN2_5_GPCOM_VCPU_DATA1;2474dec->reg.cmd = RDECODE_VCN2_5_GPCOM_VCPU_CMD;2475dec->reg.cntl = RDECODE_VCN2_5_ENGINE_CNTL;2476dec->jpg.direct_reg = true;2477break;2478default:2479RVID_ERR("VCN is not supported.\n");2480goto error;2481}24822483map_msg_fb_it_probs_buf(dec);2484rvcn_dec_message_create(dec);2485send_msg_buf(dec);2486r = flush(dec, 0);2487if (r)2488goto error;24892490next_buffer(dec);24912492if (stream_type == RDECODE_CODEC_JPEG)2493dec->send_cmd = send_cmd_jpeg;2494else2495dec->send_cmd = send_cmd_dec;249624972498if (dec->dpb_type == DPB_DYNAMIC_TIER_2) {2499list_inithead(&dec->dpb_ref_list);2500list_inithead(&dec->dpb_unref_list);2501}25022503dec->tmz_ctx = sctx->family < CHIP_RENOIR;25042505return &dec->base;25062507error:2508dec->ws->cs_destroy(&dec->cs);25092510for (i = 0; i < NUM_BUFFERS; ++i) {2511si_vid_destroy_buffer(&dec->msg_fb_it_probs_buffers[i]);2512si_vid_destroy_buffer(&dec->bs_buffers[i]);2513}25142515if (dec->dpb_type != DPB_DYNAMIC_TIER_2)2516si_vid_destroy_buffer(&dec->dpb);2517si_vid_destroy_buffer(&dec->ctx);2518si_vid_destroy_buffer(&dec->sessionctx);25192520FREE(dec);25212522return NULL;2523}252425252526