Path: blob/21.2-virgl/src/gallium/drivers/radeon/radeon_uvd.h
4570 views
/**************************************************************************1*2* Copyright 2011 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#ifndef RADEON_UVD_H28#define RADEON_UVD_H2930#include "radeon/radeon_winsys.h"31#include "vl/vl_video_buffer.h"3233/* UVD uses PM4 packet type 0 and 2 */34#define RUVD_PKT_TYPE_S(x) (((unsigned)(x)&0x3) << 30)35#define RUVD_PKT_TYPE_G(x) (((x) >> 30) & 0x3)36#define RUVD_PKT_TYPE_C 0x3FFFFFFF37#define RUVD_PKT_COUNT_S(x) (((unsigned)(x)&0x3FFF) << 16)38#define RUVD_PKT_COUNT_G(x) (((x) >> 16) & 0x3FFF)39#define RUVD_PKT_COUNT_C 0xC000FFFF40#define RUVD_PKT0_BASE_INDEX_S(x) (((unsigned)(x)&0xFFFF) << 0)41#define RUVD_PKT0_BASE_INDEX_G(x) (((x) >> 0) & 0xFFFF)42#define RUVD_PKT0_BASE_INDEX_C 0xFFFF000043#define RUVD_PKT0(index, count) \44(RUVD_PKT_TYPE_S(0) | RUVD_PKT0_BASE_INDEX_S(index) | RUVD_PKT_COUNT_S(count))45#define RUVD_PKT2() (RUVD_PKT_TYPE_S(2))4647/* registers involved with UVD */48#define RUVD_GPCOM_VCPU_CMD 0xEF0C49#define RUVD_GPCOM_VCPU_DATA0 0xEF1050#define RUVD_GPCOM_VCPU_DATA1 0xEF1451#define RUVD_ENGINE_CNTL 0xEF185253#define RUVD_GPCOM_VCPU_CMD_SOC15 0x2070c54#define RUVD_GPCOM_VCPU_DATA0_SOC15 0x2071055#define RUVD_GPCOM_VCPU_DATA1_SOC15 0x2071456#define RUVD_ENGINE_CNTL_SOC15 0x207185758/* UVD commands to VCPU */59#define RUVD_CMD_MSG_BUFFER 0x0000000060#define RUVD_CMD_DPB_BUFFER 0x0000000161#define RUVD_CMD_DECODING_TARGET_BUFFER 0x0000000262#define RUVD_CMD_FEEDBACK_BUFFER 0x0000000363#define RUVD_CMD_SESSION_CONTEXT_BUFFER 0x0000000564#define RUVD_CMD_BITSTREAM_BUFFER 0x0000010065#define RUVD_CMD_ITSCALING_TABLE_BUFFER 0x0000020466#define RUVD_CMD_CONTEXT_BUFFER 0x000002066768/* UVD message types */69#define RUVD_MSG_CREATE 070#define RUVD_MSG_DECODE 171#define RUVD_MSG_DESTROY 27273/* UVD stream types */74#define RUVD_CODEC_H264 0x0000000075#define RUVD_CODEC_VC1 0x0000000176#define RUVD_CODEC_MPEG2 0x0000000377#define RUVD_CODEC_MPEG4 0x0000000478#define RUVD_CODEC_H264_PERF 0x0000000779#define RUVD_CODEC_MJPEG 0x0000000880#define RUVD_CODEC_H265 0x000000108182/* UVD decode target buffer tiling mode */83#define RUVD_TILE_LINEAR 0x0000000084#define RUVD_TILE_8X4 0x0000000185#define RUVD_TILE_8X8 0x0000000286#define RUVD_TILE_32AS8 0x000000038788/* UVD decode target buffer array mode */89#define RUVD_ARRAY_MODE_LINEAR 0x0000000090#define RUVD_ARRAY_MODE_MACRO_LINEAR_MICRO_TILED 0x0000000191#define RUVD_ARRAY_MODE_1D_THIN 0x0000000292#define RUVD_ARRAY_MODE_2D_THIN 0x0000000493#define RUVD_ARRAY_MODE_MACRO_TILED_MICRO_LINEAR 0x0000000494#define RUVD_ARRAY_MODE_MACRO_TILED_MICRO_TILED 0x000000059596/* UVD tile config */97#define RUVD_BANK_WIDTH(x) ((x) << 0)98#define RUVD_BANK_HEIGHT(x) ((x) << 3)99#define RUVD_MACRO_TILE_ASPECT_RATIO(x) ((x) << 6)100#define RUVD_NUM_BANKS(x) ((x) << 9)101102/* H.264 profile definitions */103#define RUVD_H264_PROFILE_BASELINE 0x00000000104#define RUVD_H264_PROFILE_MAIN 0x00000001105#define RUVD_H264_PROFILE_HIGH 0x00000002106#define RUVD_H264_PROFILE_STEREO_HIGH 0x00000003107#define RUVD_H264_PROFILE_MVC 0x00000004108109/* VC-1 profile definitions */110#define RUVD_VC1_PROFILE_SIMPLE 0x00000000111#define RUVD_VC1_PROFILE_MAIN 0x00000001112#define RUVD_VC1_PROFILE_ADVANCED 0x00000002113114enum ruvd_surface_type115{116RUVD_SURFACE_TYPE_LEGACY = 0,117RUVD_SURFACE_TYPE_GFX9118};119120struct ruvd_mvc_element {121uint16_t viewOrderIndex;122uint16_t viewId;123uint16_t numOfAnchorRefsInL0;124uint16_t viewIdOfAnchorRefsInL0[15];125uint16_t numOfAnchorRefsInL1;126uint16_t viewIdOfAnchorRefsInL1[15];127uint16_t numOfNonAnchorRefsInL0;128uint16_t viewIdOfNonAnchorRefsInL0[15];129uint16_t numOfNonAnchorRefsInL1;130uint16_t viewIdOfNonAnchorRefsInL1[15];131};132133struct ruvd_h264 {134uint32_t profile;135uint32_t level;136137uint32_t sps_info_flags;138uint32_t pps_info_flags;139uint8_t chroma_format;140uint8_t bit_depth_luma_minus8;141uint8_t bit_depth_chroma_minus8;142uint8_t log2_max_frame_num_minus4;143144uint8_t pic_order_cnt_type;145uint8_t log2_max_pic_order_cnt_lsb_minus4;146uint8_t num_ref_frames;147uint8_t reserved_8bit;148149int8_t pic_init_qp_minus26;150int8_t pic_init_qs_minus26;151int8_t chroma_qp_index_offset;152int8_t second_chroma_qp_index_offset;153154uint8_t num_slice_groups_minus1;155uint8_t slice_group_map_type;156uint8_t num_ref_idx_l0_active_minus1;157uint8_t num_ref_idx_l1_active_minus1;158159uint16_t slice_group_change_rate_minus1;160uint16_t reserved_16bit_1;161162uint8_t scaling_list_4x4[6][16];163uint8_t scaling_list_8x8[2][64];164165uint32_t frame_num;166uint32_t frame_num_list[16];167int32_t curr_field_order_cnt_list[2];168int32_t field_order_cnt_list[16][2];169170uint32_t decoded_pic_idx;171172uint32_t curr_pic_ref_frame_num;173174uint8_t ref_frame_list[16];175176uint32_t reserved[122];177178struct {179uint32_t numViews;180uint32_t viewId0;181struct ruvd_mvc_element mvcElements[1];182} mvc;183};184185struct ruvd_h265 {186uint32_t sps_info_flags;187uint32_t pps_info_flags;188189uint8_t chroma_format;190uint8_t bit_depth_luma_minus8;191uint8_t bit_depth_chroma_minus8;192uint8_t log2_max_pic_order_cnt_lsb_minus4;193194uint8_t sps_max_dec_pic_buffering_minus1;195uint8_t log2_min_luma_coding_block_size_minus3;196uint8_t log2_diff_max_min_luma_coding_block_size;197uint8_t log2_min_transform_block_size_minus2;198199uint8_t log2_diff_max_min_transform_block_size;200uint8_t max_transform_hierarchy_depth_inter;201uint8_t max_transform_hierarchy_depth_intra;202uint8_t pcm_sample_bit_depth_luma_minus1;203204uint8_t pcm_sample_bit_depth_chroma_minus1;205uint8_t log2_min_pcm_luma_coding_block_size_minus3;206uint8_t log2_diff_max_min_pcm_luma_coding_block_size;207uint8_t num_extra_slice_header_bits;208209uint8_t num_short_term_ref_pic_sets;210uint8_t num_long_term_ref_pic_sps;211uint8_t num_ref_idx_l0_default_active_minus1;212uint8_t num_ref_idx_l1_default_active_minus1;213214int8_t pps_cb_qp_offset;215int8_t pps_cr_qp_offset;216int8_t pps_beta_offset_div2;217int8_t pps_tc_offset_div2;218219uint8_t diff_cu_qp_delta_depth;220uint8_t num_tile_columns_minus1;221uint8_t num_tile_rows_minus1;222uint8_t log2_parallel_merge_level_minus2;223224uint16_t column_width_minus1[19];225uint16_t row_height_minus1[21];226227int8_t init_qp_minus26;228uint8_t num_delta_pocs_ref_rps_idx;229uint8_t curr_idx;230uint8_t reserved1;231int32_t curr_poc;232uint8_t ref_pic_list[16];233int32_t poc_list[16];234uint8_t ref_pic_set_st_curr_before[8];235uint8_t ref_pic_set_st_curr_after[8];236uint8_t ref_pic_set_lt_curr[8];237238uint8_t ucScalingListDCCoefSizeID2[6];239uint8_t ucScalingListDCCoefSizeID3[2];240241uint8_t highestTid;242uint8_t isNonRef;243244uint8_t p010_mode;245uint8_t msb_mode;246uint8_t luma_10to8;247uint8_t chroma_10to8;248uint8_t sclr_luma10to8;249uint8_t sclr_chroma10to8;250251uint8_t direct_reflist[2][15];252};253254struct ruvd_vc1 {255uint32_t profile;256uint32_t level;257uint32_t sps_info_flags;258uint32_t pps_info_flags;259uint32_t pic_structure;260uint32_t chroma_format;261};262263struct ruvd_mpeg2 {264uint32_t decoded_pic_idx;265uint32_t ref_pic_idx[2];266267uint8_t load_intra_quantiser_matrix;268uint8_t load_nonintra_quantiser_matrix;269uint8_t reserved_quantiser_alignement[2];270uint8_t intra_quantiser_matrix[64];271uint8_t nonintra_quantiser_matrix[64];272273uint8_t profile_and_level_indication;274uint8_t chroma_format;275276uint8_t picture_coding_type;277278uint8_t reserved_1;279280uint8_t f_code[2][2];281uint8_t intra_dc_precision;282uint8_t pic_structure;283uint8_t top_field_first;284uint8_t frame_pred_frame_dct;285uint8_t concealment_motion_vectors;286uint8_t q_scale_type;287uint8_t intra_vlc_format;288uint8_t alternate_scan;289};290291struct ruvd_mpeg4 {292uint32_t decoded_pic_idx;293uint32_t ref_pic_idx[2];294295uint32_t variant_type;296uint8_t profile_and_level_indication;297298uint8_t video_object_layer_verid;299uint8_t video_object_layer_shape;300301uint8_t reserved_1;302303uint16_t video_object_layer_width;304uint16_t video_object_layer_height;305306uint16_t vop_time_increment_resolution;307308uint16_t reserved_2;309310uint32_t flags;311312uint8_t quant_type;313314uint8_t reserved_3[3];315316uint8_t intra_quant_mat[64];317uint8_t nonintra_quant_mat[64];318319struct {320uint8_t sprite_enable;321322uint8_t reserved_4[3];323324uint16_t sprite_width;325uint16_t sprite_height;326int16_t sprite_left_coordinate;327int16_t sprite_top_coordinate;328329uint8_t no_of_sprite_warping_points;330uint8_t sprite_warping_accuracy;331uint8_t sprite_brightness_change;332uint8_t low_latency_sprite_enable;333} sprite_config;334335struct {336uint32_t flags;337uint8_t vol_mode;338uint8_t reserved_5[3];339} divx_311_config;340};341342/* message between driver and hardware */343struct ruvd_msg {344345uint32_t size;346uint32_t msg_type;347uint32_t stream_handle;348uint32_t status_report_feedback_number;349350union {351struct {352uint32_t stream_type;353uint32_t session_flags;354uint32_t asic_id;355uint32_t width_in_samples;356uint32_t height_in_samples;357uint32_t dpb_buffer;358uint32_t dpb_size;359uint32_t dpb_model;360uint32_t version_info;361} create;362363struct {364uint32_t stream_type;365uint32_t decode_flags;366uint32_t width_in_samples;367uint32_t height_in_samples;368369uint32_t dpb_buffer;370uint32_t dpb_size;371uint32_t dpb_model;372uint32_t dpb_reserved;373374uint32_t db_offset_alignment;375uint32_t db_pitch;376uint32_t db_tiling_mode;377uint32_t db_array_mode;378uint32_t db_field_mode;379uint32_t db_surf_tile_config;380uint32_t db_aligned_height;381uint32_t db_reserved;382383uint32_t use_addr_macro;384385uint32_t bsd_buffer;386uint32_t bsd_size;387388uint32_t pic_param_buffer;389uint32_t pic_param_size;390uint32_t mb_cntl_buffer;391uint32_t mb_cntl_size;392393uint32_t dt_buffer;394uint32_t dt_pitch;395uint32_t dt_tiling_mode;396uint32_t dt_array_mode;397uint32_t dt_field_mode;398uint32_t dt_luma_top_offset;399uint32_t dt_luma_bottom_offset;400uint32_t dt_chroma_top_offset;401uint32_t dt_chroma_bottom_offset;402uint32_t dt_surf_tile_config;403uint32_t dt_uv_surf_tile_config;404// re-use dt_wa_chroma_top_offset as dt_ext_info for UV pitch in stoney405uint32_t dt_wa_chroma_top_offset;406uint32_t dt_wa_chroma_bottom_offset;407408uint32_t reserved[16];409410union {411struct ruvd_h264 h264;412struct ruvd_h265 h265;413struct ruvd_vc1 vc1;414struct ruvd_mpeg2 mpeg2;415struct ruvd_mpeg4 mpeg4;416417uint32_t info[768];418} codec;419420uint8_t extension_support;421uint8_t reserved_8bit_1;422uint8_t reserved_8bit_2;423uint8_t reserved_8bit_3;424uint32_t extension_reserved[64];425} decode;426} body;427};428429/* driver dependent callback */430typedef struct pb_buffer *(*ruvd_set_dtb)(struct ruvd_msg *msg, struct vl_video_buffer *vb);431432/* create an UVD decode */433struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *context,434const struct pipe_video_codec *templat,435ruvd_set_dtb set_dtb);436437/* fill decoding target field from the luma and chroma surfaces */438void si_uvd_set_dt_surfaces(struct ruvd_msg *msg, struct radeon_surf *luma,439struct radeon_surf *chroma, enum ruvd_surface_type type);440#endif441442443