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