xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_avp_g12_X.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2020, 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_avp_g12_X.h
24 //! \brief    Defines functions for constructing Vdbox AVP commands on Gen12-based platforms
25 //!
26 
27 #ifndef __MHW_VDBOX_AVP_G12_X_H__
28 #define __MHW_VDBOX_AVP_G12_X_H__
29 
30 #include "mhw_vdbox_avp_generic.h"
31 #include "mhw_vdbox_avp_hwcmd_g12_X.h"
32 #include "mhw_vdbox_g12_X.h"
33 
34 //!  MHW Vdbox Avp interface for Gen12
35 /*!
36 This class defines the Avp command construction functions for Gen12 platform
37 */
38 class MhwVdboxAvpInterfaceG12 : public MhwVdboxAvpInterfaceGeneric<mhw_vdbox_avp_g12_X>
39 {
40 protected:
41     #define PATCH_LIST_COMMAND(x)  (x##_NUMBER_OF_ADDRESSES)
42     bool m_scalabilitySupported = false; //!< Indicate if scalability supported
43     bool m_disableLstCmd        = false; //!< Indicate if lst cmd is used
44     enum CommandsNumberOfAddresses
45     {
46         MI_BATCH_BUFFER_START_CMD_NUMBER_OF_ADDRESSES              =  1, //  2 DW for  1 address field
47         MI_STORE_DATA_IMM_CMD_NUMBER_OF_ADDRESSES                  =  1, //  2 DW for  1 address field
48         MI_FLUSH_DW_CMD_NUMBER_OF_ADDRESSES                        =  1, //  2 DW for  1 address field
49         MI_CONDITIONAL_BATCH_BUFFER_END_CMD_NUMBER_OF_ADDRESSES    =  1, //  2 DW for  1 address field
50         MI_STORE_REGISTER_MEM_CMD_NUMBER_OF_ADDRESSES              =  1, //  2 DW for  1 address field
51         MI_COPY_MEM_MEM_CMD_NUMBER_OF_ADDRESSES                    =  4, //  4 DW for  2 address fields
52         MI_SEMAPHORE_WAIT_CMD_NUMBER_OF_ADDRESSES                  =  1, //  2 DW for  1 address fields
53         MI_ATOMIC_CMD_NUMBER_OF_ADDRESSES                          =  1, //  2 DW for  1 address field
54 
55         MFX_WAIT_CMD_NUMBER_OF_ADDRESSES                           =  0, //  0 DW for    address fields
56 
57         AVP_PIPE_MODE_SELECT_CMD_NUMBER_OF_ADDRESSES               =  0,  //  0 DW for    address fields
58         AVP_SURFACE_STATE_CMD_NUMBER_OF_ADDRESSES                  =  0,  //  0 DW for    address fields
59         AVP_PIPE_BUF_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES            =  56, //           56 address fields
60         AVP_IND_OBJ_BASE_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES        =  2,  //            2 address fields
61         AVP_PIC_STATE_CMD_NUMBER_OF_ADDRESSES                      =  0,  //  0 DW for    address fields
62         AVP_REF_IDX_STATE_CMD_NUMBER_OF_ADDRESSES                  =  0,  //  0 DW for    address fields
63         AVP_SEGMENT_STATE_CMD_NUMBER_OF_ADDRESSES                  =  0,  //  0 DW for    address fields
64         AVP_TILE_CODING_CMD_NUMBER_OF_ADDRESSES                    =  0,  //  0 DW for    address fields
65         AVP_TILE_CODING_CMD_LST_NUMBER_OF_ADDRESSES                =  0,  //  0 DW for    address fields
66         AVP_BSD_OBJECT_CMD_NUMBER_OF_ADDRESSES                     =  0,  //  0 DW for    address fields
67         AVP_INLOOP_FILTER_STATE_CMD_NUMBER_OF_ADDRESSES            =  0,  //  0 DW for    address fields
68         AVP_INTER_PRED_STATE_CMD_NUMBER_OF_ADDRESSES               =  0,  //  0 DW for    address fields
69         AVP_PAK_INSERT_OBJECT_CMD_NUMBER_OF_ADDRESSES              =  0,   //  0 DW for    address fields
70         VDENC_PIPE_BUF_ADDR_STATE_CMD_NUMBER_OF_ADDRESSES          =  12,  // 12 DW for 12 address fields
71         VD_PIPELINE_FLUSH_CMD_NUMBER_OF_ADDRESSES                  =  0,  //  0 DW for  0 address fields
72     };
73 
74 public:
75     //!
76     //! \brief  Constructor
77     //!
MhwVdboxAvpInterfaceG12(PMOS_INTERFACE osInterface,MhwMiInterface * miInterface,MhwCpInterface * cpInterface,bool decodeInUse)78     MhwVdboxAvpInterfaceG12(
79         PMOS_INTERFACE osInterface,
80         MhwMiInterface *miInterface,
81         MhwCpInterface *cpInterface,
82         bool decodeInUse)
83         : MhwVdboxAvpInterfaceGeneric(osInterface, miInterface, cpInterface, decodeInUse)
84     {
85         MHW_FUNCTION_ENTER;
86 
87         InitRowstoreUserFeatureSettings();
88 
89         MOS_USER_FEATURE_VALUE_DATA userFeatureData;
90 
91         memset(&userFeatureData, 0, sizeof(userFeatureData));
92         userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
93     #if (_DEBUG || _RELEASE_INTERNAL)
94         MOS_UserFeature_ReadValue_ID(
95             nullptr,
96             __MEDIA_USER_FEATURE_VALUE_ENABLE_AVP_SCALABILITY_DECODE_ID,
97             &userFeatureData,
98             this->m_osInterface->pOsContext);
99     #endif // _DEBUG || _RELEASE_INTERNAL
100         m_scalabilitySupported = userFeatureData.i32Data ? true : false;
101 
102         memset(&userFeatureData, 0, sizeof(userFeatureData));
103         userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
104         MOS_UserFeature_ReadValue_ID(
105             nullptr,
106             __MEDIA_USER_FEATURE_VALUE_AV1_DECODE_ON_SIMULATION_ID,
107             &userFeatureData,
108             this->m_osInterface->pOsContext);
109         m_disableLstCmd = userFeatureData.i32Data ? true : false;
110     }
111 
112     //!
113     //! \brief    Destructor
114     //!
115     virtual ~MhwVdboxAvpInterfaceG12();
116 
117     void InitRowstoreUserFeatureSettings();
118 
119         //!
120     //! \brief    Judge if scalability is supported
121     //!
122     //! \return   bool
123     //!           true if supported, else false
124     //!
IsScalabilitySupported()125     inline bool IsScalabilitySupported()
126     {
127         return m_scalabilitySupported;
128     }
129 
130     MOS_STATUS GetRowstoreCachingAddrs(
131         PMHW_VDBOX_ROWSTORE_PARAMS rowstoreParams);
132 
133     //!
134     //! \brief    Calculates maximum size for AVP state level commands
135     //! \details  Client facing function to calculate maximum size for AVP state level commands
136     //! \param    [out] commandsSize
137     //!            The maximum command buffer size
138     //! \param    [out] patchListSize
139     //!           The maximum command patch list size
140     //! \return   MOS_STATUS
141     //!           MOS_STATUS_SUCCESS if success, else fail reason
142     //!
143     MOS_STATUS GetAvpStateCommandSize(
144         uint32_t                        *commandsSize,
145         uint32_t                        *patchListSize,
146         PMHW_VDBOX_STATE_CMDSIZE_PARAMS params);
147 
148     //!
149     //! \brief    Calculates maximum size for AVP primitive level commands
150     //! \details  Client facing function to calculate maximum size for AVP primitive level commands
151     //! \param    [out] commandsSize
152     //!            The maximum command buffer size
153     //! \param    [out] patchListSize
154     //!           The maximum command patch list size
155     //! \return   MOS_STATUS
156     //!           MOS_STATUS_SUCCESS if success, else fail reason
157     //!
158     MOS_STATUS GetAvpPrimitiveCommandSize(
159         uint32_t                        *commandsSize,
160         uint32_t                        *patchListSize);
161 
162     //!
163     //! \brief    Get AV1 Buffer size
164     //!
165     //! \param    [in] bufferType
166     //!           Buffer type to get size
167     //! \param    [in] avpBufSizeParam
168     //!           buffer size params
169     //!
170     //! \return   MOS_STATUS
171     //!           MOS_STATUS_SUCCESS if success, else fail reason
172     //!
173     virtual MOS_STATUS GetAv1BufferSize(
174         MhwVdboxAvpInternalBufferType       bufferType,
175         MhwVdboxAvpBufferSizeParams         *avpBufSizeParam);
176 
177     //!
178     //! \brief    check if AV1 Buffer reallocation is needed
179     //! \details  function to check if AV1 Buffer reallocation is needed
180     //!
181     //! \param    [in] bufferType
182     //!           Buffer type to query
183     //! \param    [in] reallocParam
184     //!           reallocate params
185     //!
186     //! \return   MOS_STATUS
187     //!           MOS_STATUS_SUCCESS if success, else fail reason
188     //!
189     MOS_STATUS IsAv1BufferReallocNeeded(
190         MhwVdboxAvpInternalBufferType       bufferType,
191         MhwVdboxAvpBufferReallocParams      *reallocParam);
192 
193     //!
194     //! \brief    Adds AVP pipe mode select command
195     //! \details  function to add AVP surface state command in command buffer
196     //!
197     //! \param    [in] cmdBuffer
198     //!           Command buffer to which HW command is added
199     //! \param    [in] params
200     //!           Params structure used to populate the HW command
201     //!
202     //! \return   MOS_STATUS
203     //!           MOS_STATUS_SUCCESS if success, else fail reason
204     //!
205     MOS_STATUS AddAvpPipeModeSelectCmd(
206         PMOS_COMMAND_BUFFER                  cmdBuffer,
207         PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS   params);
208 
209     //!
210     //! \brief    Adds AVP surface state command for decoder
211     //! \details  function to add AVP surface state command in command buffer
212     //!
213     //! \param    [in] cmdBuffer
214     //!           Command buffer to which HW command is added
215     //! \param    [in] params
216     //!           Params structure used to populate the HW command
217     //!
218     //! \return   MOS_STATUS
219     //!           MOS_STATUS_SUCCESS if success, else fail reason
220     //!
221     MOS_STATUS AddAvpDecodeSurfaceStateCmd(
222         PMOS_COMMAND_BUFFER              cmdBuffer,
223         PMHW_VDBOX_SURFACE_PARAMS        params);
224 
225     //!
226     //! \brief    Adds AVP Pipe Buf Addr command
227     //! \details  function to add AVP Pipe Buf Addr command in command buffer
228     //!
229     //! \param    [in] cmdBuffer
230     //!           Command buffer to which HW command is added
231     //! \param    [in] params
232     //!           Params structure used to populate the HW command
233     //!
234     //! \return   MOS_STATUS
235     //!           MOS_STATUS_SUCCESS if success, else fail reason
236     //!
237     virtual MOS_STATUS AddAvpPipeBufAddrCmd(
238         PMOS_COMMAND_BUFFER              cmdBuffer,
239         MhwVdboxAvpPipeBufAddrParams     *params);
240 
241     //!
242     //! \brief    Adds AVP Ind Obj Base Address command
243     //! \details  function to add AVP Ind Obj Base Address command in command buffer
244     //!
245     //! \param    [in] cmdBuffer
246     //!           Command buffer to which HW command is added
247     //! \param    [in] params
248     //!           Params structure used to populate the HW command
249     //!
250     //! \return   MOS_STATUS
251     //!           MOS_STATUS_SUCCESS if success, else fail reason
252     //!
253     virtual MOS_STATUS AddAvpIndObjBaseAddrCmd(
254         PMOS_COMMAND_BUFFER                  cmdBuffer,
255         PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS  params);
256 
257     //!
258     //! \brief    Adds AVP Pic State command for decoder
259     //! \details  function to add AVP Segment State command in command buffer
260     //!
261     //! \param    [in] cmdBuffer
262     //!           Command buffer to which HW command is added
263     //! \param    [in] params
264     //!           Params structure used to populate the HW command
265     //!
266     //! \return   MOS_STATUS
267     //!           MOS_STATUS_SUCCESS if success, else fail reason
268     //!
269     MOS_STATUS AddAvpDecodePicStateCmd(
270         PMOS_COMMAND_BUFFER              cmdBuffer,
271         MhwVdboxAvpPicStateParams        *params);
272 
273     //!
274     //! \brief    Adds AVP Segment State command
275     //! \details  function to add AVP Segment State command in command buffer
276     //!
277     //! \param    [in] cmdBuffer
278     //!           Command buffer to which HW command is added
279     //! \param    [in] params
280     //!           Params structure used to populate the HW command
281     //!
282     //! \return   MOS_STATUS
283     //!           MOS_STATUS_SUCCESS if success, else fail reason
284     //!
285     MOS_STATUS AddAvpSegmentStateCmd(
286         PMOS_COMMAND_BUFFER              cmdBuffer,
287         MhwVdboxAvpSegmentStateParams    *params);
288 
289     //!
290     //! \brief    Adds AVP tile coding command in command buffer
291     //! \details  function to add AVP tile coding command in command buffer
292     //!
293     //! \param    [in] cmdBuffer
294     //!           Command buffer to which HW command is added
295     //! \param    [in] batchBuffer
296     //!           Batch buffer to which HW command is added
297     //! \param    [in] params
298     //!           Params structure used to populate the HW command
299     //!
300     //! \return   MOS_STATUS
301     //!           MOS_STATUS_SUCCESS if success, else fail reason
302     //!
303     MOS_STATUS AddAvpTileCodingCmd(
304         PMOS_COMMAND_BUFFER             cmdBuffer,
305         PMHW_BATCH_BUFFER               batchBuffer,
306         MhwVdboxAvpTileCodingParams     *params);
307 
308     //!
309     //! \brief    Adds AVP tile coding command for decoder
310     //! \details  function to add AVP tile coding command in command buffer or Batch buffer
311     //!
312     //! \param    [in] cmdBuffer
313     //!           Command buffer to which HW command is added
314     //! \param    [in] batchBuffer
315     //!           Batch buffer to which HW command is added
316     //! \param    [in] params
317     //!           Params structure used to populate the HW command
318     //!
319     //! \return   MOS_STATUS
320     //!           MOS_STATUS_SUCCESS if success, else fail reason
321     //!
322     MOS_STATUS AddAvpDecodeTileCodingCmd(
323         PMOS_COMMAND_BUFFER             cmdBuffer,
324         PMHW_BATCH_BUFFER               batchBuffer,
325         MhwVdboxAvpTileCodingParams     *params);
326 
327     //!
328     //! \brief    Adds AVP tile coding command for Large Scale Tile decoding
329     //! \details  function to add AVP tile coding command in command buffer or Batch buffer
330     //!
331     //! \param    [in] cmdBuffer
332     //!           Command buffer to which HW command is added
333     //! \param    [in] batchBuffer
334     //!           Batch buffer to which HW command is added
335     //! \param    [in] params
336     //!           Params structure used to populate the HW command
337     //!
338     //! \return   MOS_STATUS
339     //!           MOS_STATUS_SUCCESS if success, else fail reason
340     //!
341     MOS_STATUS AddAvpDecodeTileCodingCmdLst(
342         PMOS_COMMAND_BUFFER             cmdBuffer,
343         PMHW_BATCH_BUFFER               batchBuffer,
344         MhwVdboxAvpTileCodingParams     *params);
345 
346     //!
347     //! \brief    Adds AVP BSD Object command in command buffer
348     //! \details  function to add AVP BSD Object command in command buffer or Batch buffer
349     //!
350     //! \param    [in] cmdBuffer
351     //!           Command buffer to which HW command is added
352     //! \param    [in] batchBuffer
353     //!           Batch buffer to which HW command is added
354     //! \param    [in] params
355     //!           Params structure used to populate the HW command
356     //!
357     //! \return   MOS_STATUS
358     //!           MOS_STATUS_SUCCESS if success, else fail reason
359     //!
360     MOS_STATUS AddAvpBsdObjectCmd(
361         PMOS_COMMAND_BUFFER             cmdBuffer,
362         PMHW_BATCH_BUFFER               batchBuffer,
363         MhwVdboxAvpBsdParams            *params);
364 
365     //!
366     //! \brief    Adds AVP Inloop Filter State command
367     //! \details  function to add AVP Inloop Filter State command in command buffer
368     //!
369     //! \param    [in] cmdBuffer
370     //!           Command buffer to which HW command is added
371     //! \param    [in] params
372     //!           Params structure used to populate the HW command
373     //!
374     //! \return   MOS_STATUS
375     //!           MOS_STATUS_SUCCESS if success, else fail reason
376     //!
377     MOS_STATUS AddAvpInloopFilterStateCmd(
378         PMOS_COMMAND_BUFFER             cmdBuffer,
379         MhwVdboxAvpPicStateParams       *params);
380 
381 
382     //!
383     //! \brief    Adds AVP Inter Prediction State command
384     //! \details  function to add AVP Inter Prediction State command in command buffer
385     //!
386     //! \param    [in] cmdBuffer
387     //!           Command buffer to which HW command is added
388     //! \param    [in] params
389     //!           Params structure used to populate the HW command
390     //!
391     //! \return   MOS_STATUS
392     //!           MOS_STATUS_SUCCESS if success, else fail reason
393     //!
394     MOS_STATUS AddAvpInterPredStateCmd(
395         PMOS_COMMAND_BUFFER                  cmdBuffer,
396         MhwVdboxAvpPicStateParams            *params);
397 };
398 
399 #endif
400