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