1 /*
2 * Copyright (c) 2021, 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 //!
24 //! \file     codechal_decode_vc1_xe_hpm.cpp
25 //! \brief    Implements the decode interface extension for Xe_HPM VC1.
26 //! \details  Implements all functions required by CodecHal for Xe_HPM VC1 decoding.
27 //!
28 
29 #include "codechal_decode_vc1_xe_hpm.h"
30 
AllocateStandard(CodechalSetting * settings)31 MOS_STATUS CodechalDecodeVc1Xe_Hpm::AllocateStandard(
32     CodechalSetting *          settings)
33 {
34     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
35 
36     CODECHAL_DECODE_FUNCTION_ENTER;
37 
38     CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeVc1G12::AllocateStandard(settings));
39 
40     m_olpMdfKernel = MOS_New(CodechalKernelOlpMdfXe_Hpm);
41     CODECHAL_DECODE_CHK_NULL_RETURN(m_olpMdfKernel);
42     CODECHAL_DECODE_CHK_STATUS_RETURN(m_olpMdfKernel->Init(m_osInterface));
43 
44     return eStatus;
45 }
46 
PerformVc1Olp()47 MOS_STATUS CodechalDecodeVc1Xe_Hpm::PerformVc1Olp()
48 {
49     CODECHAL_DECODE_FUNCTION_ENTER;
50     CODECHAL_DECODE_CHK_NULL_RETURN(m_olpMdfKernel);
51 
52     MOS_SYNC_PARAMS syncParams;
53     uint16_t        srcMemory_object_control;
54     uint16_t        dstMemory_object_control;
55 
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_Hpm::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_Hpm(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface,PCODECHAL_STANDARD_INFO standardInfo)159 CodechalDecodeVc1Xe_Hpm::CodechalDecodeVc1Xe_Hpm(
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_Hpm()171 CodechalDecodeVc1Xe_Hpm::~CodechalDecodeVc1Xe_Hpm()
172 {
173     if(m_olpMdfKernel)
174     {
175         m_olpMdfKernel->UnInit();
176         MOS_Delete(m_olpMdfKernel);
177         m_olpMdfKernel = nullptr;
178     }
179 }
180 
181