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