1 /*
2 * Copyright (c) 2017-2019, 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 codechal_kernel_header_g11.h
24 //! \brief Gen11 kernel header definitions.
25 //!
26
27 #ifndef __CODECHAL_KERNEL_HEADER_G11_H__
28 #define __CODECHAL_KERNEL_HEADER_G11_H__
29
30 #include "codechal_encoder_base.h"
31
32 struct HmeDsScoreboardKernelHeaderG11 {
33 int nKernelCount;
34 union
35 {
36 struct
37 {
38 CODECHAL_KERNEL_HEADER hmeDownscaleGenX0;
39 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
40 CODECHAL_KERNEL_HEADER hmeDownscaleGenX1;
41 #endif
42 CODECHAL_KERNEL_HEADER hmeDownscaleGenX2;
43 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
44 CODECHAL_KERNEL_HEADER hmeDownscaleGenX3;
45 #endif
46 CODECHAL_KERNEL_HEADER hmeP;
47 CODECHAL_KERNEL_HEADER hmeB;
48 CODECHAL_KERNEL_HEADER hmeVdenc;
49 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
50 CODECHAL_KERNEL_HEADER hmeHevcVdenc;
51 CODECHAL_KERNEL_HEADER hmeDetectionGenX0;
52 #endif
53 CODECHAL_KERNEL_HEADER dsConvertGenX0;
54 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
55 CODECHAL_KERNEL_HEADER initSwScoreboard;
56 CODECHAL_KERNEL_HEADER intraDistortion;
57 CODECHAL_KERNEL_HEADER dynamicScaling;
58 CODECHAL_KERNEL_HEADER weightedPrediction;
59 #endif
60 };
61 };
62 };
63
64 enum HmeDsScoreboardKernelIdxG11
65 {
66 // HME + Scoreboard Kernel Surface
67 CODECHAL_HME_DOWNSCALE_GENX_0_KRNIDX = 0,
68 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
69 CODECHAL_HME_DOWNSCALE_GENX_1_KRNIDX,
70 #endif
71 CODECHAL_HME_DOWNSCALE_GENX_2_KRNIDX,
72 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
73 CODECHAL_HME_DOWNSCALE_GENX_3_KRNIDX,
74 #endif
75 CODECHAL_HME_GENX_0_KRNIDX,
76 CODECHAL_HME_GENX_1_KRNIDX,
77 CODECHAL_HME_GENX_2_KRNIDX,
78 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
79 CODECHAL_HME_HEVC_VDENC_KRNIDX,
80 CODECHAL_HMEDetection_GENX_0_KRNIDX,
81 #endif
82 CODECHAL_DS_CONVERT_GENX_0_KRNIDX,
83 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
84 CODECHAL_SW_SCOREBOARD_G11_KRNIDX,
85 CODECHAL_INTRA_DISTORTION_G11_KRNIDX,
86 CODECHAL_DYNAMIC_SCALING_G11_KRNIDX,
87 #endif
88 CODECHAL_HmeDsSwScoreboardInit_NUM_KRN_G11
89 };
90
91 //!
92 //! \brief Get common kernel header and size
93 //!
94 //! \param [in] binary
95 //! Kernel binary
96 //!
97 //! \param [in] operation
98 //! Encode operation
99 //!
100 //! \param [in] krnStateIdx
101 //! Kernel state index
102 //!
103 //! \param [in] krnHeader
104 //! Kernel header
105 //!
106 //! \param [in] krnSize
107 //! Kernel size
108 //!
109 //! \return MOS_STATUS
110 //! MOS_STATUS_SUCCESS if success, else fail reason
111 //!
GetCommonKernelHeaderAndSizeG11(void * binary,EncOperation operation,uint32_t krnStateIdx,void * krnHeader,uint32_t * krnSize)112 static MOS_STATUS GetCommonKernelHeaderAndSizeG11(
113 void *binary,
114 EncOperation operation,
115 uint32_t krnStateIdx,
116 void *krnHeader,
117 uint32_t *krnSize)
118 {
119 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
120
121 CODECHAL_ENCODE_FUNCTION_ENTER;
122
123 CODECHAL_ENCODE_CHK_NULL_RETURN(binary);
124 CODECHAL_ENCODE_CHK_NULL_RETURN(krnHeader);
125 CODECHAL_ENCODE_CHK_NULL_RETURN(krnSize);
126
127 HmeDsScoreboardKernelHeaderG11 *kernelHeaderTable;
128 kernelHeaderTable = (HmeDsScoreboardKernelHeaderG11*)binary;
129
130 PCODECHAL_KERNEL_HEADER currKrnHeader;
131 switch (operation)
132 {
133 case ENC_SCALING4X:
134 currKrnHeader = &kernelHeaderTable->hmeDownscaleGenX0;
135 break;
136 case ENC_SCALING2X:
137 currKrnHeader = &kernelHeaderTable->hmeDownscaleGenX2;
138 break;
139 case ENC_ME:
140 currKrnHeader = &kernelHeaderTable->hmeP;
141 break;
142 case VDENC_ME_B:
143 currKrnHeader = &kernelHeaderTable->hmeB;
144 break;
145 case VDENC_ME:
146 currKrnHeader = &kernelHeaderTable->hmeVdenc;
147 break;
148 case ENC_SCALING_CONVERSION:
149 currKrnHeader = &kernelHeaderTable->dsConvertGenX0;
150 break;
151 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
152 case VDENC_STREAMIN_HEVC:
153 currKrnHeader = &kernelHeaderTable->hmeHevcVdenc;
154 break;
155 case ENC_SFD:
156 currKrnHeader = &kernelHeaderTable->hmeDetectionGenX0;
157 break;
158 case ENC_SCOREBOARD:
159 currKrnHeader = &kernelHeaderTable->initSwScoreboard;
160 break;
161 case ENC_INTRA_DISTORTION:
162 currKrnHeader = &kernelHeaderTable->intraDistortion;
163 break;
164 case ENC_DYS:
165 currKrnHeader = &kernelHeaderTable->dynamicScaling;
166 break;
167 case ENC_WP:
168 currKrnHeader = &kernelHeaderTable->weightedPrediction;
169 break;
170 #endif
171 default:
172 CODECHAL_ENCODE_ASSERTMESSAGE("Unsupported ENC mode requested");
173 eStatus = MOS_STATUS_INVALID_PARAMETER;
174 return eStatus;
175 }
176
177 currKrnHeader += krnStateIdx;
178 *((PCODECHAL_KERNEL_HEADER)krnHeader) = *currKrnHeader;
179
180 PCODECHAL_KERNEL_HEADER invalidEntry;
181 invalidEntry = &(kernelHeaderTable->hmeDownscaleGenX0) + CODECHAL_HmeDsSwScoreboardInit_NUM_KRN_G11;
182 PCODECHAL_KERNEL_HEADER nextKrnHeader;
183 nextKrnHeader = (currKrnHeader + 1);
184 uint32_t nextKrnOffset;
185 nextKrnOffset = *krnSize;
186
187 if (nextKrnHeader < invalidEntry)
188 {
189 nextKrnOffset = nextKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT;
190 }
191 *krnSize = nextKrnOffset - (currKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT);
192
193 return eStatus;
194 }
195
196 #endif // __CODECHAL_KERNEL_HEADER_G11_H__
197