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_g12.h
24 //! \brief Gen12 kernel header definitions.
25 //!
26
27 #ifndef __CODECHAL_KERNEL_HEADER_G12_H__
28 #define __CODECHAL_KERNEL_HEADER_G12_H__
29
30 #include "codechal_encoder_base.h"
31
32 struct HmeDsScoreboardKernelHeader {
33 int nKernelCount;
34 union
35 {
36 struct
37 {
38 CODECHAL_KERNEL_HEADER hmeDownscaleGenX0;
39 CODECHAL_KERNEL_HEADER hmeDownscaleGenX1;
40 CODECHAL_KERNEL_HEADER hmeDownscaleGenX2;
41 CODECHAL_KERNEL_HEADER hmeDownscaleGenX3;
42 CODECHAL_KERNEL_HEADER hmeGenX0;
43 CODECHAL_KERNEL_HEADER hmeGenX1;
44 CODECHAL_KERNEL_HEADER hmeGenX2;
45 CODECHAL_KERNEL_HEADER hmeHevcVdenc;
46 CODECHAL_KERNEL_HEADER hmeHevcVdencRAB;
47 CODECHAL_KERNEL_HEADER hmeDetectionGenX0;
48 CODECHAL_KERNEL_HEADER dsConvertGenX0;
49 CODECHAL_KERNEL_HEADER initSwScoreboard;
50 CODECHAL_KERNEL_HEADER intraDistortion;
51 CODECHAL_KERNEL_HEADER dynamicScaling;
52 };
53 };
54 };
55
56 enum HmeDsScoreboardKernelIdx
57 {
58 // HME + Scoreboard Kernel Surface
59 CODECHAL_HME_DOWNSCALE_GEN12_0_KRNIDX = 0,
60 CODECHAL_HME_DOWNSCALE_GEN12_1_KRNIDX,
61 CODECHAL_HME_DOWNSCALE_GEN12_2_KRNIDX,
62 CODECHAL_HME_DOWNSCALE_GEN12_3_KRNIDX,
63 CODECHAL_HME_GEN12_0_KRNIDX,
64 CODECHAL_HME_GEN12_1_KRNIDX,
65 CODECHAL_HME_GEN12_2_KRNIDX,
66 CODECHAL_HME_HEVC_VDENC__GEN12_KRNIDX,
67 CODECHAL_HME_HEVC_VDENC_RAB_GEN12_KRNIDX,
68 CODECHAL_HMEDetection_GEN12_0_KRNIDX,
69 CODECHAL_DS_CONVERT_GEN12_0_KRNIDX,
70 CODECHAL_SW_SCOREBOARD_G12_KRNIDX,
71 CODECHAL_INTRA_DISTORTION_G12_KRNIDX,
72 CODECHAL_DYNAMIC_SCALING_G12_KRNIDX,
73 CODECHAL_HmeDsSwScoreboardInit_NUM_KRN_G12
74 };
75
76 //!
77 //! \brief Get common kernel header and size
78 //!
79 //! \param [in] binary
80 //! Kernel binary
81 //!
82 //! \param [in] operation
83 //! Encode operation
84 //!
85 //! \param [in] krnStateIdx
86 //! Kernel state index
87 //!
88 //! \param [in] krnHeader
89 //! Kernel header
90 //!
91 //! \param [in] krnSize
92 //! Kernel size
93 //!
94 //! \return MOS_STATUS
95 //! MOS_STATUS_SUCCESS if success, else fail reason
96 //!
GetCommonKernelHeaderAndSizeG12(void * binary,EncOperation operation,uint32_t krnStateIdx,void * krnHeader,uint32_t * krnSize)97 static MOS_STATUS GetCommonKernelHeaderAndSizeG12(
98 void *binary,
99 EncOperation operation,
100 uint32_t krnStateIdx,
101 void *krnHeader,
102 uint32_t *krnSize)
103 {
104 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
105
106 CODECHAL_ENCODE_FUNCTION_ENTER;
107
108 CODECHAL_ENCODE_CHK_NULL_RETURN(binary);
109 CODECHAL_ENCODE_CHK_NULL_RETURN(krnHeader);
110 CODECHAL_ENCODE_CHK_NULL_RETURN(krnSize);
111
112 HmeDsScoreboardKernelHeader *kernelHeaderTable;
113 kernelHeaderTable = (HmeDsScoreboardKernelHeader*)binary;
114 PCODECHAL_KERNEL_HEADER invalidEntry;
115 invalidEntry = &(kernelHeaderTable->dynamicScaling) + 1;
116
117 PCODECHAL_KERNEL_HEADER currKrnHeader;
118 switch (operation)
119 {
120 case ENC_SCALING4X:
121 currKrnHeader = &kernelHeaderTable->hmeDownscaleGenX0;
122 break;
123 case ENC_SCALING2X:
124 currKrnHeader = &kernelHeaderTable->hmeDownscaleGenX2;
125 break;
126 case ENC_ME:
127 currKrnHeader = &kernelHeaderTable->hmeGenX0;
128 break;
129 case VDENC_ME_P:
130 currKrnHeader = &kernelHeaderTable->hmeGenX0;
131 break;
132 case VDENC_ME_B:
133 currKrnHeader = &kernelHeaderTable->hmeGenX1;
134 break;
135 case VDENC_ME:
136 currKrnHeader = &kernelHeaderTable->hmeGenX2;
137 break;
138 case VDENC_STREAMIN_HEVC:
139 currKrnHeader = &kernelHeaderTable->hmeHevcVdenc;
140 break;
141 case VDENC_STREAMIN_HEVC_RAB:
142 currKrnHeader = &kernelHeaderTable->hmeHevcVdencRAB;
143 break;
144 case ENC_SFD:
145 currKrnHeader = &kernelHeaderTable->hmeDetectionGenX0;
146 break;
147 case ENC_SCALING_CONVERSION:
148 currKrnHeader = &kernelHeaderTable->dsConvertGenX0;
149 break;
150 case ENC_SCOREBOARD:
151 currKrnHeader = &kernelHeaderTable->initSwScoreboard;
152 break;
153 case ENC_INTRA_DISTORTION:
154 currKrnHeader = &kernelHeaderTable->intraDistortion;
155 break;
156 case ENC_DYS:
157 currKrnHeader = &kernelHeaderTable->dynamicScaling;
158 break;
159 default:
160 CODECHAL_ENCODE_ASSERTMESSAGE("Unsupported ENC mode requested");
161 eStatus = MOS_STATUS_INVALID_PARAMETER;
162 return eStatus;
163 }
164
165 currKrnHeader += krnStateIdx;
166 *((PCODECHAL_KERNEL_HEADER)krnHeader) = *currKrnHeader;
167
168 PCODECHAL_KERNEL_HEADER nextKrnHeader;
169 nextKrnHeader = (currKrnHeader + 1);
170 uint32_t nextKrnOffset;
171 nextKrnOffset = *krnSize;
172
173 if (nextKrnHeader < invalidEntry)
174 {
175 nextKrnOffset = nextKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT;
176 }
177 *krnSize = nextKrnOffset - (currKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT);
178
179 return eStatus;
180 }
181
182 #endif // __CODECHAL_KERNEL_HEADER_G12_H__
183