From ae912b6550af4808436fabc7cae3278a20a955b6 Mon Sep 17 00:00:00 2001 From: Gu_Peiyi Date: Tue, 12 Sep 2023 15:06:17 +0800 Subject: [PATCH] Fix FC Corruption When Blending without Colorfill in Legacy Path Fix fc will show corruption when alignedRect is bigger than DestYBottomRightLayer0/DestXBottomRightLayer0 and not set color fill Upstream-Status: Backport [https://github.com/intel/media-driver/commit/197841a545b1eaf7f202e2d057a5a6395be46061] Signed-off-by: Lim Siew Hoon --- .../common/vp/hal/vphal_render_composite.cpp | 40 +++++++++++++++++++ .../common/vp/hal/vphal_render_composite.h | 9 +++++ 2 files changed, 49 insertions(+) diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp b/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp index dd5025f32..0b0b6c432 100644 --- a/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp +++ b/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp @@ -1993,6 +1993,8 @@ MOS_STATUS CompositeState::RenderMultiPhase( for (index = 0, phase = 0; (!bLastPhase); phase++) { bool disableAvsSampler = false; + // AdjustParamsBasedOnFcLimit must be called before IsDisableAVSSampler in legacy path, or it will miss the AVS WA + bool adjustParamBasedOnFcLimit = AdjustParamsBasedOnFcLimit(pcRenderParams); VPHAL_COMPOSITE_PARAMS CompositeParams; // Prepare compositing structure ResetCompParams(&CompositeParams); @@ -6103,6 +6105,44 @@ bool CompositeState::RenderBufferComputeWalker( return bResult; } +//! +//! \brief Adjust Params Based On Fc Limit +//! \param [in,out] pCompParams +//! Pointer to Composite parameters. +//! \return bool +//! +bool CompositeState::AdjustParamsBasedOnFcLimit( + PCVPHAL_RENDER_PARAMS pcRenderParam) +{ + //The kernel is using the rectangle data to calculate mask. If the rectangle configuration does not comply to kernel requirement, the mask calculation will be incorrect and will see corruption. + if (pcRenderParam->pColorFillParams == nullptr && + pcRenderParam->uSrcCount == 1 && + pcRenderParam->uDstCount == 1 && + pcRenderParam->pSrc[0] != nullptr && + pcRenderParam->pTarget[0] != nullptr) + { + if (pcRenderParam->pSrc[0]->rcDst.top >= pcRenderParam->pTarget[0]->rcDst.top && + pcRenderParam->pSrc[0]->rcDst.left >= pcRenderParam->pTarget[0]->rcDst.left && + pcRenderParam->pSrc[0]->rcDst.right <= pcRenderParam->pTarget[0]->rcDst.right && + pcRenderParam->pSrc[0]->rcDst.bottom <= pcRenderParam->pTarget[0]->rcDst.bottom) + { + VPHAL_RENDER_NORMALMESSAGE("Render Path : 1 Surface to 1 Surface FC Composition. ColorFill is Disabled. Output Dst is bigger than Input Dst. Will make Output Dst become Input Dst to Avoid FC Corruption. (%d %d %d %d) -> (%d %d %d %d)", + pcRenderParam->pTarget[0]->rcDst.left, + pcRenderParam->pTarget[0]->rcDst.top, + pcRenderParam->pTarget[0]->rcDst.right, + pcRenderParam->pTarget[0]->rcDst.bottom, + pcRenderParam->pSrc[0]->rcDst.left, + pcRenderParam->pSrc[0]->rcDst.top, + pcRenderParam->pSrc[0]->rcDst.right, + pcRenderParam->pSrc[0]->rcDst.bottom); + pcRenderParam->pTarget[0]->rcSrc = pcRenderParam->pSrc[0]->rcDst; + pcRenderParam->pTarget[0]->rcDst = pcRenderParam->pSrc[0]->rcDst; + return true; + } + } + return false; +} + //! //! \brief Calculate Composite parameter and render data //! \param [in] pCompParams diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_composite.h b/media_driver/agnostic/common/vp/hal/vphal_render_composite.h index b3c2820c6..3838e89c0 100644 --- a/media_driver/agnostic/common/vp/hal/vphal_render_composite.h +++ b/media_driver/agnostic/common/vp/hal/vphal_render_composite.h @@ -497,6 +497,15 @@ protected: PVPHAL_RENDERING_DATA_COMPOSITE pRenderingData, bool* pbColorfill); + //! + //! \brief Adjust Params Based On Fc Limit + //! \param [in,out] PCVPHAL_RENDER_PARAMS + //! Pointer to pcRenderParam parameters. + //! \return bool + //! + bool AdjustParamsBasedOnFcLimit( + PCVPHAL_RENDER_PARAMS pcRenderParam); + //! //! \brief Set Sampler AVS parameters //! \param [in] pRenderingData -- 2.40.1