xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_mfx_g12_X.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2017-2022, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     mhw_vdbox_mfx_g12_X.h
24 //! \brief    Defines functions for constructing Vdbox MFX commands on Gen12-based platforms
25 //!
26 
27 #ifndef __MHW_VDBOX_MFX_G12_X_H__
28 #define __MHW_VDBOX_MFX_G12_X_H__
29 
30 #include "mhw_vdbox_mfx_generic.h"
31 #include "mhw_vdbox_mfx_hwcmd_g12_X.h"
32 #include "mhw_mi_hwcmd_g12_X.h"
33 
34 
35 //!  MHW Vdbox Mfx interface for Gen12
36 /*!
37 This class defines the Mfx command construction functions for Gen12 platform
38 Right now, we still use mhw_vdbox_mfx_g11_X as template, will switch to mfx_g12 once the command is done
39 */
40 class MhwVdboxMfxInterfaceG12 : public MhwVdboxMfxInterfaceGeneric<mhw_vdbox_mfx_g12_X, mhw_mi_g12_X>
41 {
42 protected:
43     static const uint32_t m_avcInterMbMaxSize = 4095; //! AVC inter macroblock max size
44     static const uint32_t m_avcIntraMbMaxSize = 2700; //! AVC intra macroblock max size
45 
46     bool m_scalabilitySupported = false; //!< Indicate if scalability supported
47 
48     #define PATCH_LIST_COMMAND(x)  (x##_NUMBER_OF_ADDRESSES)
49 
50     enum CommandsNumberOfAddresses
51     {
52         // MFX Engine Commands
53         MI_BATCH_BUFFER_START_CMD_NUMBER_OF_ADDRESSES           =  1, //  2 DW for  1 address field
54         MI_STORE_DATA_IMM_CMD_NUMBER_OF_ADDRESSES               =  1, //  2 DW for  1 address field
55         MI_FLUSH_DW_CMD_NUMBER_OF_ADDRESSES                     =  1, //  2 DW for  1 address field
56         MI_CONDITIONAL_BATCH_BUFFER_END_CMD_NUMBER_OF_ADDRESSES =  1, //  2 DW for  1 address field
57         MI_STORE_REGISTER_MEM_CMD_NUMBER_OF_ADDRESSES           =  1, //  2 DW for  1 address field
58         MFX_PIPE_MODE_SELECT_CMD_NUMBER_OF_ADDRESSES            =  0, //  0 DW for    address fields
59         MFX_SURFACE_STATE_CMD_NUMBER_OF_ADDRESSES               =  0, //  0 DW for    address fields
60         MFX_PIPE_BUF_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES         = 27, // 50 DW for 25 address fields, added 2 for DownScaledReconPicAddr
61         MFX_IND_OBJ_BASE_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES     =  5, // 10 DW for  5 address fields
62         MFX_WAIT_CMD_NUMBER_OF_ADDRESSES                        =  0, //  0 DW for    address fields
63         MFX_BSP_BUF_BASE_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES     =  3, //  2 DW for  3 address fields
64         MFD_AVC_PICID_STATE_CMD_NUMBER_OF_ADDRESSES             =  0, //  0 DW for    address fields
65         MFX_AVC_DIRECTMODE_STATE_CMD_NUMBER_OF_ADDRESSES        = 17, // 50 DW for 17 address fields
66         MFX_AVC_IMG_STATE_CMD_NUMBER_OF_ADDRESSES               =  0, //  0 DW for    address fields
67         MFX_QM_STATE_CMD_NUMBER_OF_ADDRESSES                    =  0, //  0 DW for    address fields
68         MFX_FQM_STATE_CMD_NUMBER_OF_ADDRESSES                   =  0, //  0 DW for    address fields
69         MFD_VC1_LONG_PIC_STATE_CMD_NUMBER_OF_ADDRESSES          =  0, //  0 DW for    address fields
70         MFX_VC1_PRED_PIPE_STATE_CMD_NUMBER_OF_ADDRESSES         =  0, //  0 DW for    address fields
71         MFX_VC1_DIRECTMODE_STATE_CMD_NUMBER_OF_ADDRESSES        =  2, //  2 DW for  2 address fields
72         MFX_MPEG2_PIC_STATE_CMD_NUMBER_OF_ADDRESSES             =  0, //  0 DW for    address fields
73         MFX_DBK_OBJECT_CMD_NUMBER_OF_ADDRESSES                  =  4, //  2 DW for  4 address fields
74         MFX_VP8_PIC_STATE_CMD_NUMBER_OF_ADDRESSES               =  2, //  2 DW for  2 address fields
75         MFX_AVC_SLICE_STATE_CMD_NUMBER_OF_ADDRESSES             =  0, //  0 DW for    address fields
76         MFD_AVC_BSD_OBJECT_CMD_NUMBER_OF_ADDRESSES              =  0, //  0 DW for    address fields
77         MFD_AVC_DPB_STATE_CMD_NUMBER_OF_ADDRESSES               =  0, //  0 DW for    address fields
78         MFD_AVC_SLICEADDR_CMD_NUMBER_OF_ADDRESSES               =  0, //  0 DW for    address fields
79         MFX_AVC_REF_IDX_STATE_CMD_NUMBER_OF_ADDRESSES           =  0, //  0 DW for    address fields
80         MFX_AVC_WEIGHTOFFSET_STATE_CMD_NUMBER_OF_ADDRESSES      =  0, //  0 DW for    address fields
81         MFC_AVC_PAK_INSERT_OBJECT_CMD_NUMBER_OF_ADDRESSES       =  0, //  0 DW for    address fields
82         MFD_VC1_BSD_OBJECT_CMD_NUMBER_OF_ADDRESSES              =  0, //  0 DW for    address fields
83         MFD_VC1_IT_OBJECT_CMD_NUMBER_OF_ADDRESSES               =  0, //  0 DW for    address fields
84         MFD_MPEG2_BSD_OBJECT_CMD_NUMBER_OF_ADDRESSES            =  0, //  0 DW for    address fields
85         MFD_MPEG2_IT_OBJECT_CMD_NUMBER_OF_ADDRESSES             =  0, //  0 DW for    address fields
86         MFD_VP8_BSD_OBJECT_CMD_NUMBER_OF_ADDRESSES              =  0, //  0 DW for    address fields
87     };
88 
89 public:
90     //!
91     //! \brief  Constructor
92     //!
MhwVdboxMfxInterfaceG12(PMOS_INTERFACE osInterface,MhwMiInterface * miInterface,MhwCpInterface * cpInterface,bool decodeInUse)93     MhwVdboxMfxInterfaceG12(
94         PMOS_INTERFACE osInterface,
95         MhwMiInterface *miInterface,
96         MhwCpInterface *cpInterface,
97         bool decodeInUse)
98         : MhwVdboxMfxInterfaceGeneric(osInterface, miInterface, cpInterface, decodeInUse)
99     {
100         MHW_FUNCTION_ENTER;
101 
102         m_osInterface = osInterface;
103         if (m_numVdbox > 1
104             && m_osInterface != nullptr
105             && m_osInterface->bHcpDecScalabilityMode)
106         {
107             m_scalabilitySupported = true;
108         }
109 
110         m_rhoDomainStatsEnabled = true;
111 
112         InitRowstoreUserFeatureSettings();
113         InitMmioRegisters();
114     }
115 
116     //!
117     //! \brief    Destructor
118     //!
119     virtual ~MhwVdboxMfxInterfaceG12();
120 
121 public:
122     //!
123     //! \brief    Judge if scalability is supported
124     //!
125     //! \return   bool
126     //!           true if supported, else false
127     //!
IsScalabilitySupported()128     inline bool IsScalabilitySupported()
129     {
130         return m_scalabilitySupported;
131     }
132 
133     //!
134     //! \brief    Disable scalability support
135     //!
136     //! \return   void
137     //!
DisableScalabilitySupport()138     inline void DisableScalabilitySupport()
139     {
140         m_scalabilitySupported = false;
141     }
142 
143 protected:
144 
145     void InitMmioRegisters();
146 
147     void InitRowstoreUserFeatureSettings();
148 
149     MOS_STATUS GetRowstoreCachingAddrs(
150         PMHW_VDBOX_ROWSTORE_PARAMS rowstoreParams);
151 
152 #if (_DEBUG || _RELEASE_INTERNAL)
153     virtual MOS_STATUS CheckScalabilityOverrideValidity();
154 #endif
155 
156     MOS_STATUS FindGpuNodeToUse(
157         PMHW_VDBOX_GPUNODE_LIMIT gpuNodeLimit);
158 
159     MOS_STATUS GetMfxStateCommandsDataSize(
160         uint32_t mode,
161         uint32_t *commandsSize,
162         uint32_t *patchListSize,
163         bool isShortFormat);
164 
165     MOS_STATUS GetMfxPrimitiveCommandsDataSize(
166         uint32_t mode,
167         uint32_t *commandsSize,
168         uint32_t *patchListSize,
169         bool  isModeSpecific);
170 
171     MOS_STATUS AddMfxPipeModeSelectCmd(
172         PMOS_COMMAND_BUFFER cmdBuffer,
173         PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS params);
174 
175     MOS_STATUS AddMfxSurfaceCmd(
176         PMOS_COMMAND_BUFFER cmdBuffer,
177         PMHW_VDBOX_SURFACE_PARAMS params);
178 
179     MOS_STATUS AddMfxPipeBufAddrCmd(
180         PMOS_COMMAND_BUFFER cmdBuffer,
181         PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS params);
182 
183     MOS_STATUS AddMfxIndObjBaseAddrCmd(
184         PMOS_COMMAND_BUFFER cmdBuffer,
185         PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS params);
186 
187     MOS_STATUS AddMfxBspBufBaseAddrCmd(
188         PMOS_COMMAND_BUFFER cmdBuffer,
189         PMHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS params);
190 
191     MOS_STATUS AddMfxDecodeAvcImgCmd(
192         PMOS_COMMAND_BUFFER cmdBuffer,
193         PMHW_BATCH_BUFFER batchBuffer,
194         PMHW_VDBOX_AVC_IMG_PARAMS params);
195 
196     MOS_STATUS AddMfxEncodeAvcImgCmd(
197         PMOS_COMMAND_BUFFER cmdBuffer,
198         PMHW_BATCH_BUFFER batchBuffer,
199         PMHW_VDBOX_AVC_IMG_PARAMS params);
200 
201     MOS_STATUS AddMfxAvcDirectmodeCmd(
202         PMOS_COMMAND_BUFFER cmdBuffer,
203         PMHW_VDBOX_AVC_DIRECTMODE_PARAMS params);
204 
205     MOS_STATUS AddMfdAvcSliceAddrCmd(
206         PMOS_COMMAND_BUFFER cmdBuffer,
207         PMHW_VDBOX_AVC_SLICE_STATE avcSliceState);
208 
209     MOS_STATUS AddMfdAvcBsdObjectCmd(
210         PMOS_COMMAND_BUFFER cmdBuffer,
211         PMHW_VDBOX_AVC_SLICE_STATE avcSliceState);
212 
213     MOS_STATUS AddMfxPakInsertObject(
214         PMOS_COMMAND_BUFFER cmdBuffer,
215         PMHW_BATCH_BUFFER batchBuffer,
216         PMHW_VDBOX_PAK_INSERT_PARAMS params);
217 
218     MOS_STATUS AddMfxJpegPicCmd(
219         PMOS_COMMAND_BUFFER cmdBuffer,
220         PMHW_VDBOX_JPEG_PIC_STATE params);
221 
222     MOS_STATUS AddMfxJpegEncodePicStateCmd(
223         PMOS_COMMAND_BUFFER cmdBuffer,
224         MhwVdboxJpegEncodePicState *params);
225 
226     MOS_STATUS AddMfxJpegFqmCmd(
227         PMOS_COMMAND_BUFFER cmdBuffer,
228         PMHW_VDBOX_QM_PARAMS params,
229         uint32_t numQuantTables);
230 
231     MOS_STATUS AddMfcJpegHuffTableStateCmd(
232         PMOS_COMMAND_BUFFER cmdBuffer,
233         PMHW_VDBOX_ENCODE_HUFF_TABLE_PARAMS params);
234 
235     MOS_STATUS AddMfcJpegScanObjCmd(
236         PMOS_COMMAND_BUFFER cmdBuffer,
237         MhwVdboxJpegScanParams *params);
238 
239     MOS_STATUS AddMfxDecodeVp8PicCmd(
240         PMOS_COMMAND_BUFFER cmdBuffer,
241         PMHW_VDBOX_VP8_PIC_STATE params);
242 
243     MOS_STATUS AddMfxEncodeVp8PicCmd(
244         PMOS_COMMAND_BUFFER cmdBuffer,
245         PMHW_VDBOX_VP8_PIC_STATE params);
246 
247     MOS_STATUS InitMfxVp8EncoderCfgCmd(
248         PMOS_RESOURCE cfgCmdBuffer,
249         PMHW_VDBOX_VP8_ENCODER_CFG_PARAMS params);
250 
251     MOS_STATUS AddMfxVp8BspBufBaseAddrCmd(
252         PMOS_COMMAND_BUFFER cmdBuffer,
253         PMHW_VDBOX_VP8_BSP_BUF_BASE_ADDR_PARAMS params);
254 
GetScaledReferenceSurfaceCachePolicy()255     virtual uint32_t GetScaledReferenceSurfaceCachePolicy()
256     {
257         return m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value >> 1;
258     }
259 };
260 
261 #endif
262