1 /*
2 * Copyright (c) 2011-2017, 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     vphal_render_vebox_g9_base.h
24 //! \brief    Interface and structure specific for SKL (GEN9) Vebox
25 //! \details  Interface and structure specific for SKL (GEN9) Vebox
26 //!
27 #ifndef __VPHAL_RENDER_VEBOX_G9_BASE_H__
28 #define __VPHAL_RENDER_VEBOX_G9_BASE_H__
29 
30 #include "vphal_render_vebox_base.h"
31 
32 #define VPHAL_VEBOX_MAX_SLICES_G9                               2
33 
34 #define VPHAL_VEBOX_RGB_HISTOGRAM_SIZE_G9                       (VPHAL_VEBOX_RGB_HISTOGRAM_SIZE_PER_SLICE * \
35                                                                  VPHAL_NUM_RGB_CHANNEL                    * \
36                                                                  VPHAL_VEBOX_MAX_SLICES_G9)
37 //!
38 //! \brief Temporal Denoise Definitions for SKL+
39 //!
40 #define NOISE_HISTORY_MAX_DEFAULT_G9                            208
41 #define NOISE_NUMMOTIONPIXELS_THRESHOLD_DEFAULT_G9              2
42 
43 //!
44 //! \brief SKL+ added 4 LSB for ASD/STAD/SCM/LTDT/TDT, hence shifting 4 below.
45 //!
46 #define NOISE_ABSSUMTEMPORALDIFF_THRESHOLD_LOW_G9               (32  << 4)
47 #define NOISE_ABSSUMTEMPORALDIFF_THRESHOLD_DEFAULT_G9           (32  << 4)
48 #define NOISE_ABSSUMTEMPORALDIFF_THRESHOLD_HIGH_G9              (40  << 4)
49 #define NOISE_SPATIALCOMPLEXITYMATRIX_THRESHOLD_LOW_G9          (32  << 4)
50 #define NOISE_SPATIALCOMPLEXITYMATRIX_THRESHOLD_DEFAULT_G9      (32  << 4)
51 #define NOISE_SPATIALCOMPLEXITYMATRIX_THRESHOLD_HIGH_G9         (40  << 4)
52 #define NOISE_LOWTEMPORALPIXELDIFF_THRESHOLD_LOW_G9             (4   << 4)
53 #define NOISE_LOWTEMPORALPIXELDIFF_THRESHOLD_DEFAULT_G9         (8   << 4)
54 #define NOISE_LOWTEMPORALPIXELDIFF_THRESHOLD_HIGH_G9            (8   << 4)
55 #define NOISE_TEMPORALPIXELDIFF_THRESHOLD_LOW_G9                (8  << 4)
56 #define NOISE_TEMPORALPIXELDIFF_THRESHOLD_DEFAULT_G9            (12  << 4)
57 #define NOISE_TEMPORALPIXELDIFF_THRESHOLD_HIGH_G9               (12  << 4)
58 #define NOISE_SUMABSTEMPORALDIFF_THRESHOLD_LOW_G9               (128 << 4)
59 #define NOISE_SUMABSTEMPORALDIFF_THRESHOLD_DEFAULT_G9           (128 << 4)
60 #define NOISE_SUMABSTEMPORALDIFF_THRESHOLD_HIGH_G9              (144 << 4)
61 
62 //!
63 //! \brief Vebox Statistics Surface definition for SKL+
64 //!
65 #define VPHAL_VEBOX_STATISTICS_SIZE_G9                          (32 * 4)
66 #define VPHAL_VEBOX_STATISTICS_PER_FRAME_SIZE_G9                (32 * sizeof(uint32_t))
67 #define VPHAL_VEBOX_STATISTICS_SURFACE_FMD_OFFSET_G9            0
68 #define VPHAL_VEBOX_STATISTICS_SURFACE_GNE_OFFSET_G9            0x2C
69 #define VPHAL_VEBOX_STATISTICS_SURFACE_STD_OFFSET_G9            0x44
70 
71 //!
72 //! \brief Vebox Histogram Surface definition for SKL
73 //!
74 #define VPHAL_VEBOX_ACE_HISTOGRAM_SLICE0_OFFSET_G9              0x1C00
75 #define VPHAL_VEBOX_ACE_HISTOGRAM_SLICE1_OFFSET_G9              0x2400
76 
77 struct VEBOX_STATE_UPDATE_STATIC_DATA_G9
78 {
79     // DWORD 0 - GRF R1.0
80     union
81     {
82         // DN State Update
83         struct
84         {
85             uint32_t       OffsetToSlice0;
86         };
87 
88         uint32_t       Value;
89     } DW00;
90 
91     // DWORD 1 - GRF R1.1
92     union
93     {
94         // DN State Update
95         struct
96         {
97             uint32_t       OffsetToSlice1;
98         };
99 
100         uint32_t       Value;
101     } DW01;
102 
103     // DWORD 2 - GRF R1.2
104     union
105     {
106         // DN State Update
107         struct
108         {
109             uint32_t       FirstFrameFlag : 16;
110             uint32_t       NoiseLevel : 16;
111         };
112 
113         uint32_t   Value;
114     } DW02;
115 
116     // DWORD 3 - GRF R1.3
117     union
118     {
119         // RangeThr Adp2NLvl: 1 ifenabled, 0 otherwise
120         struct
121         {
122             uint32_t       RangeThrAdp2NLvl : 16;
123             uint32_t       reserved : 16;
124         };
125 
126         uint32_t   Value;
127     } DW03;
128 
129     // DWORD 4 - GRF R1.4
130     union
131     {
132         // Vebox Statistics Surface
133         struct
134         {
135             uint32_t       VeboxStatisticsSurface;
136         };
137 
138         uint32_t   Value;
139     } DW04;
140 
141     // DWORD 5 - GRF R1.5
142     union
143     {
144         // Vebox DnDi State Surface
145         struct
146         {
147             uint32_t       VeboxDndiStateSurface;
148         };
149 
150         uint32_t   Value;
151     } DW05;
152 
153     // DWORD 6 - GRF R1.6
154     union
155     {
156         // Vebox GNE surface
157         struct
158         {
159             uint32_t       VeboxTempSurface;
160         };
161 
162         uint32_t   Value;
163     } DW06;
164 
165     // DWORD 7 - GRF R1.7
166     union
167     {
168         // Vebox Spatial Attributes Configuration Surface
169         struct
170         {
171             uint32_t       VeboxSpatialAttributesConfigurationSurface;
172         };
173 
174         uint32_t   Value;
175     } DW07;
176 };
177 
178 typedef class VPHAL_VEBOX_STATE_G9_BASE *PVPHAL_VEBOX_STATE_G9_BASE;
179 class VPHAL_VEBOX_STATE_G9_BASE:virtual public VPHAL_VEBOX_STATE
180 {
181 public:
182     VPHAL_VEBOX_STATE_G9_BASE(
183         PMOS_INTERFACE                  pOsInterface,
184         PMHW_VEBOX_INTERFACE            pVeboxInterface,
185         PMHW_SFC_INTERFACE              pSfcInterface,
186         PRENDERHAL_INTERFACE            pRenderHal,
187         PVPHAL_VEBOX_EXEC_STATE         pVeboxExecState,
188         PVPHAL_RNDR_PERF_DATA           pPerfData,
189         const VPHAL_DNDI_CACHE_CNTL     &dndiCacheCntl,
190         MOS_STATUS                      *peStatus);
191 
~VPHAL_VEBOX_STATE_G9_BASE()192     virtual                             ~VPHAL_VEBOX_STATE_G9_BASE() { }
193 
194     virtual MOS_STATUS AllocateResources();
195 
196     virtual void FreeResources();
197 
198     virtual MOS_STATUS SetupVeboxKernel(
199         int32_t                     iKDTIndex);
200 
201     virtual MOS_STATUS SetupDiIecpState(
202         bool                        bDiScdEnable,
203         PMHW_VEBOX_DI_IECP_CMD_PARAMS
204         pVeboxDiIecpCmdParams);
205 
206     virtual void SetupSurfaceStates(
207         bool                        bDiVarianceEnable,
208         PVPHAL_VEBOX_SURFACE_STATE_CMD_PARAMS
209         pVeboxSurfaceStateCmdParams);
210 
211     virtual MOS_STATUS SetupVeboxState(
212         bool                        bDiVarianceEnable,
213         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
214 
215     virtual bool IsNeeded(
216         PCVPHAL_RENDER_PARAMS       pcRenderParams,
217         RenderpassData              *pRenderPassData);
218 
219 #if VEBOX_AUTO_DENOISE_SUPPORTED
220     virtual MOS_STATUS LoadUpdateDenoiseKernelStaticData(
221         int32_t*                        iCurbeOffsetOutDN);
222 
223     virtual MOS_STATUS SetupSurfaceStatesForDenoise();
224 #endif
225 
226     virtual bool IsFormatSupported(
227         PVPHAL_SURFACE              pSrcSurface);
228 
229     virtual bool IsRTFormatSupported(
230         PVPHAL_SURFACE                  pSrcSurface,
231         PVPHAL_SURFACE                  pRTSurface);
232 
233     virtual bool IsDnFormatSupported(
234         PVPHAL_SURFACE                  pSrcSurface);
235 
236     virtual bool IsDiFormatSupported(
237         PVPHAL_SURFACE              pSrcSurface);
238 
239     virtual VPHAL_OUTPUT_PIPE_MODE  GetOutputPipe(
240         PCVPHAL_RENDER_PARAMS               pcRenderParams,
241         PVPHAL_SURFACE                      pSrcSurface,
242         bool*                               pbCompNeeded);
243 
244     virtual bool UseKernelResource();
245 
246     virtual void VeboxGetBeCSCMatrix(
247         PVPHAL_SURFACE                  pSrcSurface,
248         PVPHAL_SURFACE                  pOutSurface);
249 
250 protected:
251     //!
252     //! \brief    Setup Vebox_DI_IECP Command params for VEBOX final output surface on G75
253     //! \details  Setup Vebox_DI_IECP Command params for VEBOX final output surface on G75
254     //! \param    bDiScdEnable
255     //!           [in] Is DI/Variances report enabled
256     //! \param    pVeboxDiIecpCmdParams
257     //!           [in,out] Pointer to VEBOX_DI_IECP command parameters
258     //! \return   MOS_STATUS
259     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
260     //!
261     virtual MOS_STATUS SetupDiIecpStateForOutputSurf(
262         bool                                    bDiScdEnable,
263         PMHW_VEBOX_DI_IECP_CMD_PARAMS           pVeboxDiIecpCmdParams);
264 
265     //!
266     //! \brief    IsFormatMMCSupported
267     //! \details  Check if the format of vebox output surface is supported by MMC
268     //! \param    [in] Format
269     //! \return   bool  true if suported, otherwise not supported
270     //!
271     virtual bool IsFormatMMCSupported(
272         MOS_FORMAT                  Format);
273 
274     //!
275     //! \brief    Get Output surface params needed when allocate surfaces
276     //! \details  Get Output surface params needed when allocate surfaces
277     //! \param    Format
278     //!           [out] Format of output surface
279     //! \param    TileType
280     //!           [out] Tile type of output surface
281     //! \return   MOS_STATUS
282     //!           Return MOS_STATUS_SUCCESS if success, otherwise failed
283     //!
284     virtual MOS_STATUS      GetOutputSurfParams(
285         MOS_FORMAT          &Format,
286         MOS_TILE_TYPE       &TileType);
287 
288     //!
289     //! \brief    Get related surf parameters needed when allocate FFDI surface
290     //! \details  Get related surf parameters needed when allocate FFDI surface
291     //! \param    ColorSpace
292     //!           [out] Color space of FFDI surface
293     //! \param    SampleType
294     //!           [out] Sample type of FFDI surface
295     //! \return   MOS_STATUS
296     //!           Return MOS_STATUS_SUCCESS if success, otherwise failed
297     //!
298     virtual MOS_STATUS      GetFFDISurfParams(
299         VPHAL_CSPACE        &ColorSpace,
300         VPHAL_SAMPLE_TYPE   &SampleType);
301 
302     //!
303     //! \brief    Check for DN only case
304     //! \details  Check for DN only case
305     //! \return   bool
306     //!           Return true if DN only case, otherwise not
307     //!
308     virtual bool            IsDNOnly();
309 
310     //!
311     //! \brief    Check whether FFDI Surf is needed
312     //! \details  For decide whether FFDI surf should be allocated or will be used
313     //! \return   bool
314     //!           Return true is needed, otherwise false
315     //!
316     virtual bool            IsFFDISurfNeeded();
317 
318     //!
319     //! \brief    Check whether FFDN Surf is needed
320     //! \details  For decide whether FFDN surf should be allocated or will be used
321     //! \return   bool
322     //!           Return true is needed, otherwise false
323     //!
324     virtual bool            IsFFDNSurfNeeded();
325 
326     //!
327     //! \brief    Check whether STMM Surf is needed
328     //! \details  For decide whether STMM surf should be allocated or will be used
329     //! \return   bool
330     //!           Return true is needed, otherwise false
331     //!
332     virtual bool            IsSTMMSurfNeeded();
333 
334     //!
335     //! \brief    Get output surface of Vebox
336     //! \details  Get output surface of Vebox in current operation
337     //! \param    bDiVarianceEnable
338     //!           [in] Is DI/Variances report enabled
339     //! \return   PVPHAL_SURFACE
340     //!           Corresponding output surface pointer
341     //!
342     virtual PVPHAL_SURFACE GetSurfOutput(
343         bool                                    bDiVarianceEnable);
344 
345     virtual MOS_STATUS VeboxQueryStatLayout(
346         VEBOX_STAT_QUERY_TYPE       QueryType,
347         uint32_t*                   pQuery);
348 
349     //!
350     //! \brief    Check if 2 passes CSC are supported on the platform
351     //!
Is2PassesCscPlatformSupported()352     virtual bool Is2PassesCscPlatformSupported()
353     {
354         return true;
355     }
356 
357     virtual void GetLumaDefaultValue(
358         PVPHAL_SAMPLER_STATE_DNDI_PARAM pLumaParams);
359 
360     virtual MOS_STATUS SetDNDIParams(
361         PVPHAL_SURFACE                  pSrcSurface,
362         PVPHAL_SAMPLER_STATE_DNDI_PARAM pLumaParams,
363         PVPHAL_DNUV_PARAMS              pChromaParams);
364 
365     virtual VphalSfcState* CreateSfcState();
366 };
367 
368 #endif // __VPHAL_RENDER_VEBOX_G9_BASE_H__
369