1 /*===================== begin_copyright_notice ==================================
2 
3 # Copyright (c) 2020-2021, Intel Corporation
4 
5 # Permission is hereby granted, free of charge, to any person obtaining a
6 # copy of this software and associated documentation files (the "Software"),
7 # to deal in the Software without restriction, including without limitation
8 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 # and/or sell copies of the Software, and to permit persons to whom the
10 # Software is furnished to do so, subject to the following conditions:
11 
12 # The above copyright notice and this permission notice shall be included
13 # in all copies or substantial portions of the Software.
14 
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 # OTHER DEALINGS IN THE SOFTWARE.
22 
23 ======================= end_copyright_notice ==================================*/
24 //!
25 //! \file     codechal_decode_vc1_xe_xpm.cpp
26 //! \brief    Implements the decode interface extension for Xe_XPM VC1.
27 //! \details  Implements all functions required by CodecHal for Xe_XPM VC1 decoding.
28 //!
29 
30 #include "codechal_decode_vc1_xe_xpm.h"
31 
AllocateStandard(CodechalSetting * settings)32 MOS_STATUS CodechalDecodeVc1Xe_Xpm::AllocateStandard(
33     CodechalSetting *          settings)
34 {
35     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
36 
37     CODECHAL_DECODE_FUNCTION_ENTER;
38 
39     CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeVc1G12::AllocateStandard(settings));
40 
41     m_olpMdfKernel = MOS_New(CodechalKernelOlpMdf);
42     CODECHAL_DECODE_CHK_NULL_RETURN(m_olpMdfKernel);
43     CODECHAL_DECODE_CHK_STATUS_RETURN(m_olpMdfKernel->Init(m_osInterface));
44 
45     return eStatus;
46 }
47 
PerformVc1Olp()48 MOS_STATUS CodechalDecodeVc1Xe_Xpm::PerformVc1Olp()
49 {
50     CODECHAL_DECODE_FUNCTION_ENTER;
51     CODECHAL_DECODE_CHK_NULL_RETURN(m_olpMdfKernel);
52 
53     MOS_SYNC_PARAMS syncParams;
54     uint16_t        srcMemory_object_control;
55     uint16_t        dstMemory_object_control;
56     syncParams = g_cInitSyncParams;
57     syncParams.GpuContext = m_videoContext;
58     syncParams.presSyncResource = &m_resSyncObject;
59 
60     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
61 
62     syncParams = g_cInitSyncParams;
63     syncParams.GpuContext = m_renderContext;
64     syncParams.presSyncResource = &m_resSyncObject;
65 
66     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
67 
68     // Check if destination surface needs to be synchronized, before command buffer submission
69     syncParams = g_cInitSyncParams;
70     syncParams.GpuContext = m_renderContext;
71     syncParams.presSyncResource         = &m_deblockSurface.OsResource;
72     syncParams.bReadOnly = false;
73     syncParams.bDisableDecodeSyncLock = m_disableDecodeSyncLock;
74     syncParams.bDisableLockForTranscode = m_disableLockForTranscode;
75 
76     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnPerformOverlaySync(m_osInterface, &syncParams));
77     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceWait(m_osInterface, &syncParams));
78 
79     // execute OLP kernel
80     OLPFlags olpFlags;
81     olpFlags.Interlace            = CodecHal_PictureIsField(m_vc1PicParams->CurrPic);
82     olpFlags.HorizontalUpscaling  = m_vc1PicParams->UpsamplingFlag;
83     olpFlags.VerticalUpscaling    = m_vc1PicParams->UpsamplingFlag;
84     olpFlags.Profile              = m_vc1PicParams->sequence_fields.AdvancedProfileFlag;
85     olpFlags.RangeExpansion       = (m_vc1PicParams->range_mapping_fields.range_mapping_enabled != 0);
86     if (m_vc1PicParams->sequence_fields.AdvancedProfileFlag)
87     {
88         olpFlags.RangeMapUV           = m_vc1PicParams->range_mapping_fields.chroma;
89         olpFlags.RangeMapUVFlag       = m_vc1PicParams->range_mapping_fields.chroma_flag;
90         olpFlags.RangeMapY            = m_vc1PicParams->range_mapping_fields.luma;
91         olpFlags.RangeMapYFlag        = m_vc1PicParams->range_mapping_fields.luma_flag;
92     }
93 
94     srcMemory_object_control = (uint16_t)m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_PRE_DEBLOCKING_CODEC].Value;
95     dstMemory_object_control = (uint16_t)m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_POST_DEBLOCKING_CODEC].Value;
96 
97     CODECHAL_DECODE_CHK_STATUS_RETURN(m_olpMdfKernel->Execute(&m_destSurface, &srcMemory_object_control, &m_deblockSurface, &dstMemory_object_control, olpFlags.value));
98 
99     return MOS_STATUS_SUCCESS;
100 }
101 
HandleSkipFrame()102 MOS_STATUS CodechalDecodeVc1Xe_Xpm::HandleSkipFrame()
103 {
104     MOS_COMMAND_BUFFER                  cmdBuffer;
105     MHW_MI_FLUSH_DW_PARAMS              flushDwParams;
106     MHW_GENERIC_PROLOG_PARAMS           genericPrologParams;
107     MOS_SURFACE                         srcSurface;
108     uint8_t                             fwdRefIdx;
109     uint32_t                            surfaceSize;
110     MOS_SYNC_PARAMS                     syncParams;
111     MOS_STATUS                          eStatus = MOS_STATUS_SUCCESS;
112 
113     CODECHAL_DECODE_FUNCTION_ENTER;
114 
115     fwdRefIdx = (uint8_t)m_vc1PicParams->ForwardRefIdx;
116 
117     MOS_ZeroMemory(&srcSurface, sizeof(MOS_SURFACE));
118     srcSurface.Format = Format_NV12;
119     srcSurface.OsResource = m_vc1RefList[fwdRefIdx]->resRefPic;
120     CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(m_osInterface, &srcSurface));
121 
122     CODECHAL_DECODE_CHK_NULL_RETURN(srcSurface.OsResource.pGmmResInfo);
123 
124     //Keep driver copy for debug purpose
125     //surfaceSize = ((srcSurface.OsResource.pGmmResInfo->GetArraySize()) > 1) ?
126     //              ((uint32_t)(srcSurface.OsResource.pGmmResInfo->GetQPitchPlanar(GMM_PLANE_Y) *
127     //                          srcSurface.OsResource.pGmmResInfo->GetRenderPitch())) :
128     //               (uint32_t)(srcSurface.OsResource.pGmmResInfo->GetSizeMainSurface());
129     //CodechalDataCopyParams dataCopyParams;
130     //MOS_ZeroMemory(&dataCopyParams, sizeof(CodechalDataCopyParams));
131     //dataCopyParams.srcResource = &srcSurface.OsResource;
132     //dataCopyParams.srcSize     = surfaceSize;
133     //dataCopyParams.srcOffset = srcSurface.dwOffset;
134     //dataCopyParams.dstResource = &m_destSurface.OsResource;
135     //dataCopyParams.dstSize     = surfaceSize;
136     //dataCopyParams.dstOffset   = m_destSurface.dwOffset;
137     //CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->CopyDataSourceWithDrv(&dataCopyParams));
138 
139     // HuC copy doesn't support CCS mapping. Using Vebox copy instead
140     MOS_MEMCOMP_STATE mmcState = MOS_MEMCOMP_DISABLED;
141 
142 #ifdef _MMC_SUPPORTED
143     if (m_mmc && m_mmc->IsMmcEnabled())
144     {
145         CODECHAL_HW_CHK_STATUS_RETURN(m_osInterface->pfnGetMemoryCompressionMode(m_osInterface,
146             &srcSurface.OsResource,
147             &mmcState));
148     }
149 #endif
150 
151     CODECHAL_HW_CHK_STATUS_RETURN(m_osInterface->pfnDoubleBufferCopyResource(m_osInterface,
152         &srcSurface.OsResource,
153         &m_destSurface.OsResource,
154         ((mmcState == MOS_MEMCOMP_MC) || (mmcState == MOS_MEMCOMP_RC)) ? true : false));
155 
156     return eStatus;
157 }
158 
CodechalDecodeVc1Xe_Xpm(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface,PCODECHAL_STANDARD_INFO standardInfo)159 CodechalDecodeVc1Xe_Xpm::CodechalDecodeVc1Xe_Xpm(
160     CodechalHwInterface   *hwInterface,
161     CodechalDebugInterface* debugInterface,
162     PCODECHAL_STANDARD_INFO standardInfo) :
163     CodechalDecodeVc1G12(hwInterface, debugInterface, standardInfo)
164 {
165     MOS_ZeroMemory(&m_olpInYSurface, sizeof(m_olpInYSurface));
166     MOS_ZeroMemory(&m_olpInUVSurface, sizeof(m_olpInUVSurface));
167     MOS_ZeroMemory(&m_olpOutYSurface, sizeof(m_olpOutYSurface));
168     MOS_ZeroMemory(&m_olpOutUVSurface, sizeof(m_olpOutUVSurface));
169 }
170 
~CodechalDecodeVc1Xe_Xpm()171 CodechalDecodeVc1Xe_Xpm::~CodechalDecodeVc1Xe_Xpm()
172 {
173     if(m_olpMdfKernel)
174     {
175         m_olpMdfKernel->UnInit();
176         MOS_Delete(m_olpMdfKernel);
177         m_olpMdfKernel = nullptr;
178     }
179 }
180 
181