xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/cm/cm_surface_2d_rt_base.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*===================== begin_copyright_notice ==================================
2 /*
3 * Copyright (c) 2019, Intel Corporation
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 */
23 //!
24 //! \file      cm_surface_2d_rt_base.h
25 //! \brief     Contains CmSurface2DRTBase declaration.
26 //!
27 
28 #ifndef MEDIADRIVER_COMMON_CM_CMSURFACE2DRT_BASE_H_
29 #define MEDIADRIVER_COMMON_CM_CMSURFACE2DRT_BASE_H_
30 
31 #include "cm_surface.h"
32 #include "cm_surface_2d.h"
33 
34 #include "cm_hal.h"
35 
36 namespace CMRT_UMD
37 {
38 //!
39 //! \brief Abstraction of 2D surfaces in graphics memory.
40 //!
41 class CmSurface2DRTBase: public CmSurface, public CmSurface2D
42 {
43 public:
44     CM_RT_API int32_t ReadSurface(unsigned char *pSysMem,
45                                   CmEvent *pEvent,
46                                   uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL);
47 
48     CM_RT_API int32_t WriteSurface(const unsigned char *pSysMem,
49                                    CmEvent *pEvent,
50                                    uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL);
51 
52     CM_RT_API int32_t
53     ReadSurfaceStride(unsigned char *pSysMem,
54                       CmEvent *pEvent,
55                       const unsigned int stride,
56                       uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL);
57 
58     CM_RT_API int32_t
59     WriteSurfaceStride(const unsigned char *pSysMem,
60                        CmEvent *pEvent,
61                        const unsigned int stride,
62                        uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL);
63 
64     CM_RT_API int32_t
65     ReadSurfaceHybridStrides(unsigned char *pSysMem,
66                              CmEvent *pEvent,
67                              const unsigned int iWidthStride,
68                              const unsigned int iHeightStride,
69                              uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL,
70                              unsigned int uiOption = 0);
71 
72     CM_RT_API int32_t
73     WriteSurfaceHybridStrides(const unsigned char *pSysMem,
74                               CmEvent *pEvent,
75                               const unsigned int iWidthStride,
76                               const unsigned int iHeightStride,
77                               uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL,
78                               unsigned int uiOption = 0);
79 
80     CM_RT_API int32_t GetIndex(SurfaceIndex *&pIndex);
81 
82    virtual CM_RT_API int32_t GetSurfaceDesc(unsigned int &width,
83                                      unsigned int &height,
84                                      CM_SURFACE_FORMAT &format,
85                                      unsigned int &sizeperpixel);
86 
87     CM_RT_API int32_t InitSurface(const unsigned int initValue,
88                                   CmEvent *pEvent,
89                                   unsigned int useGPU = 0);
90 
91     CM_RT_API int32_t
92     SetSurfaceStateParam(SurfaceIndex *pSurfIndex,
93                          const CM_SURFACE2D_STATE_PARAM *pSSParam);
94 
95     CM_RT_API int32_t ReadSurfaceFullStride(unsigned char *pSysMem,
96                                             CmEvent *pEvent,
97                                             const unsigned int iWidthStride,
98                                             const unsigned int iHeightStride,
99                                             uint64_t sysMemSize);
100 
101     CM_RT_API int32_t WriteSurfaceFullStride(const unsigned char *pSysMem,
102                                              CmEvent *pEvent,
103                                              const unsigned int iWidthStride,
104                                              const unsigned int iHeightStride,
105                                              uint64_t sysMemSize);
106 
107     int32_t SetMemoryObjectControl(MEMORY_OBJECT_CONTROL mem_ctrl,
108                                    MEMORY_TYPE mem_type,
109                                    unsigned int age);
110 
111     CM_RT_API int32_t SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL mem_ctrl);
112 
113     CMRT_UMD_API int32_t SetResourceUsage(const MOS_HW_RESOURCE_DEF mosUsage);
114 
115     CM_RT_API int32_t SetCompressionMode(MEMCOMP_STATE MmcMode);
116 
117     CM_RT_API int32_t SetProperty(CM_FRAME_TYPE frameType);
118 
119     virtual int32_t GetIndexFor2D(unsigned int &index);
120 
121     virtual int32_t GetHandle(unsigned int &handle);
122 
123     int32_t SetSurfaceProperties(unsigned int width,
124                                  unsigned int height,
125                                  CM_SURFACE_FORMAT format);
126 
127     //NOT depend on RTTI::dynamic_cast
Type()128     CM_ENUM_CLASS_TYPE Type() const { return CM_ENUM_CLASS_TYPE_CMSURFACE2D; }
129 
130     bool IsGPUCopy(void *pSysMem,
131                    uint32_t iWidth,
132                    uint32_t iHeight,
133                    uint32_t iWidthStride);
134 
135     bool IsUnalignedGPUCopy(uint32_t iWidthInBytes, uint32_t iHeight);
136 
137     CMRT_UMD_API int SetReadSyncFlag(bool bReadSync, CmQueue *pCmQueue);
138 
139 
140     CMRT_UMD_API int
141     NotifyUmdResourceChanged(void *umdResource,
142                              int updateMosResource = 0,
143                              PMOS_RESOURCE pMosResource = nullptr);
144 
145     virtual int32_t UpdateResource(MOS_RESOURCE *resource);
146 
147     virtual int32_t Create2DAlias(SurfaceIndex *&pAliasSurfIndex);
148 
149     virtual int32_t GetNumAliases(unsigned int &numAliases);
150 
151     void Log(std::ostringstream &oss);
152 
153     void DumpContent(uint32_t kernelNumber,
154                      char *kernelName,
155                      int32_t taskId,
156                      uint32_t argIndex,
157                      uint32_t vectorIndex);
158 
159     void DumpContentToFile(const char *filename);
160 
161     virtual int32_t UpdateSurfaceProperty(uint32_t width, uint32_t height, uint32_t pitch, CM_SURFACE_FORMAT format);
162 
163 protected:
164     CmSurface2DRTBase(unsigned int handle,
165                   unsigned int width,
166                   unsigned int height,
167                   unsigned int pitch,
168                   CM_SURFACE_FORMAT format,
169                   CmSurfaceManager *pSurfaceManager,
170                   bool isCmCreated);
171 
172     virtual ~CmSurface2DRTBase();
173 
174     int32_t Initialize(unsigned int index);
175 
176     unsigned int m_width;
177 
178     unsigned int m_height;
179 
180     unsigned int m_handle;
181 
182     unsigned int m_pitch;
183 
184     CM_SURFACE_FORMAT m_format;
185 
186     // a pointer to UMD resource, set to nullptr if no UMD resource related to
187     void *m_umdResource;
188 
189     // number of surfaces created as an alias
190     unsigned int m_numAliases;
191 
192     SurfaceIndex *m_aliasIndexes[CM_HAL_MAX_NUM_2D_ALIASES];
193 
194     CM_FRAME_TYPE m_frameType;
195 };
196 };  //namespace
197 
198 #endif  // #ifndef MEDIADRIVER_COMMON_CM_CMSURFACE2DRT_BASE_H_
199