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 //! \file     mhw_vdbox_avp_interface.cpp
23 //! \brief    MHW interface for constructing AVP commands for the Vdbox engine
24 //! \details  Defines the interfaces for constructing MHW Vdbox AVP commands across all platforms
25 //!
26 
27 #include "mhw_vdbox_avp_interface.h"
28 
Initialize()29 void MhwVdboxAvpPipeBufAddrParams::Initialize()
30 {
31     m_mode = 0;
32 
33     for (auto i = 0; i < 8; i++)
34     {
35         m_references[i] = nullptr;
36     }
37 
38     m_decodedPic                      = nullptr;  //!< Decoded Output Frame Buffer
39     m_intrabcDecodedOutputFrameBuffer = nullptr;  //!< IntraBC Decoded output frame buffer
40     m_cdfTableInitializationBuffer    = nullptr;  //!< CDF Tables Initialization Buffer
41     m_cdfTableBwdAdaptationBuffer     = nullptr;  //!< CDF Tables Backward Adaptation Buffer
42 
43     m_segmentIdReadBuffer                                    = nullptr;  //!< AV1 Segment ID Read Buffer
44     m_segmentIdWriteBuffer                                   = nullptr;  //!< AV1 Segment ID Write Buffer
45 
46     for (auto i = 0; i < 9; i++)
47     {
48         m_colMvTemporalBuffer[i] = nullptr;
49     }
50 
51     m_curMvTemporalBuffer                                    = nullptr;  //!< Current MV temporal buffer
52     m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer     = nullptr;  //!< Handle of Bitstream Decode Line Rowstore buffer, can be programmed to use Local Media Storage VMM instead of Memory
53     m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer = nullptr;  //!< Handle of Bitstream Decode Tile Line buffer
54     m_intraPredictionLineRowstoreReadWriteBuffer             = nullptr;  //!< Handle of Intra Prediction Line Rowstore Read/Write Buffer
55     m_intraPredictionTileLineRowstoreReadWriteBuffer         = nullptr;  //!< Handle of Intra Prediction Tile Line Rowstore Read/Write Buffer
56     m_spatialMotionVectorLineReadWriteBuffer                 = nullptr;  //!< Handle of Spatial Motion Vector Line rowstore buffer, can be programmed to use Local Media Storage VMM instead of Memory
57     m_spatialMotionVectorCodingTileLineReadWriteBuffer       = nullptr;  //!< Handle of Spatial Motion Vector Tile Line buffer
58     m_loopRestorationMetaTileColumnReadWriteBuffer           = nullptr;  //!< Loop Restoration Meta Tile Column Read/Write Buffer Address
59     m_loopRestorationFilterTileReadWriteLineYBuffer          = nullptr;  //!< Loop Restoration Filter Tile Read/Write Line Y Buffer Address
60     m_loopRestorationFilterTileReadWriteLineUBuffer          = nullptr;  //!< Loop Restoration Filter Tile Read/Write Line U Buffer Address
61     m_loopRestorationFilterTileReadWriteLineVBuffer          = nullptr;  //!< Loop Restoration Filter Tile Read/Write Line V Buffer Address
62     m_deblockerFilterLineReadWriteYBuffer                    = nullptr;  //!< Deblocker Filter Line Read/Write Y Buffer Address
63     m_deblockerFilterLineReadWriteUBuffer                    = nullptr;  //!< Deblocker Filter Line Read/Write U Buffer Address
64     m_deblockerFilterLineReadWriteVBuffer                    = nullptr;  //!< Deblocker Filter Line Read/Write V Buffer Address
65     m_deblockerFilterTileLineReadWriteYBuffer                = nullptr;  //!< Deblocker Filter Tile Line Read/Write Y Buffer Address
66     m_deblockerFilterTileLineReadWriteVBuffer                = nullptr;  //!< Deblocker Filter Tile Line Read/Write V Buffer Address
67     m_deblockerFilterTileLineReadWriteUBuffer                = nullptr;  //!< Deblocker Filter Tile Line Read/Write U Buffer Address
68     m_deblockerFilterTileColumnReadWriteYBuffer              = nullptr;  //!< Deblocker Filter Tile Column Read/Write Y Buffer Address
69     m_deblockerFilterTileColumnReadWriteUBuffer              = nullptr;  //!< Deblocker Filter Tile Column Read/Write U Buffer Address
70     m_deblockerFilterTileColumnReadWriteVBuffer              = nullptr;  //!< Deblocker Filter Tile Column Read/Write V Buffer Address
71     m_cdefFilterLineReadWriteBuffer                          = nullptr;  //!< CDEF Filter Line Read/Write Y Buffer Address
72     m_cdefFilterTileLineReadWriteBuffer                      = nullptr;  //!< CDEF Filter Tile Line Read/Write Y Buffer Address
73     m_cdefFilterTileColumnReadWriteBuffer                    = nullptr;  //!< CDEF Filter Tile Column Read/Write Y Buffer Address
74     m_cdefFilterMetaTileLineReadWriteBuffer                  = nullptr;  //!< CDEF Filter Meta Tile Line Read/Write Buffer Address
75     m_cdefFilterMetaTileColumnReadWriteBuffer                = nullptr;  //!< CDEF Filter Meta Tile Column Read/Write Buffer Address
76     m_cdefFilterTopLeftCornerReadWriteBuffer                 = nullptr;  //!< CDEF Filter Top-Left Corner Read/Write Buffer Address
77     m_superResTileColumnReadWriteYBuffer                     = nullptr;  //!< Super-Res Tile Column Read/Write Y Buffer Address
78     m_superResTileColumnReadWriteUBuffer                     = nullptr;  //!< Super-Res Tile Column Read/Write U Buffer Address
79     m_superResTileColumnReadWriteVBuffer                     = nullptr;  //!< Super-Res Tile Column Read/Write V Buffer Address
80     m_loopRestorationFilterTileColumnReadWriteYBuffer        = nullptr;  //!< Loop Restoration Filter Tile Column Read/Write Y Buffer Address
81     m_loopRestorationFilterTileColumnReadWriteUBuffer        = nullptr;  //!< Loop Restoration Filter Tile Column Read/Write U Buffer Address
82     m_loopRestorationFilterTileColumnReadWriteVBuffer        = nullptr;  //!< Loop Restoration Filter Tile Column Read/Write V Buffer Address
83     m_decodedFrameStatusErrorBuffer                          = nullptr;  //!< Decoded Frame Status/Error Buffer Base Address
84     m_decodedBlockDataStreamoutBuffer                        = nullptr;  //!< Decoded Block Data Streamout Buffer Address
85 
86     //MMC supported
87     m_preDeblockSurfMmcState = {};
88     m_streamOutBufMmcState = {};
89 }
90 
AddAvpSurfaceCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_SURFACE_PARAMS params)91 MOS_STATUS MhwVdboxAvpInterface::AddAvpSurfaceCmd(
92     PMOS_COMMAND_BUFFER                  cmdBuffer,
93     PMHW_VDBOX_SURFACE_PARAMS            params)
94 {
95     MHW_FUNCTION_ENTER;
96 
97     MHW_MI_CHK_NULL(cmdBuffer);
98     MHW_MI_CHK_NULL(params);
99 
100     if (m_decodeInUse)
101     {
102         MHW_MI_CHK_STATUS(AddAvpDecodeSurfaceStateCmd(cmdBuffer, params));
103     }
104     else
105     {
106         return MOS_STATUS_UNIMPLEMENTED;
107     }
108 
109     return MOS_STATUS_SUCCESS;
110 }
111 
MhwVdboxAvpInterface(PMOS_INTERFACE osInterface,MhwMiInterface * miInterface,MhwCpInterface * cpInterface,bool decodeInUse)112 MhwVdboxAvpInterface::MhwVdboxAvpInterface(
113     PMOS_INTERFACE osInterface,
114     MhwMiInterface *miInterface,
115     MhwCpInterface *cpInterface,
116     bool decodeInUse)
117 {
118     MHW_FUNCTION_ENTER;
119 
120     m_osInterface = osInterface;
121     m_miInterface = miInterface;
122     m_cpInterface = cpInterface;
123     m_decodeInUse = decodeInUse;
124 
125     MHW_ASSERT(m_osInterface);
126     MHW_ASSERT(m_miInterface);
127     MHW_ASSERT(m_cpInterface);
128 
129     m_waTable = osInterface->pfnGetWaTable(osInterface);
130     m_skuTable = osInterface->pfnGetSkuTable(osInterface);
131 
132     if (m_osInterface->bUsesGfxAddress)
133     {
134         AddResourceToCmd = Mhw_AddResourceToCmd_GfxAddress;
135     }
136     else // bUsesPatchList
137     {
138         AddResourceToCmd = Mhw_AddResourceToCmd_PatchList;
139     }
140 
141 }
142