1 /*
2 * Copyright (c) 2024, 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_fc_wrap_filter.cpp
24 //! \brief Defines the common interface for fc wrap
25 //! this file is for the base interface which is shared by all fc wrap in driver.
26 //!
27 #include "vp_fc_wrap_filter.h"
28
29 namespace vp
30 {
PolicyFcFeatureWrapHandler(VP_HW_CAPS & hwCaps,bool enableL0FC)31 PolicyFcFeatureWrapHandler::PolicyFcFeatureWrapHandler(VP_HW_CAPS &hwCaps, bool enableL0FC) : PolicyFeatureHandler(hwCaps), m_enableL0FC(enableL0FC)
32 {
33 m_Type = FeatureTypeFc;
34 if (m_l0fcFeatureHandler == nullptr)
35 {
36 m_l0fcFeatureHandler = MOS_New(PolicyL0FcFeatureHandler, hwCaps);
37 }
38 if (m_fcFeatureHandler == nullptr)
39 {
40 m_fcFeatureHandler = MOS_New(PolicyFcFeatureHandler, hwCaps);
41 }
42 }
43
~PolicyFcFeatureWrapHandler()44 PolicyFcFeatureWrapHandler::~PolicyFcFeatureWrapHandler()
45 {
46 MOS_Delete(m_l0fcFeatureHandler);
47 m_l0fcFeatureHandler = nullptr;
48 MOS_Delete(m_fcFeatureHandler);
49 m_fcFeatureHandler = nullptr;
50 }
51
IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)52 bool PolicyFcFeatureWrapHandler::IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)
53 {
54 if (m_enableL0FC && !vpExecuteCaps.bFallbackLegacyFC)
55 {
56 if (!m_l0fcFeatureHandler)
57 {
58 VP_PUBLIC_ASSERTMESSAGE("m_l0fcFeatureHandler is nullptr");
59 return false;
60 }
61 return m_l0fcFeatureHandler->IsFeatureEnabled(vpExecuteCaps);
62 }
63 else
64 {
65 if (!m_fcFeatureHandler)
66 {
67 VP_PUBLIC_ASSERTMESSAGE("m_fcFeatureHandler is nullptr");
68 return false;
69 }
70 return m_fcFeatureHandler->IsFeatureEnabled(vpExecuteCaps);
71 }
72 }
73
CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps,SwFilterPipe & swFilterPipe,PVP_MHWINTERFACE pHwInterface)74 HwFilterParameter *PolicyFcFeatureWrapHandler::CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface)
75 {
76 if (m_enableL0FC && !vpExecuteCaps.bFallbackLegacyFC)
77 {
78 if (!m_l0fcFeatureHandler)
79 {
80 VP_PUBLIC_ASSERTMESSAGE("m_l0fcFeatureHandler is nullptr");
81 return nullptr;
82 }
83 return m_l0fcFeatureHandler->CreateHwFilterParam(vpExecuteCaps, swFilterPipe, pHwInterface);
84 }
85 else
86 {
87 if (!m_fcFeatureHandler)
88 {
89 VP_PUBLIC_ASSERTMESSAGE("m_fcFeatureHandler is nullptr");
90 return nullptr;
91 }
92 return m_fcFeatureHandler->CreateHwFilterParam(vpExecuteCaps, swFilterPipe, pHwInterface);
93 }
94 }
95
UpdateFeaturePipe(VP_EXECUTE_CAPS caps,SwFilter & feature,SwFilterPipe & featurePipe,SwFilterPipe & executePipe,bool isInputPipe,int index)96 MOS_STATUS PolicyFcFeatureWrapHandler::UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
97 {
98 if (m_enableL0FC && !caps.bFallbackLegacyFC)
99 {
100 VP_PUBLIC_CHK_NULL_RETURN(m_l0fcFeatureHandler);
101 return m_l0fcFeatureHandler->UpdateFeaturePipe(caps, feature, featurePipe, executePipe, isInputPipe, index);
102 }
103 else
104 {
105 VP_PUBLIC_CHK_NULL_RETURN(m_fcFeatureHandler);
106 return m_fcFeatureHandler->UpdateFeaturePipe(caps, feature, featurePipe, executePipe, isInputPipe, index);
107 }
108 }
109
UpdateUnusedFeature(VP_EXECUTE_CAPS caps,SwFilter & feature,SwFilterPipe & featurePipe,SwFilterPipe & executePipe,bool isInputPipe,int index)110 MOS_STATUS PolicyFcFeatureWrapHandler::UpdateUnusedFeature(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
111 {
112 if (m_enableL0FC && !caps.bFallbackLegacyFC)
113 {
114 VP_PUBLIC_CHK_NULL_RETURN(m_l0fcFeatureHandler);
115 return m_l0fcFeatureHandler->UpdateUnusedFeature(caps, feature, featurePipe, executePipe, isInputPipe, index);
116 }
117 else
118 {
119 VP_PUBLIC_CHK_NULL_RETURN(m_fcFeatureHandler);
120 return m_fcFeatureHandler->UpdateUnusedFeature(caps, feature, featurePipe, executePipe, isInputPipe, index);
121 }
122 }
123
ReleaseHwFeatureParameter(HwFilterParameter * & pParam)124 MOS_STATUS PolicyFcFeatureWrapHandler::ReleaseHwFeatureParameter(HwFilterParameter *&pParam)
125 {
126 HwFilterFcParameter *fcParam = dynamic_cast<HwFilterFcParameter *>(pParam);
127 if (fcParam)
128 {
129 //this is a legacy FC hw filter param, return it to legacy FC handler
130 VP_PUBLIC_CHK_NULL_RETURN(m_fcFeatureHandler);
131 return m_fcFeatureHandler->ReleaseHwFeatureParameter(pParam);
132 }
133 else
134 {
135 HwFilterL0FcParameter *l0fcParam = dynamic_cast<HwFilterL0FcParameter *>(pParam);
136 VP_PUBLIC_CHK_NULL_RETURN(l0fcParam);
137 //this is a L0 FC hw filter param, return it to L0 FC handler
138 VP_PUBLIC_CHK_NULL_RETURN(m_l0fcFeatureHandler);
139 return m_l0fcFeatureHandler->ReleaseHwFeatureParameter(pParam);
140 }
141 }
142
PolicyFcWrapHandler(VP_HW_CAPS & hwCaps,bool enableL0FC)143 PolicyFcWrapHandler::PolicyFcWrapHandler(VP_HW_CAPS &hwCaps, bool enableL0FC) : PolicyFeatureHandler(hwCaps), m_enableL0FC(enableL0FC)
144 {
145 m_Type = FeatureTypeFc;
146 if (m_l0fcHandler == nullptr)
147 {
148 m_l0fcHandler = MOS_New(PolicyL0FcHandler, hwCaps);
149 }
150 if (m_fcHandler == nullptr)
151 {
152 m_fcHandler = MOS_New(PolicyFcHandler, hwCaps);
153 }
154 }
155
~PolicyFcWrapHandler()156 PolicyFcWrapHandler::~PolicyFcWrapHandler()
157 {
158 MOS_Delete(m_l0fcHandler);
159 m_l0fcHandler = nullptr;
160 MOS_Delete(m_fcHandler);
161 m_fcHandler = nullptr;
162 }
163
CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps,SwFilterPipe & swFilterPipe,PVP_MHWINTERFACE pHwInterface)164 HwFilterParameter *PolicyFcWrapHandler::CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface)
165 {
166 if (m_enableL0FC && !vpExecuteCaps.bFallbackLegacyFC)
167 {
168 if (!m_l0fcHandler)
169 {
170 VP_PUBLIC_ASSERTMESSAGE("m_l0fcHandler is nullptr");
171 return nullptr;
172 }
173 return m_l0fcHandler->CreateHwFilterParam(vpExecuteCaps, swFilterPipe, pHwInterface);
174 }
175 else
176 {
177 if (!m_fcHandler)
178 {
179 VP_PUBLIC_ASSERTMESSAGE("m_fcHandler is nullptr");
180 return nullptr;
181 }
182 return m_fcHandler->CreateHwFilterParam(vpExecuteCaps, swFilterPipe, pHwInterface);
183 }
184 }
185
IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)186 bool PolicyFcWrapHandler::IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)
187 {
188 if (m_enableL0FC && !vpExecuteCaps.bFallbackLegacyFC)
189 {
190 if (!m_l0fcHandler)
191 {
192 VP_PUBLIC_ASSERTMESSAGE("m_l0fcHandler is nullptr");
193 return false;
194 }
195 return m_l0fcHandler->IsFeatureEnabled(vpExecuteCaps);
196 }
197 else
198 {
199 if (!m_fcHandler)
200 {
201 VP_PUBLIC_ASSERTMESSAGE("m_fcHandler is nullptr");
202 return false;
203 }
204 return m_fcHandler->IsFeatureEnabled(vpExecuteCaps);
205 }
206 }
207
UpdateFeaturePipe(VP_EXECUTE_CAPS caps,SwFilter & feature,SwFilterPipe & featurePipe,SwFilterPipe & executePipe,bool isInputPipe,int index)208 MOS_STATUS PolicyFcWrapHandler::UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
209 {
210 if (m_enableL0FC && !caps.bFallbackLegacyFC)
211 {
212 VP_PUBLIC_CHK_NULL_RETURN(m_l0fcHandler);
213 return m_l0fcHandler->UpdateFeaturePipe(caps, feature, featurePipe, executePipe, isInputPipe, index);
214 }
215 else
216 {
217 VP_PUBLIC_CHK_NULL_RETURN(m_fcHandler);
218 return m_fcHandler->UpdateFeaturePipe(caps, feature, featurePipe, executePipe, isInputPipe, index);
219 }
220 }
221
UpdateUnusedFeature(VP_EXECUTE_CAPS caps,SwFilter & feature,SwFilterPipe & featurePipe,SwFilterPipe & executePipe,bool isInputPipe,int index)222 MOS_STATUS PolicyFcWrapHandler::UpdateUnusedFeature(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
223 {
224 if (m_enableL0FC && !caps.bFallbackLegacyFC)
225 {
226 VP_PUBLIC_CHK_NULL_RETURN(m_l0fcHandler);
227 return m_l0fcHandler->UpdateUnusedFeature(caps, feature, featurePipe, executePipe, isInputPipe, index);
228 }
229 else
230 {
231 VP_PUBLIC_CHK_NULL_RETURN(m_fcHandler);
232 return m_fcHandler->UpdateUnusedFeature(caps, feature, featurePipe, executePipe, isInputPipe, index);
233 }
234 }
235
LayerSelectForProcess(std::vector<int> & layerIndexes,SwFilterPipe & featurePipe,VP_EXECUTE_CAPS & caps)236 MOS_STATUS PolicyFcWrapHandler::LayerSelectForProcess(std::vector<int> &layerIndexes, SwFilterPipe &featurePipe, VP_EXECUTE_CAPS &caps)
237 {
238 if (m_enableL0FC && !caps.bFallbackLegacyFC)
239 {
240 VP_PUBLIC_CHK_NULL_RETURN(m_l0fcHandler);
241 return m_l0fcHandler->LayerSelectForProcess(layerIndexes, featurePipe, caps);
242 }
243 else
244 {
245 VP_PUBLIC_CHK_NULL_RETURN(m_fcHandler);
246 return m_fcHandler->LayerSelectForProcess(layerIndexes, featurePipe, caps);
247 }
248 }
249
ReleaseHwFeatureParameter(HwFilterParameter * & pParam)250 MOS_STATUS PolicyFcWrapHandler::ReleaseHwFeatureParameter(HwFilterParameter *&pParam)
251 {
252 HwFilterFcParameter *fcParam = dynamic_cast<HwFilterFcParameter *>(pParam);
253 if (fcParam)
254 {
255 //this is a legacy FC hw filter param, return it to legacy FC handler
256 VP_PUBLIC_CHK_NULL_RETURN(m_fcHandler);
257 return m_fcHandler->ReleaseHwFeatureParameter(pParam);
258 }
259 else
260 {
261 HwFilterL0FcParameter *l0fcParam = dynamic_cast<HwFilterL0FcParameter *>(pParam);
262 VP_PUBLIC_CHK_NULL_RETURN(l0fcParam);
263 //this is a L0 FC hw filter param, return it to L0 FC handler
264 VP_PUBLIC_CHK_NULL_RETURN(m_l0fcHandler);
265 return m_l0fcHandler->ReleaseHwFeatureParameter(pParam);
266 }
267 }
268
269 } // namespace vp