1 /*
2 * Copyright (c) 2020-2023, 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     media_blt_copy_next.h
24 //! \brief    Common interface and structure used in Blitter Engine
25 //! \details  Common interface and structure used in Blitter Engine which are platform independent
26 //!
27 #ifndef __MEDIA_BLT_COPY_NEXT_H__
28 #define __MEDIA_BLT_COPY_NEXT_H__
29 
30 #include "media_interfaces_mhw_next.h"
31 #include "mhw_blt.h"
32 #include "mhw_mi.h"
33 #include "mhw_cp_interface.h"
34 #include "mos_os.h"
35 #include "media_copy.h"
36 #include "media_copy_common.h"
37 
38 class BltStateNext
39 {
40 public:
41     //!
42     //! \brief    BltStateNext constructor
43     //! \details  Initialize the BltStateNext members.
44     //! \param    osInterface
45     //!           [in] Pointer to MOS_INTERFACE.
46     //!
47     BltStateNext(PMOS_INTERFACE     osInterface);
48     BltStateNext(PMOS_INTERFACE    osInterface, MhwInterfacesNext* mhwInterfaces);
49 
50     virtual ~BltStateNext();
51 
52     //!
53     //! \brief    BltStateNext initialize
54     //! \details  Initialize the BltStateNext, create BLT context.
55     //! \return   MOS_STATUS
56     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
57     //!
58     virtual MOS_STATUS Initialize();
59 
60     //!
61     //! \brief    Copy main surface
62     //! \details  BLT engine will copy source surface to destination surface
63     //! \param    src
64     //!           [in] Pointer to source surface
65     //! \param    dst
66     //!           [in] Pointer to destination surface
67     //! \return   MOS_STATUS
68     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
69     //!
70     virtual MOS_STATUS CopyMainSurface(
71         PMOS_SURFACE src,
72         PMOS_SURFACE dst);
73 
74     //!
75     //! \brief    Copy main surface
76     //! \details  BLT engine will copy source surface to destination surface
77     //! \param    src
78     //!           [in] Pointer to source resource
79     //! \param    dst
80     //!           [in] Pointer to destination resource
81     //! \return   MOS_STATUS
82     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
83     //!
84     virtual MOS_STATUS CopyMainSurface(
85         PMOS_RESOURCE src,
86         PMOS_RESOURCE dst);
87 
88     //!
89     //! \brief    Setup blt copy parameters
90     //! \details  Setup blt copy parameters for BLT Engine
91     //! \param    mhwParams
92     //!           [in/out] Pointer to MHW_FAST_COPY_BLT_PARAM
93     //! \param    inputSurface
94     //!           [in] Pointer to input surface
95     //! \param    outputSurface
96     //!           [in] Pointer to output surface
97     //! \param    planeIndex
98     //!           [in] Pointer to YUV(RGB) plane index
99     //! \return   MOS_STATUS
100     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
101     //!
102     virtual MOS_STATUS SetupBltCopyParam(
103       PMHW_FAST_COPY_BLT_PARAM mhwParams,
104       PMOS_RESOURCE            inputSurface,
105       PMOS_RESOURCE            outputSurface,
106       int                      planeIndex);
107 
108     //!
109     //! \brief    Submit command
110     //! \details  Submit BLT command
111     //! \param    pBltStateParam
112     //!           [in] Pointer to BLT_STATE_PARAM
113     //! \return   MOS_STATUS
114     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
115     //!
116     virtual MOS_STATUS SubmitCMD(
117         PBLT_STATE_PARAM pBltStateParam);
118 
119     //!
120     //! \brief    Get Block copy color depth.
121     //! \details  get different format's color depth.
122     //! \param    Gmm format and bits per Pixel
123     //!           [in] Gmm format, Bits per Pixel;
124     //! \return   color depth
125     //!           Return color depth
126     //!
127     uint32_t GetBlkCopyColorDepth(
128         GMM_RESOURCE_FORMAT dstFormat,
129         uint32_t            Pixel);
130 
131     //!
132     //! \brief    Get plane's byte per texel
133     //! \details  Get plane's byte per texel
134     //! \param    MOS_FORMAT format
135     //!           [in] GMM resource format
136     //! \return   int
137     //!           return the scaling ratio;
138     //!
139     int GetBytesPerTexelScaling(MOS_FORMAT format);
140 
141     //!
142     //! \brief    Get plane number
143     //! \details  Get plane number
144     //! \param    MOS_FORMAT format
145     //!           [in] GMM resource format
146     //! \return   int
147     //!           return the plane number
148     //!
149     int GetPlaneNum(MOS_FORMAT format);
150 
151 
152     //!
153     //! \brief    Get control surface
154     //! \details  BLT engine will copy aux data of source surface to destination
155     //! \param    src
156     //!           [in] Pointer to source surface
157     //! \param    dst
158     //!           [in] Pointer to destination buffer which is created for aux data
159     //! \return   MOS_STATUS
160     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
161     //!
162     virtual MOS_STATUS GetCCS(
163         PMOS_SURFACE src,
164         PMOS_SURFACE dst);
165 
166     //!
167     //! \brief    Put control surface
168     //! \details  BLT engine will copy aux data in source buffer to CCS of destination surface
169     //! \param    src
170     //!           [in] Pointer to source buffer which store aux data
171     //! \param    dst
172     //!           [in] Pointer to destination surface
173     //! \return   MOS_STATUS
174     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
175     //!
176     virtual MOS_STATUS PutCCS(
177         PMOS_SURFACE src,
178         PMOS_SURFACE dst);
179 
180     //!
181     //! \brief    dump surface
182     //! \details  dump surface to get main surface and aux data
183     //! \param    pSrcSurface
184     //!           [in] Pointer to source surface
185     //! \return   MOS_STATUS
186     //!           MOS_STATUS_SUCCESS if success, otherwise error code
187     //!
188     virtual MOS_STATUS LockSurface(
189         PMOS_SURFACE pSurface);
190 
191     //!
192     //! \brief    free surface
193     //! \details  Free resource created by lockSurface, must be called once call LockSurface
194     //! \return   MOS_STATUS
195     //!           MOS_STATUS_SUCCESS if success, otherwise error code
196     //!
197     virtual MOS_STATUS UnLockSurface();
198 
199     //!
200     //! \brief    Write compressed surface
201     //! \details  Write compressed surface data from system memory to GPU memory
202     //! \param    pSysMemory
203     //!           [in] Pointer to system memory
204     //! \param    dataSize
205     //!           [in] data size, including main surface data and aux data
206     //! \param    pSurface
207     //!           [in] Pointer to the destination surface
208     //! \return   MOS_STATUS
209     //!           MOS_STATUS_SUCCESS if success, otherwise error code
210     //!
211     virtual MOS_STATUS WriteCompressedSurface(
212         void*        pSysMemory,
213         uint32_t     dataSize,
214         PMOS_SURFACE pSurface);
215 
216     //!
217     //! \brief    Get main surface size
218     //! \details  Get the size of main surface
219     //! \return   uint32_t
220     //!           Retrun data size
221     //!
GetMainSurfaceSize()222     uint32_t GetMainSurfaceSize()
223     {
224         return surfaceSize;
225     }
226 
227     //!
228     //! \brief    Get aux data size
229     //! \details  Get the size of aux
230     //! \return   uint32_t
231     //!           Retrun data size
232     //!
GetAuxSize()233     uint32_t GetAuxSize()
234     {
235         return auxSize;
236     }
237 
238     //!
239     //! \brief    Get main surface data
240     //! \details  Get the data of main surface
241     //! \return   void*
242     //!           Retrun the pointer to main surface data
243     //!
GetMainSurfaceData()244     void* GetMainSurfaceData()
245     {
246         return pMainSurface;
247     }
248 
249     //!
250     //! \brief    Get aux data
251     //! \details  Get the data of aux
252     //! \return   void*
253     //!           Retrun the pointer to aux data
254     //!
GetAuxData()255     void* GetAuxData()
256     {
257         return pAuxSurface;
258     }
259 
260 protected:
261     //!
262     //! \brief    Allocate resource
263     //! \details  Allocate internel resource
264     //! \param    pSrcSurface
265     //!           [in] Pointer to source surface
266     //! \return   MOS_STATUS
267     //!           MOS_STATUS_SUCCESS if success, otherwise error code
268     //!
269     virtual MOS_STATUS AllocateResource(
270         PMOS_SURFACE pSurface);
271 
272     //!
273     //! \brief    Free resource
274     //! \details  Free internel resource, must be called once call AllocateResource
275     //! \return   MOS_STATUS
276     //!           MOS_STATUS_SUCCESS if success, otherwise error code
277     //!
278     virtual MOS_STATUS FreeResource();
279 
280     //!
281     //! \brief    Setup control surface copy parameters
282     //! \details  Setup control surface copy parameters for BLT Engine
283     //! \param    mhwParams
284     //!           [in/out] Pointer to MHW_CTRL_SURF_COPY_BLT_PARAM
285     //! \param    inputSurface
286     //!           [in] Pointer to input surface
287     //! \param    outputSurface
288     //!           [in] Pointer to output surface
289     //! \param    flag
290     //!           [in] Flag for read/write CCS
291     //! \return   MOS_STATUS
292     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
293     //!
294     MOS_STATUS SetupCtrlSurfCopyBltParam(
295         PMHW_CTRL_SURF_COPY_BLT_PARAM pMhwBltParams,
296         PMOS_SURFACE                  inputSurface,
297         PMOS_SURFACE                  outputSurface,
298         uint32_t                      flag);
299 
300     //!
301     //! \brief    Block copy buffer
302     //! \details  BLT engine will copy source buffer to destination buffer
303     //! \param    pBltStateParam
304     //!           [in] Pointer to BLT_STATE_PARAM
305     //! \return   MOS_STATUS
306     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
307     //!
308     MOS_STATUS BlockCopyBuffer(
309         PBLT_STATE_PARAM pBltStateParam);
310 
311     //!
312     //! \brief    SetPrologParamsforCmdbuffer
313     //! \details  Set PrologParams for Cmdbuffer
314     //! \param    PMOS_COMMAND_BUFFER
315     //!           [in] Pointer to PMOS_COMMAND_BUFFER
316     //! \return   MOS_STATUS
317     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
318     //!
319     MOS_STATUS SetPrologParamsforCmdbuffer(PMOS_COMMAND_BUFFER cmdBuffer);
320 
321      //!
322     //! \brief    Set BCS_SWCTR cmd
323     //! \details  Set BCS_SWCTR for Cmdbuffer
324     //! \param    PMOS_COMMAND_BUFFER
325     //!           [in] Pointer to PMOS_COMMAND_BUFFER
326     //! \return   MOS_STATUS
327     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
328     //!
329     virtual MOS_STATUS SetBCSSWCTR(MOS_COMMAND_BUFFER *cmdBuffer);
330 
331  public:
332     PMOS_INTERFACE     m_osInterface      = nullptr;
333     MhwInterfacesNext *m_mhwInterfaces    = nullptr;
334     MhwCpInterface    *m_cpInterface      = nullptr;
335 
336     std::shared_ptr<mhw::mi::Itf>   m_miItf  = nullptr;
337     std::shared_ptr<mhw::blt::Itf>  m_bltItf = nullptr;
338 
339 protected:
340     bool         initialized = false;
341     bool         allocated   = false;
342     PMOS_SURFACE tempSurface = nullptr;
343     PMOS_SURFACE tempAuxSurface = nullptr;
344     uint32_t     surfaceSize = 0;
345     uint32_t     auxSize     = 0;
346     void*        pMainSurface = nullptr;
347     void*        pAuxSurface  = nullptr;
348 
349     MEDIA_CLASS_DEFINE_END(BltStateNext)
350 };
351 
352 #endif // __MEDIA_BLT_COPY_H__
353