xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/vp/hal/features/vp_tcc_filter.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2020-2022, 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     vp_tcc_filter.cpp
24 //! \brief    Defines the common interface for Total Color Control
25 //!           this file is for the base interface which is shared by all TCC in driver.
26 //!
27 #include "vp_tcc_filter.h"
28 #include "vp_vebox_cmd_packet_base.h"
29 #include "hw_filter.h"
30 #include "sw_filter_pipe.h"
31 
32 namespace vp {
VpTccFilter(PVP_MHWINTERFACE vpMhwInterface)33 VpTccFilter::VpTccFilter(PVP_MHWINTERFACE vpMhwInterface) :
34     VpFilter(vpMhwInterface)
35 {
36 
37 }
38 
Init()39 MOS_STATUS VpTccFilter::Init()
40 {
41     VP_FUNC_CALL();
42 
43     return MOS_STATUS_SUCCESS;
44 }
45 
Prepare()46 MOS_STATUS VpTccFilter::Prepare()
47 {
48     VP_FUNC_CALL();
49 
50     return MOS_STATUS_SUCCESS;
51 }
52 
Destroy()53 MOS_STATUS VpTccFilter::Destroy()
54 {
55     VP_FUNC_CALL();
56 
57     if (m_pVeboxTccParams)
58     {
59         MOS_FreeMemAndSetNull(m_pVeboxTccParams);
60     }
61 
62     return MOS_STATUS_SUCCESS;
63 }
64 
SetExecuteEngineCaps(FeatureParamTcc & tccParams,VP_EXECUTE_CAPS vpExecuteCaps)65 MOS_STATUS VpTccFilter::SetExecuteEngineCaps(
66     FeatureParamTcc &tccParams,
67     VP_EXECUTE_CAPS vpExecuteCaps)
68 {
69     VP_FUNC_CALL();
70 
71     m_tccParams = tccParams;
72     m_executeCaps   = vpExecuteCaps;
73 
74     return MOS_STATUS_SUCCESS;
75 }
76 
CalculateEngineParams()77 MOS_STATUS VpTccFilter::CalculateEngineParams()
78 {
79     VP_FUNC_CALL();
80     if (m_executeCaps.bVebox)
81     {
82         // create a filter Param buffer
83         if (!m_pVeboxTccParams)
84         {
85             m_pVeboxTccParams = (PVEBOX_TCC_PARAMS)MOS_AllocAndZeroMemory(sizeof(VEBOX_TCC_PARAMS));
86 
87             if (m_pVeboxTccParams == nullptr)
88             {
89                 VP_PUBLIC_ASSERTMESSAGE("Vebox Tcc Pamas buffer allocate failed, return nullpointer");
90                 return MOS_STATUS_NO_SPACE;
91             }
92         }
93         else
94         {
95             MOS_ZeroMemory(m_pVeboxTccParams, sizeof(VEBOX_TCC_PARAMS));
96         }
97 
98         m_pVeboxTccParams->bEnableTCC = m_tccParams.bEnableTCC;
99         m_pVeboxTccParams->Blue = m_tccParams.Blue;
100         m_pVeboxTccParams->Red = m_tccParams.Red;
101         m_pVeboxTccParams->Yellow = m_tccParams.Yellow;
102         m_pVeboxTccParams->Cyan = m_tccParams.Cyan;
103         m_pVeboxTccParams->Green = m_tccParams.Green;
104         m_pVeboxTccParams->Magenta = m_tccParams.Magenta;
105     }
106     else
107     {
108         VP_PUBLIC_ASSERTMESSAGE("Wrong engine caps! Vebox should be used for TCC");
109         return MOS_STATUS_INVALID_PARAMETER;
110     }
111 
112     return MOS_STATUS_SUCCESS;
113 }
114 
115 
116 /****************************************************************************************************/
117 /*                                   HwFilter Tcc Parameter                                         */
118 /****************************************************************************************************/
Create(HW_FILTER_TCC_PARAM & param,FeatureType featureType)119 HwFilterParameter *HwFilterTccParameter::Create(HW_FILTER_TCC_PARAM &param, FeatureType featureType)
120 {
121     VP_FUNC_CALL();
122 
123     HwFilterTccParameter *p = MOS_New(HwFilterTccParameter, featureType);
124     if (p)
125     {
126         if (MOS_FAILED(p->Initialize(param)))
127         {
128             MOS_Delete(p);
129             return nullptr;
130         }
131     }
132     return p;
133 }
134 
HwFilterTccParameter(FeatureType featureType)135 HwFilterTccParameter::HwFilterTccParameter(FeatureType featureType) : HwFilterParameter(featureType)
136 {
137 }
138 
~HwFilterTccParameter()139 HwFilterTccParameter::~HwFilterTccParameter()
140 {
141 }
142 
ConfigParams(HwFilter & hwFilter)143 MOS_STATUS HwFilterTccParameter::ConfigParams(HwFilter &hwFilter)
144 {
145     VP_FUNC_CALL();
146 
147     return hwFilter.ConfigParam(m_Params);
148 }
149 
Initialize(HW_FILTER_TCC_PARAM & param)150 MOS_STATUS HwFilterTccParameter::Initialize(HW_FILTER_TCC_PARAM &param)
151 {
152     VP_FUNC_CALL();
153 
154     m_Params = param;
155     return MOS_STATUS_SUCCESS;
156 }
157 
158 /****************************************************************************************************/
159 /*                                   Packet Vebox Tcc Parameter                                       */
160 /****************************************************************************************************/
Create(HW_FILTER_TCC_PARAM & param)161 VpPacketParameter *VpVeboxTccParameter::Create(HW_FILTER_TCC_PARAM &param)
162 {
163     VP_FUNC_CALL();
164 
165     if (nullptr == param.pPacketParamFactory)
166     {
167         return nullptr;
168     }
169     VpVeboxTccParameter *p = dynamic_cast<VpVeboxTccParameter *>(param.pPacketParamFactory->GetPacketParameter(param.pHwInterface));
170     if (p)
171     {
172         if (MOS_FAILED(p->Initialize(param)))
173         {
174             VpPacketParameter *pParam = p;
175             param.pPacketParamFactory->ReturnPacketParameter(pParam);
176             return nullptr;
177         }
178     }
179     return p;
180 }
181 
VpVeboxTccParameter(PVP_MHWINTERFACE pHwInterface,PacketParamFactoryBase * packetParamFactory)182 VpVeboxTccParameter::VpVeboxTccParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase *packetParamFactory) :
183     VpPacketParameter(packetParamFactory), m_tccFilter(pHwInterface)
184 {
185 }
~VpVeboxTccParameter()186 VpVeboxTccParameter::~VpVeboxTccParameter() {}
187 
SetPacketParam(VpCmdPacket * pPacket)188 bool VpVeboxTccParameter::SetPacketParam(VpCmdPacket *pPacket)
189 {
190     VP_FUNC_CALL();
191 
192     VEBOX_TCC_PARAMS *params = m_tccFilter.GetVeboxParams();
193     if (nullptr == params)
194     {
195         VP_PUBLIC_ASSERTMESSAGE("Failed to get vebox tcc params");
196         return false;
197     }
198 
199     VpVeboxCmdPacketBase *packet = dynamic_cast<VpVeboxCmdPacketBase *>(pPacket);
200     if (packet)
201     {
202         return MOS_SUCCEEDED(packet->SetTccParams(params));
203     }
204 
205     VP_PUBLIC_ASSERTMESSAGE("Invalid packet for vebox csc");
206     return false;
207 }
208 
Initialize(HW_FILTER_TCC_PARAM & params)209 MOS_STATUS VpVeboxTccParameter::Initialize(HW_FILTER_TCC_PARAM &params)
210 {
211     VP_FUNC_CALL();
212 
213     VP_PUBLIC_CHK_STATUS_RETURN(m_tccFilter.Init());
214     VP_PUBLIC_CHK_STATUS_RETURN(m_tccFilter.SetExecuteEngineCaps(params.tccParams, params.vpExecuteCaps));
215     VP_PUBLIC_CHK_STATUS_RETURN(m_tccFilter.CalculateEngineParams());
216     return MOS_STATUS_SUCCESS;
217 }
218 
219 /****************************************************************************************************/
220 /*                                   Policy Vebox Tcc Handler                                         */
221 /****************************************************************************************************/
PolicyVeboxTccHandler(VP_HW_CAPS & hwCaps)222 PolicyVeboxTccHandler::PolicyVeboxTccHandler(VP_HW_CAPS &hwCaps) : PolicyFeatureHandler(hwCaps)
223 {
224     m_Type = FeatureTypeTccOnVebox;
225 }
~PolicyVeboxTccHandler()226 PolicyVeboxTccHandler::~PolicyVeboxTccHandler()
227 {
228 }
229 
IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)230 bool PolicyVeboxTccHandler::IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)
231 {
232     VP_FUNC_CALL();
233 
234     return vpExecuteCaps.bTCC;
235 }
236 
CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps,SwFilterPipe & swFilterPipe,PVP_MHWINTERFACE pHwInterface)237 HwFilterParameter* PolicyVeboxTccHandler::CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe& swFilterPipe, PVP_MHWINTERFACE pHwInterface)
238 {
239     VP_FUNC_CALL();
240 
241     if (IsFeatureEnabled(vpExecuteCaps))
242     {
243         if (SwFilterPipeType1To1 != swFilterPipe.GetSwFilterPipeType())
244         {
245             VP_PUBLIC_ASSERTMESSAGE("Invalid parameter! Sfc only support 1To1 swFilterPipe!");
246             return nullptr;
247         }
248 
249         SwFilterTcc *swFilter = dynamic_cast<SwFilterTcc *>(swFilterPipe.GetSwFilter(true, 0, FeatureTypeTccOnVebox));
250 
251         if (nullptr == swFilter)
252         {
253             VP_PUBLIC_ASSERTMESSAGE("Invalid parameter! Feature enabled in vpExecuteCaps but no swFilter exists!");
254             return nullptr;
255         }
256 
257         FeatureParamTcc &param = swFilter->GetSwFilterParams();
258 
259         HW_FILTER_TCC_PARAM paramTcc = {};
260         paramTcc.type = m_Type;
261         paramTcc.pHwInterface = pHwInterface;
262         paramTcc.vpExecuteCaps = vpExecuteCaps;
263         paramTcc.pPacketParamFactory = &m_PacketParamFactory;
264         paramTcc.tccParams = param;
265         paramTcc.pfnCreatePacketParam = PolicyVeboxTccHandler::CreatePacketParam;
266 
267         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
268 
269         if (pHwFilterParam)
270         {
271             if (MOS_FAILED(((HwFilterTccParameter*)pHwFilterParam)->Initialize(paramTcc)))
272             {
273                 ReleaseHwFeatureParameter(pHwFilterParam);
274             }
275         }
276         else
277         {
278             pHwFilterParam = HwFilterTccParameter::Create(paramTcc, m_Type);
279         }
280 
281         return pHwFilterParam;
282     }
283     else
284     {
285         return nullptr;
286     }
287 }
288 }
289