xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/shared/mediacopy/media_copy.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     media_copy.h
24 //! \brief    Common interface and structure used in media copy
25 //! \details  Common interface and structure used in media copy which are platform independent
26 //!
27 
28 #ifndef __MEDIA_COPY_H__
29 #define __MEDIA_COPY_H__
30 
31 #include <stdint.h>
32 #include "mos_defs.h"
33 #include "mos_defs_specific.h"
34 #include "mos_os_specific.h"
35 #include "mos_resource_defs.h"
36 #include "mos_util_debug.h"
37 #include "mos_os.h"
38 #include "mos_interface.h"
39 
40 class CommonSurfaceDumper;
41 
42 typedef struct _MCPY_ENGINE_CAPS
43 {
44     uint32_t engineVebox   :1;
45     uint32_t engineBlt     :1;
46     uint32_t engineRender  :1;
47     uint32_t reversed      :29;
48 }MCPY_ENGINE_CAPS;
49 
50 enum MCPY_ENGINE
51 {
52     MCPY_ENGINE_VEBOX = 0,
53     MCPY_ENGINE_BLT,
54     MCPY_ENGINE_RENDER,
55 };
56 
57 enum MCPY_CPMODE
58 {
59     MCPY_CPMODE_CP = 0,
60     MCPY_CPMODE_CLEAR,
61 };
62 
63 enum MCPY_METHOD
64 {
65     MCPY_METHOD_DEFAULT = 0,
66     MCPY_METHOD_POWERSAVING,  // use BCS engine
67     MCPY_METHOD_PERFORMANCE,  // use EU to get the best perf.
68     MCPY_METHOD_BALANCE,      // use vebox engine.
69 };
70 
71 typedef struct _MCPY_STATE_PARAMS
72 {
73     MOS_RESOURCE         *OsRes;              // mos resource
74     MOS_RESOURCE_MMC_MODE CompressionMode;    // MC, RC, uncompressed
75     MOS_TILE_TYPE         TileMode;           // linear, TILEY, TILE4
76     MCPY_CPMODE           CpMode;             // CP content.
77     bool                  bAuxSuface;
78 }MCPY_STATE_PARAMS;
79 
80 class MediaCopyBaseState
81 {
82 public:
83     //!
84     //! \brief    MediaCopy constructor
85     //! \details  Initialize the MediaCopy members.
86     //! \param    osInterface
87     //!           [in] Pointer to MOS_INTERFACE.
88     //!
89     MediaCopyBaseState();
90     virtual ~MediaCopyBaseState();
91 
92     //!
93     //! \brief    init Media copy
94     //! \details  init func.
95     //! \param    none
96     //! \return   MOS_STATUS
97     //!           Return MOS_STATUS_SUCCESS if success, otherwise return failed.
98     //!
99     virtual MOS_STATUS Initialize(PMOS_INTERFACE osInterface);
100 
101     //!
102     //! \brief    check copy capability.
103     //! \details  to determine surface copy is supported or not.
104     //! \param    format
105     //!           [in] surface format
106     //! \param    mcpySrc
107     //!           [in] Pointer to source paramters
108     //! \param    mcpyDst
109     //!           [in] Pointer to destination paramters
110     //! \param    caps
111     //!           [in] reference of featue supported engine's caps
112     //! \return   MOS_STATUS
113     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
114     //!
115     virtual MOS_STATUS CapabilityCheck(
116         MOS_FORMAT         format,
117         MCPY_STATE_PARAMS &mcpySrc,
118         MCPY_STATE_PARAMS &mcpyDst,
119         MCPY_ENGINE_CAPS  &caps,
120         MCPY_METHOD        preferMethod);
121 
122     //!
123     //! \brief    surface copy pre process.
124     //! \details  pre process before doing surface copy.
125     //! \param    src
126     //!          [in]Media copy state's input parmaters
127     //! \param    dest
128     //!          [in]Media copy state's output parmaters
129     //! \param    preferMethod
130     //!          [in]Media copy Method
131     //! \return   MOS_STATUS
132     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
133     //!
134     virtual MOS_STATUS PreCheckCpCopy(
135         MCPY_STATE_PARAMS src, MCPY_STATE_PARAMS dest, MCPY_METHOD preferMethod);
136 
137     //!
138     //! \brief    surface copy func.
139     //! \details  copy surface.
140     //! \param    src
141     //!           [in] Pointer to source surface
142     //! \param    dst
143     //!           [in] Pointer to destination surface
144     //! \return   MOS_STATUS
145     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
146     //!
147     virtual MOS_STATUS SurfaceCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst, MCPY_METHOD preferMethod = MCPY_METHOD_PERFORMANCE);
148 
149     //!
150     //! \brief    aux surface copy.
151     //! \details  copy surface.
152     //! \param    src
153     //!           [in] Pointer to source surface
154     //! \param    dst
155     //!           [in] Pointer to destination surface
156     //! \return   MOS_STATUS
157     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
158     //!
159     virtual MOS_STATUS AuxCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst);
160 
161     //!
162     //! \brief    Is AIL force opition.
163     //! \details  Is AIL force opition.
164     //! \return   bool
165     //!           Return true if support, otherwise return false.
IsAILForceOption()166     virtual bool IsAILForceOption()
167     {
168         return false;
169     }
170 
171     virtual PMOS_INTERFACE GetMosInterface();
172 
173 #if (_DEBUG || _RELEASE_INTERNAL)
SetRegkeyReport(bool flag)174     virtual void SetRegkeyReport(bool flag)
175     {
176         m_bRegReport = flag;
177     }
178 #endif
179 
180 protected:
181 
182     //!
183     //! \brief    dispatch copy task if support.
184     //! \details  dispatch copy task to HW engine (vebox, EU, Blt) based on customer and default.
185     //! \param    mcpySrc
186     //!           [in] Pointer to source surface
187     //! \param    mcpyDst
188     //!           [in] Pointer to destination surface
189     //! \param    mcpyEngine
190     //!           [in] reference of featue supported engine
191     //! \return   MOS_STATUS
192     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
193     //!
194     virtual MOS_STATUS TaskDispatch(MCPY_STATE_PARAMS mcpySrc, MCPY_STATE_PARAMS mcpyDst, MCPY_ENGINE mcpyEngine);
195 
196     //!
197     //! \brief    vebox format support.
198     //! \details  surface format support.
199     //! \param    src
200     //!           [in] Pointer to source surface
201     //! \param    dst
202     //!           [in] Pointer to destination surface
203     //! \return   bool
204     //!           Return true if support, otherwise return false.
205     //!
IsVeboxCopySupported(PMOS_RESOURCE src,PMOS_RESOURCE dst)206     virtual bool IsVeboxCopySupported(PMOS_RESOURCE src, PMOS_RESOURCE dst)
207     {
208         return false;
209     }
210 
211     //!
212     //! \brief    render format support.
213     //! \details  surface format support.
214     //! \param    src
215     //!           [in] Pointer to source surface
216     //! \param    dst
217     //!           [in] Pointer to destination surface
218     //! \return   bool
219     //!           Return true if support, otherwise return false.
220     //!
RenderFormatSupportCheck(PMOS_RESOURCE src,PMOS_RESOURCE dst)221     virtual bool RenderFormatSupportCheck(PMOS_RESOURCE src, PMOS_RESOURCE dst)
222     {return false;}
223 
224     //!
225     //! \brief    feature support check on specific check.
226     //! \details  media copy feature support.
227     //! \param    src
228     //!           [in] Pointer to source surface
229     //! \param    dst
230     //!           [in] Pointer to destination surface
231     //! \param    caps
232     //!           [in] reference of featue supported engine
233     //! \return   MOS_STATUS
234     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
235     //!
FeatureSupport(PMOS_RESOURCE src,PMOS_RESOURCE dst,MCPY_STATE_PARAMS & mcpy_src,MCPY_STATE_PARAMS & mcpy_dst,MCPY_ENGINE_CAPS & caps)236     virtual MOS_STATUS FeatureSupport(PMOS_RESOURCE src, PMOS_RESOURCE dst,
237             MCPY_STATE_PARAMS& mcpy_src, MCPY_STATE_PARAMS& mcpy_dst, MCPY_ENGINE_CAPS& caps)
238     {return MOS_STATUS_SUCCESS;}
239 
240     //!
241     //! \brief    select copy enigne
242     //! \details  media copy select copy enigne.
243     //! \param    preferMethod
244     //!           [in] copy method
245     //! \param    mcpyEngine
246     //!           [in] copy engine
247     //! \param    caps
248     //!           [in] reference of featue supported engine
249     //! \return   MOS_STATUS
250     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
251     //!
252     virtual MOS_STATUS CopyEnigneSelect(MCPY_METHOD& preferMethod, MCPY_ENGINE &mcpyEngine, MCPY_ENGINE_CAPS &caps);
253 
254     //!
255     //! \brief    use blt engie to do surface copy.
256     //! \details  implementation media blt copy.
257     //! \param    src
258     //!           [in] Pointer to source surface
259     //! \param    dst
260     //!           [in] Pointer to destination surface
261     //! \return   MOS_STATUS
262     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
263     //!
MediaBltCopy(PMOS_RESOURCE src,PMOS_RESOURCE dst)264     virtual MOS_STATUS MediaBltCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst)
265     {return MOS_STATUS_SUCCESS;}
266 
267     //!
268     //! \brief    use Render engie to do surface copy.
269     //! \details  implementation media Render copy.
270     //! \param    src
271     //!           [in] Pointer to source surface
272     //! \param    dst
273     //!           [in] Pointer to destination surface
274     //! \return   MOS_STATUS
275     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
276     //!
MediaRenderCopy(PMOS_RESOURCE src,PMOS_RESOURCE dst)277     virtual MOS_STATUS MediaRenderCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst)
278     {return MOS_STATUS_SUCCESS;}
279 
280     //!
281     //! \brief    use vebox engie to do surface copy.
282     //! \details  implementation media vebox copy.
283     //! \param    src
284     //!           [in] Pointer to source surface
285     //! \param    dst
286     //!           [in] Pointer to destination surface
287     //! \return   MOS_STATUS
288     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
289     //!
MediaVeboxCopy(PMOS_RESOURCE src,PMOS_RESOURCE dst)290     virtual MOS_STATUS MediaVeboxCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst)
291     {return MOS_STATUS_SUCCESS;}
292 
293     MOS_STATUS CheckResourceSizeValidForCopy(const MOS_SURFACE &res, const MCPY_ENGINE method);
294     MOS_STATUS ValidateResource(const MOS_SURFACE &src, const MOS_SURFACE &dst, MCPY_ENGINE method);
295 
296 public:
297     PMOS_INTERFACE       m_osInterface    = nullptr;
298 
299 protected:
300     PMOS_MUTEX           m_inUseGPUMutex        = nullptr; // Mutex for in-use GPU context
301 #if (_DEBUG || _RELEASE_INTERNAL)
302     CommonSurfaceDumper *m_surfaceDumper        = nullptr;
303     int                  m_MCPYForceMode        = 0;
304     bool                 m_enableVeCopySmallRes = false;
305     bool                 m_bRegReport           = true;
306     char                 m_dumpLocation_in[MAX_PATH]  = {};
307     char                 m_dumpLocation_out[MAX_PATH] = {};
308 #endif
309 MEDIA_CLASS_DEFINE_END(MediaCopyBaseState)
310 };
311 #endif
312