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 ¶m, 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 ¶m)
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 ¶m)
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 ¶ms)
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 ¶m = 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