1 /*
2 * Copyright (c) 2017-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     codechal_encode_sw_scoreboard.h
24 //! \brief    Defines base class for SW scoreboard init kernel
25 //!
26 
27 #ifndef __CODECHAL_ENCODE_SW_SCOREBOARD_H__
28 #define __CODECHAL_ENCODE_SW_SCOREBOARD_H__
29 
30 #include "codechal.h"
31 #include "codechal_hw.h"
32 
33 #define CODECHAL_ENCODE_SW_SCOREBOARD_SURFACE_NUM MOS_MAX(dependencyPatternNum, CODECHAL_ENCODE_RECYCLED_BUFFER_NUM)
34 
35 enum DependencyPattern
36 {
37     dependencyWavefrontNone = 0x00,
38     dependencyWavefrontHorizontal = 0x01,
39     dependencyWavefrontVertical = 0x02,
40     dependencyWavefront45Degree = 0x03,
41     dependencyWavefront26Degree = 0x04,
42     dependencyWavefront45XDegree = 0x05,
43     dependencyWavefront26XDegree = 0x06,
44     dependencyWavefront45XVp9Degree = 0x07,
45     dependencyWavefront26ZDegree = 0x08,
46     dependencyWavefront26ZigDegree = 0x09,
47     dependencyWavefront45DDegree = 0x0A,
48     dependencyWavefront26DDegree = 0x0B, // not support yet
49     dependencyWavefront45XDegreeAlt = 0x0C,
50     dependencyWavefront26XDegreeAlt = 0x0D,
51     dependencyWavefront45XDDegree = 0x0E, // 45X diamond
52     dependencyWavefront26XDDegree = 0x0F, // 26X diamond, not support yet
53     dependencyWavefrontCustom = 0x10,
54     dependencyPatternNum = dependencyWavefrontCustom + 1
55 };
56 
57 //!
58 //! SW scoreboard init kernel base class
59 //! \details  Entry point to create SW scoreboard init class instance
60 //!
61 //! This class defines the base class for SW scoreboard init feature, it includes
62 //! common member fields, functions, interfaces etc shared by all Gens.
63 //!
64 //! To create an instance, client needs to call #CodechalEncodeSWScoreboard::CreateSWScoreboardState()
65 //!
66 class CodechalEncodeSwScoreboard
67 {
68 public:
69     //!
70     //! \brief    SW scoreboard init kernel binding table
71     //!
72     enum KernelBTI
73     {
74         swScoreboardInitSurface = 0,
75         swScoreboardInitLcuInfoSurface = 1,
76         swScoreboardNumSurfaces = 2,
77     };
78 
79     //!< \cond SKIP_DOXYGEN
80     //!
81     //! \brief    Curbe params for SW scoreboard init kernel
82     //!
83     struct CurbeParams
84     {
85         uint32_t                                 scoreboardWidth = 0;
86         uint32_t                                 scoreboardHeight = 0;
87         bool                                     isHevc = false;
88         uint32_t                                 numberOfWaveFrontSplit = 0;
89         uint32_t                                 numberOfChildThread = 0;
90     };
91 
92     //!
93     //! \brief    Surface params for SW scoreboard init kernel
94     //!
95     struct SurfaceParams
96     {
97         bool                                     isHevc = false;
98         uint32_t                                 swScoreboardSurfaceWidth = 0;
99         uint32_t                                 swScoreboardSurfaceHeight = 0;
100         MOS_SURFACE                              swScoreboardSurface[CODECHAL_ENCODE_SW_SCOREBOARD_SURFACE_NUM] = {};
101         uint32_t                                 surfaceIndex = 0;
102         PMOS_SURFACE                             lcuInfoSurface = nullptr;
103     };
104 
105     //!
106     //! \brief    Kernel params for SW scoreboard init kernel
107     //!
108     struct KernelParams
109     {
110         uint32_t                                 scoreboardWidth = 0;
111         uint32_t                                 scoreboardHeight = 0;
112         bool                                     isHevc = false;
113         uint32_t                                 numberOfWaveFrontSplit = 0;
114         uint32_t                                 numberOfChildThread = 0;
115         uint32_t                                 swScoreboardSurfaceWidth = 0;
116         uint32_t                                 swScoreboardSurfaceHeight = 0;
117         uint32_t                                 surfaceIndex = 0;
118         PMOS_SURFACE                             lcuInfoSurface = nullptr;
119     };
120 
121     //!
122     //! \brief    Get current SW scoreboard init surface
123     //!
124     //! \param    [in] index
125     //!           Index to SW scorboard surface array
126     //!
127     //! \return   void
128     //!
SetCurSwScoreboardSurfaceIndex(uint32_t index)129     void SetCurSwScoreboardSurfaceIndex(uint32_t index) { m_surfaceParams.surfaceIndex = index; }
130 
131     //!
132     //! \brief    Set current dependency pattern
133     //!
134     //! \return   Currern dependency pattern
135     //!
SetDependencyPattern(DependencyPattern pattern)136     void SetDependencyPattern(DependencyPattern pattern) { m_dependencyPatternIdx = pattern; }
137 
138     //!
139     //! \brief    Get current dependency pattern
140     //!
141     //! \return   Currern dependency pattern
142     //!
GetDependencyPattern()143     DependencyPattern GetDependencyPattern() { return (DependencyPattern)m_dependencyPatternIdx; }
144 
145     //!
146     //! \brief    Get current SW scoreboard init surface
147     //!
148     //! \return   Pointer to current SW scoreboard init surface
149     //!
GetCurSwScoreboardSurface()150     PMOS_SURFACE GetCurSwScoreboardSurface() { return &m_surfaceParams.swScoreboardSurface[m_surfaceParams.surfaceIndex]; }
151 
152     //!
153     //! \brief    Destructor
154     //!
155     virtual ~CodechalEncodeSwScoreboard();
156 
157     //!
158     //! \brief    Get SW scoreboard init BT count
159     //!
160     //! \return   Number of BTI
161     //!
162     virtual uint8_t GetBTCount();
163 
164     //!
165     //! \brief    Initialize SW scoreboard init kernel state
166     //!
167     //! \return   MOS_STATUS
168     //!           MOS_STATUS_SUCCESS if success, else fail reason
169     //!
InitKernelState()170     virtual MOS_STATUS InitKernelState() { return MOS_STATUS_SUCCESS; }
171 
172     //!
173     //! \brief    SW scoreboard init kernel function
174     //!
175     //! \param    [in] params
176     //!           Pointer to KernelParams
177     //!
178     //! \return   MOS_STATUS
179     //!           MOS_STATUS_SUCCESS if success, else fail reason
180     //!
181     virtual MOS_STATUS Execute(KernelParams *params);
182 
183     //!
184     //! \brief    Release SW scoreboard init surface
185     //!
186     //! \return   void
187     //!
188     void ReleaseResources();
189 
190     //!
191     //! \brief    Constructor
192     //!
193     CodechalEncodeSwScoreboard(CodechalEncoderState* encoder);
194 
195     //!
196     //! \brief    Copy constructor
197     //!
198     CodechalEncodeSwScoreboard(const CodechalEncodeSwScoreboard&) = delete;
199 
200     //!
201     //! \brief    Copy assignment operator
202     //!
203     CodechalEncodeSwScoreboard& operator=(const CodechalEncodeSwScoreboard&) = delete;
204 
205     //! \endcond
206 protected:
207     //!
208     //! \brief    SW scoreboard init kernel header struct
209     //!
210     struct KernelHeader
211     {
212         int                     kernelCount = 0;
213         CODECHAL_KERNEL_HEADER  header = {};
214     };
215 
216     CodechalEncoderState*       m_encoder = nullptr;                         //!< Pointer to ENCODER base class
217     MOS_INTERFACE               *m_osInterface = nullptr;                    //!< OS interface
218     CodechalHwInterface         *m_hwInterface = nullptr;                    //!< HW interface
219     CodechalDebugInterface      *m_debugInterface = nullptr;                 //!< Debug interface
220     MhwMiInterface              *m_miInterface = nullptr;                    //!< Common Mi Interface
221     MhwRenderInterface          *m_renderInterface = nullptr;                //!< Render engine interface
222     XMHW_STATE_HEAP_INTERFACE   *m_stateHeapInterface = nullptr;             //!< State heap class interface
223     MHW_KERNEL_STATE            *m_kernelState = nullptr;                    //!< SW scoreboard init kernel state
224 
225     uint32_t                    m_curbeLength = 0;                          //!< SW scoreboard init kernel Curbe length
226     uint32_t                    m_kernelUID = 0;                            //!< SW scoreboard init kernel UID
227     uint32_t                    m_kuidCommon = 0;                           //!< Combined kernel UID
228     uint32_t                    m_combinedKernelSize = 0;                   //!< Combined kernel size
229     uint8_t                     *m_kernelBase = nullptr;                     //!< kernel binary base address
230     CurbeParams                 m_curbeParams = {};                         //!< Curbe parameters
231     SurfaceParams               m_surfaceParams = {};                       //!< Surface parameters
232     uint8_t                     m_dependencyPatternIdx = 0;                 //!< Dependency pattern
233 
234     //!
235     //! Reference to data members in Encoder class
236     //!
237     bool&                       m_useHwScoreboard;
238     bool&                       m_renderContextUsesNullHw;
239     bool&                       m_groupIdSelectSupported;
240     bool&                       m_singleTaskPhaseSupported;
241     bool&                       m_firstTaskInPhase;
242     bool&                       m_lastTaskInPhase;
243     uint8_t&                    m_groupId;
244     uint16_t&                   m_pictureCodingType;
245     uint32_t&                   m_mode;
246     uint32_t&                   m_verticalLineStride;
247     uint32_t&                   m_maxBtCount;
248     uint32_t&                   m_vmeStatesSize;
249     uint32_t&                   m_storeData;
250     MHW_WALKER_MODE&            m_walkerMode;
251 
252 protected:
253     //!
254     //! \brief    SW scoreboard init kernel Curbe data
255     //!
256     struct CurbeData
257     {
258         // DW0
259         union
260         {
261             struct
262             {
263                 uint32_t   scoreboardWidth          : MOS_BITFIELD_RANGE( 0, 15);
264                 uint32_t   scoreboardHeight         : MOS_BITFIELD_RANGE(16, 31);
265             };
266             struct
267             {
268                 uint32_t   value;
269             };
270         } DW0;
271 
272         // DW1
273         union
274         {
275             struct
276             {
277                 uint32_t   isHevc                   : MOS_BITFIELD_BIT  (     0);
278                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 1, 31);
279             };
280             struct
281             {
282                 uint32_t   value;
283             };
284         } DW1;
285 
286         // DW2
287         union
288         {
289             struct
290             {
291                 uint32_t   numberOfWaveFrontsSplits : MOS_BITFIELD_RANGE( 0,  7);
292                 uint32_t   numberofChildThreads     : MOS_BITFIELD_RANGE( 8, 15);
293                 uint32_t   reserved                 : MOS_BITFIELD_RANGE(16, 31);
294             };
295             struct
296             {
297                 uint32_t   value;
298             };
299         } DW2;
300 
301         // DW3
302         union
303         {
304             struct
305             {
306                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
307             };
308             struct
309             {
310                 uint32_t   value;
311             };
312         } DW3;
313 
314         // DW4
315         union
316         {
317             struct
318             {
319                 uint32_t   dependencyPattern        : MOS_BITFIELD_RANGE( 0, 15);
320                 uint32_t   reserved                 : MOS_BITFIELD_RANGE(16, 31);
321             };
322             struct
323             {
324                 uint32_t   value;
325             };
326         } DW4;
327 
328         // DW5
329         union
330         {
331             struct
332             {
333                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
334             };
335             struct
336             {
337                 uint32_t   value;
338             };
339         } DW5;
340 
341         // DW6
342         union
343         {
344             struct
345             {
346                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
347             };
348             struct
349             {
350                 uint32_t   value;
351             };
352         } DW6;
353 
354         // DW7
355         union
356         {
357             struct
358             {
359                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
360             };
361             struct
362             {
363                 uint32_t   value;
364             };
365         } DW7;
366 
367         // DW8
368         union
369         {
370             struct
371             {
372                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
373             };
374             struct
375             {
376                 uint32_t   value;
377             };
378         } DW8;
379 
380         // DW9
381         union
382         {
383             struct
384             {
385                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
386             };
387             struct
388             {
389                 uint32_t   value;
390             };
391         } DW9;
392 
393         // DW10
394         union
395         {
396             struct
397             {
398                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
399             };
400             struct
401             {
402                 uint32_t   value;
403             };
404         } DW10;
405 
406         // DW11
407         union
408         {
409             struct
410             {
411                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
412             };
413             struct
414             {
415                 uint32_t   value;
416             };
417         } DW11;
418 
419         // DW12
420         union
421         {
422             struct
423             {
424                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
425             };
426             struct
427             {
428                 uint32_t   value;
429             };
430         } DW12;
431 
432         // DW13
433         union
434         {
435             struct
436             {
437                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
438             };
439             struct
440             {
441                 uint32_t   value;
442             };
443         } DW13;
444 
445         // DW14
446         union
447         {
448             struct
449             {
450                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
451             };
452             struct
453             {
454                 uint32_t   value;
455             };
456         } DW14;
457 
458         // DW15
459         union
460         {
461             struct
462             {
463                 uint32_t   reserved                 : MOS_BITFIELD_RANGE( 0, 31);
464             };
465             struct
466             {
467                 uint32_t   value;
468             };
469         } DW15;
470 
471         // DW16
472         union
473         {
474             struct
475             {
476                 uint32_t   softwareScoreboard       : MOS_BITFIELD_RANGE( 0, 31);
477             };
478             struct
479             {
480                 uint32_t   value;
481             };
482         } DW16;
483 
484         // DW17
485         union
486         {
487             struct
488             {
489                 uint32_t   lcuInfoSurface           : MOS_BITFIELD_RANGE( 0, 31);
490             };
491             struct
492             {
493                 uint32_t   value;
494             };
495         } DW17;
496     };
497     C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CurbeData)) == 18);
498 
499     //!
500     //! \brief    Allocate SW scoreboard init surface
501     //!
502     //! \return   MOS_STATUS
503     //!           MOS_STATUS_SUCCESS if success, else fail reason
504     //!
505     MOS_STATUS AllocateResources();
506 
507     //!
508     //! \brief    Setup Curbe
509     //!
510     //! \return   MOS_STATUS
511     //!           MOS_STATUS_SUCCESS if success, else fail reason
512     //!
513     virtual MOS_STATUS SetCurbe();
514 
515     //!
516     //! \brief    Send surface
517     //!
518     //! \return   MOS_STATUS
519     //!           MOS_STATUS_SUCCESS if success, else fail reason
520     //!
521     MOS_STATUS SendSurface(PMOS_COMMAND_BUFFER cmdBuffer);
522 };
523 
524 #endif  // __CODECHAL_ENCODE_SW_SCOREBOARD_H__
525