1 /*
2 * Copyright (c) 2020-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     encode_preenc_packet.h
24 //! \brief    Defines the interface to adapt to preenc pipeline
25 //!
26 
27 #ifndef __CODECHAL_PREENC_PACKET_H__
28 #define __CODECHAL_PREENC_PACKET_H__
29 
30 #include "media_cmd_packet.h"
31 #include "encode_pipeline.h"
32 #include "encode_utils.h"
33 #include "encode_preenc_basic_feature.h"
34 #include "encode_status_report.h"
35 #include "mhw_vdbox_vdenc_itf.h"
36 #include "mhw_vdbox_hcp_itf.h"
37 #include "media_sfc_interface.h"
38 
39 namespace encode
40 {
41     class EncodePreEncPacket : public CmdPacket, public MediaStatusReportObserver, public mhw::vdbox::vdenc::Itf::ParSetting, public mhw::vdbox::hcp::Itf::ParSetting
42     {
43     public:
44         enum FlushCmd
45         {
46             waitHevc = 0,
47             waitVdenc,
48             waitHevcVdenc
49         };
EncodePreEncPacket(MediaPipeline * pipeline,MediaTask * task,CodechalHwInterfaceNext * hwInterface)50         EncodePreEncPacket(MediaPipeline* pipeline, MediaTask* task, CodechalHwInterfaceNext* hwInterface) : CmdPacket(task),
51             m_pipeline(dynamic_cast<EncodePipeline*>(pipeline)),
52             m_hwInterface(dynamic_cast<CodechalHwInterfaceNext*>(hwInterface))
53         {
54             ENCODE_CHK_NULL_NO_STATUS_RETURN(hwInterface);
55             ENCODE_CHK_NULL_NO_STATUS_RETURN(m_pipeline);
56             ENCODE_CHK_NULL_NO_STATUS_RETURN(m_hwInterface);
57 
58             m_osInterface = hwInterface->GetOsInterface();
59             m_statusReport = m_pipeline->GetStatusReportInstance();
60 
61             m_featureManager = m_pipeline->GetPacketLevelFeatureManager(EncodePipeline::encodePreEncPacket);
62             m_vdencItf      = std::static_pointer_cast<mhw::vdbox::vdenc::Itf>(hwInterface->GetVdencInterfaceNext());
63 
64             m_hcpItf = std::static_pointer_cast<mhw::vdbox::hcp::Itf>(m_hwInterface->GetHcpInterfaceNext());
65             m_miItf  = m_hwInterface->GetMiInterfaceNext();
66             ENCODE_CHK_NULL_NO_STATUS_RETURN(m_miItf);
67 
68             m_sfcItf = m_hwInterface->GetMediaSfcInterface();
69             ENCODE_CHK_NULL_NO_STATUS_RETURN(m_sfcItf);
70 
71             MEDIA_SFC_INTERFACE_MODE sfcMode = {};
72             sfcMode.vdboxSfcEnabled          = false;
73             sfcMode.veboxSfcEnabled          = true;
74             m_sfcItf->Initialize(sfcMode);
75         }
~EncodePreEncPacket()76         virtual ~EncodePreEncPacket() {}
77 
78         virtual MOS_STATUS Init() override;
79 
80         virtual MOS_STATUS Prepare() override;
81 
82         virtual MOS_STATUS Destroy() override;
83 
84         virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket) override;
85 
86         virtual MOS_STATUS Completed(void* mfxStatus, void* rcsStatus, void* statusReport) override;
87 
88         virtual MOS_STATUS CalculatePictureStateCommandSize();
89 
90         virtual MOS_STATUS GetVdencStateCommandsDataSize(uint32_t& vdencPictureStatesSize, uint32_t& vdencPicturePatchListSize);
91 
92         virtual MOS_STATUS PrepareRawSurface();
93 
94         MOS_STATUS CalculateCommandSize(
95             uint32_t& commandBufferSize,
96             uint32_t& requestedPatchListSize) override;
97 
98         MOS_STATUS RawSurfaceDownScaling(const PMOS_SURFACE inSurf, PMOS_SURFACE outSurf);
99 
GetPacketName()100         virtual std::string GetPacketName() override
101         {
102             return "VDENC_PASS" + std::to_string((uint32_t)m_pipeline->GetCurrentPass());
103         }
104 
105     protected:
106 
107         virtual MOS_STATUS GetHxxPrimitiveCommandSize();
108 
109         virtual uint32_t CalculateCommandBufferSize();
110 
111         virtual uint32_t CalculatePatchListSize();
112 
113         virtual MOS_STATUS StartStatusReport(
114             uint32_t srType,
115             MOS_COMMAND_BUFFER* cmdBuffer) override;
116 
117         virtual MOS_STATUS EndStatusReport(
118             uint32_t            srType,
119             MOS_COMMAND_BUFFER* cmdBuffer) override;
120 
121         MOS_STATUS ReadHcpStatus(
122             MHW_VDBOX_NODE_IND  vdboxIndex,
123             MediaStatusReport* statusReport,
124             MOS_COMMAND_BUFFER& cmdBuffer);
125 
126         virtual MOS_STATUS AllocateResources();
127 
128         virtual MOS_STATUS AddPicStateWithNoTile(
129             MOS_COMMAND_BUFFER& cmdBuffer);
130 
131         virtual MOS_STATUS SendHwSliceEncodeCommand(
132             MOS_COMMAND_BUFFER& cmdBuffer);
133 
134         virtual MOS_STATUS AddHcpPipeModeSelect(
135             MOS_COMMAND_BUFFER& cmdBuffer);
136 
137         void SetPerfTag(uint16_t type, uint16_t mode, uint16_t picCodingType);
138 
139         MOS_STATUS SendPrologCmds(
140             MOS_COMMAND_BUFFER& cmdBuffer);
141 
142         MOS_STATUS AddForceWakeup(MOS_COMMAND_BUFFER& cmdBuffer);
143 
144         MHW_SETPAR_DECL_HDR(VDENC_PIPE_MODE_SELECT);
145 
146         MHW_SETPAR_DECL_HDR(VDENC_HEVC_VP9_TILE_SLICE_STATE);
147 
148         MHW_SETPAR_DECL_HDR(VDENC_PIPE_BUF_ADDR_STATE);
149 
150         MHW_SETPAR_DECL_HDR(VD_PIPELINE_FLUSH);
151 
152         MHW_SETPAR_DECL_HDR(HCP_PIPE_BUF_ADDR_STATE);
153 
154         MHW_SETPAR_DECL_HDR(HCP_PIPE_MODE_SELECT);
155 
156         MHW_SETPAR_DECL_HDR(HCP_SURFACE_STATE);
157 
158         MHW_SETPAR_DECL_HDR(HCP_IND_OBJ_BASE_ADDR_STATE);
159 
160         MHW_SETPAR_DECL_HDR(HCP_SLICE_STATE);
161 
162         MOS_STATUS AddHcpSurfaceStateCmds(PMOS_COMMAND_BUFFER cmdBuffer) const;
163 
164         MOS_STATUS AddHcpFqmStateCmds(PMOS_COMMAND_BUFFER cmdBuffer) const;
165 
166         MOS_STATUS AddHcpQMStateCmds(PMOS_COMMAND_BUFFER cmdBuffer) const;
167 
168         MOS_STATUS AddHcpPakInsertObjectCmds(PMOS_COMMAND_BUFFER cmdBuffer) const;
169 
170         MOS_STATUS AddHcpRefIdxStateCmds(PMOS_COMMAND_BUFFER cmdBuffer) const;
171 
172         MOS_STATUS AddHcpBSliceRefIdxStateCmds(PMOS_COMMAND_BUFFER cmdBuffer) const;
173 
174         MOS_STATUS SubmitPictureLevel(MOS_COMMAND_BUFFER *commandBuffer, uint8_t packetPhase);
175 
176         MOS_STATUS PatchSliceLevelCommands(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t packetPhase);
177 
178         MOS_STATUS AddPictureHcpCommands(MOS_COMMAND_BUFFER &cmdBuffer);
179 
180         MOS_STATUS AddPictureVdencCommands(MOS_COMMAND_BUFFER &cmdBuffer);
181 
182         MOS_STATUS PatchPictureLevelCommands(const uint8_t &packetPhase, MOS_COMMAND_BUFFER &cmdBuffer);
183 
184         MOS_STATUS EnsureAllCommandsExecuted(MOS_COMMAND_BUFFER &cmdBuffer);
185 
186 #if USE_CODECHAL_DEBUG_TOOL
187         MOS_STATUS DumpResources(
188             EncodeStatusMfx* encodeStatusMfx,
189             EncodeStatusReportData* statusReportData);
190 #endif
191         EncodePipeline *m_pipeline = nullptr;
192 
193         // Interfaces
194         EncodeAllocator *       m_allocator      = nullptr;
195         CodechalHwInterfaceNext *   m_hwInterface    = nullptr;
196         PreEncBasicFeature *    m_basicFeature   = nullptr;  //!< Encode parameters used in each frame
197         EncodeMemComp *         m_mmcState       = nullptr;
198 
199         std::shared_ptr<mhw::vdbox::vdenc::Itf>           m_vdencItf       = nullptr;
200         std::shared_ptr<mhw::vdbox::hcp::Itf>             m_hcpItf         = nullptr;
201         std::shared_ptr<MediaSfcInterface>                m_sfcItf         = nullptr;
202         std::shared_ptr<MediaFeatureManager::ManagerLite> m_featureManager = nullptr;
203 
204         mutable uint8_t m_curHcpSurfStateId = 0;
205 
206         // Parameters passed from application
207         const CODECHAL_HEVC_IQ_MATRIX_PARAMS* m_hevcIqMatrixParams = nullptr;  //!< Pointer to IQ matrix parameter
208         const PCODECHAL_NAL_UNIT_PARAMS* m_nalUnitParams = nullptr;  //!< Pointer to NAL unit parameters
209 
210         // PAK resources
211         PMOS_RESOURCE m_resMetadataLineBuffer = nullptr;  //!< Metadata line data buffer
212         PMOS_RESOURCE m_resMetadataTileLineBuffer = nullptr;  //!< Metadata tile line data buffer
213         PMOS_RESOURCE m_resMetadataTileColumnBuffer = nullptr;  //!< Metadata tile column data buffer
214 
215         PMOS_RESOURCE m_vdencTileRowStoreBuffer = nullptr;  //!< Tile row store buffer
216 
217         uint32_t m_sliceStatesSize = 0;  //!< Slice states size
218 
219         PMOS_RESOURCE m_vdencIntraRowStoreScratch = nullptr;
220 
221         bool     m_usePatchList = 0;  //!< Use Ptach List or not
222         uint32_t m_defaultPictureStatesSize = 0;  //!< Picture state command size
223         uint32_t m_pictureStatesSize = 0;  //!< Picture states size
224         uint32_t m_defaultSliceStatesSize = 0;  //!< Slice state command size
225         uint32_t m_defaultPicturePatchListSize = 0;  //!< Picture state patch list size
226         uint32_t m_picturePatchListSize = 0;  //!< Picture patch list size
227         uint32_t m_defaultSlicePatchListSize = 0;  //!< Slice state patch list size
228         uint32_t m_slicePatchListSize = 0;  //!< Slice patch list size
229 
230         FlushCmd m_flushCmd = waitHevc;
231         uint32_t m_encodeMode = 0;
232 
233         bool m_enablePreEncStatusReport = false;
234 
235     MEDIA_CLASS_DEFINE_END(encode__EncodePreEncPacket)
236     };
237 
238 }  // namespace encode
239 #endif
240