1 /*
2 * Copyright (c) 2017-2021, 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     mos_graphicsresource_specific.h
24 //! \brief   Container class for the linux/Android specfic graphic resource
25 //!
26 
27 #ifndef __GRAPHICS_RESOURCE_SPECIFIC_H__
28 #define __GRAPHICS_RESOURCE_SPECIFIC_H__
29 
30 #include "mos_graphicsresource.h"
31 
32 class GraphicsResourceSpecific : public GraphicsResource
33 {
34 public:
35     //!
36     //! \brief  Constructor
37     //!
38     GraphicsResourceSpecific();
39 
40     //!
41     //! \brief  Destructor
42     //!
43     ~GraphicsResourceSpecific();
44 
45     //!
46     //! \brief  to sync render target for multi-threading decoding mode
47     //!
48     struct HybridSem
49     {
50     public:
51         //!
52         //! \brief   Semaphore queue for hybrid decoding multi-threading case
53         //!
54         PMOS_SEMAPHORE* m_pCurrentFrameSemaphore   = nullptr;
55 
56         //!
57         //! \brief   Semaphore queue for hybrid decoding multi-threading case; post when a
58         //!          surface is not used as reference frame
59         //!
60         PMOS_SEMAPHORE* m_pReferenceFrameSemaphore = nullptr;
61 
62         //!
63         //! \brief   Flag to mark whether the semaphore has been initialized
64         //!
65         bool m_semInitialized = false;
66 
67     };
68 
69     //!
70     //! \brief  Add a sync tag to the graphic resource
71     //! \param  [in] osContextPtr
72     //!         Pointer to the osContext handle
73     //! \param  [in] params
74     //!         Parameters to do the synchronization
75     //! \return MOS_SUCCESS on success case
76     //!
77     MOS_STATUS SetSyncTag(OsContext* osContextPtr, SyncParams& params, uint32_t streamIndex);
78 
79     //!
80     //! \brief  Check whether the resource is nullptr
81     //! \return ture if the resource is nullptr, false on other cases
82     //!
83     bool ResourceIsNull();
84 
85     //!
86     //! \brief  Allocate the graphic memory to back up the graphic resource
87     //! \param  [in] osContextPtr
88     //!         Pointer to the osContext handle
89     //! \param  [in] params
90     //!         Resource creation Params
91     //! \return MOS_STATUS_SUCCESS on success case, MOS error status on fail cases
92     //!
93     MOS_STATUS Allocate(OsContext* osContextPtr, CreateParams& params);
94 
95     //!
96     //! \brief  Frees the specified resource with flag, if locked, unlocks it.
97     //! \param  [in] osContextPtr
98     //!         Pointer to the osContext handle
99     //! \param  [in] freeFlag
100     //!         flags for the free operation
101     //!
102     void Free(OsContext* osContextPtr, uint32_t  freeFlag = 0);
103 
104     //!
105     //! \brief  Check whether the specific graphic resources is equal to the current one
106     //! \param  [in] toCompare
107     //!         ptr to the graphics resource to be compared with
108     //! \return Returns true if the two resources are equal and false otherwise.
109     //!
110     bool IsEqual(GraphicsResource* toCompare);
111 
112     //!
113     //! \brief  Check whether the current graphic resource is valid
114     //! \return Returns true if a resource is valid and false otherwise.
115     //!
116     bool IsValid();
117 
118     //!
119     //! \brief  Locks a resource and returns a mapped system memory pointer.
120     //! \param  [in] osContextPtr
121     //!         Pointer to the osContext handle
122     //! \param  [in] params
123     //!         Resource lock Params
124     //! \return CPU side lock address in success case, nullptr in fail cases
125     //!
126     void* Lock(OsContext* osContextPtr, LockParams& params);
127 
128     //!
129     //! \brief  Unlocks a resource that has already been locked, if no lock has
130     //!         occurred, this function does nothing
131     //! \param  [in] osContextPtr
132     //!         Pointer to the osContext handle
133     //! \return MOS_SUCCESS in success case, MOS error status in fail cases
134     //!
135     MOS_STATUS Unlock(OsContext* osContextPtr);
136 
137     //!
138     //! \brief  Converts an OS specific resource to a MOS resource.
139     //! \param  [in] mosResourcePtr
140     //!         ptr to the MosResource to be filled w/ the conversion result
141     //! \return MOS_SUCCESS on success case
142     //!
143     MOS_STATUS ConvertToMosResource(MOS_RESOURCE* mosResourcePtr);
144 
GetBufferObject()145     MOS_LINUX_BO*  GetBufferObject(){return m_bo;};
146 
147 protected:
148     //!
149     //! \brief  Converts MOS format infot GMM format.
150     //! \return the converting result.
151     //!
152     GMM_RESOURCE_FORMAT ConvertMosFmtToGmmFmt(MOS_FORMAT format);
153 
154     //!
155     //! \brief  Set tilemode by force to GMM info flag.
156     //! \return MOS_SUCCESS on success case.
157     //!
158     MOS_STATUS SetTileModebyForce(GMM_RESCREATE_PARAMS &gmmParams, MOS_TILE_MODE_GMM tileMode);
159 
160 private:
161 
162     //!
163     //! \brief  Pointer to the GMM info structure
164     //!
165     GMM_RESOURCE_INFO* m_gmmResInfo = nullptr;
166 
167     //!
168     //! \brief  Whether the graphic resource is mapped at CPU side
169     //!
170     bool m_mapped = false;
171 
172     //!
173     //! \brief  The map operation type we use
174     //!
175     MOS_MMAP_OPERATION m_mmapOperation = MOS_MMAP_OPERATION_NONE;
176 
177     //!
178     //! \brief  the ptr to the buffer object of the graphic buffer
179     //!
180     MOS_LINUX_BO* m_bo = nullptr;
181 
182     //!
183     //! \brief  the semaphore used in hybrid decoder corresponding to the graphic buffer
184     //!
185     HybridSem m_hybridSem = {};
186 
187     uint8_t*  m_systemShadow = nullptr;     //!< System shadow surface for s/w untiling
188 };
189 #endif // #ifndef __GRAPHICS_RESOURCE_SPECIFIC_H__
190 
191