1 /*
2 * Copyright (c) 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_hdr_render_filter.cpp
24 //! \brief    Defines the common interface for Adaptive Contrast Enhancement
25 //!           this file is for the base interface which is shared by all Hdr in driver.
26 //!
27 #include "vp_hdr_render_filter.h"
28 #include "hw_filter.h"
29 #include "sw_filter_pipe.h"
30 #include "vp_render_cmd_packet.h"
31 
32 namespace vp
33 {
VpHdrRenderFilter(PVP_MHWINTERFACE vpMhwInterface)34 VpHdrRenderFilter::VpHdrRenderFilter(PVP_MHWINTERFACE vpMhwInterface) :
35     VpFilter(vpMhwInterface)
36 {
37 }
38 
Init()39 MOS_STATUS VpHdrRenderFilter::Init()
40 {
41     VP_FUNC_CALL();
42 
43     return MOS_STATUS_SUCCESS;
44 }
45 
Prepare()46 MOS_STATUS VpHdrRenderFilter::Prepare()
47 {
48     VP_FUNC_CALL();
49 
50     return MOS_STATUS_SUCCESS;
51 }
52 
Destroy()53 MOS_STATUS VpHdrRenderFilter::Destroy()
54 {
55     VP_FUNC_CALL();
56 
57     return MOS_STATUS_SUCCESS;
58 }
59 
SetExecuteEngineCaps(SwFilterPipe * executedPipe,VP_EXECUTE_CAPS vpExecuteCaps)60 MOS_STATUS VpHdrRenderFilter::SetExecuteEngineCaps(
61         SwFilterPipe    *executedPipe,
62         VP_EXECUTE_CAPS vpExecuteCaps)
63 {
64     VP_FUNC_CALL();
65 
66     m_executedPipe  = executedPipe;
67     m_executeCaps   = vpExecuteCaps;
68 
69     return MOS_STATUS_SUCCESS;
70 }
71 
CalculateEngineParams(FeatureParamHdr & hdrParams,VP_EXECUTE_CAPS vpExecuteCaps)72 MOS_STATUS VpHdrRenderFilter::CalculateEngineParams(
73     FeatureParamHdr  &hdrParams,
74     VP_EXECUTE_CAPS  vpExecuteCaps)
75 {
76     VP_FUNC_CALL();
77     uint32_t   i          = 0;
78     VP_SURFACE *inputSrc  = nullptr;
79     VP_SURFACE *targetSrc = nullptr;
80 
81     VP_PUBLIC_CHK_NULL_RETURN(m_executedPipe);
82 
83     // create a filter Param buffer
84     MOS_ZeroMemory(&m_renderHdrParams, sizeof(m_renderHdrParams));
85 
86     m_renderHdrParams.kernelId                         = (VpKernelID)kernelHdrMandatory;
87     m_renderHdrParams.uSourceCount                     = m_executedPipe->GetSurfaceCount(true);
88     m_renderHdrParams.uTargetCount                     = m_executedPipe->GetSurfaceCount(false);
89     m_renderHdrParams.pColorFillParams                 = hdrParams.pColorFillParams;
90     m_renderHdrParams.uiMaxDisplayLum                  = hdrParams.uiMaxDisplayLum;
91 
92 
93     SwFilterScaling *scaling      = dynamic_cast<SwFilterScaling *>(m_executedPipe->GetSwFilter(true, 0, FeatureTypeScaling));
94     m_renderHdrParams.ScalingMode = scaling ? scaling->GetSwFilterParams().scalingMode : VPHAL_SCALING_BILINEAR;
95 
96     SwFilterRotMir *rotation      = dynamic_cast<SwFilterRotMir *>(m_executedPipe->GetSwFilter(true, 0, FeatureTypeRotMir));
97     m_renderHdrParams.Rotation    = rotation ? rotation->GetSwFilterParams().rotation : VPHAL_ROTATION_IDENTITY;
98 
99     auto blending = dynamic_cast<SwFilterBlending *>(m_executedPipe->GetSwFilter(true, i, FeatureTypeBlending));
100     if (blending)
101     {
102         auto &blendingParams              = blending->GetSwFilterParams();
103         m_renderHdrParams.pBlendingParams = blendingParams.blendingParams;
104     }
105 
106     for (i = 0; i < m_renderHdrParams.uSourceCount && i < VPHAL_MAX_HDR_INPUT_LAYER; ++i)
107     {
108         SwFilterHdr *hdrfilter = dynamic_cast<SwFilterHdr *>(m_executedPipe->GetSwFilter(true, i, FeatureTypeHdr));
109 
110         if (nullptr == hdrfilter)
111         {
112             continue;
113         }
114         auto &hdrParams = hdrfilter->GetSwFilterParams();
115 
116         if (!vpExecuteCaps.bRender || HDR_STAGE_3DLUT_KERNEL == hdrParams.stage)
117         {
118             VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
119         }
120         auto &surfGroup             = m_executedPipe->GetSurfacesSetting().surfGroup;
121 
122         SurfaceType surfId         = (SurfaceType)(SurfaceTypeHdrInputLayer0 + i);
123         auto        inputSrcHandle = surfGroup.find(surfId);
124         if (inputSrcHandle == surfGroup.end())
125         {
126             VP_PUBLIC_NORMALMESSAGE("surfId %d not found", surfId);
127             inputSrc = nullptr;
128         }
129         else
130         {
131             inputSrc = inputSrcHandle->second;
132         }
133 
134         if (inputSrc == nullptr)
135         {
136             m_renderHdrParams.InputSrc[i] = false;
137             continue;
138         }
139         m_renderHdrParams.InputSrc[i]     = true;
140         m_renderHdrParams.srcHDRParams[i] = hdrParams.srcHDRParams;
141         m_renderHdrParams.uSourceBindingTableIndex[i] = VPHAL_HDR_BTINDEX_LAYER0 + i * VPHAL_HDR_BTINDEX_PER_LAYER0;
142     }
143 
144     for (i = 0; i < m_renderHdrParams.uTargetCount; i++)
145     {
146         auto &surfGroup             = m_executedPipe->GetSurfacesSetting().surfGroup;
147 
148         SurfaceType surfId          = (SurfaceType)(SurfaceTypeHdrTarget0 + i);
149         auto        targetSrcHandle = surfGroup.find(surfId);
150         if (targetSrcHandle == surfGroup.end())
151         {
152             VP_PUBLIC_NORMALMESSAGE("surfId %d not found", surfId);
153             targetSrc = nullptr;
154         }
155         else
156         {
157             targetSrc = targetSrcHandle->second;
158         }
159 
160         if (targetSrc == nullptr)
161         {
162             continue;
163         }
164         //auto &hdrParams                               = ((SwFilterHdr *)m_executedPipe->GetSwFilter(false, 0, FeatureTypeHdr))->GetSwFilterParams();
165         m_renderHdrParams.targetHDRParams[i]          = hdrParams.targetHDRParams;
166         m_renderHdrParams.uTargetBindingTableIndex[i] = VPHAL_HDR_BTINDEX_RENDERTARGET + i * VPHAL_HDR_BTINDEX_PER_TARGET;
167     }
168 
169     uint32_t blockWidth = 16;
170     uint32_t blockHeight = 8;
171 
172     m_renderHdrParams.threadWidth = (LUT65_SEG_SIZE * 2 + blockWidth - 1) / blockWidth;
173     m_renderHdrParams.threadHeight = (LUT65_SEG_SIZE * LUT65_MUL_SIZE + blockHeight - 1) / blockHeight;
174 
175     return MOS_STATUS_SUCCESS;
176 }
177 
178 /****************************************************************************************************/
179 /*                                   HwFilter Hdr Parameter                                         */
180 /****************************************************************************************************/
Create(HW_FILTER_HDR_RENDER_PARAM & param,FeatureType featureType)181 HwFilterParameter *HwFilterHdrRenderParameter::Create(HW_FILTER_HDR_RENDER_PARAM &param, FeatureType featureType)
182 {
183     VP_FUNC_CALL();
184 
185     HwFilterHdrRenderParameter *p = MOS_New(HwFilterHdrRenderParameter, featureType);
186     if (p)
187     {
188         if (MOS_FAILED(p->Initialize(param)))
189         {
190             MOS_Delete(p);
191             return nullptr;
192         }
193     }
194     return p;
195 }
196 
HwFilterHdrRenderParameter(FeatureType featureType)197 HwFilterHdrRenderParameter::HwFilterHdrRenderParameter(FeatureType featureType) : HwFilterParameter(featureType)
198 {
199 }
200 
~HwFilterHdrRenderParameter()201 HwFilterHdrRenderParameter::~HwFilterHdrRenderParameter()
202 {
203 }
204 
ConfigParams(HwFilter & hwFilter)205 MOS_STATUS HwFilterHdrRenderParameter::ConfigParams(HwFilter &hwFilter)
206 {
207     VP_FUNC_CALL();
208 
209     return hwFilter.ConfigParam(m_Params);
210 }
211 
Initialize(HW_FILTER_HDR_RENDER_PARAM & param)212 MOS_STATUS HwFilterHdrRenderParameter::Initialize(HW_FILTER_HDR_RENDER_PARAM &param)
213 {
214     VP_FUNC_CALL();
215 
216     m_Params = param;
217     return MOS_STATUS_SUCCESS;
218 }
219 
220 /****************************************************************************************************/
221 /*                                   Packet Render Hdr Parameter                                       */
222 /****************************************************************************************************/
Create(HW_FILTER_HDR_RENDER_PARAM & param)223 VpPacketParameter * VpRenderHdrParameter::Create(HW_FILTER_HDR_RENDER_PARAM &param)
224 {
225     VP_FUNC_CALL();
226 
227     if (nullptr == param.pPacketParamFactory)
228     {
229         return nullptr;
230     }
231     VpRenderHdrParameter *p = dynamic_cast< VpRenderHdrParameter *>(param.pPacketParamFactory->GetPacketParameter(param.pHwInterface));
232     if (p)
233     {
234         if (MOS_FAILED(p->Initialize(param)))
235         {
236             VpPacketParameter *pParam = p;
237             param.pPacketParamFactory->ReturnPacketParameter(pParam);
238             return nullptr;
239         }
240     }
241     return p;
242 }
243 
VpRenderHdrParameter(PVP_MHWINTERFACE pHwInterface,PacketParamFactoryBase * packetParamFactory)244  VpRenderHdrParameter:: VpRenderHdrParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase *packetParamFactory) : VpPacketParameter(packetParamFactory), m_HdrFilter(pHwInterface)
245 {
246 }
~VpRenderHdrParameter()247  VpRenderHdrParameter::~ VpRenderHdrParameter() {}
248 
SetPacketParam(VpCmdPacket * pPacket)249 bool VpRenderHdrParameter::SetPacketParam(VpCmdPacket *pPacket)
250 {
251     VP_FUNC_CALL();
252 
253     RENDER_HDR_PARAMS *pParams = m_HdrFilter.GetRenderParams();
254     if (nullptr == pParams)
255     {
256         VP_PUBLIC_ASSERTMESSAGE("Failed to get vebox hdr params");
257         return false;
258     }
259 
260     VpRenderCmdPacket *packet = dynamic_cast<VpRenderCmdPacket *>(pPacket);
261     if (packet)
262     {
263         return MOS_SUCCEEDED(packet->SetHdrParams(pParams));
264     }
265 
266     VP_PUBLIC_ASSERTMESSAGE("Invalid packet for Vebox hdr");
267     return false;
268 
269 }
270 
Initialize(HW_FILTER_HDR_RENDER_PARAM & params)271 MOS_STATUS VpRenderHdrParameter::Initialize(HW_FILTER_HDR_RENDER_PARAM &params)
272 {
273     VP_FUNC_CALL();
274 
275     VP_PUBLIC_CHK_STATUS_RETURN(m_HdrFilter.Init());
276     VP_PUBLIC_CHK_STATUS_RETURN(m_HdrFilter.SetExecuteEngineCaps(params.executedPipe, params.vpExecuteCaps));
277     VP_PUBLIC_CHK_STATUS_RETURN(m_HdrFilter.CalculateEngineParams(params.hdrParams, params.vpExecuteCaps));
278     return MOS_STATUS_SUCCESS;
279 }
280 
281 /****************************************************************************************************/
282 /*                                   Policy Render Hdr Handler                                         */
283 /****************************************************************************************************/
PolicyRenderHdrHandler(VP_HW_CAPS & hwCaps)284 PolicyRenderHdrHandler::PolicyRenderHdrHandler(VP_HW_CAPS &hwCaps) : PolicyFeatureHandler(hwCaps)
285 {
286     m_Type = FeatureTypeHdrOnRender;
287 }
~PolicyRenderHdrHandler()288 PolicyRenderHdrHandler::~PolicyRenderHdrHandler()
289 {
290 }
291 
IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)292 bool PolicyRenderHdrHandler::IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)
293 {
294     VP_FUNC_CALL();
295 
296     //Need to check if other path activated
297     return vpExecuteCaps.bRenderHdr;
298 }
299 
CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps,SwFilterPipe & swFilterPipe,PVP_MHWINTERFACE pHwInterface)300 HwFilterParameter *PolicyRenderHdrHandler::CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface)
301 {
302     VP_FUNC_CALL();
303 
304     if (IsFeatureEnabled(vpExecuteCaps))
305     {
306         SwFilterHdr *swFilter = dynamic_cast<SwFilterHdr *>(swFilterPipe.GetSwFilter(true, 0, FeatureTypeHdrOnRender));
307 
308         if (nullptr == swFilter)
309         {
310             VP_PUBLIC_ASSERTMESSAGE("Invalid parameter! Feature enabled in vpExecuteCaps but no swFilter exists!");
311             return nullptr;
312         }
313 
314         FeatureParamHdr &param = swFilter->GetSwFilterParams();
315 
316         HW_FILTER_HDR_RENDER_PARAM paramHdr = {};
317         paramHdr.type                = m_Type;
318         paramHdr.pHwInterface        = pHwInterface;
319         paramHdr.vpExecuteCaps       = vpExecuteCaps;
320         paramHdr.pPacketParamFactory = &m_PacketParamFactory;
321         paramHdr.hdrParams           = param;
322         paramHdr.executedPipe         = &swFilterPipe;
323         paramHdr.pfnCreatePacketParam = PolicyRenderHdrHandler::CreatePacketParam;
324 
325         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
326 
327         if (pHwFilterParam)
328         {
329             if (MOS_FAILED(((HwFilterHdrRenderParameter *)pHwFilterParam)->Initialize(paramHdr)))
330             {
331                 ReleaseHwFeatureParameter(pHwFilterParam);
332             }
333         }
334         else
335         {
336             pHwFilterParam = HwFilterHdrRenderParameter::Create(paramHdr, m_Type);
337         }
338 
339         return pHwFilterParam;
340     }
341     else
342     {
343         return nullptr;
344     }
345 }
346 
LayerSelectForProcess(std::vector<int> & layerIndexes,SwFilterPipe & featurePipe,VP_EXECUTE_CAPS & caps)347 MOS_STATUS PolicyRenderHdrHandler::LayerSelectForProcess(std::vector<int> &layerIndexes, SwFilterPipe &featurePipe, VP_EXECUTE_CAPS &caps)
348 {
349     for (uint32_t index = 0; index < featurePipe.GetSurfaceCount(true); ++index)
350     {
351         SwFilterSubPipe *subpipe = featurePipe.GetSwFilterSubPipe(true, index);
352         VP_PUBLIC_CHK_NULL_RETURN(subpipe);
353 
354         SwFilterHdr *hdr = dynamic_cast<SwFilterHdr *>(subpipe->GetSwFilter(FeatureType::FeatureTypeHdr));
355         if (nullptr == hdr)
356         {
357             continue;
358         }
359 
360         SwFilterScaling *scaling = dynamic_cast<SwFilterScaling *>(subpipe->GetSwFilter(FeatureType::FeatureTypeScaling));
361         VP_PUBLIC_CHK_NULL_RETURN(scaling);
362 
363         // Disable AVS scaling mode
364         if (!m_hwCaps.m_rules.isAvsSamplerSupported)
365         {
366             if (VPHAL_SCALING_AVS == scaling->GetSwFilterParams().scalingMode)
367             {
368                 scaling->GetSwFilterParams().scalingMode = VPHAL_SCALING_BILINEAR;
369             }
370         }
371         // first step to process all layers when hdr kernel used, todo: add handle for >8 layers cases.
372         layerIndexes.push_back(index);
373     }
374 
375     return MOS_STATUS_SUCCESS;
376 }
377 
378 
379 }  // namespace vp
380