Path: blob/21.2-virgl/src/gallium/drivers/radeon/radeon_uvd_enc.h
4570 views
/**************************************************************************1*2* Copyright 2018 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_ENC_H28#define _RADEON_UVD_ENC_H2930#include "radeon_video.h"3132#define RENC_UVD_FW_INTERFACE_MAJOR_VERSION 133#define RENC_UVD_FW_INTERFACE_MINOR_VERSION 13435#define RENC_UVD_IB_PARAM_SESSION_INFO 0x0000000136#define RENC_UVD_IB_PARAM_TASK_INFO 0x0000000237#define RENC_UVD_IB_PARAM_SESSION_INIT 0x0000000338#define RENC_UVD_IB_PARAM_LAYER_CONTROL 0x0000000439#define RENC_UVD_IB_PARAM_LAYER_SELECT 0x0000000540#define RENC_UVD_IB_PARAM_SLICE_CONTROL 0x0000000641#define RENC_UVD_IB_PARAM_SPEC_MISC 0x0000000742#define RENC_UVD_IB_PARAM_RATE_CONTROL_SESSION_INIT 0x0000000843#define RENC_UVD_IB_PARAM_RATE_CONTROL_LAYER_INIT 0x0000000944#define RENC_UVD_IB_PARAM_RATE_CONTROL_PER_PICTURE 0x0000000a45#define RENC_UVD_IB_PARAM_SLICE_HEADER 0x0000000b46#define RENC_UVD_IB_PARAM_ENCODE_PARAMS 0x0000000c47#define RENC_UVD_IB_PARAM_QUALITY_PARAMS 0x0000000d48#define RENC_UVD_IB_PARAM_DEBLOCKING_FILTER 0x0000000e49#define RENC_UVD_IB_PARAM_INTRA_REFRESH 0x0000000f50#define RENC_UVD_IB_PARAM_ENCODE_CONTEXT_BUFFER 0x0000001051#define RENC_UVD_IB_PARAM_VIDEO_BITSTREAM_BUFFER 0x0000001152#define RENC_UVD_IB_PARAM_FEEDBACK_BUFFER 0x0000001253#define RENC_UVD_IB_PARAM_INSERT_NALU_BUFFER 0x0000001354#define RENC_UVD_IB_PARAM_FEEDBACK_BUFFER_ADDITIONAL 0x000000145556#define RENC_UVD_IB_OP_INITIALIZE 0x0800000157#define RENC_UVD_IB_OP_CLOSE_SESSION 0x0800000258#define RENC_UVD_IB_OP_ENCODE 0x0800000359#define RENC_UVD_IB_OP_INIT_RC 0x0800000460#define RENC_UVD_IB_OP_INIT_RC_VBV_BUFFER_LEVEL 0x0800000561#define RENC_UVD_IB_OP_SET_SPEED_ENCODING_MODE 0x0800000662#define RENC_UVD_IB_OP_SET_BALANCE_ENCODING_MODE 0x0800000763#define RENC_UVD_IB_OP_SET_QUALITY_ENCODING_MODE 0x080000086465#define RENC_UVD_IF_MAJOR_VERSION_MASK 0xFFFF000066#define RENC_UVD_IF_MAJOR_VERSION_SHIFT 1667#define RENC_UVD_IF_MINOR_VERSION_MASK 0x0000FFFF68#define RENC_UVD_IF_MINOR_VERSION_SHIFT 06970#define RENC_UVD_PREENCODE_MODE_NONE 0x0000000071#define RENC_UVD_PREENCODE_MODE_1X 0x0000000172#define RENC_UVD_PREENCODE_MODE_2X 0x0000000273#define RENC_UVD_PREENCODE_MODE_4X 0x000000047475#define RENC_UVD_SLICE_CONTROL_MODE_FIXED_CTBS 0x0000000076#define RENC_UVD_SLICE_CONTROL_MODE_FIXED_BITS 0x000000017778#define RENC_UVD_RATE_CONTROL_METHOD_NONE 0x0000000079#define RENC_UVD_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR 0x0000000180#define RENC_UVD_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR 0x0000000281#define RENC_UVD_RATE_CONTROL_METHOD_CBR 0x000000038283#define RENC_UVD_NALU_TYPE_AUD 0x0000000184#define RENC_UVD_NALU_TYPE_VPS 0x0000000285#define RENC_UVD_NALU_TYPE_SPS 0x0000000386#define RENC_UVD_NALU_TYPE_PPS 0x0000000487#define RENC_UVD_NALU_TYPE_END_OF_SEQUENCE 0x000000058889#define RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS 1690#define RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS 169192#define RENC_UVD_HEADER_INSTRUCTION_END 093#define RENC_UVD_HEADER_INSTRUCTION_DEPENDENT_SLICE_END 194#define RENC_UVD_HEADER_INSTRUCTION_COPY 295#define RENC_UVD_HEADER_INSTRUCTION_FIRST_SLICE 396#define RENC_UVD_HEADER_INSTRUCTION_SLICE_SEGMENT 497#define RENC_UVD_HEADER_INSTRUCTION_SLICE_QP_DELTA 59899#define RENC_UVD_PICTURE_TYPE_B 0100#define RENC_UVD_PICTURE_TYPE_P 1101#define RENC_UVD_PICTURE_TYPE_I 2102#define RENC_UVD_PICTURE_TYPE_P_SKIP 3103104#define RENC_UVD_SWIZZLE_MODE_LINEAR 0105#define RENC_UVD_SWIZZLE_MODE_256B_D 2106#define RENC_UVD_SWIZZLE_MODE_4kB_D 6107#define RENC_UVD_SWIZZLE_MODE_64kB_D 10108#define RENC_UVD_INTRA_REFRESH_MODE_NONE 0109#define RENC_UVD_INTRA_REFRESH_MODE_CTB_MB_ROWS 1110#define RENC_UVD_INTRA_REFRESH_MODE_CTB_MB_COLUMNS 2111112#define RENC_UVD_MAX_NUM_RECONSTRUCTED_PICTURES 34113#define RENC_UVD_ADDR_MODE_LINEAR 0114#define RENC_UVD_ADDR_MODE_PELE_8X8_1D 1115#define RENC_UVD_ADDR_MODE_32AS8_88 2116117#define RENC_UVD_ARRAY_MODE_LINEAR 0118#define RENC_UVD_ARRAY_MODE_PELE_8X8_1D 2119#define RENC_UVD_ARRAY_MODE_2D_TILED_THIN1 4120121#define RENC_UVD_VIDEO_BITSTREAM_BUFFER_MODE_LINEAR 0122#define RENC_UVD_VIDEO_BITSTREAM_BUFFER_MODE_CIRCULAR 1123124#define RENC_UVD_FEEDBACK_BUFFER_MODE_LINEAR 0125#define RENC_UVD_FEEDBACK_BUFFER_MODE_CIRCULAR 1126127#define RENC_UVD_FEEDBACK_STATUS_OK 0x00000000128#define RENC_UVD_FEEDBACK_STATUS_NOT_ENCODED 0x10000001129130typedef struct radeon_uvd_enc_feedback_s {131uint32_t task_id;132uint32_t first_in_task;133uint32_t last_in_task;134uint32_t status;135uint32_t has_bitstream;136uint32_t bitstream_offset;137uint32_t bitstream_size;138uint32_t enabled_filler_data;139uint32_t filler_data_size;140uint32_t extra_bytes;141} radeon_uvd_enc_feedback_t;142143typedef struct ruvd_enc_session_info_s {144uint32_t reserved;145uint32_t interface_version;146uint32_t sw_context_address_hi;147uint32_t sw_context_address_lo;148} ruvd_enc_session_info_t;149150typedef struct ruvd_enc_task_info_s {151uint32_t total_size_of_all_packages;152uint32_t task_id;153uint32_t allowed_max_num_feedbacks;154} ruvd_enc_task_info_t;155156typedef struct ruvd_enc_session_init_s {157uint32_t aligned_picture_width;158uint32_t aligned_picture_height;159uint32_t padding_width;160uint32_t padding_height;161uint32_t pre_encode_mode;162uint32_t pre_encode_chroma_enabled;163} ruvd_enc_session_init_t;164165typedef struct ruvd_enc_layer_control_s {166uint32_t max_num_temporal_layers;167uint32_t num_temporal_layers;168} ruvd_enc_layer_control_t;169170typedef struct ruvd_enc_layer_select_s {171uint32_t temporal_layer_index;172} ruvd_enc_layer_select_t;173174typedef struct ruvd_enc_hevc_slice_control_s {175uint32_t slice_control_mode;176union {177struct {178uint32_t num_ctbs_per_slice;179uint32_t num_ctbs_per_slice_segment;180} fixed_ctbs_per_slice;181182struct {183uint32_t num_bits_per_slice;184uint32_t num_bits_per_slice_segment;185} fixed_bits_per_slice;186};187} ruvd_enc_hevc_slice_control_t;188189typedef struct ruvd_enc_hevc_spec_misc_s {190uint32_t log2_min_luma_coding_block_size_minus3;191uint32_t amp_disabled;192uint32_t strong_intra_smoothing_enabled;193uint32_t constrained_intra_pred_flag;194uint32_t cabac_init_flag;195uint32_t half_pel_enabled;196uint32_t quarter_pel_enabled;197} ruvd_enc_hevc_spec_misc_t;198199typedef struct ruvd_enc_rate_ctl_session_init_s {200uint32_t rate_control_method;201uint32_t vbv_buffer_level;202} ruvd_enc_rate_ctl_session_init_t;203204typedef struct ruvd_enc_rate_ctl_layer_init_s {205uint32_t target_bit_rate;206uint32_t peak_bit_rate;207uint32_t frame_rate_num;208uint32_t frame_rate_den;209uint32_t vbv_buffer_size;210uint32_t avg_target_bits_per_picture;211uint32_t peak_bits_per_picture_integer;212uint32_t peak_bits_per_picture_fractional;213} ruvd_enc_rate_ctl_layer_init_t;214215typedef struct ruvd_enc_rate_ctl_per_picture_s {216uint32_t qp;217uint32_t min_qp_app;218uint32_t max_qp_app;219uint32_t max_au_size;220uint32_t enabled_filler_data;221uint32_t skip_frame_enable;222uint32_t enforce_hrd;223} ruvd_enc_rate_ctl_per_picture_t;224225typedef struct ruvd_enc_quality_params_s {226uint32_t vbaq_mode;227uint32_t scene_change_sensitivity;228uint32_t scene_change_min_idr_interval;229} ruvd_enc_quality_params_t;230231typedef struct ruvd_enc_direct_output_nalu_s {232uint32_t type;233uint32_t size;234uint32_t data[1];235} ruvd_enc_direct_output_nalu_t;236237typedef struct ruvd_enc_slice_header_s {238uint32_t bitstream_template[RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS];239struct {240uint32_t instruction;241uint32_t num_bits;242} instructions[RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS];243} ruvd_enc_slice_header_t;244245typedef struct ruvd_enc_encode_params_s {246uint32_t pic_type;247uint32_t allowed_max_bitstream_size;248uint32_t input_picture_luma_address_hi;249uint32_t input_picture_luma_address_lo;250uint32_t input_picture_chroma_address_hi;251uint32_t input_picture_chroma_address_lo;252uint32_t input_pic_luma_pitch;253uint32_t input_pic_chroma_pitch;254union {255uint32_t input_pic_addr_mode;256uint32_t reserved;257};258union {259uint32_t input_pic_array_mode;260uint32_t input_pic_swizzle_mode;261};262uint32_t reference_picture_index;263uint32_t reconstructed_picture_index;264} ruvd_enc_encode_params_t;265266typedef struct ruvd_enc_hevc_deblocking_filter_s {267uint32_t loop_filter_across_slices_enabled;268int32_t deblocking_filter_disabled;269int32_t beta_offset_div2;270int32_t tc_offset_div2;271int32_t cb_qp_offset;272int32_t cr_qp_offset;273} ruvd_enc_hevc_deblocking_filter_t;274275typedef struct ruvd_enc_intra_refresh_s {276uint32_t intra_refresh_mode;277uint32_t offset;278uint32_t region_size;279} ruvd_enc_intra_refresh_t;280281typedef struct ruvd_enc_reconstructed_picture_s {282uint32_t luma_offset;283uint32_t chroma_offset;284} ruvd_enc_reconstructed_picture_t;285286typedef struct ruvd_enc_encode_context_buffer_s {287uint32_t encode_context_address_hi;288uint32_t encode_context_address_lo;289union {290uint32_t addr_mode;291uint32_t reserved;292};293union {294uint32_t array_mode;295uint32_t swizzle_mode;296};297uint32_t rec_luma_pitch;298uint32_t rec_chroma_pitch;299uint32_t num_reconstructed_pictures;300ruvd_enc_reconstructed_picture_t reconstructed_pictures[RENC_UVD_MAX_NUM_RECONSTRUCTED_PICTURES];301uint32_t pre_encode_picture_luma_pitch;302uint32_t pre_encode_picture_chroma_pitch;303ruvd_enc_reconstructed_picture_t304pre_encode_reconstructed_pictures[RENC_UVD_MAX_NUM_RECONSTRUCTED_PICTURES];305ruvd_enc_reconstructed_picture_t pre_encode_input_picture;306} ruvd_enc_encode_context_buffer_t;307308typedef struct ruvd_enc_video_bitstream_buffer_s {309uint32_t mode;310uint32_t video_bitstream_buffer_address_hi;311uint32_t video_bitstream_buffer_address_lo;312uint32_t video_bitstream_buffer_size;313uint32_t video_bitstream_data_offset;314} ruvd_enc_video_bitstream_buffer_t;315316typedef struct ruvd_enc_feedback_buffer_s {317uint32_t mode;318uint32_t feedback_buffer_address_hi;319uint32_t feedback_buffer_address_lo;320uint32_t feedback_buffer_size;321uint32_t feedback_data_size;322} ruvd_enc_feedback_buffer_t;323324typedef void (*radeon_uvd_enc_get_buffer)(struct pipe_resource *resource, struct pb_buffer **handle,325struct radeon_surf **surface);326327struct pipe_video_codec *radeon_uvd_create_encoder(struct pipe_context *context,328const struct pipe_video_codec *templat,329struct radeon_winsys *ws,330radeon_uvd_enc_get_buffer get_buffer);331332struct radeon_uvd_enc_pic {333enum pipe_h2645_enc_picture_type picture_type;334335unsigned frame_num;336unsigned pic_order_cnt;337unsigned pic_order_cnt_type;338unsigned crop_left;339unsigned crop_right;340unsigned crop_top;341unsigned crop_bottom;342unsigned general_tier_flag;343unsigned general_profile_idc;344unsigned general_level_idc;345unsigned max_poc;346unsigned log2_max_poc;347unsigned chroma_format_idc;348unsigned pic_width_in_luma_samples;349unsigned pic_height_in_luma_samples;350unsigned log2_diff_max_min_luma_coding_block_size;351unsigned log2_min_transform_block_size_minus2;352unsigned log2_diff_max_min_transform_block_size;353unsigned max_transform_hierarchy_depth_inter;354unsigned max_transform_hierarchy_depth_intra;355unsigned log2_parallel_merge_level_minus2;356unsigned bit_depth_luma_minus8;357unsigned bit_depth_chroma_minus8;358unsigned nal_unit_type;359unsigned max_num_merge_cand;360361bool not_referenced;362bool is_iframe;363bool is_even_frame;364bool sample_adaptive_offset_enabled_flag;365bool pcm_enabled_flag;366bool sps_temporal_mvp_enabled_flag;367368ruvd_enc_task_info_t task_info;369ruvd_enc_session_init_t session_init;370ruvd_enc_layer_control_t layer_ctrl;371ruvd_enc_layer_select_t layer_sel;372ruvd_enc_hevc_slice_control_t hevc_slice_ctrl;373ruvd_enc_hevc_spec_misc_t hevc_spec_misc;374ruvd_enc_rate_ctl_session_init_t rc_session_init;375ruvd_enc_rate_ctl_layer_init_t rc_layer_init;376ruvd_enc_hevc_deblocking_filter_t hevc_deblock;377ruvd_enc_rate_ctl_per_picture_t rc_per_pic;378ruvd_enc_quality_params_t quality_params;379ruvd_enc_encode_context_buffer_t ctx_buf;380ruvd_enc_video_bitstream_buffer_t bit_buf;381ruvd_enc_feedback_buffer_t fb_buf;382ruvd_enc_intra_refresh_t intra_ref;383ruvd_enc_encode_params_t enc_params;384};385386struct radeon_uvd_encoder {387struct pipe_video_codec base;388389void (*begin)(struct radeon_uvd_encoder *enc, struct pipe_picture_desc *pic);390void (*encode)(struct radeon_uvd_encoder *enc);391void (*destroy)(struct radeon_uvd_encoder *enc);392393unsigned stream_handle;394395struct pipe_screen *screen;396struct radeon_winsys *ws;397struct radeon_cmdbuf cs;398399radeon_uvd_enc_get_buffer get_buffer;400401struct pb_buffer *handle;402struct radeon_surf *luma;403struct radeon_surf *chroma;404405struct pb_buffer *bs_handle;406unsigned bs_size;407408unsigned cpb_num;409410struct rvid_buffer *si;411struct rvid_buffer *fb;412struct rvid_buffer cpb;413struct radeon_uvd_enc_pic enc_pic;414415unsigned shifter;416unsigned bits_in_shifter;417unsigned num_zeros;418unsigned byte_index;419unsigned bits_output;420uint32_t total_task_size;421uint32_t *p_task_size;422423bool emulation_prevention;424bool need_feedback;425};426427struct si_screen;428429void radeon_uvd_enc_1_1_init(struct radeon_uvd_encoder *enc);430bool si_radeon_uvd_enc_supported(struct si_screen *sscreen);431432#endif // _RADEON_UVD_ENC_H433434435