xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/cm/cm_kernel_data.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2017, 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      cm_kernel_data.cpp
24 //! \brief     Contains Class CmKernelData definitions
25 //!
26 
27 #include "cm_kernel_data.h"
28 
29 #include "cm_device.h"
30 #include "cm_mem.h"
31 
32 #define minimum(a,b) (((a)<(b))?(a):(b))
33 
34 namespace CMRT_UMD
35 {
36 //*-----------------------------------------------------------------------------
37 //| Purpose:    Create Kernel Data
38 //| Returns:    Result of the operation.
39 //*-----------------------------------------------------------------------------
Create(CmKernelRT * kernel,CmKernelData * & kernelData)40 int32_t CmKernelData::Create( CmKernelRT* kernel, CmKernelData*& kernelData )
41 {
42     if(!kernel)
43     {
44         CM_ASSERTMESSAGE("Error: Invalid CmKernel.");
45         return CM_NULL_POINTER;
46     }
47 
48     int32_t result = CM_SUCCESS;
49     kernelData = new (std::nothrow) CmKernelData( kernel );
50     if( kernelData )
51     {
52         kernelData->Acquire();
53         result = kernelData->Initialize();
54         if( result != CM_SUCCESS )
55         {
56             CmKernelData::Destroy( kernelData );
57         }
58     }
59     else
60     {
61         CM_ASSERTMESSAGE("Error: Failed to create CmKernelData due to out of system memory.");
62         result = CM_OUT_OF_HOST_MEMORY;
63     }
64     return result;
65 }
66 
67 //*-----------------------------------------------------------------------------
68 //| Purpose:    Destroy CM Kernel Data
69 //| Returns:    Result of the operation.
70 //*-----------------------------------------------------------------------------
Destroy(CmKernelData * & kernelData)71 int32_t CmKernelData::Destroy( CmKernelData* &kernelData )
72 {
73     if(kernelData)
74     {
75         uint32_t refCount;
76         refCount = kernelData->SafeRelease();
77         if (refCount == 0)
78         {
79             kernelData = nullptr;
80         }
81     }
82 
83     return CM_SUCCESS;
84 }
85 
86 //*-----------------------------------------------------------------------------
87 //| Purpose:    CM Kernel Data constructor
88 //| Returns:    Result of the operation.
89 //*-----------------------------------------------------------------------------
CmKernelData(CmKernelRT * kernel)90 CmKernelData::CmKernelData(  CmKernelRT* kernel ):
91     m_kerneldatasize( 0 ),
92     m_kernel(kernel),
93     m_refCount(0),
94     m_isInUse(true)
95 {
96    CmSafeMemSet(&m_halKernelParam, 0, sizeof(CM_HAL_KERNEL_PARAM));
97    m_halKernelParam.samplerHeap = MOS_New( std::list<SamplerParam> );
98 }
99 
100 //*-----------------------------------------------------------------------------
101 //| Purpose:    CM Kernel Data Destructor
102 //| Returns:    Result of the operation.
103 //*-----------------------------------------------------------------------------
~CmKernelData(void)104 CmKernelData::~CmKernelData( void )
105 {
106     //Free memory space for kernel arguments
107     for(uint32_t i = 0; i< m_halKernelParam.numArgs; i++)
108     {
109         MosSafeDeleteArray(m_halKernelParam.argParams[i].firstValue);
110     }
111     for(uint32_t i = m_halKernelParam.numArgs; i< minimum(m_halKernelParam.numArgs+6, CM_MAX_ARGS_PER_KERNEL); i++)
112     {
113         MosSafeDeleteArray(m_halKernelParam.argParams[i].firstValue);
114     }
115 
116     //Free memory for indirect data
117     MosSafeDeleteArray(m_halKernelParam.indirectDataParam.indirectData);
118     MosSafeDeleteArray(m_halKernelParam.indirectDataParam.surfaceInfo);
119 
120     //Free memory for thread space param
121     MosSafeDeleteArray(m_halKernelParam.kernelThreadSpaceParam.dispatchInfo.numThreadsInWave);
122     MosSafeDeleteArray(m_halKernelParam.kernelThreadSpaceParam.threadCoordinates);
123 
124     // Free memory for move instructions
125     MosSafeDeleteArray(m_halKernelParam.movInsData);
126 
127     //Frees memory for sampler heap
128     MosSafeDelete(m_halKernelParam.samplerHeap);
129 }
130 
131 //*-----------------------------------------------------------------------------
132 //| Purpose:    Do nothing in initialization
133 //| Returns:    CM_SUCCESS
134 //*-----------------------------------------------------------------------------
Initialize(void)135 int32_t CmKernelData::Initialize( void )
136 {
137 
138    return CM_SUCCESS;
139 }
140 
141 //*-----------------------------------------------------------------------------
142 //| Purpose:    Get Kernel Data pointer
143 //| Returns:    Result of the operation.
144 //*-----------------------------------------------------------------------------
GetCmKernel(CmKernelRT * & kernel)145 int32_t CmKernelData::GetCmKernel( CmKernelRT*& kernel )
146 {
147     kernel = m_kernel;
148     return CM_SUCCESS;
149 }
150 
151 //*-----------------------------------------------------------------------------
152 //| Purpose:    SET Kernel Data pointer
153 //| Returns:    Result of the operation.
154 //*-----------------------------------------------------------------------------
SetKernelDataSize(int32_t value)155 int32_t CmKernelData::SetKernelDataSize(int32_t value)
156 {
157     m_kerneldatasize = value;
158     return CM_SUCCESS;
159 }
160 
161 //*-----------------------------------------------------------------------------
162 //| Purpose:    Get Kernel Data pointer
163 //| Returns:    Result of the operation.
164 //*-----------------------------------------------------------------------------
GetKernelDataSize()165 int32_t CmKernelData::GetKernelDataSize()
166 {
167     return m_kerneldatasize;
168 }
169 
170 //*-----------------------------------------------------------------------------
171 //| Purpose:    Increase Reference count
172 //| Returns:    Result of the operation.
173 //*-----------------------------------------------------------------------------
Acquire(void)174 uint32_t CmKernelData::Acquire( void )
175 {
176     ++m_refCount;
177 
178     m_isInUse  = true; // reused or created
179 
180     return m_refCount;
181 }
182 
183 //*-----------------------------------------------------------------------------
184 //| Purpose:    Destroy of Cm kernel data
185 //| Returns:    Result of the operation.
186 //*-----------------------------------------------------------------------------
SafeRelease()187 uint32_t CmKernelData::SafeRelease( )
188 {
189 
190     --m_refCount;
191     if( m_refCount == 0 )
192     {
193         delete this;
194         return 0;
195     }
196     else
197     {
198         return m_refCount;
199     }
200 }
201 
202 //*-----------------------------------------------------------------------------
203 //| Purpose:    Get HalCmKernelData
204 //| Returns:    Result of the operation.
205 //*-----------------------------------------------------------------------------
GetHalCmKernelData()206 PCM_HAL_KERNEL_PARAM CmKernelData::GetHalCmKernelData( )
207 {
208     return &m_halKernelParam;
209 }
210 
211 //*-----------------------------------------------------------------------------
212 //| Purpose:    Whether the kernel data is in use
213 //| Returns:    Result of the operation.
214 //*-----------------------------------------------------------------------------
IsInUse()215 bool CmKernelData::IsInUse()
216 {
217     return m_isInUse;
218 }
219 
220 //*-----------------------------------------------------------------------------
221 //| Purpose:    Get Curbe Size from kernel data
222 //| Returns:    Result of the operation.
223 //*-----------------------------------------------------------------------------
GetKernelCurbeSize(void)224 uint32_t CmKernelData::GetKernelCurbeSize( void )
225 {
226     return m_halKernelParam.totalCurbeSize;
227 }
228 
229 //*-----------------------------------------------------------------------------
230 //| Purpose:    Reset Kernel data status to IDLE. It will be called once kernel data flushed.
231 //| Returns:    CM_SUCCESS.
232 //*-----------------------------------------------------------------------------
ResetStatus(void)233 int32_t CmKernelData::ResetStatus( void )
234 {
235     m_isInUse = false;
236 
237     return CM_SUCCESS;
238 }
239 }  // namespace
240