[VP] Enable HDR APO by default Open part
Switch default path to APO.
Defines chromasitting init only for HDR now.
Make other settings same as Legacy path.
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
index b0e0065..ef97487 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
@@ -605,15 +605,15 @@
// Check IECP first here, since IECP is done after DI, and the vebox downsampling not affect the vebox input.
if (executeCaps.bIECP)
{
- if (executeCaps.bHDR3DLUT)
- {
- return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? Format_R10G10B10A2 : Format_A8B8G8R8;
- }
// Upsampling to yuv444 for IECP input/output.
// To align with legacy path, need to check whether inputFormat can also be used for IECP case,
// in which case IECP down sampling will be applied.
return Format_AYUV;
}
+ else if (executeCaps.bHDR3DLUT)
+ {
+ return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? Format_R10G10B10A2 : Format_A8B8G8R8;
+ }
else if (executeCaps.bDI)
{
// If the input is 4:2:0, then chroma data is doubled vertically to 4:2:2
@@ -1266,6 +1266,9 @@
// Insert Vebox statistics surface
surfGroup.insert(std::make_pair(SurfaceTypeStatistics, m_veboxStatisticsSurface));
+ // Insert Vebox 3Dlut surface
+ surfGroup.insert(std::make_pair(SurfaceType3dLut, m_vebox3DLookUpTables));
+
// Update previous Dn output flag for next frame to use.
if (surfGroup.find(SurfaceTypeDNOutput) != surfGroup.end() || m_sameSamples && m_pastDnOutputValid)
{
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp
index 4b7eb80..415baf6 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp
@@ -354,21 +354,24 @@
VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
}
- MOS_FORMAT hdrFormat = Format_Any;
- VPHAL_CSPACE hdrCSpace = CSpace_Any;
-
- if (m_hwCaps.m_sfcHwEntry[cscParams->formatInput].inputSupported &&
+ MOS_FORMAT hdrFormat = Format_Any;
+ VPHAL_CSPACE hdrCSpace = CSpace_Any;
+ hdrCSpace = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? CSpace_BT2020_RGB : CSpace_sRGB;
+ hdrFormat = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? Format_R10G10B10A2 : Format_A8R8G8B8;
+ if (m_hwCaps.m_sfcHwEntry[hdrFormat].inputSupported &&
m_hwCaps.m_sfcHwEntry[cscParams->formatOutput].outputSupported &&
- m_hwCaps.m_sfcHwEntry[cscParams->formatInput].cscSupported)
+ m_hwCaps.m_sfcHwEntry[hdrFormat].cscSupported)
{
- hdrCSpace = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? CSpace_BT2020_RGB : CSpace_sRGB;
- hdrFormat = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? Format_R10G10B10A2 : Format_A8R8G8B8;
- if (m_hwCaps.m_sfcHwEntry[hdrFormat].inputSupported &&
- m_hwCaps.m_sfcHwEntry[cscParams->formatOutput].outputSupported &&
- m_hwCaps.m_sfcHwEntry[hdrFormat].cscSupported)
+ cscEngine->bEnabled = 1;
+ cscEngine->VeboxNeeded = 0;
+ cscEngine->RenderNeeded = 0;
+ if (hdrFormat != cscParams->formatOutput || hdrCSpace != cscParams->output.colorSpace)
{
- cscEngine->bEnabled = 1;
- cscEngine->SfcNeeded |= 1;
+ cscEngine->SfcNeeded |= 1;
+ }
+ else
+ {
+ cscEngine->SfcNeeded = 0;
}
}
else
@@ -918,7 +921,6 @@
{
pHDREngine->bEnabled = 1;
pHDREngine->VeboxNeeded = 1;
- pHDREngine->VeboxIECPNeeded = 1;
if (hdrParams->formatOutput == Format_A8B8G8R8 || hdrParams->formatOutput == Format_A8R8G8B8)
{
pHDREngine->VeboxARGBOut = 1;
@@ -1096,6 +1098,10 @@
}
}
}
+ else
+ {
+ VP_PUBLIC_CHK_STATUS_RETURN(FilterFeatureCombination(inputPipe));
+ }
engineCaps.value = 0;
// Set Engine Caps the first time
@@ -1116,6 +1122,39 @@
return MOS_STATUS_SUCCESS;
}
+MOS_STATUS Policy::FilterFeatureCombination(SwFilterSubPipe *pipe)
+{
+ VP_FUNC_CALL();
+
+ auto hdr = pipe->GetSwFilter(FeatureTypeHdr);
+ if (nullptr != hdr)
+ {
+ for (auto filterID : m_featurePool)
+ {
+ if (filterID == FeatureTypeTcc ||
+ filterID == FeatureTypeSte ||
+ filterID == FeatureTypeProcamp)
+ {
+ auto feature = pipe->GetSwFilter(FeatureType(filterID));
+ if (feature && feature->GetFilterEngineCaps().bEnabled)
+ {
+ feature->GetFilterEngineCaps().bEnabled = false;
+ }
+ }
+ if (filterID == FeatureTypeCsc)
+ {
+ SwFilterCsc *feature = (SwFilterCsc *)pipe->GetSwFilter(FeatureType(filterID));
+ if (feature)
+ {
+ auto ¶ms = feature->GetSwFilterParams();
+ params.pIEFParams = nullptr;
+ }
+ }
+ }
+ }
+ return MOS_STATUS_SUCCESS;
+}
+
MOS_STATUS Policy::BuildExecuteFilter(SwFilterPipe& featurePipe, VP_EXECUTE_CAPS& caps, HW_FILTER_PARAMS& params)
{
VP_FUNC_CALL();
@@ -1247,7 +1286,7 @@
}
// Vebox only cases
else if (caps.bVebox && engineCaps->bEnabled &&
- (engineCaps->VeboxNeeded || (caps.bIECP && filterID == FeatureTypeCsc)))
+ (engineCaps->VeboxNeeded || (!caps.bHDR3DLUT && caps.bIECP && filterID == FeatureTypeCsc)))
{
UpdateExeCaps(feature, caps, EngineTypeVebox);
}
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h
index 9dc37d4..0b90067 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h
@@ -113,6 +113,8 @@
MOS_STATUS AssignExecuteResource(VP_EXECUTE_CAPS& caps, HW_FILTER_PARAMS& params);
+ virtual MOS_STATUS FilterFeatureCombination(SwFilterSubPipe *pipe);
+
virtual bool IsVeboxSecurePathEnabled(SwFilterPipe& subSwFilterPipe, VP_EXECUTE_CAPS& caps)
{
return false;
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
index 6ef0e50..d5dc532 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
@@ -202,8 +202,8 @@
m_sfcCSCParams->iefParams = m_cscParams.pIEFParams;
}
- m_cscParams.input.colorSpace = GetSfcInputColorSpace(m_executeCaps, m_cscParams.input.colorSpace, m_cscParams.output.colorSpace);
- m_sfcCSCParams->inputColorSpace = m_cscParams.input.colorSpace;
+ m_cscParams.input.colorSpace = m_cscParams.input.colorSpace;
+ m_sfcCSCParams->inputColorSpace = GetSfcInputColorSpace(m_executeCaps, m_cscParams.input.colorSpace, m_cscParams.output.colorSpace);
m_cscParams.formatInput = GetSfcInputFormat(m_executeCaps, m_cscParams.formatInput, m_cscParams.output.colorSpace);
m_sfcCSCParams->inputFormat = m_cscParams.formatInput;
@@ -322,7 +322,7 @@
VP_RENDER_CHK_NULL_RETURN(m_veboxCSCParams);
VPHAL_COLORPACK srcColorPack;
- bool bNeedUpSampling = vpExecuteCaps.bIECP;
+ bool bNeedUpSampling = vpExecuteCaps.bIECP || vpExecuteCaps.bHDR3DLUT;
bool bDIEnabled = vpExecuteCaps.bDI;
srcColorPack = VpHal_GetSurfaceColorPack(m_cscParams.formatInput);
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
index d796532..01973de 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
@@ -113,6 +113,7 @@
MOS_FORMAT format,
bool bOutput,
bool bRotateNeeded,
+ bool bVEHDR3DlutUsed,
uint16_t & widthAlignUnit,
uint16_t & heightAlignUnit)
{
@@ -136,6 +137,11 @@
// Output rect has been rotated in SwFilterScaling::Configure. Need to swap the alignUnit accordingly.
swap(widthAlignUnit, heightAlignUnit);
}
+ if (m_pvpMhwInterface && MEDIA_IS_SKU(m_pvpMhwInterface->m_skuTable, FtrHeight8AlignVE3DLUTDualPipe)
+ && bVEHDR3DlutUsed)
+ {
+ heightAlignUnit = 8;
+ }
}
MOS_STATUS VpScalingFilter::IsColorfillEnable()
@@ -274,8 +280,8 @@
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
GetFormatWidthHeightAlignUnit(isOutputSurf ? m_scalingParams.formatOutput : m_scalingParams.formatInput,
- isOutputSurf, m_scalingParams.rotation.rotationNeeded, wWidthAlignUnit, wHeightAlignUnit);
- GetFormatWidthHeightAlignUnit(m_scalingParams.formatOutput, true, m_scalingParams.rotation.rotationNeeded, wWidthAlignUnitForDstRect, wHeightAlignUnitForDstRect);
+ isOutputSurf, m_scalingParams.rotation.rotationNeeded, false, wWidthAlignUnit, wHeightAlignUnit);
+ GetFormatWidthHeightAlignUnit(m_scalingParams.formatOutput, true, false, m_scalingParams.rotation.rotationNeeded, wWidthAlignUnitForDstRect, wHeightAlignUnitForDstRect);
// The source rectangle is floored to the aligned unit to
// get rid of invalid data(ex: an odd numbered src rectangle with NV12 format
@@ -393,6 +399,7 @@
GetFormatWidthHeightAlignUnit(
m_scalingParams.formatOutput,
true,
+ false,
m_scalingParams.rotation.rotationNeeded,
wOutputWidthAlignUnit,
wOutputHeightAlignUnit);
@@ -401,6 +408,7 @@
GetFormatWidthHeightAlignUnit(
m_sfcScalingParams->inputFrameFormat,
false,
+ m_executeCaps.bHDR3DLUT,
m_scalingParams.rotation.rotationNeeded,
wInputWidthAlignUnit,
wInputHeightAlignUnit);
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
index 7a2940f..bea0109 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
@@ -96,6 +96,7 @@
MOS_FORMAT format,
bool bOutput,
bool bRotateNeeded,
+ bool bVE3DlutUsed,
uint16_t &widthAlignUnit,
uint16_t &heightAlignUnit);
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h b/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h
index ec0d339..2afd581 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2018-2020, Intel Corporation
+* Copyright (c) 2018-2021, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -413,6 +413,17 @@
uint32_t *pAceCacheData = nullptr;
+ virtual MOS_STATUS InitChromaSampling()
+ {
+ MOS_ZeroMemory(&m_chromaSampling, sizeof(MHW_VEBOX_CHROMA_SAMPLING));
+ m_chromaSampling.BypassChromaUpsampling = 1;
+ m_chromaSampling.ChromaUpsamplingCoSitedHorizontalOffset = 0;
+ m_chromaSampling.ChromaUpsamplingCoSitedVerticalOffset = 0;
+ m_chromaSampling.BypassChromaDownsampling = 1;
+ m_chromaSampling.ChromaDownsamplingCoSitedHorizontalOffset = 0;
+ m_chromaSampling.ChromaDownsamplingCoSitedVerticalOffset = 0;
+ return MOS_STATUS_SUCCESS;
+ }
protected:
MHW_VEBOX_DNDI_PARAMS m_veboxDNDIParams = {};
MHW_VEBOX_IECP_PARAMS m_veboxIecpParams = {};