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