1 /*
2 * Copyright (c) 2019, 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 //!
24 //! \file     vp_feature_manager.h
25 //! \brief    Defines the common interface for vp features manager
26 //! \details  The vp manager is further sub-divided by vp type
27 //!           this file is for the base interface which is shared by all components.
28 //!
29 #ifndef __VP_FEATURE_MANAGER_H__
30 #define __VP_FEATURE_MANAGER_H__
31 
32 #include "media_feature_manager.h"
33 #include "vp_utils.h"
34 #include "vp_pipeline_common.h"
35 #include "vp_allocator.h"
36 #include "vp_obj_factories.h"
37 #include "vp_user_feature_control.h"
38 
39 namespace vp
40 {
41 class SwFilterFeatureHandler;
42 class VpResourceManager;
43 
44 class VPFeatureManager : public MediaFeatureManager
45 {
46 public:
47     //!
48     //! \brief  VPFeatureManager constructor
49     //! \param  [in] hwInterface
50     //!         Pointer to VP_MHWINTERFACE
51     //! \param  [in] pOsInterface
52     //!         Pointer to MOS INTERFACE
53     //!
54     VPFeatureManager(PVP_MHWINTERFACE hwInterface);
55 
56     //!
57     //! \brief  VPFeatureManager deconstructor
58     //!
~VPFeatureManager()59     virtual ~VPFeatureManager() {}
60 
61     //!
62     //! \brief  Check the conflict between features
63     //! \param  [in] params
64     //!         encode parameters
65     //! \return MOS_STATUS
66     //!         MOS_STATUS_SUCCESS if success, else fail reason
67     //!
68     virtual MOS_STATUS CheckFeatures(void *params, bool &bapgFuncSupported);
69 
70     //!
71     //! \brief  Check the conflict between features
72     //! \param  [in] params
73     //!         encode parameters
74     //! \return MOS_STATUS
75     //!         MOS_STATUS_SUCCESS if success, else fail reason
76     //!
77     virtual MOS_STATUS CheckFeatures(void *params);
78 
79 protected:
80     //!
81     //! \brief    Check if HDR are needed
82     //! \param    [in] pSrc
83     //!           Pointer to input surface of Vebox
84     //! \param    [in] pRenderTarget
85     //!           Pointer to Render targe surface of VPP BLT
86     //! \return   bool
87     //!           return true if 2 Passes CSC is needed, otherwise false
88     //!
89     virtual bool IsHdrNeeded(
90         PVPHAL_SURFACE              pSrc,
91         PVPHAL_SURFACE              pRenderTarget);
92 
93     virtual bool IsCroppingNeeded(PVPHAL_SURFACE pSrc);
94     //!
95     //! \brief    Check if 2 passes CSC are needed
96     //! \param    [in] pSrc
97     //!           Pointer to input surface of Vebox
98     //! \param    [in] pRenderTarget
99     //!           Pointer to Render targe surface of VPP BLT
100     //! \return   bool
101     //!           return true if 2 Passes CSC is needed, otherwise false
102     //!
103     virtual bool Is2PassesCSCNeeded(
104         PVPHAL_SURFACE              pSrc,
105         PVPHAL_SURFACE              pRenderTarget);
106 
107     virtual bool IsVeboxOutFeasible(PVP_PIPELINE_PARAMS params);
108 
109     virtual bool IsVeboxInputFormatSupport(PVPHAL_SURFACE pSrcSurface);
110 
111     virtual bool IsVeboxRTFormatSupport(
112         PVPHAL_SURFACE pSrcSurface,
113         PVPHAL_SURFACE pRTSurface);
114 
115     virtual bool IsVeboxSupported(PVP_PIPELINE_PARAMS params);
116 
117     virtual bool IsSfcOutputFeasible(PVP_PIPELINE_PARAMS params);
118 
119     virtual bool IsOutputFormatSupported(
120         PVPHAL_SURFACE              outSurface);
121 
122     virtual bool IsRGBOutputFormatSupported(
123         PVPHAL_SURFACE              outSurface);
124 
125     virtual bool IsNV12P010OutputFormatSupported(
126         PVPHAL_SURFACE              outSurface);
127 
128     //!
129     //! \brief    Get the aligned the surface height and width unit
130     //! \details  According to the format of the surface, get the aligned unit for the surface
131     //!           width and height
132     //! \param    [in,out] pwWidthAlignUnit
133     //!           Pointer to the surface width alignment unit
134     //! \param    [in,out] pwHeightAlignUnit
135     //!           Pointer to the surface height alignment unit
136     //! \param    [in] format
137     //!           The format of the surface
138     //! \return   void
139     //!
140     virtual void GetAlignUnit(
141         uint16_t        &wWidthAlignUnit,
142         uint16_t        &wHeightAlignUnit,
143         MOS_FORMAT      format);
144 
145     //!
146     //! \brief    Align the src/dst surface rectangle and surface width/height
147     //! \details  The surface rects and width/height need to be aligned according to the surface format
148     //! \param    [in,out] pSurface
149     //!           Pointer to the surface
150     //! \param    [in] formatForDstRect
151     //!           Format for Dst Rect
152     //! \return   MOS_STATUS
153     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
154     //!
155     virtual MOS_STATUS RectSurfaceAlignment(
156         PVPHAL_SURFACE       pSurface,
157         MOS_FORMAT           formatForDstRect);
158 
IsSfcInterlacedScalingSupported()159     virtual bool IsSfcInterlacedScalingSupported()
160     {
161         return false;
162     }
163 
164     virtual bool IsDiFormatSupported(MOS_FORMAT format);
165     virtual bool IsVeboxSurfaceHeightAligned(VPHAL_SURFACE &surf);
166 
167 protected:
168     PVP_MHWINTERFACE           m_hwInterface       = nullptr;
169     PMOS_INTERFACE             m_pOsInterface      = nullptr;
170     vp::VpUserFeatureControl   *m_vpUserFeatureControl = nullptr;
171 
172 MEDIA_CLASS_DEFINE_END(vp__VPFeatureManager)
173 };
174 
175 class VpFeatureManagerNext : public MediaFeatureManager
176 {
177 public:
178     VpFeatureManagerNext(VpInterface& vpInterface);
179     virtual ~VpFeatureManagerNext();
180 
181     virtual MOS_STATUS Init(void* settings) override;
182     virtual MOS_STATUS InitPacketPipe(SwFilterPipe& swFilterPipe,
183         PacketPipe& packetPipe);
184 
185     //!
186     //! \brief    Check whether VEBOX-SFC Format Supported
187     //! \details  Check whether VEBOX-SFC Format Supported.
188     //! \param    inputFormat
189     //!           [in] Format of Input Frame
190     //! \param    outputFormat
191     //!           [in] Format of Output Frame
192     //! \return   bool
193     //!           Return true if supported, otherwise failed
194     //!
195     bool IsVeboxSfcFormatSupported(MOS_FORMAT formatInput, MOS_FORMAT formatOutput);
196 
GetPolicy()197     Policy *GetPolicy()
198     {
199         return m_policy;
200     }
201 
202 protected:
203     MOS_STATUS CreateHwFilterPipe(SwFilterPipe& swFilterPipe, HwFilterPipe*& pHwFilterPipe);
204     MOS_STATUS UpdateResources(HwFilterPipe& hwFilterPipe);
205 
206     virtual MOS_STATUS RegisterFeatures();
207     MOS_STATUS UnregisterFeatures();
208 
209     VpInterface          &m_vpInterface;
210     Policy               *m_policy = nullptr;
211     std::map<FeatureType, SwFilterFeatureHandler*> m_featureHandler;
212     uint32_t             m_isFeatureRegistered = false;
213 
214 MEDIA_CLASS_DEFINE_END(vp__VpFeatureManagerNext)
215 };
216 }
217 #endif // !__VP_FEATURE_MANAGER_H__
218