1 /*
2 * Copyright (c) 2014-2018, 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 //! \file mhw_vdbox_hcp_interface.cpp
24 //! \brief MHW interface for constructing HCP commands for the Vdbox engine
25 //! \details Defines the interfaces for constructing MHW Vdbox HCP commands across all platforms
26 //!
27
28 #include "mhw_vdbox_hcp_interface.h"
29
30 const MhwVdboxHcpInterface::HevcSliceType MhwVdboxHcpInterface::m_hevcBsdSliceType[3] =
31 {
32 MhwVdboxHcpInterface::hevcSliceB,
33 MhwVdboxHcpInterface::hevcSliceP,
34 MhwVdboxHcpInterface::hevcSliceI
35 };
36
AddHcpSurfaceCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_SURFACE_PARAMS params)37 MOS_STATUS MhwVdboxHcpInterface::AddHcpSurfaceCmd(
38 PMOS_COMMAND_BUFFER cmdBuffer,
39 PMHW_VDBOX_SURFACE_PARAMS params)
40 {
41 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
42
43 MHW_FUNCTION_ENTER;
44
45 if (m_decodeInUse)
46 {
47 MHW_MI_CHK_STATUS(AddHcpDecodeSurfaceStateCmd(cmdBuffer, params));
48 }
49 else
50 {
51 MHW_MI_CHK_STATUS(AddHcpEncodeSurfaceStateCmd(cmdBuffer, params));
52 }
53
54 return eStatus;
55 }
56
MhwVdboxHcpInterface(PMOS_INTERFACE osInterface,MhwMiInterface * miInterface,MhwCpInterface * cpInterface,bool decodeInUse)57 MhwVdboxHcpInterface::MhwVdboxHcpInterface(
58 PMOS_INTERFACE osInterface,
59 MhwMiInterface *miInterface,
60 MhwCpInterface *cpInterface,
61 bool decodeInUse)
62 {
63 MHW_FUNCTION_ENTER;
64
65 m_osInterface = osInterface;
66 m_miInterface = miInterface;
67 m_cpInterface = cpInterface;
68 m_decodeInUse = decodeInUse;
69
70 MHW_ASSERT(m_osInterface);
71 MHW_ASSERT(m_miInterface);
72 MHW_ASSERT(m_cpInterface);
73
74 m_waTable = osInterface->pfnGetWaTable(osInterface);
75 m_skuTable = osInterface->pfnGetSkuTable(osInterface);
76
77 if (m_osInterface->bUsesGfxAddress)
78 {
79 pfnAddResourceToCmd = Mhw_AddResourceToCmd_GfxAddress;
80 }
81 else // bUsesPatchList
82 {
83 pfnAddResourceToCmd = Mhw_AddResourceToCmd_PatchList;
84 }
85 }
86
AddHcpPicStateCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_HEVC_PIC_STATE params)87 MOS_STATUS MhwVdboxHcpInterface::AddHcpPicStateCmd(
88 PMOS_COMMAND_BUFFER cmdBuffer,
89 PMHW_VDBOX_HEVC_PIC_STATE params)
90 {
91 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
92
93 MHW_FUNCTION_ENTER;
94
95 if (m_decodeInUse)
96 {
97 MHW_MI_CHK_STATUS(AddHcpDecodePicStateCmd(cmdBuffer, params));
98 }
99 else
100 {
101 MHW_MI_CHK_STATUS(AddHcpEncodePicStateCmd(cmdBuffer, params));
102 }
103
104 return eStatus;
105 }
106
AddHcpSliceStateCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState)107 MOS_STATUS MhwVdboxHcpInterface::AddHcpSliceStateCmd(
108 PMOS_COMMAND_BUFFER cmdBuffer,
109 PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState)
110 {
111 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
112
113 MHW_FUNCTION_ENTER;
114
115 if (m_decodeInUse)
116 {
117 MHW_MI_CHK_STATUS(AddHcpDecodeSliceStateCmd(cmdBuffer, hevcSliceState));
118 }
119 else
120 {
121 MHW_MI_CHK_STATUS(AddHcpEncodeSliceStateCmd(cmdBuffer, hevcSliceState));
122 }
123
124 return eStatus;
125 }
126
AddHcpProtectStateCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState)127 MOS_STATUS MhwVdboxHcpInterface::AddHcpProtectStateCmd(
128 PMOS_COMMAND_BUFFER cmdBuffer,
129 PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState)
130 {
131 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
132
133 MHW_FUNCTION_ENTER;
134
135 MHW_MI_CHK_STATUS(AddHcpDecodeProtectStateCmd(cmdBuffer, hevcSliceState));
136
137 return eStatus;
138 }
139
Convert2SignMagnitude(int32_t val,uint32_t signBitPos)140 uint16_t MhwVdboxHcpInterface::Convert2SignMagnitude(
141 int32_t val,
142 uint32_t signBitPos)
143 {
144 uint16_t retVal = 0;
145 if (val < 0)
146 {
147 retVal = ((1 << (signBitPos - 1)) | (-val & ((1 << (signBitPos - 1)) - 1)));
148 }
149 else
150 {
151 retVal = val & ((1 << (signBitPos - 1)) - 1);
152 }
153 return retVal;
154 }
155