1 /*
2 * Copyright (c) 2014-2020, 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_decode_downsampling.h
24 //! \brief    Defines the decode interface extension for field downsampling.
25 //! \details  Downsampling in this case is supported by EU kernels.
26 //!
27 
28 #ifndef __CODECHAL_DECODER_DOWNSAMPLING_H__
29 #define __CODECHAL_DECODER_DOWNSAMPLING_H__
30 
31 #include "mos_os.h"
32 #include "mhw_state_heap.h"
33 #include "codechal_mmc.h"
34 
35 struct DecodeProcessingParams;
36 
37 //!
38 //! \class MediaWalkerFieldScalingStaticData
39 //! \brief This class defines the member fields, functions etc. for Media Walker Static Data used by Field Downscaling Kernel.
40 //!
41 class MediaWalkerFieldScalingStaticData
42 {
43 public:
44     //!
45     //! \brief    Constructor
46     //!
47     MediaWalkerFieldScalingStaticData();
48 
49     //!
50     //! \brief    Destructor
51     //!
~MediaWalkerFieldScalingStaticData()52     ~MediaWalkerFieldScalingStaticData() {};
53 
54     //!
55     //! \struct MediaWalkerData
56     //! \brief Media Walker Data bit definitions
57     //!
58     struct MediaWalkerData
59     {
60         // uint32_t 0 - GRF R1.0
61         union
62         {
63             // CSC
64             struct
65             {
66                 uint32_t       m_cscConstantC0                  : 16;
67                 uint32_t       m_cscConstantC1                  : 16;
68             };
69 
70             uint32_t       m_value;
71         } m_dword00;
72 
73         // uint32_t 1 - GRF R1.1
74         union
75         {
76             // CSC
77             struct
78             {
79                 uint32_t       m_cscConstantC2                  : 16;
80                 uint32_t       m_cscConstantC3                  : 16;
81             };
82 
83             uint32_t       m_value;
84         } m_dword01;
85 
86         // uint32_t 2 - GRF R1.2
87         union
88         {
89             // CSC
90             struct
91             {
92                 uint32_t       m_cscConstantC4                  : 16;
93                 uint32_t       m_cscConstantC5                  : 16;
94             };
95 
96             uint32_t       m_value;
97         } m_dword02;
98 
99         // uint32_t 3 - GRF R1.3
100         union
101         {
102             // CSC
103             struct
104             {
105                 uint32_t       m_cscConstantC6                  : 16;
106                 uint32_t       m_cscConstantC7                  : 16;
107             };
108 
109             uint32_t       m_value;
110         } m_dword03;
111 
112         // uint32_t 4 - GRF R1.4
113         union
114         {
115             // CSC
116             struct
117             {
118                 uint32_t       m_cscConstantC8                  : 16;
119                 uint32_t       m_cscConstantC9                  : 16;
120             };
121 
122             uint32_t       m_value;
123         } m_dword04;
124 
125         // uint32_t 5 - GRF R1.5
126         union
127         {
128             // CSC
129             struct
130             {
131                 uint32_t       m_cscConstantC10                 : 16;
132                 uint32_t       m_cscConstantC11                 : 16;
133             };
134 
135             uint32_t       m_value;
136         } m_dword05;
137 
138         // uint32_t 6 - GRF R1.6
139         uint32_t           m_padConstantBlend;
140 
141         // uint32_t 7 - GRF R1.7
142         union
143         {
144             struct
145             {
146                 uint32_t       m_reserved                       : 24;
147                 uint32_t       m_pointerToInlineParameters      : 8;
148             };
149 
150             uint32_t       m_value;
151         } m_dword07;
152 
153         // uint32_t 8 - GRF R2.0
154         union
155         {
156             struct
157             {
158                 uint32_t       m_destinationRectangleWidth      : 16;
159                 uint32_t       m_destinationRectangleHeight     : 16;
160             };
161 
162             uint32_t       m_value;
163         } m_dword08;
164 
165         // uint32_t 9 - GRF R2.1
166         union
167         {
168             struct
169             {
170                 uint32_t       m_reserved0                      : 27;
171                 uint32_t       m_iefByPassEnable                : 1;
172                 uint32_t       m_reserved1                      : 4;
173             };
174 
175             uint32_t       m_value;
176         } m_dword09;
177 
178         // uint32_t 10 - GRF R2.2
179         union
180         {
181             struct
182             {
183                 uint32_t       m_reserved0                      : 24;
184                 uint32_t       m_chromaSitingLocation           : 3;
185                 uint32_t       m_reserved1                      : 5;
186             };
187 
188             uint32_t       m_value;
189         } m_dword10;
190 
191         // uint32_t 11 - 13 - GRF R2.3 - 2.5
192         uint32_t           m_pad0[3];
193 
194         // uint32_t 14 - GRF R2.6
195         union
196         {
197             // Lumakey, NLAS
198             struct
199             {
200                 uint32_t       m_lumakeyLowThreshold            : 8;
201                 uint32_t       m_lumakeyHighThreshold           : 8;
202                 uint32_t       m_nlasEnable                     : 8;
203                 uint32_t       m_reserved                       : 8;
204             };
205 
206             uint32_t       m_value;
207         } m_dword14;
208 
209         // uint32_t 15 - GRF R2.7
210         union
211         {
212             // Save
213             struct
214             {
215                 uint8_t        m_destinationPackedYOffset;
216                 uint8_t        m_destinationPackedUOffset;
217                 uint8_t        m_destinationPackedVOffset;
218                 uint8_t        m_destinationRGBFormat;
219             };
220 
221             uint32_t       m_value;
222         } m_dword15;
223 
224         // uint32_t 16 - GRF R3.0
225         union
226         {
227             // Sampler Load
228             struct
229             {
230                 float          m_horizontalScalingStepRatioLayer0;
231             };
232 
233             uint32_t       m_value;
234         } m_dword16;
235 
236         // uint32_t 17 - 23 - GRF R3.1 - R3.7
237         uint32_t           m_pad1[7];
238 
239         // uint32_t 24 - GRF R4.0
240         union
241         {
242             // Sampler Load
243             struct
244             {
245                 float          m_verticalScalingStepRatioLayer0;
246             };
247 
248             // Dataport Load
249             struct
250             {
251                 uint8_t        m_sourcePackedYOffset;
252                 uint8_t        m_sourcePackedUOffset;
253                 uint8_t        m_sourcePackedVOffset;
254                 uint8_t        m_reserved;
255             };
256 
257             uint32_t       m_value;
258         } m_dword24;
259 
260         // uint32_t 25 - 31 - GRF R4.1 - R4.7
261         uint32_t           m_pad2[7];
262 
263         // uint32_t 32 - GRF R5.0
264         union
265         {
266             // Sampler Load
267             struct
268             {
269                 float          m_verticalFrameOriginLayer0;
270             };
271 
272             uint32_t       m_value;
273         } m_dword32;
274 
275         // uint32_t 33 - 39 - GRF R5.1 - R5.7
276         uint32_t           m_pad3[7];
277 
278         // uint32_t 40 - GRF R6.0
279         union
280         {
281             // Sampler Load
282             struct
283             {
284                 float          m_horizontalFrameOriginLayer0;
285             };
286 
287             uint32_t       m_value;
288         } m_dword40;
289 
290         // uint32_t 41 - 47 - GRF R6.1 - R6.7
291         uint32_t           m_pad4[7];
292 
293         // uint32_t 48  - GRF R7.0
294         union
295         {
296             struct
297             {
298                 uint32_t       m_destXTopLeftLayer0             : 16;
299                 uint32_t       m_destYTopLeftLayer0             : 16;
300             };
301 
302             uint32_t       m_value;
303         } m_dword48;
304 
305         // uint32_t 49 - 55 - GRF R7.1 - R7.7
306         uint32_t           m_pad5[7];
307 
308         // uint32_t 56  - GRF R8.0
309         union
310         {
311             struct
312             {
313                 uint32_t       m_destXBottomRightLayer0         : 16;
314                 uint32_t       m_destYBottomRightLayer0         : 16;
315             };
316 
317             uint32_t       m_value;
318         } m_dword56;
319 
320         // uint32_t 57 - 63 - GRF R8.1
321         uint32_t           m_pad6[7];
322 
323         // uint32_t 64  - GRF R9.0
324         union
325         {
326             struct
327             {
328                 float          m_mainVideoXScalingStepLeft;
329             };
330 
331             uint32_t       m_value;
332         } m_dword64;
333 
334         // DWORD65  - GRF R9.1
335         union
336         {
337             struct
338             {
339                 float          m_videoStepDeltaForNonLinearRegion;
340             };
341 
342             uint32_t       m_value;
343         } m_dword65;
344 
345         // DWORD66  - GRF R9.2
346         union
347         {
348             struct
349             {
350                 uint32_t       m_startofLinearScalingInPixelPositionC0          : 16;
351                 uint32_t       m_startofRHSNonLinearScalingInPixelPositionC1    : 16;
352             };
353 
354             uint32_t       m_value;
355         } m_dword66;
356 
357         // uint32_t 67 - GRF R9.3
358         union
359         {
360             // Sampler Load
361             struct
362             {
363                 float          m_mainVideoXScalingStepCenter;
364             };
365 
366             uint32_t       m_value;
367         } m_dword67;
368 
369         // uint32_t 68 - GRF R9.4
370         union
371         {
372             // Sampler Load
373             struct
374             {
375                 float          m_mainVideoXScalingStepRight;
376             };
377 
378             uint32_t       m_value;
379         } m_dword68;
380 
381         // uint32_t 69-71 - Padding is needed as we program ConstantURBEntryReadLength  = iCurbeLength >> 5
382         uint32_t           m_pad[3];
383     } m_mediaWalkerData;                                              //!< media walker data
384 
385     static const size_t m_byteSize = sizeof(MediaWalkerData);         //!< byte size of media walker data
386 };
387 
388 //!
389 //! \class FieldScalingInterface
390 //! \brief This class defines the member fields, functions etc used by Field Downscaling interface.
391 //!
392 class FieldScalingInterface
393 {
394 public:
395     //!
396     //! \brief    Copy constructor
397     //!
398     FieldScalingInterface(const FieldScalingInterface&) = delete;
399 
400     //!
401     //! \brief    Copy assignment operator
402     //!
403     FieldScalingInterface& operator=(const FieldScalingInterface&) = delete;
404 
405     //!
406     //! \brief    Destructor
407     //!
408     virtual ~FieldScalingInterface();
409 
410     //!
411     //! \brief    Check Field Scaling Supported
412     //! \details  Check parameter legitimacy for field scaling
413     //! \param    [in] procParams
414     //!           Pointer to decode processing paramters #CODECHAL_DECODE_PROCESSING_PARAMS
415     //! \return   bool
416     //!           true if support, else false
417     //!
418     bool IsFieldScalingSupported(DecodeProcessingParams *procParams);
419 
420     //!
421     //! \brief    Initialize Field Scaling Kernel State
422     //! \details  Initialize Field Scaling Kernel State & Params
423     //! \param    [in] decoder
424     //!           Pointer to decode interface
425     //! \param    [in] hwInterface
426     //!           Pointer to hardware interface
427     //! \param    [in] osInterface
428     //!           Pointer to OS interface
429     //! \return   MOS_STATUS
430     //!           MOS_STATUS_SUCCESS if success, else fail reason
431     //!
432     virtual MOS_STATUS InitializeKernelState(
433         CodechalDecode                      *decoder,
434         CodechalHwInterface                 *hwInterface,
435         PMOS_INTERFACE                      osInterface);
436 
437     //!
438     //! \brief    Send Media VFE cmds
439     //! \details  Send Media VFE cmds to setup VFE for media kernel
440     //! \param    [in] cmdBuffer
441     //!           Pointer to command buffer
442     //! \param    [in] kernelState
443     //!           Pointer to MHW kernel state
444     //! \return   MOS_STATUS
445     //!           MOS_STATUS_SUCCESS if success, else fail reason
446     //!
447     virtual MOS_STATUS SetupMediaVfe(
448         PMOS_COMMAND_BUFFER  cmdBuffer,
449         MHW_KERNEL_STATE     *kernelState);
450 
451     //!
452     //! \brief  Initialize MMC state for specified downsampling device
453     //!
454     //! \return MOS_STATUS
455     //!         MOS_STATUS_SUCCESS if success, else fail reason
456     //!
457     virtual MOS_STATUS InitMmcState();
458 
459     //!
460     //! \brief    Perform Field Scaling
461     //! \details  Configure kernel regions to do field scaling
462     //! \param    [in] procParams
463     //!           Pointer to decode processing paramters #CODECHAL_DECODE_PROCESSING_PARAMS
464     //! \param    [in] renderContext
465     //!           The render context using for decode
466     //! \param    [in] disableDecodeSyncLock
467     //!           Disable decode sync lock
468     //! \param    [in] disableLockForTranscode
469     //!           Disable lock for transcode
470     //! \return   MOS_STATUS
471     //!           MOS_STATUS_SUCCESS if success, else fail reason
472     //!
473     virtual MOS_STATUS DoFieldScaling(
474         DecodeProcessingParams *procParams,
475         MOS_GPU_CONTEXT         renderContext,
476         bool                    disableDecodeSyncLock,
477         bool                    disableLockForTranscode);
478 
479 protected:
480     //!
481     //! \brief    Constructor
482     //!
483     FieldScalingInterface();
484 
485     //!
486     //! \enum     FieldScalingKernelStateIdx
487     //! \brief    Field scaling kernel state index
488     //!
489     enum FieldScalingKernelStateIdx
490     {
491         stateNv12     = 0,                                                                              //!< Field scaling kernel index for NV12
492         stateYuy2,                                                                                      //!< Field scaling kernel index for YUY2
493         stateMax                                                                                        //!< Max kernel index for Field scaling
494     };
495 
496     enum
497     {
498         fieldTopSrcY        = 0,                                                                        //!< Binding table offset for Top field input Y
499         fieldTopSrcUV       = 1,                                                                        //!< Binding table offset for Top field input UV
500         fieldBotSrcY        = 48,                                                                       //!< Binding table offset for Bottom field input Y
501         fieldBotSrcUV       = 49,                                                                       //!< Binding table offset for Bottom field input UV
502         dstY                = 24,                                                                       //!< Binding table offset for output Y
503         dstUV               = 25,                                                                       //!< Binding table offset for output UV
504         numSurfaces         = 50                                                                        //!< Number of BT entries for Field scaling
505     };
506 
507     static const uint32_t           m_maxInputWidth             = 4096;                                 //!< Max input width supported by Field Scaling
508     static const uint32_t           m_minInputWidth             = 128;                                  //!< Min input width supported by Field Scaling
509     static const uint32_t           m_maxInputHeight            = 4096;                                 //!< Max input height supported by Field Scaling
510     static const uint32_t           m_minInputHeight            = 128;                                  //!< Min input height supported by Field Scaling
511 
512     static const uint32_t           m_initDshSize               = MHW_PAGE_SIZE;                        //!< Init DSH size for Field Downscailng kernel
513     static const uint32_t           m_samplerNum                = 4;                                    //!< Sampler count for Field Downscaling kernel
514     static const uint32_t           m_numSyncTags               = 16;                                   //!< Sync tags num of state heap settings
515     static const float              m_maxScaleRatio;                                                    //!< Maximum scaling ratio for both X and Y directions
516     static const float              m_minScaleRatio;                                                    //!< Minimum scaling ratio for both X and Y directions
517 
518     CodechalDecode                  *m_decoder                  = nullptr;                              //!< Pointer to Decode Interface
519     MOS_INTERFACE                   *m_osInterface              = nullptr;                              //!< Pointer to OS Interface
520     CodechalHwInterface             *m_hwInterface              = nullptr;                              //!< Pointer to HW Interface
521     MhwRenderInterface              *m_renderInterface          = nullptr;                              //!< Pointer to Render Interface
522     MHW_STATE_HEAP_INTERFACE        *m_stateHeapInterface       = nullptr;                              //!< Pointer to State Heap Interface
523     MhwMiInterface                  *m_miInterface              = nullptr;                              //!< Pointer to MI interface.
524     uint8_t                         *m_kernelBase               = nullptr;                              //!< Pointer to kernel base address
525     CodecHalMmcState                *m_mmcState                 = nullptr;                              //!< Pointer to MMC state
526     uint8_t                         *m_kernelBinary[stateMax];                                          //!< Kernel binary
527     uint32_t                        m_kernelUID[stateMax];                                              //!< Kernel unique ID
528     uint32_t                        m_kernelSize[stateMax];                                             //!< Kernel size
529     MHW_KERNEL_STATE                m_kernelStates[stateMax];                                           //!< Kernel state
530     uint32_t                        m_dshSize[stateMax];                                                //!< DSH size
531     MOS_RESOURCE                    m_syncObject;                                                       //!< Sync Object
532     uint32_t                        m_curbeLength;                                                      //!< Media Data struct Length
533 
534     //!
535     //! \brief    Initialize state heap settings and kernel params
536     //! \details  Initialize Field Scaling Kernel State heap settings & params
537     //! \param    [in] hwInterface
538     //!           Pointer to HW Interface
539     //! \return   MOS_STATUS
540     //!           MOS_STATUS_SUCCESS if success, else fail reason
541     //!
542     virtual MOS_STATUS InitInterfaceStateHeapSetting(
543         CodechalHwInterface               *hwInterface);
544 
545 protected:
546     //!
547     //! \brief    Set Field Scaling Curbe
548     //! \details  Set curbe for field scaling kernel
549     //! \param    MHW_KERNEL_STATE *kernelState
550     //!           [in] Pointer to kernel state
551     //! \param    CODECHAL_DECODE_PROCESSING_PARAMS *procParams
552     //!           [in] Pointer to decode processing paramters
553     //! \return   MOS_STATUS
554     //!           MOS_STATUS_SUCCESS if success, else fail reason
555     //!
556     MOS_STATUS SetCurbeFieldScaling(
557         MHW_KERNEL_STATE       *kernelState,
558         DecodeProcessingParams *procParams);
559 };
560 #endif // __CODECHAL_DECODER_DOWNSAMPLING_H__
561