xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/renderhal/renderhal.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2009-2022, 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     renderhal.cpp
24 //! \brief    Render Engine state heap manager for VP and CM
25 //! \details  Platform/OS Independent Render Engine state heap management interfaces
26 //!
27 
28 #include "renderhal.h"
29 #include "hal_kerneldll_next.h"
30 #include "renderhal_platform_interface.h"
31 #include "media_interfaces_renderhal.h"
32 #include "media_interfaces_mhw_next.h"
33 #include "hal_oca_interface_next.h"
34 
35 #define OutputSurfaceWidthRatio 1
36 extern const SURFACE_STATE_TOKEN_COMMON g_cInit_SURFACE_STATE_TOKEN_COMMON =
37 {
38     // DWORD 0
39     {
40         OP_LENGTH(SIZE32(SURFACE_STATE_TOKEN_COMMON)),          // Length
41         GFXSUBOP_SURFACE_STATE_TOKEN,                       // InstructionSubOpcode
42         GFXOP_PIPELINED,                                    // InstructionOpcode
43         PIPE_3D,                                            // InstructionPipeline
44         INSTRUCTION_GFX,                                    // InstructionType
45         1                                                   // Token
46     },
47 
48     // DWORD 1
49     {
50         0,                       // SurfaceStateHeapOffset
51         0                        // SurfaceAllocationIndex
52     },
53 
54     // DWORD 2
55     {
56         0                        // SurfaceOffset
57     },
58 
59     // DWORD 3
60     {
61         0,                       // RenderTargetEnable
62         0,                       // YUVPlane
63         0                        // SurfaceStateType
64     },
65 
66     // DWORD 4
67     {
68         0                        // SurfaceBaseAddress
69     },
70 
71     // DWORD 5
72     {
73         0                       // SurfaceBaseAddress64
74     },
75 };
76 
77 const MHW_PIPE_CONTROL_PARAMS  g_cRenderHal_InitPipeControlParams =
78 {
79     nullptr,                           // presDest
80     0,                              // dwResourceOffset
81     0,                              // dwDataDW1
82     0,                              // dwDataDW2
83     MHW_FLUSH_NONE,                 // dwFlushMode
84     MHW_FLUSH_NOWRITE,              // dwPostSyncOp
85     false,                          // bDisableCSStall
86     false,                          // bInvalidateStateCache
87     false,                          // bInvalidateConstantCache
88     false,                          // bInvalidateVFECache
89     false,                          // bInvalidateInstructionCache
90     true,                           // bFlushRenderTargetCache
91     false,                          // bTlbInvalidate
92     false,                          // bInvalidateTextureCache
93     false,                          // bGenericMediaStateClear
94     false,                          // bIndirectStatePointersDisable
95     false,                          // bHdcPipelineFlush
96     false,                          // bKernelFenceEnabled
97 };
98 
99 extern const RENDERHAL_SURFACE_STATE_ENTRY g_cInitSurfaceStateEntry =
100 {
101     RENDERHAL_SURFACE_TYPE_INVALID, // Type
102     nullptr,                           // pSurface
103     nullptr,                           // pSurfaceState
104     {                               // SurfaceS Token
105         {},   //DW0
106         {},   //DW1
107         {},   //DW2
108         {},   //DW3
109         {},   //DW4
110         {},   //DW5
111         nullptr, // pResourceInfo
112     },
113     -1,                             // iSurfStateID
114     0,                              // dwSurfStateOffset
115     0,                              // dwFormat
116     0,                              // dwWidth
117     0,                              // dwHeight
118     0,                              // dwPitch
119     0,                              // dwQPitch
120     0,                              // YUVPlane
121     false,                          // bAVS
122     false,                          // bRenderTarget
123     false,                          // bVertStride
124     false,                          // bVertStrideOffs
125     false,                          // bWidthInDword
126     false,                          // bTiledSurface
127     false,                          // bTileWalk
128     false,                          // bHalfPitchChroma
129     false,                          // bInterleaveChroma
130     0,                              // DirectionV
131     0,                              // DirectionU
132     0,                              // AddressControl
133     0,                              // wUXOffset
134     0,                              // wUYOffset
135     0,                              // wVXOffset
136     0                               // wVYOffset
137 };
138 
139 const MHW_MEDIA_STATE_FLUSH_PARAM  g_cRenderHal_InitMediaStateFlushParams =
140 {
141     false,                              // bFlushToGo
142     0                                   // ui8InterfaceDescriptorOffset
143 };
144 
145 const RENDERHAL_KERNEL_PARAM g_cRenderHal_InitKernelParams =
146 {
147     0,                                  // GRF_Count;
148     0,                                  // BT_Count;
149     0,                                  // Sampler_Count
150     0,                                  // Thread_Count
151     0,                                  // GRF_Start_Register
152     0,                                  // CURBE_Length
153     0,                                  // block_width
154     0,                                  // block_height
155     0,                                  // blocks_x
156     0                                   // blocks_y
157 };
158 
159 //!
160 //! \brief      Table only used on HSW (look @ renderhal.c for HSW- table)
161 //!             Constants used for setting up surface states ui8PlaneID,
162 //!             ui8ScaleWidth, ui8ScaleHeight, ui8AlignWidth, ui8AlignHeight,
163 //!             ui8PixelsPerDword, bAdvanced, dwFormat
164 //!
165 extern const MHW_SURFACE_PLANES g_cRenderHal_SurfacePlanes[RENDERHAL_PLANES_DEFINITION_COUNT] =
166 {
167     // RENDERHAL_PLANES_PL3
168     {   3,
169         {
170             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
171             { MHW_U_PLANE      , 2, 2, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
172             { MHW_V_PLANE      , 2, 2, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
173         }
174     },
175     // RENDERHAL_PLANES_NV12
176     {   1,
177         {
178             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_PLANAR_420_8 }
179         }
180     },
181     // RENDERHAL_PLANES_YUY2
182     {   1,
183         {
184             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_NORMAL }
185         }
186     },
187     // RENDERHAL_PLANES_UYVY
188     {   1,
189         {
190             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPY }
191         }
192     },
193     // RENDERHAL_PLANES_YVYU
194     {   1,
195         {
196             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUV }
197         }
198     },
199     // RENDERHAL_PLANES_VYUY
200     {   1,
201         {
202             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUVY }
203         }
204     },
205     // RENDERHAL_PLANES_ARGB
206     {   1,
207         {
208             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_B8G8R8A8_UNORM }
209         }
210     },
211     // RENDERHAL_PLANES_XRGB
212     {   1,
213         {
214             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_B8G8R8X8_UNORM }
215         }
216     },
217     // RENDERHAL_PLANES_ABGR
218     {   1,
219         {
220             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM }
221         }
222     },
223     // RENDERHAL_PLANES_XBGR
224     {   1,
225         {
226             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8X8_UNORM }
227         }
228     },
229     // RENDERHAL_PLANES_RGB16
230     {   1,
231         {
232             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_B5G6R5_UNORM }
233         }
234     },
235     // RENDERHAL_PLANES_RGB24
236     {   1,
237         {
238            { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8_UNORM }
239         }
240     },
241     // RENDERHAL_PLANES_R16U
242     {   1,
243         {
244             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UINT }
245         }
246     },
247     // RENDERHAL_PLANES_R16S
248     {   1,
249         {
250             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_SINT }
251         }
252     },
253     // RENDERHAL_PLANES_R32U
254     {   1,
255         {
256             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R32_UINT }
257         }
258     },
259     // RENDERHAL_PLANES_R32S
260     {   1,
261         {
262             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R32_SINT }
263         }
264     },
265     // RENDERHAL_PLANES_R32F
266     {   1,
267         {
268             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R32_FLOAT }
269         }
270     },
271     // RENDERHAL_PLANES_V8U8
272     {   1,
273         {
274             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_SNORM }
275         }
276     },
277     // RENDERHAL_PLANES_R8G8_UNORM
278     {   1,
279         {
280             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM }
281         }
282     },
283     // RENDERHAL_PLANES_411P
284     {   3,
285         {
286             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
287             { MHW_U_PLANE      , 4, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
288             { MHW_V_PLANE      , 4, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
289         }
290     },
291     // RENDERHAL_PLANES_411R
292     {   3,
293         {
294             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
295             { MHW_U_PLANE      , 1, 4, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
296             { MHW_V_PLANE      , 1, 4, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
297         }
298     },
299     // RENDERHAL_PLANES_422H
300     {   3,
301         {
302             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
303             { MHW_U_PLANE      , 2, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
304             { MHW_V_PLANE      , 2, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
305         }
306     },
307     // RENDERHAL_PLANES_422V
308     {   3,
309         {
310             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
311             { MHW_U_PLANE      , 1, 2, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
312             { MHW_V_PLANE      , 1, 2, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
313         }
314     },
315     // RENDERHAL_PLANES_444P
316     {   3,
317         {
318             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
319             { MHW_U_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
320             { MHW_V_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
321         }
322     },
323     // RENDERHAL_PLANES_RGBP
324     {   3,
325         {
326             { MHW_U_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
327             { MHW_V_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
328             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
329         }
330     },
331     // RENDERHAL_PLANES_BGRP
332     {   3,
333         {
334             { MHW_U_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
335             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
336             { MHW_V_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
337         }
338     },
339     // RENDERHAL_PLANES_AI44_PALLETE_0
340     {   1,
341         {
342             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_P4A4_UNORM_PALETTE_0 }
343         }
344     },
345     // RENDERHAL_PLANES_IA44_PALLETE_0
346     {   1,
347         {
348             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_A4P4_UNORM_PALETTE_0 }
349         }
350     },
351     // RENDERHAL_PLANES_P8_PALLETE_0
352     {   1,
353         {
354             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_P8_UNORM_PALETTE_0 }
355         }
356     },
357     // RENDERHAL_PLANES_A8P8_PALLETE_0
358     {   1,
359         {
360             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_P8A8_UNORM_PALETTE_0 }
361         }
362     },
363     // RENDERHAL_PLANES_AI44_PALLETE_1
364     {   1,
365         {
366             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_P4A4_UNORM_PALETTE_1 }
367         }
368     },
369     // RENDERHAL_PLANES_IA44_PALLETE_1
370     {   1,
371         {
372             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_A4P4_UNORM_PALETTE_1 }
373         }
374     },
375     // RENDERHAL_PLANES_P8_PALLETE_1
376     {   1,
377         {
378             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_P8_UNORM_PALETTE_1 }
379         }
380     },
381     // RENDERHAL_PLANES_A8P8_PALLETE_1
382     {   1,
383         {
384             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_P8A8_UNORM_PALETTE_1 }
385         }
386     },
387     // RENDERHAL_PLANES_AYUV
388     {   1,
389         {
390             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8B8G8A8_UNORM }
391         }
392     },
393     // RENDERHAL_PLANES_STMM
394     {   1,
395         {
396             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_L8_UNORM }
397         }
398     },
399     // RENDERHAL_PLANES_L8
400     {   1,
401         {
402             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_L8_UNORM }
403         }
404     },
405     // RENDERHAL_PLANES_PL3_ADV
406     {   3,
407         {
408             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
409             { MHW_U_PLANE      , 2, 2, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
410             { MHW_V_PLANE      , 2, 2, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
411         }
412     },
413     // RENDERHAL_PLANES_NV12_ADV
414     {   1,
415         {
416             { MHW_Y_PLANE      , 1, 1, 2, 2, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_420_8 }
417         }
418     },
419     // RENDERHAL_PLANES_YUY2_ADV
420     {   1,
421         {
422             { MHW_GENERIC_PLANE, 1, 1, 2, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_NORMAL }
423         }
424     },
425     // RENDERHAL_PLANES_UYVY_ADV
426     {   1,
427         {
428             { MHW_GENERIC_PLANE, 1, 1, 2, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_SWAPY }
429         }
430     },
431     // RENDERHAL_PLANES_YVYU_ADV
432     {   1,
433         {
434             { MHW_GENERIC_PLANE, 1, 1, 2, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_SWAPUV }
435         }
436     },
437     // RENDERHAL_PLANES_VYUY_ADV
438     {   1,
439         {
440             { MHW_GENERIC_PLANE, 1, 1, 2, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_SWAPUVY }
441         }
442     },
443     // RENDERHAL_PLANES_ARGB_ADV
444     {   1,
445         {
446             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_B8G8R8A8_UNORM }
447         }
448     },
449     // RENDERHAL_PLANES_ABGR_ADV
450     {   1,
451         {
452             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8G8B8A8_UNORM }
453         }
454     },
455     // RENDERHAL_PLANES_AYUV_ADV
456     {   1,
457         {
458             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 1, MHW_MEDIASTATE_SURFACEFORMAT_A8Y8U8V8_UNORM }
459         }
460     },
461     // RENDERHAL_PLANES_STMM_ADV
462     {   1,
463         {
464             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_STMM_DN_STATISTICS }
465         }
466     },
467     // RENDERHAL_PLANES_L8_ADV
468     {   1,
469         {
470             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
471         }
472     },
473     // RENDERHAL_PLANES_A8_ADV
474     {   1,
475         {
476             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_411_8 }
477         }
478     },
479     // RENDERHAL_PLANES_A8
480     {   1,
481         {
482             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_A8_UNORM }
483         }
484     },
485     // RENDERHAL_PLANES_R8
486     {   1,
487         {
488             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM }
489         }
490     },
491     // RENDERHAL_PLANES_NV12_2PLANES
492     {   2,
493         {
494             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM   },
495             { MHW_U_PLANE      , 2, 2, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM }
496         }
497     },
498     // RENDERHAL_PLANES_NV12_2PLANES_ADV
499     {   2,
500         {
501             { MHW_Y_PLANE      , 1, 1, 2, 2, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM   },
502             { MHW_U_PLANE      , 2, 2, 1, 1, 2, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8B8_UNORM }
503         }
504     },
505     // RENDERHAL_PLANES_411P_ADV
506     {   3,
507         {
508             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
509             { MHW_U_PLANE      , 4, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
510             { MHW_V_PLANE      , 4, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
511         }
512     },
513     // RENDERHAL_PLANES_411R_ADV
514     {   3,
515         {
516             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
517             { MHW_U_PLANE      , 1, 4, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
518             { MHW_V_PLANE      , 1, 4, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
519         }
520     },
521     // RENDERHAL_PLANES_422H_ADV
522     {   3,
523         {
524             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
525             { MHW_U_PLANE      , 2, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
526             { MHW_V_PLANE      , 2, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
527         }
528     },
529     // RENDERHAL_PLANES_422V_ADV
530     {   3,
531         {
532             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
533             { MHW_U_PLANE      , 1, 2, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
534             { MHW_V_PLANE      , 1, 2, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
535         }
536     },
537     // RENDERHAL_PLANES_444P_ADV
538     {   3,
539         {
540             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
541             { MHW_U_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
542             { MHW_V_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
543         }
544     },
545     // RENDERHAL_PLANES_RGBP_ADV
546     {   3,
547         {
548             { MHW_U_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
549             { MHW_V_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
550             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
551         }
552     },
553     // RENDERHAL_PLANES_BGRP_ADV
554     {   3,
555         {
556             { MHW_U_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM },
557             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM },
558             { MHW_V_PLANE      , 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_R8_UNORM }
559         }
560     },
561     // RENDERHAL_PLANES_R16_UNORM
562     {   1,
563         {
564             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM }
565         }
566     },
567         // RENDERHAL_PLANES_Y8
568     {   1,
569         {
570             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_411_8 }
571         }
572     },
573     // RENDERHAL_PLANES_Y1
574     {   1,
575         {
576             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, 16 }
577         }
578     },
579     // RENDERHAL_PLANES_Y16U
580     {   1,
581         {
582             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 1, MHW_MEDIASTATE_SURFACEFORMAT_STMM_DN_STATISTICS }
583         }
584     },
585     // RENDERHAL_PLANES_Y16S
586     {   1,
587         {
588             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 1, MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_422_8 }
589         }
590     },
591     // RENDERHAL_PLANES_A16B16G16R16
592     {   1,
593         {
594             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM } //setting "PixelsPerDword = 0" for sampler_8x8 use
595         }
596     },
597     // RENDERHAL_PLANES_A16B16G16R16_ADV
598     {   1,
599         {
600             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 1, MHW_MEDIASTATE_SURFACEFORMAT_R16G16B16A16 } //setting "PixelsPerDword = 0" for sampler_8x8 use
601         }
602     },
603     // RENDERHAL_PLANES_R10G10B10A2
604     {   1,
605         {
606             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R10G10B10A2_UNORM }
607         }
608     },
609     // RENDERHAL_PLANES_R10G10B10A2_ADV
610     {   1,
611         {
612             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 1, MHW_MEDIASTATE_SURFACEFORMAT_R10G10B10A2_UNORM }
613         }
614     },
615     // RENDERHAL_PLANES_B10G10R10A2
616     {   1,
617         {
618             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_B10G10R10A2_UNORM }
619         }
620     },
621     // RENDERHAL_PLANES_L16
622     {   1,
623         {
624             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_L16_UNORM }
625         }
626     },
627     // RENDERHAL_PLANES_NV21
628     {   2,
629         {
630             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM   },
631             { MHW_U_PLANE      , 2, 2, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM }
632         }
633     },
634     // RENDERHAL_PLANES_YV12
635     {   1,
636         {
637             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_PLANAR_420_8 }
638         }
639     },
640           // RENDERHAL_PLANES_P016
641     {   2,
642         {
643             { MHW_Y_PLANE      , 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM   },
644             { MHW_U_PLANE      , 2, 2, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM }
645         }
646     },
647     // RENDERHAL_PLANES_P016_2PLANES_ADV
648     {   2,
649         {
650             { MHW_Y_PLANE      , 1, 1, 2, 2, 2, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y16_UNORM   },
651             { MHW_U_PLANE      , 2, 2, 2, 2, 1, 1, MHW_MEDIASTATE_SURFACEFORMAT_R16B16_UNORM }
652         }
653     },
654     // RENDERHAL_PLANES_P010
655     {   2,
656         {
657             { MHW_Y_PLANE      , 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM   },
658             { MHW_U_PLANE      , 2, 2, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM }
659         }
660     },
661     // RENDERHAL_PLANES_P010_1PLANE
662     {   1,
663         {
664             { MHW_Y_PLANE      , 1, 1, 2, 2, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_PLANAR_420_16 }
665         }
666     },
667     // RENDERHAL_PLANES_P010_1PLANE_ADV
668     {   1,
669         {
670             { MHW_Y_PLANE      , 1, 1, 2, 2, 2, 1, MHW_MEDIASTATE_SURFACEFORMAT_PLANAR_420_16 }
671         }
672     },
673     // RENDERHAL_PLANES_IRW0
674     {   1,
675         {
676             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM }
677         }
678     },
679     // RENDERHAL_PLANES_IRW1
680     {   1,
681         {
682             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM }
683         }
684     },
685     // RENDERHAL_PLANES_IRW2
686     {   1,
687         {
688             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM }
689          }
690     },
691     // RENDERHAL_PLANES_IRW3
692     { 1,
693          {
694              { MHW_GENERIC_PLANE, 1, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_UNORM }
695          }
696     },
697     // RENDERHAL_PLANES_A16B16G16R16F
698     {1,
699          {
700             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_FLOAT } //setting "PixelsPerDword = 0" in DP R/W usage, "0" means no need to adjust dwSurfaceWidth. already DWord aligned.
701          }
702     },
703     // RENDERHAL_PLANES_R16G16_UNORM
704     {1,
705          {
706              { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM }
707         }
708     },
709     // RENDERHAL_PLANES_R16F
710     {   1,
711         {
712             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16_FLOAT }
713          }
714     },
715     // RENDERHAL_PLANES_A16R16G16B16F
716     {1,
717          {
718             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_FLOAT } //setting "PixelsPerDword = 0" in DP R/W usage, "0" means no need to adjust dwSurfaceWidth. already DWord aligned.
719          }
720     },
721     // RENDERHAL_PLANES_YUY2_2PLANES
722     { 2,
723         {
724             { MHW_Y_PLANE, 1, 1, 2, 2, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM },
725             { MHW_U_PLANE, 2, 1, 2, 2, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM }
726         }
727     },
728     // RENDERHAL_PLANES_Y210_ADV
729     { 2,
730         {
731             { MHW_Y_PLANE, 1, 1, 1, 1, 1, 1, MHW_MEDIASTATE_SURFACEFORMAT_R16B16_UNORM },
732             { MHW_U_PLANE, 2, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM }
733         }
734     },
735     // RENDERHAL_PLANES_Y210_RT
736     { 1,
737         {
738             { MHW_GENERIC_PLANE, 2, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM }
739         }
740     },
741     // RENDERHAL_PLANES_Y210
742     { 2,
743         {
744             { MHW_Y_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM },
745             { MHW_U_PLANE, 2, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM }
746         }
747     },
748     // RENDERHAL_PLANES_Y210_1PLANE_ADV
749     { 1,
750         {
751             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 1, MHW_MEDIASTATE_SURFACEFORMAT_R16B16_UNORM }
752         }
753     },
754     // RENDERHAL_PLANES_R16G16_SINT
755     { 1,
756         {
757             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_SINT }
758         }
759     },
760     // RENDERHAL_PLANES_R24_UNORM_X8_TYPELESS
761     { 1,
762         {
763             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R24_UNORM_X8_TYPELESS }
764         }
765     },
766     // RENDERHAL_PLANES_R32_FLOAT_X8X24_TYPELESS
767     { 1,
768         {
769             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS }
770         }
771     },
772     // RENDERHAL_PLANES_P208
773     { 2,
774         {
775             { MHW_Y_PLANE      , 1, 1, 1, 1, 4, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8_UNORM },
776             { MHW_U_PLANE      , 2, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM }
777         }
778     },
779     // RENDERHAL_PLANES_P208_1PLANE_ADV
780     { 1,
781         {
782             { MHW_GENERIC_PLANE, 1, 1, 2, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_YCRCB_NORMAL }
783         }
784     },
785     // RENDERHAL_PLANES_Y416_RT
786     { 1,
787         {
788             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM }
789         }
790     },
791         // RENDERHAL_PLANES_R32G32B32A32
792     {   1,
793         {
794             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_FLOAT }
795         }
796     },
797         //RENDERHAL_PLANES_Y8_ADV
798     {   1,
799         {
800             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 4, 1, MHW_MEDIASTATE_SURFACEFORMAT_Y8_UNORM }
801         }
802     },
803     //RENDERHAL_PLANES_G32R32F
804     {   1,
805         {
806             { MHW_GENERIC_PLANE, 1, 1, 1, 1, 0, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM }
807         }
808     },
809     //RENDERHAL_PLANES_NV12_2PLANES_COMBINED Combine 2 Luma Channel pixels into 1 pixel, so that kernel can reduce write times
810     {
811         2,
812         {
813             {MHW_Y_PLANE, 2, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM},
814             {MHW_U_PLANE, 2, 2, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM}
815         }
816     },
817     //RENDERHAL_PLANES_P016_2PLANES_COMBINED Combine 2 Luma Channel pixels into 1 pixel, so that kernel can reduce write times
818     {
819         2,
820         {
821             {MHW_Y_PLANE, 2, 1, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM},
822             {MHW_U_PLANE, 2, 2, 1, 1, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM}
823         }
824     },
825     // RENDERHAL_PLANES_YUY2_2PLANES_WIDTH_UNALIGNED
826     {   2,
827         {
828             { MHW_Y_PLANE, 1, 1, 2, 2, 2, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM },
829             { MHW_U_PLANE, 2, 1, 1, 2, 1, 0, MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM }
830         }
831     },
832 };
833 
834 //!
835 //! \brief    Get Align Unit
836 //! \details  Set HW alignment Unit
837 //! \param    uint16_t *pwWidthAlignUnit
838 //!           [out] Width Align Unit
839 //! \param    uint16_t *pwHeightAlignUnit
840 //!           [out] Height Align Unit
841 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
842 //!           [in] Pointer to Surface
843 //! \return   void
844 //!
RenderHal_GetAlignUnit(uint16_t * pwWidthAlignUnit,uint16_t * pwHeightAlignUnit,PRENDERHAL_SURFACE pRenderHalSurface)845 void RenderHal_GetAlignUnit(
846     uint16_t           *pwWidthAlignUnit,
847     uint16_t           *pwHeightAlignUnit,
848     PRENDERHAL_SURFACE pRenderHalSurface)
849 {
850     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHalSurface);
851 
852     switch (pRenderHalSurface->OsSurface.Format)
853     {
854         case Format_YUY2:
855         case Format_UYVY:
856         case Format_YVYU:
857         case Format_VYUY:
858         case Format_P208:
859             *pwWidthAlignUnit = 1;
860 
861             // Height alignment should be 1 but is currently set to 2 because
862             // of an issue in AVS scaling.
863             *pwHeightAlignUnit = 2;
864             break;
865 
866         default:
867             *pwWidthAlignUnit = 1;
868             *pwHeightAlignUnit = 1;
869             break;
870     }
871 
872     // For deinterlace messages, the width must be a multiple of 8.
873     if (pRenderHalSurface->bDeinterlaceEnable)
874     {
875         *pwWidthAlignUnit = 8;
876     }
877 }
878 
879 //!
880 //! \brief    Adjust Boundary
881 //! \details  Adjust the height and width of the surface based on Boundary
882 //! \param    PRENDERHAL_INTERFACE pRenderHal
883 //!           [in] Pointer to Hardware Interface
884 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
885 //!           [in] Pointer to Input Surface
886 //! \param    RENDERHAL_SS_BOUNDARY Boundary
887 //!           [in] How the adjustment needs to be done
888 //! \param    uint32_t *pdwSurfaceWidth
889 //!           [out] Adjusted surface width
890 //! \param    uint32_t *pdwSurfaceHeight
891 //!           [out] Adjusted surface height
892 //! \return   void
893 //!
RenderHal_AdjustBoundary(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface,RENDERHAL_SS_BOUNDARY Boundary,uint32_t * pdwSurfaceWidth,uint32_t * pdwSurfaceHeight)894 void RenderHal_AdjustBoundary(
895     PRENDERHAL_INTERFACE  pRenderHal,
896     PRENDERHAL_SURFACE    pRenderHalSurface,
897     RENDERHAL_SS_BOUNDARY Boundary,
898     uint32_t              *pdwSurfaceWidth,
899     uint32_t              *pdwSurfaceHeight)
900 {
901     uint16_t wWidthAlignUnit;
902     uint16_t wHeightAlignUnit;
903 
904     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal);
905     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHalSurface);
906     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pdwSurfaceWidth);
907     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pdwSurfaceHeight);
908 
909     PMOS_SURFACE pSurface = &(pRenderHalSurface->OsSurface);
910 
911     pRenderHal->pfnGetAlignUnit(&wWidthAlignUnit, &wHeightAlignUnit, pRenderHalSurface);
912 
913     switch (Boundary)
914     {
915         case RENDERHAL_SS_BOUNDARY_SRCRECT:
916             *pdwSurfaceHeight = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwHeight, (uint32_t)pRenderHalSurface->rcSrc.bottom), wHeightAlignUnit);
917             *pdwSurfaceWidth  = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwWidth, (uint32_t)pRenderHalSurface->rcSrc.right), wWidthAlignUnit);
918             break;
919 
920         case RENDERHAL_SS_BOUNDARY_DSTRECT:
921             *pdwSurfaceHeight = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwHeight, (uint32_t)pRenderHalSurface->rcDst.bottom), wHeightAlignUnit);
922             *pdwSurfaceWidth  = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwWidth, (uint32_t)pRenderHalSurface->rcDst.right), wWidthAlignUnit);
923             break;
924 
925         // align with max src rect
926         case RENDERHAL_SS_BOUNDARY_MAXSRCRECT:
927             *pdwSurfaceHeight = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwHeight, (uint32_t)pRenderHalSurface->rcMaxSrc.bottom), wHeightAlignUnit);
928             *pdwSurfaceWidth  = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwWidth, (uint32_t)pRenderHalSurface->rcMaxSrc.right), wWidthAlignUnit);
929             break;
930 
931         case RENDERHAL_SS_BOUNDARY_ORIGINAL:
932         default:
933             *pdwSurfaceHeight = (pRenderHalSurface->dwHeightInUse == 0) ? MOS_ALIGN_CEIL(pSurface->dwHeight, wHeightAlignUnit) : pRenderHalSurface->dwHeightInUse;
934             *pdwSurfaceWidth  = (pRenderHalSurface->dwWidthInUse == 0) ? MOS_ALIGN_CEIL(pSurface->dwWidth, wWidthAlignUnit) : pRenderHalSurface->dwWidthInUse;
935             break;
936     }
937 }
938 
939 //!
940 //! \brief    Get Pixels Per Sample
941 //! \details  Get Number of Pixels per Dataport Sample
942 //! \param    MOS_FORMAT format
943 //!           [in] Surface Format
944 //! \param    uint32_t *pdwPixelsPerSampleUV
945 //!           [in] Pointer to dwPixelsPerSampleUV
946 //! \return   void
947 //!
RenderHal_GetPixelsPerSample(MOS_FORMAT format,uint32_t * pdwPixelsPerSampleUV)948 void RenderHal_GetPixelsPerSample(
949     MOS_FORMAT    format,
950     uint32_t      *pdwPixelsPerSampleUV)
951 {
952     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pdwPixelsPerSampleUV);
953 
954     *pdwPixelsPerSampleUV = 0;
955     switch (format)
956     {
957         CASE_PL3_FORMAT:
958         CASE_PL3_RGB_FORMAT:
959             *pdwPixelsPerSampleUV = 4;   // 4 U/V pixels per dataport sample (uint32_t)
960             break;
961 
962         // Y and UV surfaces have different formats
963         CASE_PL2_FORMAT:
964         case Format_400P:
965             *pdwPixelsPerSampleUV = 2;   // 2 UV pixels per dataport sample (uint32_t)
966             break;
967 
968         default:
969             *pdwPixelsPerSampleUV = 1;
970             MHW_RENDERHAL_ASSERTMESSAGE("Incorrect Filter Format.");
971             break;
972     }
973 }
974 
975 //!
976 //! \brief    Allocate GSH, SSH, ISH control structures and heaps
977 //! \details  Allocates State Heap control structure (system memory)
978 //!           and associated State Buffer in gfx/sys memory (GSH,ISH,SSH)
979 //!           initializes the State Heap control structure and state buffers
980 /*-----------------------------------------------------------------------------
981 |
982 |      GSH ORGANIZATION (GSH block in GFX memory)
983 |
984 |    |===========================================|
985 |    |              SYNC/PERF TAGS   (SY)        |
986 |    |-------------------------------------------|
987 |    |                                           |
988 |    |             MEDIA STATE [0]   (MS)        |
989 |    |                                           |
990 |    |-------------------------------------------|
991 |    |                                           |
992 |    |                    ...                    |
993 |    |                                           |
994 |    |-------------------------------------------|
995 |    |                                           |
996 |    |              MEDIA STATE [Q-1]            |
997 |    |                                           |
998 |    |-------------------------------------------|
999 |    |                                           |
1000 |    |              KERNEL SPILL AREA            |
1001 |    |                                           |
1002 |    |===========================================|
1003 |    where SY = (sSettings.iSyncSize) bytes
1004 |          MS = Media state heap entry shown below.
1005 |          Q  = (sSettings.iMediaStateHeaps) Media States
1006 |
1007 |      ISH ORGANIZATION (ISH block in GFX memory)
1008 |      ~~~~~~~~~~~~~~~~~~~~~~~~
1009 |
1010 |    |===========================================|
1011 |    |   |   |   |   |   |   |   |   |   |   |   |
1012 |    |---+---+---+---+---+---+---+---+---+---+---|
1013 |    |   |   |   |   |   |   |   |   |   |   |   |
1014 |    |---+---+--                       --+---+---|
1015 |    |              KERNEL HEAP  (KH)            |
1016 |    |---+---+--                       --+---+---|
1017 |    |   |   |   |   |   |   |   |   |   |   |   |
1018 |    |---+---+---+---+---+---+---+---+---+---+---|
1019 |    |   |   |   |   |   |   |   |   |   |   |   |
1020 |    |-------------------------------------------|
1021 |    |                                           |
1022 |    |        SYSTEM ROUTINE (SIP Kernel)        |
1023 |    |                                           |
1024 |    |===========================================|
1025 |     where KH = (sSettings.iKernelHeapSize) bytes in allocation
1026 |                 blocks of (sSettings.iKernelBlockSize) bytes
1027 |
1028 |     MEDIA STATE ORGANIZATION (Media States in GFX memory)
1029 |      ~~~~~~~~~~~~~~~~~~~~~~~~
1030 |              (Gen6, Gen7, Gen75 Layout)
1031 |    |================================================|
1032 |    |                                                |
1033 |    |              CURBE DATA        (C)             |
1034 |    |                                                |
1035 |    |------------------------------------------------|
1036 |    | SAMPLER STATES [0] to [S-1] - for ID[0]        |
1037 |    |                    .                           |
1038 |    |                    .                           |
1039 |    | SAMPLER STATES [0] to [S-1] - for ID[M-1]      |
1040 |    |------------------------------------------------|
1041 |    | SAMPLER 8x8 TABLE [0]                          |
1042 |    |                    .                           |
1043 |    | SAMPLER 8x8 TABLE [AS-1]                       |
1044 |    |------------------------------------------------|
1045 |    | MEDIA INTERFACE DESCRIPTOR [0]                 |
1046 |    |                    .                           |
1047 |    |                    .                           |
1048 |    | MEDIA INTERFACE DESCRIPTOR [M-1]               |
1049 |    |------------------------------------------------|
1050 |    | Kernel Execution start time (8 Bytes)          |
1051 |    |------------------------------------------------|
1052 |    | Kernel Execution end time (8 Bytes)            |
1053 |    |------------------------------------------------|
1054 |    | Component ID (4 Bytes)                         |
1055 |    |------------------------------------------------|
1056 |    | Reserved (44 Bytes)                            |
1057 |    |================================================|
1058 |
1059 |                    (Gen8+ Layout)
1060 |    |================================================|
1061 |    |                                                |
1062 |    |              CURBE DATA        (C)             |
1063 |    |                                                |
1064 |    |------------------------------------------------|
1065 |    | SAMPLER STATES         [0] to [S-1]            |
1066 |    | VA SAMPLER 8x8 STATE   [0] to [VA-1]           | ID[0]
1067 |    | AVS SAMPLER 8x8 STATE  [0] to [AS-1]           |
1068 |    |------------------------------------------------|
1069 |    |                    .                           |
1070 |    |                    .                           |
1071 |    |                    .                           |
1072 |    |------------------------------------------------|
1073 |    | SAMPLER STATES         [0] to [S-1]            | ID[M-1]
1074 |    | VA SAMPLER 8x8 STATE   [0] to [VA-1]           |
1075 |    | AVS SAMPLER 8x8 STATE  [0] to [AS-1]           |
1076 |    |------------------------------------------------|
1077 |    | MEDIA INTERFACE DESCRIPTOR [0]                 |
1078 |    |        .                                       |
1079 |    |        .                                       |
1080 |    | MEDIA INTERFACE DESCRIPTOR [M-1]               |
1081 |    |------------------------------------------------|
1082 |    | Kernel Execution start time (8 Bytes)          |
1083 |    |------------------------------------------------|
1084 |    | Kernel Execution end time (8 Bytes)            |
1085 |    |------------------------------------------------|
1086 |    | Component ID (4 Bytes)                         |
1087 |    |------------------------------------------------|
1088 |    | Reserved (44 Bytes)                            |
1089 |    |================================================|
1090 |
1091 |    where C  = (sSettings.iCurbeSize) bytes for static parameters
1092 |          S  = (sSettings.iSamplers) samplers per Media ID
1093 |          AS = (sSettings.iSamplersAVS) advanced sampler 8x8 tables (preGen8)
1094 |          AS = (sSettings.iSamplersAVS) advanced sampler 8x8 states (Gen8+)
1095 |          VA = (sSettings.iSamplersVA)  video analytics sampler
1096 |          M  = (sSettings.iMediaIDs) Media Interface Descriptors (ID)
1097 |
1098 |
1099 |         STATE HEAP CONTROL STRUCTURE ORGANIZATION (in system memory)
1100 |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1101 |            |===========================================|
1102 |            |       RENDERHAL_STATE_HEAP STRUCTURE      |
1103 |            |                                           |
1104 |  +---------| pSshBuffer                                |
1105 |  |         |-------------------------------------------|
1106 |  |         | Kernel Allocation [0]                     |
1107 |  |         |                    .                      |
1108 |  |         |                    .                      |
1109 |  |         | Kernel Allocation [K-1]                   |
1110 |  |         |-------------------------------------------|
1111 |  |         | Media State Control Structure [0]         |--+
1112 |  |         | Media State Control Structure [1]         |--|--+
1113 |  |         |                    .                      |  |  |
1114 |  |         |                    .                      |  |  |
1115 |  |         | Media State Control Structure [Q-1]       |--|--|--+
1116 |  |         |-------------------------------------------|  |  |  |
1117 |  |         | KAID[0] to KAID[M-1] for Media State[0]   |<-+  |  |
1118 |  |         | KAID[0] to KAID[M-1] for Media State[1]   |<----+  |
1119 |  |         |                    .                      |        |
1120 |  |         |                    .                      |        |
1121 |  |         | KAID[0] to KAID[M-1] for Media State[Q-1] |<-------+
1122 |  |         |-------------------------------------------|
1123 |  |  +------| SurfStateEntry[0]                         |
1124 |  |  |      |                    .                      |
1125 |  |  |      |                    .                      |
1126 |  |  |  +---| SurfStateEntry[P-1]                       |
1127 |  |  |  |   |===========================================|
1128 |  |  |  |
1129 |  |  |  |    SSH BUFFER for HW (or SW) - or IndirectBuffer
1130 |  +--|--|-->|==============================| <-- iBindingTableOffset = 0
1131 |     |  |   | BI[0]   ......       BI[T-1] |    <- BT[0] (iBindingTableSize)
1132 |     |  |   | BI[0]   ......       BI[T-1] |    <- BT[1]
1133 |     |  |   |            .                 |
1134 |     |  |   | BI[0]   ......       BI[T-1] |    <- BT[N-1]
1135 |     |  |   |------------------------------| <-- iSurfaceStateOffset
1136 |     +--|-->| SurfState[0]                 |
1137 |        |   |        .                     |
1138 |        |   |        .                     |
1139 |        +-->| SurfState[P-1]               |
1140 |            |==============================|
1141 |
1142 |     where K  = (sSettings.iKernelCount)     Kernel Allocation Entries
1143 |           Q  = (sSettings.iMediaStateHeaps) Media States
1144 |           M  = (sSettings.iMediaIDs)        Media Interface Descriptors (ID)
1145 |           P  = (sSettings.iSurfaceStates)   Surface States
1146 |           T  = (sSettings.iSurfacesPerBT)   Binding Index entries per Binding Table
1147 |           N  = (sSettings.iBindingTables)   Binding Tables
1148 |
1149 |           BT = Binding Table (Each Binding Table contains M Binding Indices)
1150 |           BI = Binding Index
1151 |
1152 |        KAID  => Kernel Allocation ID - each value determines the kernel
1153 |                 allocation entry in StateHeap (0 to sSettings.iKernelCount - 1)
1154 |
1155 |-----------------------------------------------------------------------------*/
1156 //! \param    PRENDERHAL_INTERFACE pRenderHal
1157 //!           [in] Pointer to Rendering Interface Structure
1158 //! \param    PRENDERHAL_STATE_HEAP_SETTINGS pSettings
1159 //!           [in] Pointer to state heap settings (GSH/SSH/ISH)
1160 //! \return   MOS_STATUS
1161 //!           MOS_STATUS_SUCCESS if state heaps were successfully allocated and initialized
1162 //!           others             if bad parameters or allocation failed
1163 //!
RenderHal_AllocateStateHeaps(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_STATE_HEAP_SETTINGS pSettings)1164 MOS_STATUS RenderHal_AllocateStateHeaps(
1165     PRENDERHAL_INTERFACE           pRenderHal,
1166     PRENDERHAL_STATE_HEAP_SETTINGS pSettings)
1167 {
1168     MHW_STATE_HEAP_SETTINGS      MhwStateHeapSettings;
1169     PMHW_RENDER_STATE_SIZES      pHwSizes;
1170     PRENDERHAL_STATE_HEAP        pStateHeap;
1171     int32_t                      *pAllocations;
1172     uint32_t                     dwSizeAlloc;
1173     uint32_t                     dwSizeGSH;
1174     uint32_t                     dwSizeSSH;
1175     uint32_t                     dwSizeISH;
1176     uint32_t                     dwSizeMediaState;
1177     PMHW_STATE_HEAP              pDshHeap;
1178     PMHW_STATE_HEAP              pIshHeap;
1179     int32_t                      i;
1180     uint8_t                      *ptr;
1181     uint8_t                      *ptrMediaState = nullptr;
1182     MOS_STATUS                   eStatus;
1183     size_t                       mediaStateSize = 0;
1184     size_t                       stateHeapSize  = 0;
1185     // Initialize locals
1186     eStatus          = MOS_STATUS_UNKNOWN;
1187     pStateHeap       = nullptr;
1188 
1189     //---------------------------------------
1190     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
1191     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
1192     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
1193     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
1194     MHW_RENDERHAL_CHK_NULL_RETURN(pSettings);
1195     // verify GSH parameters and alignments
1196     MHW_RENDERHAL_ASSERT((pSettings->iSyncSize        % RENDERHAL_SYNC_BLOCK_ALIGN)   == 0);
1197     MHW_RENDERHAL_ASSERT((pSettings->iCurbeSize       % RENDERHAL_URB_BLOCK_ALIGN)    == 0);
1198     MHW_RENDERHAL_ASSERT((pSettings->iKernelHeapSize  % RENDERHAL_KERNEL_BLOCK_ALIGN) == 0);
1199     MHW_RENDERHAL_ASSERT((pSettings->iKernelBlockSize % RENDERHAL_KERNEL_BLOCK_ALIGN) == 0);
1200     // verify SSH parameters
1201     MHW_RENDERHAL_ASSERT(pSettings->iBindingTables >= RENDERHAL_SSH_BINDING_TABLES_MIN);
1202     MHW_RENDERHAL_ASSERT(pSettings->iBindingTables <= RENDERHAL_SSH_BINDING_TABLES_MAX);
1203     MHW_RENDERHAL_ASSERT(pSettings->iSurfaceStates >= RENDERHAL_SSH_SURFACE_STATES_MIN);
1204     MHW_RENDERHAL_ASSERT(pSettings->iSurfaceStates <= RENDERHAL_SSH_SURFACE_STATES_MAX);
1205     MHW_RENDERHAL_ASSERT(pSettings->iSurfacesPerBT >= RENDERHAL_SSH_SURFACES_PER_BT_MIN);
1206     MHW_RENDERHAL_ASSERT(pSettings->iSurfacesPerBT <= RENDERHAL_SSH_SURFACES_PER_BT_MAX);
1207     //---------------------------------------
1208 
1209     pHwSizes       = pRenderHal->pHwSizes;
1210     mediaStateSize = pRenderHal->pRenderHalPltInterface->GetRenderHalMediaStateSize();
1211     stateHeapSize  = pRenderHal->pRenderHalPltInterface->GetRenderHalStateHeapSize();
1212 
1213     //---------------------------------------
1214     // Setup General State Heap
1215     //---------------------------------------
1216     // Calculate size of State Heap control structure
1217     dwSizeAlloc  = MOS_ALIGN_CEIL(stateHeapSize, 16);
1218     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iKernelCount     * sizeof(RENDERHAL_KRN_ALLOCATION)     , 16);
1219     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * mediaStateSize, 16);
1220     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * pSettings->iMediaIDs * sizeof(int32_t)   , 16);
1221     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iSurfaceStates   * sizeof(RENDERHAL_SURFACE_STATE_ENTRY), 16);
1222 
1223     // Allocate State Heap control structure (aligned)
1224     pRenderHal->pStateHeap = pStateHeap = (PRENDERHAL_STATE_HEAP)MOS_AlignedAllocMemory(dwSizeAlloc, 16);
1225     pRenderHal->dwStateHeapSize = dwSizeAlloc;
1226 
1227     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap);
1228     MOS_ZeroMemory(pStateHeap, dwSizeAlloc);
1229 
1230     //-------------------------------------------------------------------------
1231     // Reset resource allocations
1232     //-------------------------------------------------------------------------
1233     pRenderHal->pOsInterface->pfnResetResource(&pStateHeap->GshOsResource);
1234     pStateHeap->bGshLocked = false;
1235     pStateHeap->pGshBuffer = nullptr;
1236 
1237     pRenderHal->pOsInterface->pfnResetResource(&pStateHeap->SshOsResource);
1238     pStateHeap->pSshBuffer = nullptr;
1239     pStateHeap->bSshLocked = false;
1240 
1241     pRenderHal->pOsInterface->pfnResetResource(&pStateHeap->IshOsResource);
1242     pStateHeap->bIshLocked = false;
1243     pStateHeap->pIshBuffer = nullptr;
1244 
1245     //-------------------------------------------------------------------------
1246     // Setup State Heap control structures
1247     //-------------------------------------------------------------------------
1248     // Skip RENDERHAL_STATE_HEAP structure
1249     ptr = (uint8_t*)pStateHeap;
1250     ptr += MOS_ALIGN_CEIL(stateHeapSize, 16);
1251 
1252     // Pointer to Kernel allocations
1253     pStateHeap->pKernelAllocation = (PRENDERHAL_KRN_ALLOCATION) ptr;
1254     ptr += MOS_ALIGN_CEIL(pSettings->iKernelCount * sizeof(RENDERHAL_KRN_ALLOCATION), 16);
1255 
1256     // Pointer to Media State allocations
1257     pStateHeap->pMediaStates = (PRENDERHAL_MEDIA_STATE) ptr;
1258     ptr += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * mediaStateSize, 16);
1259 
1260     // Pointer to Media ID allocations
1261     pAllocations = (int32_t*) ptr;
1262     ptr += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * pSettings->iMediaIDs * sizeof(int32_t), 16);
1263 
1264     // Pointer to Surface State allocations
1265     pStateHeap->pSurfaceEntry = (PRENDERHAL_SURFACE_STATE_ENTRY) ptr;
1266 
1267     //-------------------------------------------------------------------------
1268     // Calculate offsets/sizes in GSH
1269     //-------------------------------------------------------------------------
1270     // Synchronization, debugging data
1271     pStateHeap->dwOffsetSync = 0;
1272     pStateHeap->dwSizeSync   = pSettings->iSyncSize;
1273     pStateHeap->dwNextTag    = 0;
1274     pStateHeap->dwSyncTag    = 0;
1275     dwSizeGSH                = pStateHeap->dwSizeSync;
1276 
1277     // Align Media State base
1278     dwSizeGSH = MOS_ALIGN_CEIL(dwSizeGSH, MHW_MEDIA_STATE_ALIGN);
1279 
1280     dwSizeMediaState = 0;
1281 
1282     // Reset current media state
1283     pStateHeap->iCurMediaState     = 0;
1284     pStateHeap->iNextMediaState    = 0;
1285 
1286     // Constant URBs
1287     pStateHeap->dwOffsetCurbe = dwSizeMediaState;
1288     pStateHeap->dwSizeCurbe   = pSettings->iCurbeSize;
1289     dwSizeMediaState         += pStateHeap->dwSizeCurbe;
1290 
1291     // Allocate Samplers
1292     if (pRenderHal->bHasCombinedAVSSamplerState == false)
1293     {
1294         // Sampler states
1295         pStateHeap->dwOffsetSampler     = dwSizeMediaState;
1296         pStateHeap->dwSizeSampler       = MOS_ALIGN_CEIL(pSettings->iSamplers * pHwSizes->dwSizeSamplerState,  MHW_SAMPLER_STATE_ALIGN);
1297         pStateHeap->dwSizeSamplers      = pStateHeap->dwSizeSampler;
1298         dwSizeMediaState               += pSettings->iMediaIDs * pStateHeap->dwSizeSamplers;
1299 
1300         // Sampler 8x8 State table is allocated in this area
1301         pStateHeap->dwOffsetSampler8x8Table = dwSizeMediaState;
1302         pStateHeap->dwSizeSampler8x8Table   = MOS_ALIGN_CEIL(pHwSizes->dwSizeSamplerStateTable8x8,  MHW_SAMPLER_STATE_ALIGN);
1303         dwSizeMediaState                   += pSettings->iSamplersAVS * pHwSizes->dwSizeSampler8x8Table;
1304     }
1305     else
1306     {
1307         // Sampler states - Start of this area to be aligned on MHW_SAMPLER_STATE_ALIGN byte boundary
1308         uint32_t dwOffsetSamplers          = dwSizeMediaState;
1309         pStateHeap->dwOffsetSampler     = dwSizeMediaState;
1310         pStateHeap->dwSizeSampler       = MOS_ALIGN_CEIL(pSettings->iSamplers * pHwSizes->dwSizeSamplerState,  MHW_SAMPLER_STATE_ALIGN);
1311         dwSizeMediaState               += pStateHeap->dwSizeSampler;
1312 
1313         // Sampler for MinMax, Erode and Dilate - Start of this area to be aligned on MHW_SAMPLER_STATE_VA_ALIGN byte boundary
1314         pStateHeap->dwOffsetSamplerVA   = dwSizeMediaState;
1315         pStateHeap->dwSizeSamplerVA     = MOS_ALIGN_CEIL(pSettings->iSamplersVA * pHwSizes->dwSizeSamplerStateVA, MHW_SAMPLER_STATE_VA_ALIGN);
1316         dwSizeMediaState               += pStateHeap->dwSizeSamplerVA;
1317 
1318         // Sampler for AVS - Start of this area to be aligned on 64 byte boundary
1319         if(GFX_IS_GEN_9_OR_LATER(pRenderHal->Platform))
1320         {
1321             // AVS state should begin on MHW_SAMPLER_STATE_AVS_ALIGN_G9 byte boundary in g9+
1322             dwSizeMediaState           = MOS_ALIGN_CEIL((dwSizeMediaState - pStateHeap->dwSizeCurbe),  MHW_SAMPLER_STATE_AVS_ALIGN_G9) + pStateHeap->dwSizeCurbe;
1323         }
1324 
1325         pStateHeap->dwOffsetSamplerAVS = dwSizeMediaState;
1326         pStateHeap->dwSizeSamplerAVS   = MOS_ALIGN_CEIL(pSettings->iSamplersAVS *
1327                                                         pHwSizes->dwSizeSamplerStateAvs,  MHW_SAMPLER_STATE_AVS_ALIGN);
1328         dwSizeMediaState               += pStateHeap->dwSizeSamplerAVS;
1329 
1330         // Sampler Indirect State
1331         pStateHeap->dwOffsetSamplerIndirect = dwSizeMediaState;
1332         pStateHeap->dwSizeSamplerIndirect = MOS_ALIGN_CEIL(pSettings->iSamplers * pHwSizes->dwSizeSamplerIndirectState, MHW_SAMPLER_STATE_ALIGN);
1333         dwSizeMediaState += pStateHeap->dwSizeSamplerIndirect;
1334 
1335         // Get the total size of all the samplers
1336         pStateHeap->dwSizeSamplers      = MOS_ALIGN_CEIL((dwSizeMediaState - dwOffsetSamplers),  MHW_SAMPLER_STATE_ALIGN);
1337         dwSizeMediaState               += pSettings->iMediaIDs * pStateHeap->dwSizeSamplers;
1338 
1339         // Sampler 8x8 State table is part of Sampler8x8 state
1340         pStateHeap->dwOffsetSampler8x8Table   = 0;
1341         pStateHeap->dwSizeSampler8x8Table     = pHwSizes->dwSizeSamplerStateTable8x8;
1342     }
1343 
1344     // Interface Descriptors
1345     pStateHeap->dwOffsetMediaID     = dwSizeMediaState;
1346     pStateHeap->dwSizeMediaID       = pHwSizes->dwSizeInterfaceDescriptor;
1347     dwSizeMediaState               += pSettings->iMediaIDs * pStateHeap->dwSizeMediaID;
1348 
1349     // 3P Budget
1350     pStateHeap->dwOffsetStartTime   = dwSizeMediaState;
1351     pStateHeap->dwStartTimeSize     = sizeof(uint64_t);
1352     dwSizeMediaState               += pStateHeap->dwStartTimeSize;
1353 
1354     pStateHeap->dwOffsetEndTime     = dwSizeMediaState;
1355     pStateHeap->dwEndTimeSize       = sizeof(uint64_t);
1356     dwSizeMediaState               += pStateHeap->dwEndTimeSize;
1357 
1358     pStateHeap->dwOffsetComponentID = dwSizeMediaState;
1359     pStateHeap->dwComponentIDSize   = sizeof(uint32_t);
1360     dwSizeMediaState               += pStateHeap->dwComponentIDSize;
1361 
1362     pStateHeap->dwOffsetReserved    = dwSizeMediaState;
1363     pStateHeap->dwReservedSize      = 44;  // 64 - 2 * sizeof(uint64_t) - sizeof(uint32_t);
1364     dwSizeMediaState               += pStateHeap->dwReservedSize;
1365 
1366     // Ensure correct alignment of consecutive Media States
1367     if(GFX_IS_GEN_9_OR_LATER(pRenderHal->Platform))
1368     {
1369         dwSizeMediaState = MOS_ALIGN_CEIL(dwSizeMediaState, MHW_SAMPLER_STATE_AVS_ALIGN_G9);
1370     }
1371     else
1372     {
1373         dwSizeMediaState = MOS_ALIGN_CEIL(dwSizeMediaState, MHW_SAMPLER_STATE_AVS_ALIGN);
1374     }
1375 
1376     // Create multiple instances of Media state heaps for Dynamic GSH
1377     ptrMediaState = (uint8_t*)pStateHeap->pMediaStates;
1378     for (i = 0; i < pSettings->iMediaStateHeaps; i++)
1379     {
1380         PRENDERHAL_MEDIA_STATE pStat = (PRENDERHAL_MEDIA_STATE)ptrMediaState;
1381         pStat->dwOffset     = dwSizeGSH;
1382         pStat->piAllocation = pAllocations;
1383         dwSizeGSH    += dwSizeMediaState;
1384         pAllocations += pSettings->iMediaIDs;
1385         // Pointer moves to next MEDIA STATE position
1386         ptrMediaState += mediaStateSize;
1387     }
1388 
1389     // Kernel Spill Area
1390     if (pSettings->iPerThreadScratchSize > 0)
1391     {
1392         // Scratch Space Base Pointer. Specifies the MHW_SCRATCH_SPACE_ALIGN
1393         // aligned address offset to scratch space for use by the kernel.
1394         // This pointer is relative to the General State Base Address.
1395         dwSizeGSH = MOS_ALIGN_CEIL(dwSizeGSH, MHW_SCRATCH_SPACE_ALIGN);
1396 
1397         MHW_RENDERHAL_ASSERT(pSettings->iPerThreadScratchSize ==
1398             MOS_ALIGN_CEIL(pSettings->iPerThreadScratchSize, MHW_SCRATCH_SPACE_ALIGN));
1399 
1400         pStateHeap->dwScratchSpaceSize = pRenderHal->pfnGetScratchSpaceSize(pRenderHal, pSettings->iPerThreadScratchSize);
1401         pStateHeap->dwScratchSpaceBase = dwSizeGSH;
1402         dwSizeGSH                     += pStateHeap->dwScratchSpaceSize;
1403     }
1404 
1405     pStateHeap->dwSizeGSH        = dwSizeGSH;
1406     pStateHeap->dwSizeMediaState = dwSizeMediaState;
1407 
1408     //----------------------------------
1409     // Instruction State Heap (Kernel Heap)
1410     //----------------------------------
1411     pStateHeap->dwKernelBase = 0;
1412     dwSizeISH = MOS_ALIGN_CEIL(pSettings->iKernelHeapSize, RENDERHAL_KERNEL_BLOCK_ALIGN);
1413 
1414     // System Routine Area, always loaded for Cm
1415     // Don't put the allocation under bIsaAsmDebugEnable
1416     pStateHeap->dwSipBase                 = dwSizeISH;
1417     pRenderHal->SipStateParams.bSipKernel = false;
1418     pRenderHal->SipStateParams.dwSipBase  = dwSizeISH;
1419     dwSizeISH            += MOS_ALIGN_CEIL(pSettings->iSipSize, RENDERHAL_KERNEL_BLOCK_ALIGN);
1420 
1421     pStateHeap->dwSizeISH = dwSizeISH;
1422 
1423     //----------------------------------
1424     // Surface State Heap
1425     //----------------------------------
1426     // Reset initial SSH allocations
1427     pStateHeap->iCurSshBufferIndex    = 0;
1428     pStateHeap->iCurrentBindingTable  = 0;
1429     pStateHeap->iCurrentSurfaceState  = 0;
1430 
1431     if (pRenderHal->isBindlessHeapInUse == false)
1432     {
1433         // Set BT sizes
1434         pStateHeap->iBindingTableSize = MOS_ALIGN_CEIL(pSettings->iSurfacesPerBT * pHwSizes->dwSizeBindingTableState,
1435             pSettings->iBTAlignment);
1436 
1437         // Set offsets to BT and SS entries
1438         pStateHeap->iBindingTableOffset = 0;
1439         pStateHeap->iSurfaceStateOffset = pSettings->iBindingTables * pStateHeap->iBindingTableSize;
1440 
1441         // Calculate size of a single SSH instance and total SSH buffer size
1442         dwSizeSSH = pStateHeap->iSurfaceStateOffset +
1443                     pSettings->iSurfaceStates * pRenderHal->pRenderHalPltInterface->GetSurfaceStateCmdSize();
1444         pStateHeap->dwSshIntanceSize   = dwSizeSSH;
1445         pRenderHal->dwIndirectHeapSize = MOS_ALIGN_CEIL(dwSizeSSH, MHW_PAGE_SIZE);
1446 
1447         // Allocate SSH buffer in system memory, not Gfx
1448         pStateHeap->dwSizeSSH  = dwSizeSSH;  // Single SSH instance
1449         pStateHeap->pSshBuffer = (uint8_t *)MOS_AllocAndZeroMemory(dwSizeSSH);
1450     }
1451     else
1452     {
1453         if (!pStateHeap->surfaceStateMgr)
1454         {
1455             pStateHeap->surfaceStateMgr = MOS_New(SurfaceStateHeapManager, pRenderHal->pOsInterface);
1456             if (pStateHeap->surfaceStateMgr == nullptr)
1457             {
1458                 MHW_RENDERHAL_ASSERTMESSAGE("Fail to Allocate SSH manager.");
1459                 // Free State Heap control structure
1460                 MOS_AlignedFreeMemory(pStateHeap);
1461                 pRenderHal->pStateHeap = nullptr;
1462                 return MOS_STATUS_NULL_POINTER;
1463             }
1464 
1465             eStatus                          = pStateHeap->surfaceStateMgr->CreateHeap(pRenderHal->pRenderHalPltInterface->GetSurfaceStateCmdSize());
1466             if (eStatus != MOS_STATUS_SUCCESS)
1467             {
1468                 MHW_RENDERHAL_ASSERTMESSAGE("Fail to Allocate SSH manager.");
1469                 MHW_RENDERHAL_CHK_STATUS_RETURN(pStateHeap->surfaceStateMgr->DestroyHeap());
1470                 // Free State Heap control structure
1471                 MOS_AlignedFreeMemory(pStateHeap);
1472                 pRenderHal->pStateHeap = nullptr;
1473                 return eStatus;
1474             }
1475             pStateHeap->iCurrentSurfaceState = pStateHeap->surfaceStateMgr->m_surfStateHeap->uiCurState;
1476         }
1477     }
1478 
1479     do
1480     {
1481         if (pStateHeap->dwSizeSSH > 0 && !pStateHeap->pSshBuffer)
1482         {
1483             MHW_RENDERHAL_ASSERTMESSAGE("Fail to Allocate SSH buffer.");
1484             eStatus = MOS_STATUS_NO_SPACE;
1485             break;
1486         }
1487 
1488         pStateHeap->bSshLocked = true;
1489 
1490         //----------------------------------
1491         // Allocate State Heap in MHW
1492         //----------------------------------
1493         MOS_ZeroMemory(&MhwStateHeapSettings, sizeof(MhwStateHeapSettings));
1494         MhwStateHeapSettings.dwDshSize     = pStateHeap->dwSizeGSH;
1495         MhwStateHeapSettings.dwIshSize     = pStateHeap->dwSizeISH;
1496         MhwStateHeapSettings.dwNumSyncTags = pStateHeap->dwSizeSync;
1497         MhwStateHeapSettings.m_heapUsageType = pSettings->heapUsageType;
1498 
1499         if (pRenderHal->pRenderHalPltInterface->AllocateHeaps(pRenderHal, MhwStateHeapSettings) != MOS_STATUS_SUCCESS)
1500         {
1501             break;
1502         }
1503         if (pRenderHal->pRenderHalPltInterface->GetStateHeapInterface(pRenderHal)==nullptr)
1504         {
1505             break;
1506         }
1507 
1508         pDshHeap = pRenderHal->pMhwStateHeap->GetDSHPointer();
1509         if (pRenderHal->pMhwStateHeap->GetDynamicMode() == MHW_RENDER_HAL_MODE)
1510         {
1511             while (pDshHeap->pNext != nullptr)
1512             {
1513                 pDshHeap = pDshHeap->pNext;
1514             }
1515         }
1516         if (pRenderHal->pMhwStateHeap->LockStateHeap(pDshHeap) != MOS_STATUS_SUCCESS)
1517         {
1518             break;
1519         }
1520 
1521         pStateHeap->GshOsResource = pDshHeap->resHeap;
1522         pStateHeap->pGshBuffer    = (uint8_t *)pDshHeap->pvLockedHeap;
1523         pStateHeap->bGshLocked    = true;
1524 
1525         pIshHeap = pRenderHal->pMhwStateHeap->GetISHPointer();
1526         if (pRenderHal->pMhwStateHeap->GetDynamicMode() == MHW_RENDER_HAL_MODE)
1527         {
1528             while (pIshHeap->pNext != nullptr)
1529             {
1530                 pIshHeap = pIshHeap->pNext;
1531             }
1532         }
1533         if (pRenderHal->pMhwStateHeap->LockStateHeap(pIshHeap) != MOS_STATUS_SUCCESS)
1534         {
1535             break;
1536         }
1537         pStateHeap->IshOsResource = pIshHeap->resHeap;
1538         pStateHeap->pIshBuffer    = (uint8_t *)pIshHeap->pvLockedHeap;
1539         pStateHeap->bIshLocked    = true;
1540 
1541         //-----------------------------
1542         // Heap initialization
1543         //-----------------------------
1544 
1545         // Reset GSH contents until scratch space (excluding)
1546         MOS_ZeroMemory(pStateHeap->pGshBuffer, pStateHeap->dwScratchSpaceBase);
1547 
1548         // Setup pointer to sync tags
1549         pStateHeap->pSync = (uint32_t *)(pStateHeap->pGshBuffer + pStateHeap->dwOffsetSync);
1550 
1551         // Reset kernel allocations
1552         pRenderHal->pfnResetKernels(pRenderHal);
1553 
1554         eStatus = MOS_STATUS_SUCCESS;
1555 
1556     } while (false);
1557 
1558 
1559     if (eStatus != MOS_STATUS_SUCCESS)
1560     {
1561         if (pStateHeap)
1562         {
1563             // Free SSH buffer
1564             if (pStateHeap->pSshBuffer)
1565             {
1566                 MOS_FreeMemory(pStateHeap->pSshBuffer);
1567             }
1568 
1569             // Free State Heap control structure
1570             MOS_AlignedFreeMemory(pStateHeap);
1571             pRenderHal->pStateHeap = nullptr;
1572         }
1573     }
1574 
1575     return eStatus;
1576 }
1577 
RenderHal_ReAllocateStateHeapsforAdvFeatureWithSshEnlarged(PRENDERHAL_INTERFACE pRenderHal,bool & bAllocated)1578 MOS_STATUS RenderHal_ReAllocateStateHeapsforAdvFeatureWithSshEnlarged(
1579     PRENDERHAL_INTERFACE           pRenderHal,
1580     bool                           &bAllocated)
1581 {
1582     PMOS_INTERFACE                 pOsInterface     = nullptr;
1583     PRENDERHAL_STATE_HEAP          pStateHeap       = nullptr;
1584     PRENDERHAL_STATE_HEAP          pOldStateHeap    = nullptr;
1585     uint8_t                       *ptr              = nullptr;
1586     int32_t                       *pAllocations     = nullptr;
1587     PRENDERHAL_STATE_HEAP_SETTINGS pSettings        = nullptr;
1588     uint8_t                       *ptrMediaState    = nullptr;
1589     MOS_STATUS                     eStatus          = MOS_STATUS_SUCCESS;
1590     PMHW_RENDER_STATE_SIZES        pHwSizes         = {};
1591     uint32_t                       dwSizeAlloc      = 0;
1592     uint32_t                       dwSizeSSH        = 0;
1593     int32_t                        i                = 0;
1594     uint32_t                       dwSizeGSH        = 0;
1595     uint32_t                       dwSizeMediaState = 0;
1596     size_t                         mediaStateSize   = 0;
1597     size_t                         stateHeapSize    = 0;
1598 
1599     //------------------------------------------------
1600     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
1601     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
1602     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
1603     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
1604 
1605     pSettings  = &pRenderHal->StateHeapSettings;
1606     bAllocated = false;
1607     //------------------------------------------------
1608 
1609     if (pRenderHal->pStateHeap == nullptr)
1610     {
1611         return MOS_STATUS_SUCCESS;
1612     }
1613 
1614     if ((pSettings->iBindingTables == pRenderHal->enlargeStateHeapSettingsForAdv.iBindingTables) &&
1615         (pSettings->iSurfaceStates == pRenderHal->enlargeStateHeapSettingsForAdv.iSurfaceStates) &&
1616         (pSettings->iSurfacesPerBT == pRenderHal->enlargeStateHeapSettingsForAdv.iSurfacesPerBT))
1617     {
1618         return MOS_STATUS_SUCCESS;
1619     }
1620 
1621     pOsInterface  = pRenderHal->pOsInterface;
1622     pOldStateHeap = pRenderHal->pStateHeap;
1623     pHwSizes      = pRenderHal->pHwSizes;
1624 
1625     // Free SSH Resource
1626     if (pOldStateHeap->pSshBuffer)
1627     {
1628         MOS_FreeMemory(pOldStateHeap->pSshBuffer);
1629         pOldStateHeap->pSshBuffer = nullptr;
1630     }
1631 
1632     // Free MOS surface in surface state entry
1633     for (int32_t index = 0; index < pSettings->iSurfaceStates; ++index)
1634     {
1635         PRENDERHAL_SURFACE_STATE_ENTRY entry = pOldStateHeap->pSurfaceEntry + index;
1636         MOS_SafeFreeMemory(entry->pSurface);
1637         entry->pSurface = nullptr;
1638     }
1639 
1640     // Enlarge the binding table size and surface state size
1641     pSettings->iBindingTables = pRenderHal->enlargeStateHeapSettingsForAdv.iBindingTables;
1642     pSettings->iSurfaceStates = pRenderHal->enlargeStateHeapSettingsForAdv.iSurfaceStates;
1643     pSettings->iSurfacesPerBT = pRenderHal->enlargeStateHeapSettingsForAdv.iSurfacesPerBT;
1644 
1645     mediaStateSize = pRenderHal->pRenderHalPltInterface->GetRenderHalMediaStateSize();
1646     stateHeapSize  = pRenderHal->pRenderHalPltInterface->GetRenderHalStateHeapSize();
1647     //---------------------------------------
1648     // Setup General State Heap
1649     //---------------------------------------
1650     // Calculate size of State Heap control structure
1651     dwSizeAlloc  = MOS_ALIGN_CEIL(stateHeapSize                                                      , 16);
1652     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iKernelCount     * sizeof(RENDERHAL_KRN_ALLOCATION)     , 16);
1653     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * mediaStateSize                       , 16);
1654     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * pSettings->iMediaIDs * sizeof(int32_t)   , 16);
1655     dwSizeAlloc += MOS_ALIGN_CEIL(pSettings->iSurfaceStates   * sizeof(RENDERHAL_SURFACE_STATE_ENTRY), 16);
1656 
1657     // Allocate State Heap control structure (aligned)
1658     pStateHeap = (PRENDERHAL_STATE_HEAP)MOS_AlignedAllocMemory(dwSizeAlloc, 16);
1659     pRenderHal->dwStateHeapSize = dwSizeAlloc;
1660 
1661     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap);
1662     MOS_ZeroMemory(pStateHeap, dwSizeAlloc);
1663 
1664     MOS_SecureMemcpy(pStateHeap, dwSizeAlloc, pOldStateHeap, dwSizeAlloc - MOS_ALIGN_CEIL(pSettings->iSurfaceStates * sizeof(RENDERHAL_SURFACE_STATE_ENTRY), 16));
1665 
1666     // Update the State Heap
1667     pRenderHal->pStateHeap = pStateHeap;
1668 
1669     //-------------------------------------------------------------------------
1670     // Setup State Heap control structures
1671     //-------------------------------------------------------------------------
1672     // Skip RENDERHAL_STATE_HEAP structure
1673     ptr = (uint8_t *)pStateHeap;
1674     ptr += MOS_ALIGN_CEIL(stateHeapSize, 16);
1675 
1676     // Pointer to Kernel allocations
1677     pStateHeap->pKernelAllocation = (PRENDERHAL_KRN_ALLOCATION)ptr;
1678     ptr += MOS_ALIGN_CEIL(pSettings->iKernelCount * sizeof(RENDERHAL_KRN_ALLOCATION), 16);
1679 
1680     // Pointer to Media State allocations
1681     pStateHeap->pMediaStates = (PRENDERHAL_MEDIA_STATE)ptr;
1682     ptr += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * mediaStateSize, 16);
1683 
1684     // Pointer to Media ID allocations
1685     pAllocations = (int32_t *)ptr;
1686     ptr += MOS_ALIGN_CEIL(pSettings->iMediaStateHeaps * pSettings->iMediaIDs * sizeof(int32_t), 16);
1687 
1688     // Pointer to Surface State allocations
1689     pStateHeap->pSurfaceEntry = (PRENDERHAL_SURFACE_STATE_ENTRY)ptr;
1690 
1691     dwSizeMediaState = pStateHeap->dwSizeMediaState;
1692 
1693     // Reset current media state
1694     pStateHeap->iCurMediaState  = 0;
1695     pStateHeap->iNextMediaState = 0;
1696 
1697     dwSizeGSH = pStateHeap->dwSizeSync;
1698 
1699     // Align Media State base
1700     dwSizeGSH = MOS_ALIGN_CEIL(dwSizeGSH, MHW_MEDIA_STATE_ALIGN);
1701 
1702     // Create multiple instances of Media state heaps for Dynamic GSH
1703     ptrMediaState = (uint8_t *)pStateHeap->pMediaStates;
1704     for (i = 0; i < pSettings->iMediaStateHeaps; i++)
1705     {
1706         PRENDERHAL_MEDIA_STATE pStat = (PRENDERHAL_MEDIA_STATE)ptrMediaState;
1707         pStat->dwOffset              = dwSizeGSH;
1708         pStat->piAllocation          = pAllocations;
1709         dwSizeGSH += dwSizeMediaState;
1710         pAllocations += pSettings->iMediaIDs;
1711         // Pointer moves to next MEDIA STATE position
1712         ptrMediaState += mediaStateSize;
1713     }
1714 
1715     //----------------------------------
1716     // Surface State Heap
1717     //----------------------------------
1718     // Reset initial SSH allocations
1719     pStateHeap->iCurSshBufferIndex    = 0;
1720     pStateHeap->iCurrentBindingTable  = 0;
1721     pStateHeap->iCurrentSurfaceState  = 0;
1722 
1723     // Set BT sizes
1724     pStateHeap->iBindingTableSize = MOS_ALIGN_CEIL(pSettings->iSurfacesPerBT * pHwSizes->dwSizeBindingTableState,
1725                                                    pSettings->iBTAlignment);
1726 
1727     // Set offsets to BT and SS entries
1728     pStateHeap->iBindingTableOffset  = 0;
1729     pStateHeap->iSurfaceStateOffset  = pSettings->iBindingTables * pStateHeap->iBindingTableSize;
1730 
1731     // Calculate size of a single SSH instance and total SSH buffer size
1732     dwSizeSSH = pStateHeap->iSurfaceStateOffset +
1733                 pSettings->iSurfaceStates * pRenderHal->pRenderHalPltInterface->GetSurfaceStateCmdSize();
1734     pStateHeap->dwSshIntanceSize   = dwSizeSSH;
1735     pRenderHal->dwIndirectHeapSize = MOS_ALIGN_CEIL(dwSizeSSH, MHW_PAGE_SIZE);
1736 
1737     // Allocate SSH buffer in system memory, not Gfx
1738     pStateHeap->dwSizeSSH  = dwSizeSSH; // Single SSH instance
1739     pStateHeap->pSshBuffer = (uint8_t*)MOS_AllocAndZeroMemory(dwSizeSSH);
1740     if (!pStateHeap->pSshBuffer)
1741     {
1742         MHW_RENDERHAL_ASSERTMESSAGE("Fail to Allocate SSH buffer.");
1743         eStatus = MOS_STATUS_NO_SPACE;
1744         return eStatus;
1745     }
1746 
1747     pStateHeap->bSshLocked = true;
1748 
1749     // Free State Heap Control structure
1750     MOS_AlignedFreeMemory(pOldStateHeap);
1751     pOldStateHeap = nullptr;
1752 
1753     eStatus = MOS_STATUS_SUCCESS;
1754     bAllocated = true;
1755 
1756     return eStatus;
1757 }
1758 
RenderHal_ReAllocateStateHeapsforAdvFeatureWithAllHeapsEnlarged(PRENDERHAL_INTERFACE pRenderHal,bool & bAllocated)1759 MOS_STATUS RenderHal_ReAllocateStateHeapsforAdvFeatureWithAllHeapsEnlarged(
1760     PRENDERHAL_INTERFACE      pRenderHal,
1761     bool                     &bAllocated)
1762 {
1763     PRENDERHAL_STATE_HEAP_SETTINGS pRenderhalSettings = nullptr;
1764     PRENDERHAL_ENLARGE_PARAMS      pParams            = nullptr;
1765     MOS_STATUS                     eStatus            = MOS_STATUS_SUCCESS;
1766     //------------------------------------------------
1767     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
1768     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
1769     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
1770     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
1771     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
1772 
1773     pParams            = &pRenderHal->enlargeStateHeapSettingsForAdv;
1774     pRenderhalSettings = &pRenderHal->StateHeapSettings;
1775     bAllocated         = false;
1776 
1777     //------------------------------------------------
1778     // Enlarge the binding table size and surface state size
1779     if ((pRenderhalSettings->iBindingTables  == pParams->iBindingTables) &&
1780         (pRenderhalSettings->iSurfaceStates  == pParams->iSurfaceStates) &&
1781         (pRenderhalSettings->iKernelCount    == pParams->iKernelCount) &&
1782         (pRenderhalSettings->iCurbeSize      == pParams->iCurbeSize) &&
1783         (pRenderhalSettings->iKernelHeapSize == pParams->iKernelHeapSize) &&
1784         (pRenderhalSettings->iSurfacesPerBT  == pParams->iSurfacesPerBT))
1785     {
1786         return MOS_STATUS_SUCCESS;
1787     }
1788 
1789     // Free State Heaps(RenderHal_FreeStateHeaps):
1790     // Free state heap here will only destroy software allocations.
1791     // Will not destroy resources used by hw.
1792     MHW_RENDERHAL_CHK_STATUS_RETURN((MOS_STATUS)(pRenderHal->pfnFreeStateHeaps(pRenderHal)));
1793 
1794     pRenderhalSettings->iBindingTables  = pParams->iBindingTables;
1795     pRenderhalSettings->iSurfaceStates  = pParams->iSurfaceStates;
1796     pRenderhalSettings->iKernelCount    = pParams->iKernelCount;
1797     pRenderhalSettings->iCurbeSize      = pParams->iCurbeSize;
1798     pRenderhalSettings->iKernelHeapSize = pParams->iKernelHeapSize;
1799     pRenderhalSettings->iSurfacesPerBT  = pParams->iSurfacesPerBT;
1800     eStatus                             = pRenderHal->pfnAllocateStateHeaps(pRenderHal, pRenderhalSettings);
1801     bAllocated                          = true;
1802 
1803     return eStatus;
1804 }
1805 
1806 //!
1807 //! \brief    Free State Heaps (including MHW interfaces)
1808 //! \details  Free State Heap resources allocated by RenderHal
1809 //! \param    PRENDERHAL_INTERFACE pRenderHal
1810 //!           [in] Pointer to Render Hal Interface
1811 //! \return   MOS_STATUS
1812 //!
RenderHal_FreeStateHeaps(PRENDERHAL_INTERFACE pRenderHal)1813 MOS_STATUS RenderHal_FreeStateHeaps(PRENDERHAL_INTERFACE pRenderHal)
1814 {
1815     PMOS_INTERFACE        pOsInterface;
1816     PRENDERHAL_STATE_HEAP pStateHeap;
1817     MOS_STATUS            eStatus;
1818 
1819     //------------------------------------------------
1820     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
1821     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
1822     //------------------------------------------------
1823 
1824     if (pRenderHal->pStateHeap == nullptr)
1825     {
1826         return MOS_STATUS_SUCCESS;
1827     }
1828 
1829     eStatus      = MOS_STATUS_UNKNOWN;
1830 
1831     pOsInterface = pRenderHal->pOsInterface;
1832     pStateHeap   = pRenderHal->pStateHeap;
1833 
1834     // Free SSH Resource
1835     if (pStateHeap->pSshBuffer)
1836     {
1837         MOS_FreeMemory(pStateHeap->pSshBuffer);
1838         pStateHeap->pSshBuffer = nullptr;
1839     }
1840 
1841     if (pStateHeap->surfaceStateMgr)
1842     {
1843         MOS_Delete(pStateHeap->surfaceStateMgr);
1844         pStateHeap->surfaceStateMgr = nullptr;
1845     }
1846 
1847     // Free MOS surface in surface state entry
1848     for (int32_t index = 0; index < pRenderHal->StateHeapSettings.iSurfaceStates; ++index) {
1849         PRENDERHAL_SURFACE_STATE_ENTRY entry = pStateHeap->pSurfaceEntry + index;
1850         MOS_SafeFreeMemory(entry->pSurface);
1851         entry->pSurface = nullptr;
1852     }
1853 
1854     // Free State Heap Control structure
1855     MOS_AlignedFreeMemory(pStateHeap);
1856     pRenderHal->pStateHeap = nullptr;
1857 
1858     eStatus = MOS_STATUS_SUCCESS;
1859 
1860     return eStatus;
1861 }
1862 
1863 //!
1864 //! \brief    Allocate BB
1865 //! \details  Allocate Batch Buffer resource (not BB structure),
1866 //!           attaching it to head of linked list in RenderHal.
1867 //! \param    PRENDERHAL_INTERFACE pRenderHal
1868 //!           [in] Pointer to Hardwaew interface structure
1869 //! \param    PMHW_BATCH_BUFFER pBatchBuffer
1870 //!           [out] Pointer to batch buffer structure to be initialized
1871 //! \param    int32_t iSize
1872 //!           [in] Size of the batch buffer to be allocated
1873 //! \return   MOS_STATUS
1874 //!           MOS_STATUS_SUCCESS  if the Batch Buffer was successfully allocated
1875 //!           others              if failed
1876 //!
RenderHal_AllocateBB(PRENDERHAL_INTERFACE pRenderHal,PMHW_BATCH_BUFFER pBatchBuffer,int32_t iSize)1877 MOS_STATUS RenderHal_AllocateBB(
1878     PRENDERHAL_INTERFACE    pRenderHal,
1879     PMHW_BATCH_BUFFER       pBatchBuffer,
1880     int32_t                 iSize)
1881 {
1882     PMOS_INTERFACE           pOsInterface;
1883     MOS_RESOURCE             OsResource;
1884     MOS_ALLOC_GFXRES_PARAMS  AllocParams;
1885     MOS_STATUS               eStatus;
1886 
1887     //---------------------------------------------
1888     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
1889     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
1890     MHW_RENDERHAL_CHK_NULL_RETURN(pBatchBuffer);
1891     //---------------------------------------------
1892 
1893     eStatus         = MOS_STATUS_UNKNOWN;
1894     pOsInterface    = pRenderHal->pOsInterface;
1895 
1896     MOS_ZeroMemory(&OsResource, sizeof(OsResource));
1897 
1898     MOS_ZeroMemory(&AllocParams, sizeof(MOS_ALLOC_GFXRES_PARAMS));
1899 
1900     AllocParams.Type     = MOS_GFXRES_BUFFER;
1901     AllocParams.TileType = MOS_TILE_LINEAR;
1902     AllocParams.Format   = Format_Buffer;
1903     AllocParams.dwBytes  = iSize;
1904     AllocParams.pBufName = "RenderHalBB";
1905     AllocParams.ResUsageType = MOS_HW_RESOURCE_USAGE_MEDIA_BATCH_BUFFERS;
1906 
1907     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnAllocateResource(
1908         pOsInterface,
1909         &AllocParams,
1910         &OsResource));
1911 
1912     // Reset Allocation
1913     pOsInterface->pfnResetResourceAllocationIndex(
1914         pOsInterface,
1915         &OsResource);
1916 
1917     pBatchBuffer->OsResource       = OsResource;
1918     pBatchBuffer->iRemaining       = iSize;
1919     pBatchBuffer->iSize            = iSize;
1920     pBatchBuffer->iCurrent         = 0;
1921     pBatchBuffer->bLocked          = false;
1922     pBatchBuffer->pData            = nullptr;
1923 
1924     pBatchBuffer->dwOffset         = 0;
1925 
1926     pBatchBuffer->bBusy            = false;
1927     pBatchBuffer->dwCmdBufId       = 0;
1928 
1929     // Link BB to beginning of linked list
1930     pBatchBuffer->pPrev            = nullptr;
1931     pBatchBuffer->pNext            = pRenderHal->pBatchBufferList;
1932     pRenderHal->pBatchBufferList   = pBatchBuffer;
1933     if (pBatchBuffer->pNext)
1934     {
1935         pBatchBuffer->pNext->pPrev = pBatchBuffer;
1936     }
1937 
1938     // Reset Sync/BB Reuse data
1939     pBatchBuffer->dwSyncTag        = 0;
1940     pBatchBuffer->bMatch           = false;
1941 
1942     eStatus = MOS_STATUS_SUCCESS;
1943 
1944     return eStatus;
1945 }
1946 
1947 //!
1948 //! \brief    Free BB
1949 //! \details  Frees Batch Buffer Resource (not structure),
1950 //!           detaching it from linked list in RenderHal.
1951 //! \param    PRENDERHAL_INTERFACE pRenderHal
1952 //!           [in] Pointer to Hardware Interface Structure
1953 //! \param    PMHW_BATCH_BUFFER pBatchBuffer
1954 //!           [in] Pointer to Batch Buffer
1955 //! \return   MOS_STATUS
1956 //!
RenderHal_FreeBB(PRENDERHAL_INTERFACE pRenderHal,PMHW_BATCH_BUFFER pBatchBuffer)1957 MOS_STATUS RenderHal_FreeBB(
1958     PRENDERHAL_INTERFACE pRenderHal,
1959     PMHW_BATCH_BUFFER pBatchBuffer)
1960 {
1961     PMOS_INTERFACE      pOsInterface;
1962     MOS_STATUS          eStatus;
1963 
1964     //----------------------------------------------
1965     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
1966     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
1967     MHW_RENDERHAL_CHK_NULL_RETURN(pBatchBuffer);
1968     //----------------------------------------------
1969 
1970     eStatus         = MOS_STATUS_UNKNOWN;
1971     pOsInterface    = pRenderHal->pOsInterface;
1972 
1973     if (pBatchBuffer->bLocked)
1974     {
1975         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnUnlockBB(pRenderHal, pBatchBuffer));
1976     }
1977 
1978     pOsInterface->pfnFreeResource(pOsInterface, &pBatchBuffer->OsResource);
1979 
1980     pBatchBuffer->dwSyncTag        = 0;
1981     pBatchBuffer->iSize            = 0;
1982     pBatchBuffer->iCurrent         = 0;
1983     pBatchBuffer->bMatch           = 0;
1984 
1985     // Unlink BB from synchronization list
1986     if (pBatchBuffer->pNext)
1987     {
1988         pBatchBuffer->pNext->pPrev = pBatchBuffer->pPrev;
1989     }
1990 
1991     if (pBatchBuffer->pPrev)
1992     {
1993         pBatchBuffer->pPrev->pNext = pBatchBuffer->pNext;
1994     }
1995     else
1996     {
1997         pRenderHal->pBatchBufferList = pBatchBuffer->pNext;
1998     }
1999 
2000     pBatchBuffer->pPrev = pBatchBuffer->pNext = nullptr;
2001 
2002     eStatus = MOS_STATUS_SUCCESS;
2003 
2004     return eStatus;
2005 }
2006 
2007 //!
2008 //! \brief    Lock BB
2009 //! \details  Locks Batch Buffer
2010 //! \param    PRENDERHAL_INTERFACE pRenderHal
2011 //!           [in] Pointer to Hardware Interface Structure
2012 //! \param    PMHW_BATCH_BUFFER pBatchBuffer
2013 //!           [in] Pointer to Batch Buffer
2014 //! \return   MOS_STATUS
2015 //!
RenderHal_LockBB(PRENDERHAL_INTERFACE pRenderHal,PMHW_BATCH_BUFFER pBatchBuffer)2016 MOS_STATUS RenderHal_LockBB(
2017     PRENDERHAL_INTERFACE pRenderHal,
2018     PMHW_BATCH_BUFFER pBatchBuffer)
2019 {
2020     PMOS_INTERFACE      pOsInterface;
2021     MOS_LOCK_PARAMS     LockFlags;
2022     MOS_STATUS          eStatus;
2023 
2024     //-----------------------------------
2025     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
2026     MHW_RENDERHAL_CHK_NULL_RETURN(pBatchBuffer);
2027     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
2028     //-----------------------------------
2029 
2030     eStatus         = MOS_STATUS_UNKNOWN;
2031     pOsInterface    = pRenderHal->pOsInterface;
2032 
2033     if (pBatchBuffer->bLocked)
2034     {
2035         MHW_RENDERHAL_ASSERTMESSAGE("Batch Buffer is already locked.");
2036         return eStatus;
2037     }
2038 
2039     MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS));
2040 
2041     LockFlags.WriteOnly = 1;
2042 
2043     pBatchBuffer->pData = (uint8_t*)pOsInterface->pfnLockResource(
2044                                     pOsInterface,
2045                                     &pBatchBuffer->OsResource,
2046                                     &LockFlags);
2047 
2048     MHW_RENDERHAL_CHK_NULL_RETURN(pBatchBuffer->pData);
2049 
2050     pBatchBuffer->bLocked   = true;
2051     eStatus                 = MOS_STATUS_SUCCESS;
2052 
2053     return eStatus;
2054 }
2055 
2056 //!
2057 //! \brief    Unlock BB
2058 //! \details  Unlocks Batch Buffer
2059 //! \param    PRENDERHAL_INTERFACE pRenderHal
2060 //!           [in] Pointer to Hardware Interface Structure
2061 //! \param    PMHW_BATCH_BUFFER pBatchBuffer
2062 //!           [in] Pointer to Batch Buffer
2063 //! \return   MOS_STATUS
2064 //!
RenderHal_UnlockBB(PRENDERHAL_INTERFACE pRenderHal,PMHW_BATCH_BUFFER pBatchBuffer)2065 MOS_STATUS RenderHal_UnlockBB(
2066     PRENDERHAL_INTERFACE pRenderHal,
2067     PMHW_BATCH_BUFFER pBatchBuffer)
2068 {
2069     PMOS_INTERFACE      pOsInterface;
2070     MOS_STATUS          eStatus;
2071 
2072     //---------------------------------
2073     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
2074     MHW_RENDERHAL_CHK_NULL_RETURN(pBatchBuffer);
2075     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
2076     //---------------------------------
2077 
2078     eStatus         = MOS_STATUS_UNKNOWN;
2079     pOsInterface    = pRenderHal->pOsInterface;
2080 
2081     if (!pBatchBuffer->bLocked)
2082     {
2083         MHW_RENDERHAL_ASSERTMESSAGE("Batch buffer is locked.");
2084         return eStatus;
2085     }
2086 
2087     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnUnlockResource(
2088                 pOsInterface,
2089                 &pBatchBuffer->OsResource));
2090 
2091     pBatchBuffer->bLocked = false;
2092 
2093     eStatus = MOS_STATUS_SUCCESS;
2094 
2095     return eStatus;
2096 }
2097 
2098 //!
2099 //! \brief    Refresh Sync
2100 //! \details  Update Sync tags
2101 //! \param    PRENDERHAL_INTERFACE pRenderHal
2102 //!           [in] Pointer to Hardware Interface Structure
2103 //! \return   MOS_STATUS
2104 //!
RenderHal_RefreshSync(PRENDERHAL_INTERFACE pRenderHal)2105 MOS_STATUS RenderHal_RefreshSync(PRENDERHAL_INTERFACE pRenderHal)
2106 {
2107     PRENDERHAL_STATE_HEAP       pStateHeap;
2108     PRENDERHAL_MEDIA_STATE      pCurMediaState;
2109     PMHW_BATCH_BUFFER           pBatchBuffer;
2110     uint32_t                    dwCurrentTag;
2111     int32_t                     i;
2112     int32_t                     iStatesInUse;
2113     int32_t                     iBuffersInUse;
2114     MOS_STATUS                  eStatus;
2115     MOS_NULL_RENDERING_FLAGS    NullRenderingFlags;
2116     uint8_t                     *pCurrentPtr;
2117     uint64_t                    uiStartTime;
2118     uint64_t                    uiEndTime;
2119     uint64_t                    uiDiff;
2120     uint64_t                    uiNS;
2121     double                      TimeMS;
2122     uint32_t                    uiComponent;
2123     size_t                      mediaStateSize = 0;
2124     uint8_t                     *ptrMediaState = nullptr;
2125 
2126     //----------------------------------
2127     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
2128     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
2129     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
2130     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
2131     //----------------------------------
2132 
2133     eStatus         = MOS_STATUS_UNKNOWN;
2134     pCurrentPtr     = nullptr;
2135     uiNS            = 0;
2136     mediaStateSize  = pRenderHal->pRenderHalPltInterface->GetRenderHalMediaStateSize();
2137     // GSH must be locked
2138     pStateHeap = pRenderHal->pStateHeap;
2139     if (!pStateHeap->bGshLocked)
2140     {
2141         return eStatus;
2142     }
2143 
2144     // Most recent tag
2145     dwCurrentTag = pStateHeap->pSync[0];
2146     pStateHeap->dwSyncTag = dwCurrentTag - 1;
2147 
2148     // Refresh batch buffers
2149     iBuffersInUse       = 0;
2150     pBatchBuffer        = pRenderHal->pBatchBufferList;
2151 
2152     NullRenderingFlags  = pRenderHal->pOsInterface->pfnGetNullHWRenderFlags(
2153                         pRenderHal->pOsInterface);
2154 
2155     for (; pBatchBuffer != nullptr; pBatchBuffer = pBatchBuffer->pNext)
2156     {
2157         if (!pBatchBuffer->bBusy) continue;
2158 
2159         // Clear BB busy flag when Sync Tag is reached
2160         if ((int32_t)(dwCurrentTag - pBatchBuffer->dwSyncTag) > 0 ||
2161             NullRenderingFlags.VPGobal)
2162         {
2163             pBatchBuffer->bBusy = false;
2164         }
2165         else
2166         {
2167             iBuffersInUse++;
2168         }
2169     }
2170 
2171     // Refresh media states
2172     if(pRenderHal->StateHeapSettings.iMediaStateHeaps > 0)
2173     {
2174         MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->pMediaStates);
2175     }
2176     ptrMediaState  = (uint8_t*)pStateHeap->pMediaStates;
2177     pCurMediaState = pStateHeap->pMediaStates;
2178     iStatesInUse   = 0;
2179     for (i = pRenderHal->StateHeapSettings.iMediaStateHeaps; i > 0; i--, pCurMediaState = (PRENDERHAL_MEDIA_STATE)ptrMediaState)
2180     {
2181         ptrMediaState += mediaStateSize;
2182         if (!pCurMediaState->bBusy) continue;
2183 
2184         // The condition below is valid when sync tag wraps from 2^32-1 to 0
2185         if ((int32_t)(dwCurrentTag - pCurMediaState->dwSyncTag) > 0)
2186         {
2187             pCurMediaState->bBusy = false;
2188             if (pRenderHal->bKerneltimeDump)
2189             {
2190                 // Dump Kernel execution time when media state is being freed
2191                 pCurrentPtr = pStateHeap->pGshBuffer +
2192                               pCurMediaState->dwOffset +
2193                               pStateHeap->dwOffsetStartTime;
2194                 if (pCurrentPtr)
2195                 {
2196                     uiStartTime = *((uint64_t *) pCurrentPtr);
2197                     pCurrentPtr += pStateHeap->dwStartTimeSize;
2198 
2199                     uiEndTime =  *((uint64_t *) pCurrentPtr);
2200                     pCurrentPtr += pStateHeap->dwEndTimeSize;
2201 
2202                     uiComponent = *((RENDERHAL_COMPONENT *) pCurrentPtr);
2203                     if (uiComponent < (uint32_t)RENDERHAL_COMPONENT_COUNT)
2204                     {
2205                         // Convert ticks to ns
2206                         uiDiff   = uiEndTime - uiStartTime;
2207                         uiNS     = 0;
2208                         pRenderHal->pfnConvertToNanoSeconds(pRenderHal, uiDiff, &uiNS);
2209 
2210                         TimeMS = ((double)uiNS) / (1000 * 1000); // Convert to ms (double)
2211 
2212                         pRenderHal->kernelTime[uiComponent] += TimeMS;
2213                     }
2214                 }
2215             }
2216         }
2217         else
2218         {
2219             iStatesInUse++;
2220         }
2221     }
2222 
2223     // Save number of states/buffers in use
2224     pRenderHal->iBuffersInUse     = iBuffersInUse;
2225     pRenderHal->iMediaStatesInUse = iStatesInUse;
2226 
2227     eStatus = MOS_STATUS_SUCCESS;
2228 
2229     return eStatus;
2230 }
2231 
2232 //!
2233 //! \brief    Load Kernel
2234 //! \details  Load a kernel from cache into GSH; searches for unused space in
2235 //!           the kernel heap; deallocates kernels identified as no longer in use.
2236 //! \param    PRENDERHAL_INTERFACE pRenderHal
2237 //!           [in] Pointer to Hardware Interface Structure
2238 //! \param    PCRENDERHAL_KERNEL_PARAM pParameters
2239 //!           [in] Pointer to Kernel Parameters
2240 //! \param    PMHW_KERNEL_PARAMS pKernel
2241 //!           [in] Pointer to Kernel entry
2242 //! \param    Kdll_CacheEntry pKernelEntry
2243 //!           [in] The cache entry pointer maintaining the load status.
2244 //!                For cache entries from local variable,
2245 //!                set it to nullptr to avoid memory corruption
2246 //! \return   int32_t
2247 //!           Index to a kernel allocation index
2248 //!           -1 if invalid parameters, no available space and no
2249 //!            deallocation possible
2250 //!
RenderHal_LoadKernel(PRENDERHAL_INTERFACE pRenderHal,PCRENDERHAL_KERNEL_PARAM pParameters,PMHW_KERNEL_PARAM pKernel,Kdll_CacheEntry * pKernelEntry)2251 int32_t RenderHal_LoadKernel(
2252     PRENDERHAL_INTERFACE       pRenderHal,
2253     PCRENDERHAL_KERNEL_PARAM   pParameters,
2254     PMHW_KERNEL_PARAM          pKernel,
2255     Kdll_CacheEntry            *pKernelEntry)
2256 {
2257     PRENDERHAL_STATE_HEAP       pStateHeap;
2258     PRENDERHAL_KRN_ALLOCATION   pKernelAllocation;
2259 
2260     int32_t iKernelAllocationID;    // Kernel allocation ID in GSH
2261     int32_t iKernelCacheID;         // Kernel cache ID
2262     int32_t iKernelUniqueID;        // Kernel unique ID
2263     void    *pKernelPtr;
2264     int32_t iKernelSize;
2265     int32_t iSearchIndex;
2266     int32_t iMaxKernels;            // Max number of kernels allowed in GSH
2267     uint32_t dwOffset;
2268     int32_t iSize;
2269     MOS_STATUS eStatus;
2270 
2271     iKernelAllocationID = RENDERHAL_KERNEL_LOAD_FAIL;
2272     eStatus             = MOS_STATUS_SUCCESS;
2273 
2274     do
2275     {
2276         if (pRenderHal==nullptr)
2277         {
2278             break;
2279         }
2280         if (pRenderHal->pStateHeap == nullptr)
2281         {
2282             break;
2283         }
2284         if (pRenderHal->pStateHeap->pKernelAllocation == nullptr)
2285         {
2286             break;
2287         }
2288         if (pParameters == nullptr)
2289         {
2290             break;
2291         }
2292         if (pKernel == nullptr)
2293         {
2294             break;
2295         }
2296         pStateHeap = pRenderHal->pStateHeap;
2297 
2298           // Validate parameters
2299         if (pStateHeap->bGshLocked == false ||
2300             pKernel->iSize == 0)
2301         {
2302             eStatus = MOS_STATUS_INVALID_PARAMETER;
2303             MHW_RENDERHAL_NORMALMESSAGE("Failed to load kernel - invalid parameters.");
2304             break;
2305         }
2306 
2307            // Kernel parameters
2308         pKernelPtr      = pKernel->pBinary;
2309         iKernelSize     = pKernel->iSize;
2310         iKernelUniqueID = pKernel->iKUID;
2311         iKernelCacheID  = pKernel->iKCID;
2312 
2313         // Check if kernel is already loaded; Search free allocation index
2314         iSearchIndex      = -1;
2315         iMaxKernels       = pRenderHal->StateHeapSettings.iKernelCount;
2316         pKernelAllocation = pStateHeap->pKernelAllocation;
2317         for (iKernelAllocationID = 0;
2318              iKernelAllocationID < iMaxKernels;
2319              iKernelAllocationID++, pKernelAllocation++)
2320         {
2321             if (pKernelAllocation->iKUID == iKernelUniqueID &&
2322                 pKernelAllocation->iKCID == iKernelCacheID)
2323             {
2324                 if (iKernelAllocationID != RENDERHAL_KERNEL_LOAD_FAIL)
2325                 {
2326                     // Update kernel usage
2327                     pRenderHal->pfnTouchKernel(pRenderHal, iKernelAllocationID);
2328 
2329                     // Increment reference counter
2330                     if (pKernelEntry)
2331                     {
2332                         pKernelEntry->dwLoaded = 1;
2333                     }
2334                     pRenderHal->iKernelAllocationID = iKernelAllocationID;
2335                 }
2336 
2337                 // Return kernel allocation index
2338                 return iKernelAllocationID;
2339             }
2340 
2341             if (iSearchIndex < 0 &&
2342                 pKernelAllocation->dwFlags == RENDERHAL_KERNEL_ALLOCATION_FREE)
2343             {
2344                 iSearchIndex = iKernelAllocationID;
2345             }
2346         }
2347 
2348         // The kernel size to be dumped in oca buffer.
2349         pStateHeap->iKernelUsedForDump = iKernelSize;
2350 
2351         // Kernel already loaded: refresh timer; return allocation index
2352         if (iKernelAllocationID < iMaxKernels)
2353         {
2354             // To reload the kernel forcibly if needed
2355             if (pKernel->bForceReload)
2356             {
2357                 dwOffset = pKernelAllocation->dwOffset;
2358                 MOS_SecureMemcpy(pStateHeap->pIshBuffer + dwOffset, iKernelSize, pKernelPtr, iKernelSize);
2359 
2360                 pKernel->bForceReload = false;
2361             }
2362             break;
2363         }
2364 
2365         // Kernel parameters
2366         pKernelPtr      = pKernel->pBinary;
2367         iKernelSize     = pKernel->iSize;
2368         iKernelUniqueID = pKernel->iKUID;
2369         iKernelCacheID  = pKernel->iKCID;
2370 
2371         // Check if kernel is already loaded; Search free allocation index
2372         iSearchIndex      = -1;
2373         iMaxKernels       = pRenderHal->StateHeapSettings.iKernelCount;
2374         pKernelAllocation = pStateHeap->pKernelAllocation;
2375         for (iKernelAllocationID = 0;
2376              iKernelAllocationID < iMaxKernels;
2377              iKernelAllocationID++, pKernelAllocation++)
2378         {
2379             if (pKernelAllocation->iKUID == iKernelUniqueID &&
2380                 pKernelAllocation->iKCID == iKernelCacheID)
2381             {
2382                 break;
2383             }
2384 
2385             if (iSearchIndex < 0 &&
2386                 pKernelAllocation->dwFlags == RENDERHAL_KERNEL_ALLOCATION_FREE)
2387             {
2388                 iSearchIndex = iKernelAllocationID;
2389             }
2390         }
2391 
2392         // The kernel size to be dumped in oca buffer.
2393         pStateHeap->iKernelUsedForDump = iKernelSize;
2394 
2395         // Kernel already loaded: refresh timer; return allocation index
2396         if (iKernelAllocationID < iMaxKernels)
2397         {
2398             // To reload the kernel forcibly if needed
2399             if (pKernel->bForceReload)
2400             {
2401                 dwOffset = pKernelAllocation->dwOffset;
2402                 MOS_SecureMemcpy(pStateHeap->pIshBuffer + dwOffset, iKernelSize, pKernelPtr, iKernelSize);
2403 
2404                 pKernel->bForceReload = false;
2405             }
2406             break;
2407         }
2408 
2409         // Simple allocation: allocation index available, space available
2410         if ((iSearchIndex >= 0) &&
2411             (pStateHeap->iKernelUsed + iKernelSize <= pStateHeap->iKernelSize))
2412         {
2413             // Allocate kernel at the end of the heap
2414             iKernelAllocationID = iSearchIndex;
2415             pKernelAllocation   = &(pStateHeap->pKernelAllocation[iSearchIndex]);
2416 
2417             // Allocate block from the end of the heap
2418             dwOffset = pStateHeap->dwKernelBase + pStateHeap->iKernelUsed;
2419             iSize    = MOS_ALIGN_CEIL(iKernelSize, pRenderHal->StateHeapSettings.iKernelBlockSize);
2420 
2421             // Update heap
2422             pStateHeap->iKernelUsed += iSize;
2423 
2424             // Load kernel
2425             goto loadkernel;
2426         }
2427 
2428         // Search block from deallocated entry
2429         if (iSearchIndex >= 0)
2430         {
2431             int32_t iMinSize = 0;
2432 
2433             iSearchIndex      = -1;
2434             pKernelAllocation = pStateHeap->pKernelAllocation;
2435             for (iKernelAllocationID = 0;
2436                  iKernelAllocationID < iMaxKernels;
2437                  iKernelAllocationID++, pKernelAllocation++)
2438             {
2439                 // Skip allocated/empty entries
2440                 if (pKernelAllocation->dwFlags != RENDERHAL_KERNEL_ALLOCATION_FREE ||
2441                     pKernelAllocation->iSize == 0)
2442                 {
2443                     continue;
2444                 }
2445 
2446                 // Allocate minimum available block
2447                 if (pKernelAllocation->iSize >= iKernelSize)
2448                 {
2449                     if (iSearchIndex < 0 ||
2450                         pKernelAllocation->iSize < iMinSize)
2451                     {
2452                         iSearchIndex = iKernelAllocationID;
2453                         iMinSize     = pKernelAllocation->iSize;
2454                     }
2455                 }
2456             }
2457         }
2458 
2459         // Did not find block, try to deallocate a kernel not recently used
2460         if (iSearchIndex < 0)
2461         {
2462             uint32_t dwOldest = 0;
2463             uint32_t dwLastUsed;
2464 
2465             // Search and deallocate least used kernel
2466             pKernelAllocation = pStateHeap->pKernelAllocation;
2467             for (iKernelAllocationID = 0;
2468                  iKernelAllocationID < iMaxKernels;
2469                  iKernelAllocationID++, pKernelAllocation++)
2470             {
2471                 // Skip unused entries and entries that would not fit
2472                 // Skip kernels flagged as locked (cannot be automatically deallocated)
2473                 if (pKernelAllocation->dwFlags == RENDERHAL_KERNEL_ALLOCATION_FREE ||
2474                     pKernelAllocation->dwFlags == RENDERHAL_KERNEL_ALLOCATION_LOCKED ||
2475                     pKernelAllocation->iSize < iKernelSize)
2476                 {
2477                     continue;
2478                 }
2479 
2480                 // Check if kernel may be replaced (not in use by GPU)
2481                 if ((int32_t)(pStateHeap->dwSyncTag - pKernelAllocation->dwSync) < 0)
2482                 {
2483                     continue;
2484                 }
2485 
2486                 // Find kernel not used for the greater amount of time (measured in number of operations)
2487                 // Must not unload recently allocated kernels
2488                 dwLastUsed = (uint32_t)(pStateHeap->dwAccessCounter - pKernelAllocation->dwCount);
2489                 if (dwLastUsed > dwOldest)
2490                 {
2491                     iSearchIndex = iKernelAllocationID;
2492                     dwOldest     = dwLastUsed;
2493                 }
2494             }
2495 
2496             // Did not found any entry for deallocation
2497             if (iSearchIndex < 0)
2498             {
2499                 MHW_RENDERHAL_NORMALMESSAGE("Failed to load kernel - no space available in GSH.");
2500                 iKernelAllocationID = RENDERHAL_KERNEL_LOAD_FAIL;
2501                 break;
2502             }
2503 
2504             // Free kernel entry and states associated with the kernel (if any)
2505             if (pRenderHal->pfnUnloadKernel(pRenderHal, iSearchIndex) != MOS_STATUS_SUCCESS)
2506             {
2507                 MHW_RENDERHAL_NORMALMESSAGE("Failed to load kernel - no space available in GSH.");
2508                 iKernelAllocationID = RENDERHAL_KERNEL_LOAD_FAIL;
2509                 break;
2510             }
2511         }
2512 
2513         // Allocate the entry
2514         iKernelAllocationID = iSearchIndex;
2515         pKernelAllocation   = &(pStateHeap->pKernelAllocation[iSearchIndex]);
2516 
2517         dwOffset = pKernelAllocation->dwOffset;
2518         iSize    = pKernelAllocation->iSize;
2519 
2520     loadkernel:
2521         // Allocate kernel
2522         pKernelAllocation->iKID   = -1;
2523         pKernelAllocation->iKUID  = iKernelUniqueID;
2524         pKernelAllocation->iKCID  = iKernelCacheID;
2525         pKernelAllocation->dwSync = 0;
2526         FrameTrackerTokenFlat_Clear(&pKernelAllocation->trackerToken);
2527         pKernelAllocation->dwOffset     = dwOffset;
2528         pKernelAllocation->iSize        = iSize;
2529         pKernelAllocation->dwFlags      = RENDERHAL_KERNEL_ALLOCATION_USED;
2530         pKernelAllocation->dwCount      = 0;  // will be updated by "TouchKernel"
2531         pKernelAllocation->Params       = *pParameters;
2532         pKernelAllocation->pKernelEntry = pKernelEntry;
2533         pKernelAllocation->iAllocIndex  = iKernelAllocationID;
2534 
2535         // Copy kernel data
2536         MOS_SecureMemcpy(pStateHeap->pIshBuffer + dwOffset, iKernelSize, pKernelPtr, iKernelSize);
2537         if (iKernelSize < iSize)
2538         {
2539             MOS_ZeroMemory(pStateHeap->pIshBuffer + dwOffset + iKernelSize, iSize - iKernelSize);
2540         }
2541     } while (false);
2542 
2543 
2544     if (iKernelAllocationID != RENDERHAL_KERNEL_LOAD_FAIL)
2545     {
2546         // Update kernel usage
2547         pRenderHal->pfnTouchKernel(pRenderHal, iKernelAllocationID);
2548 
2549         // Increment reference counter
2550         if (pKernelEntry)
2551         {
2552             pKernelEntry->dwLoaded = 1;
2553         }
2554         pRenderHal->iKernelAllocationID = iKernelAllocationID;
2555     }
2556 
2557     // Return kernel allocation index
2558     return iKernelAllocationID;
2559 }
2560 
2561 //!
2562 //! \brief    Unload Kernel
2563 //! \details  Unload a kernel from GSH, free kernel heap space
2564 //!           Notify that the kernel has been unloaded (for tracking)
2565 //! \param    PRENDERHAL_INTERFACE pRenderHal
2566 //!           [in] Pointer to Hardware Interface Structure
2567 //! \param    int32_t iKernelAllocationID
2568 //!           [in] Kernel allocation index in GSH
2569 //! \return   MOS_STATUS
2570 //!           MOS_STATUS_SUCCESS    if success
2571 //!           others                if invalid parameters or if kernel cannot be unloaded
2572 //!
RenderHal_UnloadKernel(PRENDERHAL_INTERFACE pRenderHal,int32_t iKernelAllocationID)2573 MOS_STATUS RenderHal_UnloadKernel(
2574     PRENDERHAL_INTERFACE pRenderHal,
2575     int32_t              iKernelAllocationID)
2576 {
2577     PRENDERHAL_STATE_HEAP       pStateHeap;
2578     PRENDERHAL_KRN_ALLOCATION   pKernelAllocation;
2579     MOS_STATUS                  eStatus;
2580 
2581     //---------------------------------------
2582     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
2583     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
2584     MHW_RENDERHAL_CHK_NULL_RETURN((void *)(iKernelAllocationID >= 0));
2585     //---------------------------------------
2586 
2587     eStatus    = MOS_STATUS_UNKNOWN;
2588     pStateHeap = pRenderHal->pStateHeap;
2589 
2590     //---------------------------------------
2591     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->pKernelAllocation);
2592     MHW_RENDERHAL_ASSERT(iKernelAllocationID < pRenderHal->StateHeapSettings.iKernelCount);
2593     //---------------------------------------
2594 
2595     pKernelAllocation = &(pStateHeap->pKernelAllocation[iKernelAllocationID]);
2596 
2597     if (pKernelAllocation->dwFlags == RENDERHAL_KERNEL_ALLOCATION_FREE)
2598     {
2599         return eStatus;
2600     }
2601 
2602     // Update Sync tags
2603     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnRefreshSync(pRenderHal));
2604 
2605     // Check if kernel may be unloaded
2606     if ((int32_t)(pStateHeap->dwSyncTag - pKernelAllocation->dwSync) < 0)
2607     {
2608         return eStatus;
2609     }
2610 
2611     // Unload kernel
2612     if (pKernelAllocation->pKernelEntry)
2613     {
2614         pKernelAllocation->pKernelEntry->dwLoaded = 0;
2615     }
2616 
2617     // Release kernel entry (Offset/size may be used for reallocation)
2618     pKernelAllocation->iKID             = -1;
2619     pKernelAllocation->iKUID            = -1;
2620     pKernelAllocation->iKCID            = -1;
2621     pKernelAllocation->dwSync           = 0;
2622     FrameTrackerTokenFlat_Clear(&pKernelAllocation->trackerToken);
2623     pKernelAllocation->dwFlags          = RENDERHAL_KERNEL_ALLOCATION_FREE;
2624     pKernelAllocation->dwCount          = 0;
2625     pKernelAllocation->pKernelEntry     = nullptr;
2626 
2627     eStatus = MOS_STATUS_SUCCESS;
2628 
2629     return eStatus;
2630 }
2631 
2632 //!
2633 //! \brief    Touch Kernel
2634 //! \details  Touch Kernel
2635 //! \param    PRENDERHAL_INTERFACE pRenderHal
2636 //!           [in] Pointer to Hardware Interface Structure
2637 //! \param    int32_t iKernelAllocationID
2638 //!           [in] Kernel Allocation ID
2639 //! \return   void
2640 //!
RenderHal_TouchKernel(PRENDERHAL_INTERFACE pRenderHal,int32_t iKernelAllocationID)2641 void RenderHal_TouchKernel(
2642     PRENDERHAL_INTERFACE pRenderHal,
2643     int32_t             iKernelAllocationID)
2644 {
2645     PRENDERHAL_STATE_HEAP       pStateHeap;
2646     PRENDERHAL_KRN_ALLOCATION   pKernelAllocation;
2647 
2648     pStateHeap = (pRenderHal) ? pRenderHal->pStateHeap : nullptr;
2649     if (pStateHeap == nullptr ||
2650         pStateHeap->pKernelAllocation == nullptr ||
2651         iKernelAllocationID < 0 ||
2652         iKernelAllocationID >= pRenderHal->StateHeapSettings.iKernelCount)
2653     {
2654         return;
2655     }
2656 
2657     // Update usage
2658     pKernelAllocation = &(pStateHeap->pKernelAllocation[iKernelAllocationID]);
2659     if (pKernelAllocation->dwFlags != RENDERHAL_KERNEL_ALLOCATION_FREE &&
2660         pKernelAllocation->dwFlags != RENDERHAL_KERNEL_ALLOCATION_LOCKED)
2661     {
2662         pKernelAllocation->dwCount = pStateHeap->dwAccessCounter++;
2663     }
2664 
2665     // Set sync tag, for deallocation control
2666     pKernelAllocation->dwSync = pStateHeap->dwNextTag;
2667 }
2668 
2669 //!
2670 //! \brief    Reset Kernels
2671 //! \details  Reset Kernels
2672 //! \param    PRENDERHAL_INTERFACE pRenderHal
2673 //!           [in] Pointer to Hardware Interface Structure
2674 //! \return   void
2675 //!
RenderHal_ResetKernels(PRENDERHAL_INTERFACE pRenderHal)2676 void RenderHal_ResetKernels(
2677     PRENDERHAL_INTERFACE pRenderHal)
2678 {
2679     PRENDERHAL_STATE_HEAP       pStateHeap;
2680     PRENDERHAL_KRN_ALLOCATION   pKernelAllocation;
2681     int32_t                     i;
2682     MOS_STATUS                  eStatus = MOS_STATUS_UNKNOWN;
2683 
2684     //---------------------------------------
2685     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal);
2686     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal->pStateHeap);
2687     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal->pStateHeap->pKernelAllocation);
2688     //---------------------------------------
2689 
2690     pStateHeap    = pRenderHal->pStateHeap;
2691 
2692     // Unload kernels and notify HAL layer
2693     pKernelAllocation = pStateHeap->pKernelAllocation;
2694     for (i = 0; i< pRenderHal->StateHeapSettings.iKernelCount; i++, pKernelAllocation++)
2695     {
2696         // Unload kernel
2697         if (pKernelAllocation->pKernelEntry)
2698         {
2699             pKernelAllocation->pKernelEntry->dwLoaded = 0;
2700         }
2701 
2702         pKernelAllocation->iKID             = -1;
2703         pKernelAllocation->iKUID            = -1;
2704         pKernelAllocation->iKCID            = -1;
2705         pKernelAllocation->dwSync           = 0;
2706         FrameTrackerTokenFlat_Clear(&pKernelAllocation->trackerToken);
2707         pKernelAllocation->dwOffset         = 0;
2708         pKernelAllocation->iSize            = 0;
2709         pKernelAllocation->dwFlags          = RENDERHAL_KERNEL_ALLOCATION_FREE;
2710         pKernelAllocation->dwCount          = 0;
2711         pKernelAllocation->pKernelEntry     = nullptr;
2712         pKernelAllocation->iAllocIndex      = i;
2713         pKernelAllocation->Params           = g_cRenderHal_InitKernelParams;
2714     }
2715 
2716     // Free Kernel Heap
2717     pStateHeap->dwAccessCounter = 0;
2718     pStateHeap->iKernelSize = pRenderHal->StateHeapSettings.iKernelHeapSize;
2719     pStateHeap->iKernelUsed = 0;
2720     pStateHeap->iKernelUsedForDump = 0;
2721 
2722     return;
2723 }
2724 
2725 //!
2726 //! \brief    Get Kernel Offset
2727 //! \details  Get Kernel Offset
2728 //! \param    PRENDERHAL_INTERFACE pRenderHal
2729 //!           [in] Pointer to Hardware Interface Structure
2730 //! \param    int32_t iKernelAllocationIndex
2731 //!           [in] Kernel Allocation Index
2732 //! \return   int32_t
2733 //!
RenderHal_GetKernelOffset(PRENDERHAL_INTERFACE pRenderHal,int32_t iKernelAllocationIndex)2734 int32_t RenderHal_GetKernelOffset(
2735     PRENDERHAL_INTERFACE pRenderHal,
2736     int32_t             iKernelAllocationIndex)
2737 {
2738     PRENDERHAL_STATE_HEAP pStateHeap;
2739     int32_t               iResult;
2740 
2741     pStateHeap = (pRenderHal) ? pRenderHal->pStateHeap : nullptr;
2742     if (pStateHeap &&
2743         pStateHeap->pKernelAllocation &&
2744         iKernelAllocationIndex >= 0 &&
2745         iKernelAllocationIndex < pRenderHal->StateHeapSettings.iKernelCount)
2746     {
2747         iResult = pStateHeap->pKernelAllocation[iKernelAllocationIndex].dwOffset;
2748     }
2749     else
2750     {
2751         iResult = -1;
2752     }
2753 
2754     return iResult;
2755 }
2756 
2757 //!
2758 //! \brief    Allocate Media ID
2759 //! \details  Allocates an setup Interface Descriptor for Media Pipeline
2760 //!           Kernel        must be preloaded using pfnLoadKernel
2761 //!           Curbe         must be allocated using pfnAllocateCurbe
2762 //!           Binding Table must be allocated using pfnAllocateBindingTable
2763 //! \param    PRENDERHAL_INTERFACE pRenderHal
2764 //!           [in] Pointer to Hardware Interface Structure
2765 //! \param    int32_t iKernelAllocationID
2766 //!           [in] Kernel Allocation ID
2767 //! \param    int32_t iBindingTableID
2768 //!           [in] Binding Table ID
2769 //! \param    int32_t iCurbeOffset
2770 //!           [in] Curbe Offset (from Curbe base)
2771 //! \param    int32_t iCurbeLength
2772 //!           [in] Curbe Length
2773 //! \param    int32_t iCrsThrdConstDataLn
2774 //!           [in] Cross Thread constant data length
2775 //! \param    PMHW_GPGPU_WALKER_PARAMS pGpGpuWalkerParams
2776 //!           [in] Pointer to GpGpu Walker Params
2777 //! \return   int32_t
2778 //!           Media Interface descriptor ID
2779 //!           -1 if invalid parameters, no ID entry available in GSH
2780 //!
RenderHal_AllocateMediaID(PRENDERHAL_INTERFACE pRenderHal,int32_t iKernelAllocationID,int32_t iBindingTableID,int32_t iCurbeOffset,int32_t iCurbeLength,int32_t iCrsThrdConstDataLn,PMHW_GPGPU_WALKER_PARAMS pGpGpuWalkerParams)2781 int32_t RenderHal_AllocateMediaID(
2782     PRENDERHAL_INTERFACE        pRenderHal,
2783     int32_t                    iKernelAllocationID,
2784     int32_t                    iBindingTableID,
2785     int32_t                    iCurbeOffset,
2786     int32_t                    iCurbeLength,
2787     int32_t                    iCrsThrdConstDataLn,
2788     PMHW_GPGPU_WALKER_PARAMS   pGpGpuWalkerParams)
2789 {
2790     PRENDERHAL_STATE_HEAP             pStateHeap;
2791     PRENDERHAL_KRN_ALLOCATION         pKernelAllocation;
2792     PRENDERHAL_MEDIA_STATE            pCurMediaState;
2793     int32_t                           iCurbeSize;
2794     int32_t                           iInterfaceDescriptor;
2795     RENDERHAL_INTERFACE_DESCRIPTOR_PARAMS InterfaceDescriptorParams;
2796 
2797     iInterfaceDescriptor = -1;
2798 
2799     // Validate GSH
2800     pStateHeap = (pRenderHal) ? pRenderHal->pStateHeap : nullptr;
2801     if (pStateHeap == nullptr ||
2802         pStateHeap->pKernelAllocation == nullptr ||
2803         pStateHeap->bGshLocked == false)
2804     {
2805         MHW_RENDERHAL_ASSERTMESSAGE("Invalid GSH State.");
2806         return iInterfaceDescriptor;
2807     }
2808 
2809     // Obtain pointer to current media state
2810     pCurMediaState = pStateHeap->pCurMediaState;
2811     if (pCurMediaState == nullptr ||
2812         pCurMediaState->piAllocation == nullptr)
2813     {
2814         MHW_RENDERHAL_ASSERTMESSAGE("Invalid Media State.");
2815         return iInterfaceDescriptor;
2816     }
2817 
2818     // Validate kernel allocation ID (kernel must be pre-loaded into GSH)
2819     if (iKernelAllocationID < 0 ||
2820         iKernelAllocationID >= pRenderHal->StateHeapSettings.iKernelCount)
2821     {
2822         MHW_RENDERHAL_ASSERTMESSAGE("Invalid Kernel Allocation ID.");
2823         return iInterfaceDescriptor;
2824     }
2825 
2826     // Obtain pointer to kernel allocation control and kernel parameters
2827     pKernelAllocation = &(pStateHeap->pKernelAllocation[iKernelAllocationID]);
2828     if (pKernelAllocation->dwFlags == RENDERHAL_KERNEL_ALLOCATION_FREE ||
2829         pKernelAllocation->iSize   == 0)
2830     {
2831         MHW_RENDERHAL_ASSERTMESSAGE("Invalid Kernel Allocation.");
2832         return iInterfaceDescriptor;
2833     }
2834 
2835     // Check Curbe allocation (CURBE_Lenght is in 256-bit count -> convert to bytes)
2836     iCurbeSize = iCurbeLength;
2837     if (iCurbeSize <= 0)
2838     {
2839         // Curbe is not used by the kernel
2840         iCurbeSize = iCurbeOffset = 0;
2841     }
2842     // Validate Curbe Offset (curbe must be pre-allocated)
2843     else if ( iCurbeOffset < 0 ||                                       // Not allocated
2844              (iCurbeOffset & 0x1F) != 0 ||                              // Invalid alignment
2845              (iCurbeOffset + iCurbeSize) > pCurMediaState->iCurbeOffset)   // Invalid size
2846     {
2847         MHW_RENDERHAL_ASSERTMESSAGE("Invalid Curbe Allocation.");
2848         return iInterfaceDescriptor;
2849     }
2850 
2851     // Search available ID in current media state heap, try to reuse index (2nd level BB reuse)
2852     iInterfaceDescriptor = pRenderHal->pfnGetMediaID(pRenderHal, pCurMediaState, pKernelAllocation);
2853     if (iInterfaceDescriptor < 0)
2854     {
2855         MHW_RENDERHAL_ASSERTMESSAGE("No Interface Descriptor available.");
2856         return iInterfaceDescriptor;
2857     }
2858 
2859     MOS_ZeroMemory((void *)&InterfaceDescriptorParams, sizeof(InterfaceDescriptorParams));
2860 
2861     InterfaceDescriptorParams.iMediaID            = iInterfaceDescriptor;
2862     InterfaceDescriptorParams.iBindingTableID     = iBindingTableID;
2863     InterfaceDescriptorParams.iCurbeOffset        = iCurbeOffset;
2864     InterfaceDescriptorParams.iCurbeLength        = iCurbeLength;
2865     InterfaceDescriptorParams.iCrsThrdConstDataLn = iCrsThrdConstDataLn;
2866 
2867     // barrier and slm
2868     if (pGpGpuWalkerParams && pGpGpuWalkerParams->GpGpuEnable)
2869     {
2870         InterfaceDescriptorParams.blBarrierEnable = true;
2871         InterfaceDescriptorParams.iNumberThreadsInGroup = pGpGpuWalkerParams->ThreadWidth * pGpGpuWalkerParams->ThreadHeight;
2872         InterfaceDescriptorParams.iSLMSize = pGpGpuWalkerParams->SLMSize; // The shift will be handled by pfnEncodeSLMSize()
2873         InterfaceDescriptorParams.blGlobalBarrierEnable = false;
2874     }
2875     else //Reset barrier and slm setting since they may be set before
2876     {
2877         InterfaceDescriptorParams.blBarrierEnable = false;
2878         InterfaceDescriptorParams.iNumberThreadsInGroup = pRenderHal->dwMinNumberThreadsInGroup;
2879         InterfaceDescriptorParams.iSLMSize = 0;
2880         InterfaceDescriptorParams.iCrsThrdConstDataLn &= pRenderHal->dwMaskCrsThdConDataRdLn;
2881         InterfaceDescriptorParams.blGlobalBarrierEnable = false;
2882     }
2883 
2884     // Setup Media ID entry - this call could be HW dependent
2885     if (MOS_STATUS_SUCCESS != pRenderHal->pfnSetupInterfaceDescriptor(
2886                                               pRenderHal,
2887                                               pCurMediaState,
2888                                               pKernelAllocation,
2889                                               &InterfaceDescriptorParams))
2890     {
2891         MHW_RENDERHAL_ASSERTMESSAGE("Failed to setup interface descriptor.");
2892         return iInterfaceDescriptor;
2893     }
2894 
2895     // Update kernel usage
2896     pRenderHal->pfnTouchKernel(pRenderHal, iInterfaceDescriptor);
2897 
2898     return iInterfaceDescriptor;
2899 }
2900 
RenderHal_GetMediaID(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_MEDIA_STATE pMediaState,PRENDERHAL_KRN_ALLOCATION pKernelAllocation)2901 int32_t RenderHal_GetMediaID(
2902     PRENDERHAL_INTERFACE        pRenderHal,
2903     PRENDERHAL_MEDIA_STATE      pMediaState,
2904     PRENDERHAL_KRN_ALLOCATION   pKernelAllocation)
2905 {
2906     int32_t    iInterfaceDescriptor = -1;
2907     int32_t    *Allocation;
2908     MOS_STATUS eStatus = MOS_STATUS_UNKNOWN;
2909 
2910     MHW_RENDERHAL_CHK_NULL_RETURN(pMediaState);
2911     MHW_RENDERHAL_CHK_NULL_RETURN(pMediaState->piAllocation);
2912     MHW_RENDERHAL_CHK_NULL_RETURN(pKernelAllocation);
2913 
2914     iInterfaceDescriptor = pKernelAllocation->iKID;
2915     Allocation           = pMediaState->piAllocation;
2916 
2917     // Try to reuse interface descriptor (for 2nd level buffer optimizations)
2918     // Check if ID already in use by another kernel - must use a different ID
2919     if (iInterfaceDescriptor >= 0 &&
2920         Allocation[iInterfaceDescriptor] >= 0 &&
2921         Allocation[iInterfaceDescriptor] != pKernelAllocation->iAllocIndex)
2922     {
2923         iInterfaceDescriptor = -1;
2924     }
2925 
2926     // Search available ID in current media state heap
2927     if (iInterfaceDescriptor < 0)
2928     {
2929         int32_t iMax = pRenderHal->StateHeapSettings.iMediaIDs;
2930         for (iInterfaceDescriptor = 0;
2931              iInterfaceDescriptor < iMax;
2932              iInterfaceDescriptor++)
2933         {
2934             if (Allocation[iInterfaceDescriptor] < 0)
2935             {
2936                 break;
2937             }
2938         }
2939 
2940         // All IDs are in use - fail
2941         if (iInterfaceDescriptor >= iMax)
2942         {
2943             MHW_RENDERHAL_ASSERT("No Interface Descriptor available.");
2944             iInterfaceDescriptor = -1;
2945             return iInterfaceDescriptor;
2946         }
2947     }
2948 
2949     // Set kernel allocation for the current Media ID
2950     Allocation[iInterfaceDescriptor] = pKernelAllocation->iAllocIndex;
2951 
2952     // Set preferred Media ID for the current kernel
2953     // This is necessary for 2nd level BB optimization.
2954     if (pKernelAllocation->iKID < 0)
2955     {
2956         pKernelAllocation->iKID = iInterfaceDescriptor;
2957     }
2958 
2959     return iInterfaceDescriptor;
2960 }
2961 
RenderHal_SetSurfacesPerBT(PRENDERHAL_INTERFACE pRenderHal,uint32_t dwSurfacesPerBT)2962 uint32_t RenderHal_SetSurfacesPerBT(PRENDERHAL_INTERFACE pRenderHal, uint32_t dwSurfacesPerBT)
2963 {
2964     if (pRenderHal == nullptr)
2965     {
2966         MHW_RENDERHAL_ASSERT("Invalid renderhal interface.");
2967         return dwSurfacesPerBT;
2968     }
2969 
2970     // Set number of surfaces per Binding Table
2971     uint32_t dwSizeBT = (uint32_t)pRenderHal->StateHeapSettings.iBTAlignment/pRenderHal->pRenderHalPltInterface->GetBTStateCmdSize();
2972     while (dwSizeBT < dwSurfacesPerBT) dwSizeBT <<= 1;
2973     dwSurfacesPerBT = dwSizeBT;
2974 
2975     // Reconfigure the binding table size
2976     pRenderHal->pStateHeap->iBindingTableSize = MOS_ALIGN_CEIL(dwSizeBT * pRenderHal->pRenderHalPltInterface->GetBTStateCmdSize(),
2977                                                                   pRenderHal->StateHeapSettings.iBTAlignment);
2978 
2979     // Reconfigure the binding table number, surface per BT
2980     pRenderHal->StateHeapSettings.iBindingTables = pRenderHal->StateHeapSettings.iBindingTables *
2981                                                    pRenderHal->StateHeapSettings.iSurfacesPerBT / dwSurfacesPerBT;
2982     pRenderHal->StateHeapSettings.iSurfacesPerBT = (int32_t) dwSurfacesPerBT;
2983 
2984     return dwSurfacesPerBT;
2985 }
2986 
2987 //!
2988 //! \brief    Assign Surface State
2989 //! \details  Assign a new surface state from already allocated surfState pool
2990 //!           Setup the surface state to default
2991 //! \param    PRENDERHAL_INTERFACE pRenderHal
2992 //!           [in] Pointer to Hardware Interface Structure
2993 //! \param    RENDERHAL_SURFACE_STATE_TYPE Type
2994 //!           [in] Surface State Type
2995 //! \param    PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntry
2996 //!           [in] Pointer to Surface State Entry
2997 //! \return   MOS_STATUS
2998 //!
RenderHal_AssignSurfaceState(PRENDERHAL_INTERFACE pRenderHal,RENDERHAL_SURFACE_STATE_TYPE Type,PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntry)2999 MOS_STATUS RenderHal_AssignSurfaceState(
3000     PRENDERHAL_INTERFACE            pRenderHal,
3001     RENDERHAL_SURFACE_STATE_TYPE    Type,
3002     PRENDERHAL_SURFACE_STATE_ENTRY  *ppSurfaceEntry)
3003 {
3004     PRENDERHAL_STATE_HEAP           pStateHeap;
3005     int32_t                         iSurfaceEntry;
3006     PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntry;
3007     uint32_t                        dwOffset;
3008     MOS_STATUS                      eStatus;
3009 
3010     //----------------------------------------------
3011     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
3012     MHW_RENDERHAL_CHK_NULL_RETURN(ppSurfaceEntry);
3013     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
3014     //----------------------------------------------
3015 
3016     eStatus    = MOS_STATUS_UNKNOWN;
3017     pStateHeap = pRenderHal->pStateHeap;
3018 
3019     uint8_t *pCurSurfaceState;
3020     // Calculate the Offset to the Surface State
3021     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
3022 
3023     if (pRenderHal->isBindlessHeapInUse == false)
3024     {
3025         if (pStateHeap->iCurrentSurfaceState >= pRenderHal->StateHeapSettings.iSurfaceStates)
3026         {
3027             MHW_RENDERHAL_ASSERTMESSAGE("Unable to allocate Surface State. Exceeds Maximum.");
3028             return eStatus;
3029         }
3030 
3031         dwOffset = pStateHeap->iSurfaceStateOffset +
3032                    (pStateHeap->iCurrentSurfaceState *
3033                     pRenderHal->pRenderHalPltInterface->GetSurfaceStateCmdSize());  // Moves the pointer to a Currently assigned Surface State
3034                                                                                        // Increment the Current Surface State Entry
3035                                                                                        // Obtain new surface entry and initialize
3036         iSurfaceEntry = pStateHeap->iCurrentSurfaceState;
3037         pCurSurfaceState = pStateHeap->pSshBuffer + dwOffset;
3038         ++pStateHeap->iCurrentSurfaceState;
3039     }
3040     else
3041     {
3042         MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->surfaceStateMgr);
3043         MHW_RENDERHAL_CHK_STATUS_RETURN(pStateHeap->surfaceStateMgr->AssignSurfaceState());
3044         SURFACE_STATES_HEAP_OBJ                    *sufStateHeap = pStateHeap->surfaceStateMgr->m_surfStateHeap;
3045         MHW_RENDERHAL_CHK_NULL_RETURN(sufStateHeap);
3046         MHW_RENDERHAL_CHK_NULL_RETURN(sufStateHeap->pLockedOsResourceMem);
3047         dwOffset = sufStateHeap->uiCurState * sufStateHeap->uiInstanceSize;
3048         pCurSurfaceState =sufStateHeap->pLockedOsResourceMem + dwOffset;
3049         pStateHeap->iCurrentSurfaceState = sufStateHeap->uiCurState;
3050 
3051         MHW_RENDERHAL_CHK_STATUS_RETURN(pStateHeap->surfaceStateMgr->AssignUsedSurfaceState(pStateHeap->iCurrentSurfaceState));
3052         // Obtain new surface entry and initialize
3053         iSurfaceEntry = pStateHeap->iCurrentSurfaceState;
3054     }
3055 
3056     pSurfaceEntry                       = &pStateHeap->pSurfaceEntry[iSurfaceEntry];
3057     if (pSurfaceEntry->pSurface)
3058     {
3059         MOS_SafeFreeMemory(pSurfaceEntry->pSurface);
3060         pSurfaceEntry->pSurface = nullptr;
3061     }
3062     *pSurfaceEntry                      = g_cInitSurfaceStateEntry;
3063 
3064     // Setup Surface Entry parameters
3065     pSurfaceEntry->iSurfStateID         = iSurfaceEntry;
3066     pSurfaceEntry->Type                 = Type;
3067     pSurfaceEntry->dwSurfStateOffset    = (uint32_t)-1;                         // Each platform to setup
3068     pSurfaceEntry->pSurfaceState        = pCurSurfaceState;
3069     pSurfaceEntry->pSurface             = (PMOS_SURFACE)MOS_AllocAndZeroMemory(sizeof(MOS_SURFACE));
3070     if (pSurfaceEntry->pSurface == nullptr)
3071     {
3072         MHW_RENDERHAL_ASSERTMESSAGE("Allocating Surface failed!");
3073         eStatus = MOS_STATUS_NO_SPACE;
3074         return eStatus;
3075     }
3076 
3077     *ppSurfaceEntry                     = pSurfaceEntry;
3078 
3079     eStatus = MOS_STATUS_SUCCESS;
3080 
3081     return eStatus;
3082 }
3083 
3084 //!
3085 //! \brief    Get DI UV Offset
3086 //! \details  Get DI UV Offset
3087 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
3088 //!           [in] Pointer to Surface
3089 //! \param    uint16_t *pUXOffset
3090 //!           [out] X Offset for U Plane
3091 //! \param    uint16_t *pUYOffset
3092 //!           [out] Y Offset for U Plane
3093 //! \param    uint16_t *pVXOffset
3094 //!           [out] X Offset for V Plane
3095 //! \param    uint16_t *pVYOffset
3096 //!           [out] Y Offset for V Plane
3097 //! \return   void
3098 //!
RenderHal_Get_DI_UVOffSet(PRENDERHAL_SURFACE pRenderHalSurface,uint16_t * pUXOffset,uint16_t * pUYOffset,uint16_t * pVXOffset,uint16_t * pVYOffset)3099 void RenderHal_Get_DI_UVOffSet(
3100     PRENDERHAL_SURFACE pRenderHalSurface,
3101     uint16_t           *pUXOffset,
3102     uint16_t           *pUYOffset,
3103     uint16_t           *pVXOffset,
3104     uint16_t           *pVYOffset)
3105 {
3106     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHalSurface);
3107     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pUXOffset);
3108     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pUYOffset);
3109     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pVXOffset);
3110     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pVXOffset);
3111 
3112     PMOS_SURFACE pSurface = &pRenderHalSurface->OsSurface;
3113     MOS_FORMAT fmt = pSurface->Format;
3114     uint32_t dwNumRowsFromTopV = 0;
3115     uint32_t dwNumRowsFromTopU = 0;
3116     uint32_t dwNumColsFromLeftV = 0;
3117     uint32_t dwNumColsFromLeftU = 0;
3118     uint32_t dwHeight = pSurface->dwHeight;
3119     uint32_t dwPitch  = pSurface->dwPitch;
3120 
3121     switch (fmt)
3122     {
3123         //  YY
3124         //  YY
3125         //  V-
3126         //  U-
3127         case Format_IMC1:
3128             dwNumRowsFromTopV = dwHeight;
3129             dwNumRowsFromTopU = dwHeight + (dwHeight >> 1);
3130             break;
3131 
3132         //  YY
3133         //  YY
3134         //  VU
3135         case Format_IMC2:
3136             dwNumRowsFromTopV = dwNumRowsFromTopU = dwHeight;
3137             dwNumColsFromLeftU = dwPitch >> 1;
3138             break;
3139 
3140         //  YY
3141         //  YY
3142         //  U-
3143         //  V-
3144         case Format_IMC3:
3145             dwNumRowsFromTopU = dwHeight;
3146             dwNumRowsFromTopV = dwHeight + (dwHeight >> 1);
3147             break;
3148 
3149         //  YY
3150         //  YY
3151         //  UV
3152         case Format_IMC4:
3153             dwNumRowsFromTopU = dwNumRowsFromTopV = dwHeight;
3154             dwNumColsFromLeftV = dwPitch >> 1;
3155             break;
3156 
3157         //  YY
3158         //  YY
3159         //  U
3160         //  V
3161         case Format_I420:
3162         case Format_IYUV:
3163             dwNumRowsFromTopU = dwHeight;
3164             dwNumRowsFromTopV = dwHeight + (dwHeight >> 1);
3165             break;
3166 
3167         //  YY
3168         //  YY
3169         //  V
3170         //  U
3171         case Format_YV12:
3172             dwNumRowsFromTopU = dwHeight + (dwHeight >> 1);
3173             dwNumRowsFromTopV = dwHeight;
3174             break;
3175 
3176         //  YYYY
3177         //  YYYY
3178         //  YYYY
3179         //  YYYY
3180         //  V
3181         //  U
3182         case Format_YVU9:
3183             dwNumRowsFromTopU = dwHeight;
3184             dwNumRowsFromTopV = dwHeight + (dwHeight >> 2);
3185             break;
3186 
3187         //  NV12                P208
3188         //  ----                ----
3189         //  YY                  YY
3190         //  YY                  UV (interleaved)
3191         //  UV (interleaved)
3192         case Format_NV12:
3193         case Format_P208:
3194         case Format_P016:
3195         case Format_P010:
3196             dwNumRowsFromTopU = dwNumRowsFromTopV = dwHeight;
3197             break;
3198 
3199         //  NV11
3200         //  ----
3201         //  YYYY
3202         //  UV (interleaved)
3203         case Format_NV11:
3204             dwNumRowsFromTopU = dwNumRowsFromTopV = dwHeight;
3205             break;
3206 
3207        default:
3208            MHW_RENDERHAL_ASSERTMESSAGE("called with Packed or Unknown format.");
3209            break;
3210     }
3211 
3212     // the Offsets must be even numbers so we round down
3213     dwNumRowsFromTopU = MOS_ALIGN_FLOOR(dwNumRowsFromTopU, 2);
3214     dwNumColsFromLeftU = MOS_ALIGN_FLOOR(dwNumColsFromLeftU, 2);
3215     dwNumRowsFromTopV = MOS_ALIGN_FLOOR(dwNumRowsFromTopV, 2);
3216     dwNumColsFromLeftV = MOS_ALIGN_FLOOR(dwNumColsFromLeftV, 2);
3217 
3218     *pVYOffset = (uint16_t)dwNumRowsFromTopV;
3219     *pUYOffset = (uint16_t)dwNumRowsFromTopU;
3220     *pVXOffset = (uint16_t)dwNumColsFromLeftV;
3221     *pUXOffset = (uint16_t)dwNumColsFromLeftU;
3222 }
3223 
3224 //!
3225 //! \brief    Set Slice Shutdown Mode
3226 //! \details  Sets Slice Shutdown Mode
3227 //! \param    PRENDERHAL_INTERFACE pRenderHal
3228 //!           [in] Pointer to RenderHal Interface Structure
3229 //! \param    bool bMode
3230 //!           [in] Slice Shutdown Mode
3231 //! \return   void
3232 //!
RenderHal_SetSliceShutdownMode(PRENDERHAL_INTERFACE pRenderHal,bool bMode)3233 void RenderHal_SetSliceShutdownMode(
3234     PRENDERHAL_INTERFACE     pRenderHal,
3235     bool                     bMode)
3236 {
3237     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal);
3238     pRenderHal->bRequestSingleSlice = bMode;
3239 }
3240 
3241 //!
3242 //! \brief    Set General Slice Shutdown Mode
3243 //! \details  Sets General Slice Shutdown Mode
3244 //! \param    PRENDERHAL_INTERFACE pRenderHal
3245 //!           [in] Pointer to RenderHal Interface Structure
3246 //! \param    PRENDERHAL_POWEROPTION pMode
3247 //!           [in] Slice Shutdown Mode
3248 //! \return   void
3249 //!
RenderHal_SetPowerOptionMode(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_POWEROPTION pMode)3250 void RenderHal_SetPowerOptionMode(
3251     PRENDERHAL_INTERFACE     pRenderHal,
3252     PRENDERHAL_POWEROPTION   pMode )
3253 {
3254     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal);
3255     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pMode);
3256     pRenderHal->PowerOption = *pMode;
3257 }
3258 
3259 //!
3260 //! \brief    Enable Middle Batch Buffer Preemption
3261 //! \details  Enable Middle Batch Buffer Preemption
3262 //! \param    PRENDERHAL_INTERFACE pRenderHal
3263 //!           [in] Pointer to Hardware Interface Structurev
3264 //! \return   void
3265 //!
RenderHal_EnableGpgpuMiddleBatchBufferPreemption(PRENDERHAL_INTERFACE pRenderHal)3266 void RenderHal_EnableGpgpuMiddleBatchBufferPreemption(
3267     PRENDERHAL_INTERFACE     pRenderHal)
3268 {
3269     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal);
3270     pRenderHal->bEnableGpgpuMidBatchPreEmption = MEDIA_IS_SKU(pRenderHal->pSkuTable, FtrGpGpuMidBatchPreempt) ? true : false;
3271 }
3272 
3273 //!
3274 //! \brief    Enable Middle Thread Preemption
3275 //! \details  Enable Middle Thread Preemption
3276 //! \param    PRENDERHAL_INTERFACE pRenderHal
3277 //!           [in] Pointer to Hardware Interface Structurev
3278 //! \return   void
3279 //!
RenderHal_EnableGpgpuMiddleThreadPreemption(PRENDERHAL_INTERFACE pRenderHal)3280 void RenderHal_EnableGpgpuMiddleThreadPreemption(
3281     PRENDERHAL_INTERFACE     pRenderHal)
3282 {
3283     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal);
3284     pRenderHal->bEnableGpgpuMidThreadPreEmption = MEDIA_IS_SKU(pRenderHal->pSkuTable, FtrGpGpuMidThreadLevelPreempt) ? true : false;
3285 }
3286 
3287 //!
3288 //! \brief    Get Surface State Entries
3289 //! \details  Gets the Surface State Entries
3290 //! \param    PRENDERHAL_INTERFACE pRenderHal
3291 //!           [in] Pointer to Hardware Interface structure
3292 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
3293 //!           [in] Pointer to Render Hal Surface
3294 //! \param    PRENDERHAL_SURFACE_STATE_PARAMS pParams
3295 //!           [in] Pointer to Surface State Params
3296 //! \param    int32_t *piNumEntries
3297 //!           [out] Number of Surface Entries (one entry per surface plane)
3298 //! \param    PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntries
3299 //!           [out] Array of Surface State Entries
3300 //! \return   MOS_STATUS
3301 //!
RenderHal_GetSurfaceStateEntries(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface,PRENDERHAL_SURFACE_STATE_PARAMS pParams,int32_t * piNumEntries,PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntries)3302 MOS_STATUS RenderHal_GetSurfaceStateEntries(
3303     PRENDERHAL_INTERFACE            pRenderHal,
3304     PRENDERHAL_SURFACE              pRenderHalSurface,
3305     PRENDERHAL_SURFACE_STATE_PARAMS pParams,
3306     int32_t                         *piNumEntries,
3307     PRENDERHAL_SURFACE_STATE_ENTRY  *ppSurfaceEntries)
3308 {
3309     MOS_STATUS                      eStatus;
3310     PCMHW_PLANE_SETTING             pPlane;
3311     PMOS_SURFACE                    pSurface;
3312     RENDERHAL_PLANE_DEFINITION      PlaneDefinition;
3313     PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntry;
3314     uint32_t                        dwSurfaceWidth;
3315     uint32_t                        dwSurfaceHeight;
3316     uint32_t                        dwUVPitch;
3317     int32_t                         i;
3318     bool                            bHalfPitchForChroma;
3319     bool                            bInterleaveChroma;
3320     bool                            bWidthInDword;
3321     uint8_t                         Direction;
3322     uint16_t                        wUXOffset;
3323     uint16_t                        wUYOffset;
3324     uint16_t                        wVXOffset;
3325     uint16_t                        wVYOffset;
3326     bool                            bIsChromaSitEnabled;
3327     bool                            bIsTri9YV12;
3328 
3329     //------------------------------------------------
3330     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
3331     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHalSurface);
3332     MHW_RENDERHAL_CHK_NULL_RETURN(pParams);
3333     MHW_RENDERHAL_CHK_NULL_RETURN(piNumEntries);
3334     MHW_RENDERHAL_CHK_NULL_RETURN(ppSurfaceEntries);
3335     //------------------------------------------------
3336 
3337     eStatus             = MOS_STATUS_UNKNOWN;
3338     pSurface            = &pRenderHalSurface->OsSurface;
3339     dwUVPitch           = pSurface->dwPitch;
3340     bHalfPitchForChroma = false;
3341     bInterleaveChroma   = false;
3342     Direction           = MEDIASTATE_VDIRECTION_FULL_FRAME;
3343     wUXOffset           = 0;
3344     wUYOffset           = 0;
3345     wVXOffset           = 0;
3346     wVYOffset           = 0;
3347     *piNumEntries       = -1;
3348     PlaneDefinition     = RENDERHAL_PLANES_DEFINITION_COUNT;
3349     bIsChromaSitEnabled = 0;
3350 
3351     // In trinity9, YV12 format will use 3 Planes
3352     bIsTri9YV12 = pSurface->Format == Format_YV12 &&
3353                   pRenderHal->pOsInterface != nullptr &&
3354                   pRenderHal->pOsInterface->trinityPath == TRINITY9_ENABLED;
3355 
3356     pRenderHal->bIsAVS  = pParams->bAVS;
3357 
3358     // Check palette allocations
3359     if (IS_PAL_FORMAT(pSurface->Format))
3360     {
3361         if (pRenderHalSurface->iPaletteID < 0 ||
3362             pRenderHalSurface->iPaletteID >= pRenderHal->iMaxPalettes)
3363         {
3364             MHW_RENDERHAL_ASSERTMESSAGE("Invalid palette.");
3365             return eStatus;
3366         }
3367     }
3368 
3369     // adjust the U/V-Pitch for formats that have U/V-Pitch smaller than Y-Pitch
3370     if (pSurface->Format == Format_I420 ||
3371         pSurface->Format == Format_IYUV ||
3372         pSurface->Format == Format_YV12 ||
3373         pSurface->Format == Format_NV11)
3374     {
3375         dwUVPitch >>= 1;
3376     }
3377     else if (pSurface->Format == Format_YVU9)
3378     {
3379         dwUVPitch >>= 2;
3380     }
3381 
3382     if (pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G8      ||
3383         pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G9      ||
3384         pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G10)
3385     {
3386         // Select the surface/plane description
3387         switch (pSurface->Format)
3388         {
3389             case Format_NV12:
3390                 // On G8, NV12 format needs the width and Height to be a multiple
3391                 // of 4 for both 3D sampler and 8x8 sampler; G75 needs the width
3392                 // of NV12 input surface to be a multiple of 4 for 3D sampler;
3393                 // G9+ does not has such restriction; to simplify the implementation,
3394                 // we enable 2 plane NV12 for all of the platform when the width
3395                 // or Height is not a multiple of 4
3396                 if (pRenderHal->pfnIs2PlaneNV12Needed(pRenderHal,
3397                                                       pRenderHalSurface,
3398                                                       pParams->Boundary))
3399                 {
3400                     PlaneDefinition = RENDERHAL_PLANES_NV12_2PLANES_ADV;
3401                 }
3402                 else
3403                 {
3404                     PlaneDefinition = RENDERHAL_PLANES_NV12_ADV;
3405                     wUYOffset       = RenderHal_CalculateYOffset(pRenderHal->pOsInterface, &pSurface->OsResource);
3406                 }
3407 
3408                 bHalfPitchForChroma = false;
3409                 bInterleaveChroma   = true;
3410 
3411                 // Set up chroma direction
3412                 Direction           = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3413                 break;
3414 
3415             case Format_P208:
3416                 PlaneDefinition = RENDERHAL_PLANES_P208_1PLANE_ADV;
3417                 break;
3418 
3419             case Format_IMC1:
3420             case Format_IMC2:
3421             case Format_IMC3:
3422             case Format_IMC4:
3423             case Format_I420:
3424             case Format_IYUV:
3425             case Format_YV12:
3426             case Format_YVU9:
3427                 PlaneDefinition     = RENDERHAL_PLANES_PL3_ADV;
3428                 bHalfPitchForChroma = false;
3429 
3430                 if (pSurface->Format == Format_I420 ||
3431                     pSurface->Format == Format_IYUV ||
3432                     pSurface->Format == Format_YV12 ||
3433                     pSurface->Format == Format_NV11)
3434                 {
3435                     bHalfPitchForChroma = true;
3436                 }
3437 
3438                 // Set up chroma direction
3439                 Direction = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3440 
3441                 if (!pParams->bAVS)
3442                 {
3443                     // Get U/V offset for PL3 DNDI
3444                     RenderHal_Get_DI_UVOffSet(pRenderHalSurface,
3445                                       &wUXOffset,
3446                                       &wUYOffset,
3447                                       &wVXOffset,
3448                                       &wVYOffset);
3449                     PlaneDefinition = RENDERHAL_PLANES_NV12_ADV;
3450                 }
3451                 break;
3452 
3453             case Format_400P:
3454                 // Single Y plane here is treated like a NV12 surface.
3455                 // U and V offsets fall inside this Y plane. Eventhough false UV pixels are
3456                 // picked by the kernel, CSC coeffecients are such that the effect of these
3457                 // are nullified.
3458                 PlaneDefinition     = RENDERHAL_PLANES_NV12_ADV;
3459                 break;
3460 
3461             case Format_411P:
3462                 PlaneDefinition     = RENDERHAL_PLANES_411P_ADV;
3463                 break;
3464 
3465             case Format_411R:
3466                 PlaneDefinition     = RENDERHAL_PLANES_411R_ADV;
3467                 break;
3468 
3469             case Format_422H:
3470                 PlaneDefinition     = RENDERHAL_PLANES_422H_ADV;
3471                 break;
3472 
3473             case Format_422V:
3474                 PlaneDefinition     = RENDERHAL_PLANES_422V_ADV;
3475                 break;
3476 
3477             case Format_444P:
3478                 PlaneDefinition     = RENDERHAL_PLANES_444P_ADV;
3479                 break;
3480 
3481             case Format_RGBP:
3482                 PlaneDefinition     = RENDERHAL_PLANES_RGBP_ADV;
3483                 break;
3484 
3485             case Format_BGRP:
3486                 PlaneDefinition     = RENDERHAL_PLANES_BGRP_ADV;
3487                 break;
3488 
3489             case Format_AYUV:
3490                 PlaneDefinition = RENDERHAL_PLANES_AYUV_ADV;
3491                 break;
3492 
3493             case Format_YUYV:
3494             case Format_YUY2:
3495                 if (pParams->bVmeUse)
3496                 {
3497                     //Since 422 planar is not supported on application side.
3498                     //App is using 422 packed as WA with w=w/2 and h=h*2
3499                     pSurface->dwWidth = pSurface->dwWidth * 2;
3500                     pSurface->dwHeight = pSurface->dwHeight / 2;
3501                     pRenderHalSurface->rcSrc.right = pSurface->dwWidth;
3502                     pRenderHalSurface->rcSrc.bottom = pSurface->dwHeight;
3503                     pRenderHalSurface->rcDst = pRenderHalSurface->rcSrc;
3504                     PlaneDefinition = RENDERHAL_PLANES_YUY2_ADV;
3505 
3506                     // Set up chroma direction
3507                     Direction = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3508                 }
3509                 else
3510                 {
3511                     PlaneDefinition = RENDERHAL_PLANES_YUY2_ADV;
3512 
3513                     // Set up chroma direction
3514                     Direction = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3515                 }
3516                 break;
3517 
3518             case Format_UYVY:
3519                 PlaneDefinition     = RENDERHAL_PLANES_UYVY_ADV;
3520 
3521                 // Set up chroma direction
3522                 Direction = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3523                 break;
3524 
3525             case Format_YVYU:
3526                 PlaneDefinition     = RENDERHAL_PLANES_YVYU_ADV;
3527 
3528                 // Set up chroma direction
3529                 Direction = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3530                 break;
3531 
3532             case Format_VYUY:
3533                 PlaneDefinition     = RENDERHAL_PLANES_VYUY_ADV;
3534 
3535                 // Set up chroma direction
3536                 Direction = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3537                 break;
3538 
3539             case Format_A8R8G8B8:
3540             case Format_X8R8G8B8:
3541                 if (pParams->bVASurface)
3542                 {
3543                     pSurface->dwWidth *= 32;
3544                     PlaneDefinition     = RENDERHAL_PLANES_Y1;
3545                 }
3546                 else
3547                 {
3548                     PlaneDefinition     = RENDERHAL_PLANES_ARGB_ADV;
3549                 }
3550                 break;
3551 
3552             case Format_R8G8SN:
3553                 if ( pParams->bVASurface )
3554                 {
3555                     PlaneDefinition = RENDERHAL_PLANES_Y16S;
3556                 }
3557                 break;
3558 
3559             case Format_V8U8:
3560                 if ( pParams->bVASurface )
3561                 {
3562                     PlaneDefinition = RENDERHAL_PLANES_Y16U;
3563                 }
3564                 break;
3565 
3566             case Format_A8B8G8R8:
3567             case Format_X8B8G8R8:
3568                 PlaneDefinition     = RENDERHAL_PLANES_ABGR_ADV;
3569                 break;
3570 
3571             case Format_STMM:
3572                 PlaneDefinition     = RENDERHAL_PLANES_STMM_ADV;
3573                 break;
3574 
3575             case Format_A8:
3576             case Format_Buffer_2D:
3577                 if (pParams->bVASurface)
3578                 {
3579                     PlaneDefinition = RENDERHAL_PLANES_Y8;
3580                 }
3581                 break;
3582             case Format_Y8:
3583                 PlaneDefinition = RENDERHAL_PLANES_Y8_ADV;
3584                 break;
3585 
3586             case Format_L8:
3587             case Format_R8UN:
3588                 if (pParams->bForceNV12)
3589                 {
3590                     PlaneDefinition     = RENDERHAL_PLANES_NV12_ADV;
3591                     bHalfPitchForChroma = false;
3592                     bInterleaveChroma   = true;
3593                     wUYOffset           = (uint16_t) pSurface->dwHeight;
3594                 }
3595                 else
3596                 {
3597                     PlaneDefinition     = RENDERHAL_PLANES_L8_ADV;
3598                 }
3599                 break;
3600 
3601             case Format_A16B16G16R16:
3602             case Format_Y416:
3603                 PlaneDefinition        = RENDERHAL_PLANES_A16B16G16R16_ADV;
3604                 break;
3605 
3606             case Format_R10G10B10A2:
3607             case Format_Y410:
3608                 PlaneDefinition        = RENDERHAL_PLANES_R10G10B10A2_ADV;
3609                 break;
3610 
3611             case Format_L16:
3612             case Format_R16S:
3613                 if (pParams->bVASurface)
3614                 {
3615                     PlaneDefinition = RENDERHAL_PLANES_Y16S;
3616                 }
3617                 break;
3618 
3619             case Format_D16:
3620             case Format_R16U:
3621                 if (pParams->bVASurface)
3622                 {
3623                     PlaneDefinition = RENDERHAL_PLANES_Y16U;
3624                 }
3625                 break;
3626 
3627             case Format_P010:
3628             case Format_P016:
3629                 if (pParams->bVmeUse)
3630                 {
3631                     PlaneDefinition = RENDERHAL_PLANES_P010_1PLANE_ADV;
3632                 }
3633                 else if (pRenderHal->bEnableP010SinglePass &&
3634                     (pRenderHalSurface->SurfType != RENDERHAL_SURF_OUT_RENDERTARGET))
3635                 {
3636                     PlaneDefinition     = RENDERHAL_PLANES_P010_1PLANE_ADV;
3637                     bHalfPitchForChroma = false;
3638                     bInterleaveChroma   = true;
3639                     wUYOffset           = RenderHal_CalculateYOffset(pRenderHal->pOsInterface, &pSurface->OsResource);
3640 
3641                     // Set up chroma direction
3642                     Direction = pRenderHal->pfnSetChromaDirection(pRenderHal, pRenderHalSurface);
3643                 }
3644                 else
3645                 {
3646                     // Format not supported with AVS - use regular format
3647                     MHW_RENDERHAL_NORMALMESSAGE("Format not supported with AVS.");
3648 
3649                     pParams->bAVS = false;
3650 
3651                     // Since the format is not supported with AVS, set the scaling mode as bilinear.
3652                     pRenderHalSurface->ScalingMode = RENDERHAL_SCALING_BILINEAR;
3653 
3654                     if (pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G8)
3655                     {
3656                         pParams->Type = RENDERHAL_SURFACE_TYPE_G8;
3657                     }
3658                     else if (pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G9)
3659                     {
3660                         pParams->Type = RENDERHAL_SURFACE_TYPE_G9;
3661                     }
3662                     else if (pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G10)
3663                     {
3664                         pParams->Type = RENDERHAL_SURFACE_TYPE_G10;
3665                     }
3666                     else
3667                     {
3668                         MHW_RENDERHAL_ASSERTMESSAGE("Unsupported surface type");
3669                     }
3670                 }
3671                 break;
3672             case Format_Y210:
3673             case Format_Y216:
3674                 if (pParams->bVmeUse)
3675                 {
3676                     //Since 422 planar is not supported on application side.
3677                     //App is using 422 packed as WA with w=w/2 and h=h*2
3678                     pSurface->dwWidth = pSurface->dwWidth * 2;
3679                     pSurface->dwHeight = pSurface->dwHeight / 2;
3680                     pRenderHalSurface->rcSrc.right = pSurface->dwWidth;
3681                     pRenderHalSurface->rcSrc.bottom = pSurface->dwHeight;
3682                     pRenderHalSurface->rcDst = pRenderHalSurface->rcSrc;
3683                     PlaneDefinition = RENDERHAL_PLANES_Y210_1PLANE_ADV;
3684                 }
3685                 else
3686                 {
3687                     PlaneDefinition = RENDERHAL_PLANES_Y210_ADV;
3688                 }
3689                 break;
3690             default:
3691                 // Format not supported with AVS - use regular format
3692                 MHW_RENDERHAL_NORMALMESSAGE("Format not supported with AVS.");
3693 
3694                 pParams->bAVS = false;
3695 
3696                 // Since the format is not supported with AVS, set the scaling mode as bilinear.
3697                 pRenderHalSurface->ScalingMode = RENDERHAL_SCALING_BILINEAR;
3698 
3699                 if (pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G8)
3700                 {
3701                     pParams->Type = RENDERHAL_SURFACE_TYPE_G8;
3702                 }
3703                 else if (pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G9)
3704                 {
3705                     pParams->Type = RENDERHAL_SURFACE_TYPE_G9;
3706                 }
3707                 else if (pParams->Type == RENDERHAL_SURFACE_TYPE_ADV_G10)
3708                 {
3709                     pParams->Type = RENDERHAL_SURFACE_TYPE_G10;
3710                 }
3711                 else
3712                 {
3713                     MHW_RENDERHAL_ASSERTMESSAGE("Unsupported surface type");
3714                 }
3715 
3716                 break;
3717         }
3718     }
3719 
3720     // Select the surface/plane description
3721     if (pParams->Type == RENDERHAL_SURFACE_TYPE_G8  ||
3722         pParams->Type == RENDERHAL_SURFACE_TYPE_G9  ||
3723         pParams->Type == RENDERHAL_SURFACE_TYPE_G10)
3724     {
3725         bIsChromaSitEnabled = pRenderHal->pRenderHalPltInterface->IsChromasitingEnabled(pRenderHal, pParams);
3726 
3727         switch (pSurface->Format)
3728         {
3729             case Format_IMC1:
3730             case Format_IMC2:
3731             case Format_IMC3:
3732             case Format_IMC4:
3733             case Format_I420:
3734             case Format_IYUV:
3735             case Format_YVU9:
3736                 PlaneDefinition = RENDERHAL_PLANES_PL3;
3737                 break;
3738 
3739             case Format_YV12:
3740                 bHalfPitchForChroma = true;
3741 
3742                 // Y_Uoffset(Height*2 + Height/2) of RENDERHAL_PLANES_YV12 define Bitfield_Range(0, 13) on gen9+.
3743                 // The max value is 16383. So use PL3 kernel to avoid out of range when Y_Uoffset is larger than 16383.
3744                 // Use PL3 plane to avoid YV12 blending issue with DI enabled and U channel shift issue with not 4-aligned height
3745                 PlaneDefinition = (pRenderHal->bEnableYV12SinglePass                              &&
3746                                    !pRenderHalSurface->pDeinterlaceParams                         &&
3747                                    !pRenderHalSurface->bInterlacedScaling                         &&
3748                                    !bIsTri9YV12                                                   &&
3749                                    MOS_IS_ALIGNED(pSurface->dwHeight, 4)                          &&
3750                                    pRenderHalSurface->SurfType != RENDERHAL_SURF_OUT_RENDERTARGET &&
3751                                    (pSurface->dwHeight * 2 + pSurface->dwHeight / 2) < RENDERHAL_MAX_YV12_PLANE_Y_U_OFFSET_G9)?
3752                                    RENDERHAL_PLANES_YV12 : RENDERHAL_PLANES_PL3;
3753                 break;
3754 
3755             case Format_400P:
3756                 // Single Y plane here is treated like a NV12 surface.
3757                 // U and V offsets fall inside this Y plane. Eventhough false UV pixels are
3758                 // picked by the kernel, CSC coeffecients are such that the effect of these
3759                 // are nullified.
3760                 PlaneDefinition = RENDERHAL_PLANES_NV12;
3761                 break;
3762 
3763             case Format_P208:
3764                 PlaneDefinition = RENDERHAL_PLANES_P208;
3765                 break;
3766 
3767             case Format_P010:
3768             case Format_P016:
3769                 if (pParams->bUseSinglePlane == true)
3770                 {
3771                     PlaneDefinition = RENDERHAL_PLANES_R16_UNORM;
3772                 }
3773                 else if (pRenderHal->bEnableP010SinglePass &&
3774                     (pRenderHalSurface->SurfType != RENDERHAL_SURF_OUT_RENDERTARGET))
3775                 {
3776                     PlaneDefinition = RENDERHAL_PLANES_P010_1PLANE;
3777                 }
3778                 else
3779                 {
3780                     PlaneDefinition = RENDERHAL_PLANES_P010;
3781                 }
3782                 break;
3783 
3784             case Format_411P:
3785                 PlaneDefinition = RENDERHAL_PLANES_411P;
3786                 break;
3787 
3788             case Format_411R:
3789                 PlaneDefinition = RENDERHAL_PLANES_411R;
3790                 break;
3791 
3792             case Format_422H:
3793                 PlaneDefinition = RENDERHAL_PLANES_422H;
3794                 break;
3795 
3796             case Format_422V:
3797                 PlaneDefinition = RENDERHAL_PLANES_422V;
3798                 break;
3799 
3800             case Format_444P:
3801                 PlaneDefinition = RENDERHAL_PLANES_444P;
3802                 break;
3803 
3804             case Format_RGBP:
3805                 PlaneDefinition = RENDERHAL_PLANES_RGBP;
3806                 break;
3807 
3808             case Format_BGRP:
3809                 PlaneDefinition = RENDERHAL_PLANES_BGRP;
3810                 break;
3811 
3812             case Format_NV12:
3813                 // On Gen7.5 (Haswell) NV12 format needs a single plane instead
3814                 // of two (listed in renderhal_g75.c for RENDERHAL_PLANES_NV12),  and
3815                 // is also expected by the Sampler or Media Kernels. Yet, the
3816                 // Data Port works with two planes instead. Besides, the Sampler
3817                 // uses it for input only (as there is no output) while the Data
3818                 // Port uses it for input as well as output or both for the same
3819                 // surface. Hence the check added for bWidthInDword_Y &&
3820                 // bWidthInDword_UV, which are set in vphal_render_3P.c for the
3821                 // above reason. Two plane NV12 can also be explicitly spcified.
3822 
3823                 // On G8, NV12 format needs the width and Height to be a multiple
3824                 // of 4 for both 3D sampler and 8x8 sampler; G75 needs the width
3825                 // of NV12 input surface to be a multiple of 4 for 3D sampler;
3826                 // On G9+, width need to be a multiple of 2, while height still need
3827                 // be a multiple of 4; since G9 already post PV, just keep the old logic
3828                 // to enable 2 plane NV12 when the width or Height is not a multiple of 4.
3829                 // For G10+, enable 2 plane NV12 when width is not multiple of 2 or height
3830                 // is not multiple of 4.
3831                 if (pParams->bUseSinglePlane == true)
3832                 {
3833                     PlaneDefinition = RENDERHAL_PLANES_R8;
3834                 }
3835                 else if (pRenderHalSurface->SurfType == RENDERHAL_SURF_OUT_RENDERTARGET ||
3836                     (pParams->bWidthInDword_Y && pParams->bWidthInDword_UV) ||
3837                     pParams->b2PlaneNV12NeededByKernel ||
3838                     bIsChromaSitEnabled ||
3839                     pRenderHal->pfnIs2PlaneNV12Needed(pRenderHal,
3840                         pRenderHalSurface,
3841                         pParams->Boundary))
3842                 {
3843                     PlaneDefinition = RENDERHAL_PLANES_NV12_2PLANES;
3844                 }
3845                 else
3846                 {
3847                     PlaneDefinition = RENDERHAL_PLANES_NV12;
3848                     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
3849                     pRenderHal->pRenderHalPltInterface->GetPlaneDefForFormatNV12(
3850                      PlaneDefinition);
3851                 }
3852                 break;
3853 
3854             case Format_YUYV    :
3855             case Format_YUY2    :
3856                 if (bIsChromaSitEnabled)
3857                 {
3858                     PlaneDefinition = RENDERHAL_PLANES_YUY2_2PLANES;
3859                 }
3860                 else
3861                 {
3862                     PlaneDefinition = RENDERHAL_PLANES_YUY2;
3863                 }
3864                 break;
3865 
3866             case Format_G8R8_G8B8:
3867             case Format_UYVY     :
3868                 PlaneDefinition = RENDERHAL_PLANES_UYVY;
3869                 break;
3870 
3871             case Format_YVYU:
3872                 PlaneDefinition = RENDERHAL_PLANES_YVYU;
3873                 break;
3874 
3875             case Format_VYUY:
3876                 PlaneDefinition = RENDERHAL_PLANES_VYUY;
3877                 break;
3878 
3879             case Format_A8R8G8B8:
3880                 PlaneDefinition = RENDERHAL_PLANES_ARGB;
3881                 break;
3882 
3883             case Format_R32U:
3884                 PlaneDefinition = RENDERHAL_PLANES_R32U;
3885                 break;
3886 
3887             case Format_R32S:
3888                 PlaneDefinition = RENDERHAL_PLANES_R32S;
3889                 break;
3890 
3891             case Format_R32F:
3892             case Format_D32F:
3893             case Format_R32:
3894                 PlaneDefinition = RENDERHAL_PLANES_R32F;
3895                 break;
3896 
3897             case Format_G32R32F:
3898                 PlaneDefinition = RENDERHAL_PLANES_G32R32F;
3899                 break;
3900 
3901             case Format_Y8:
3902                 PlaneDefinition = RENDERHAL_PLANES_R8;
3903                 break;
3904 
3905             case Format_Y1:
3906                 PlaneDefinition = RENDERHAL_PLANES_Y1;
3907                 break;
3908 
3909             case Format_Y16U:
3910                 PlaneDefinition = RENDERHAL_PLANES_Y16U;
3911                 break;
3912 
3913             case Format_Y16S:
3914                 PlaneDefinition = RENDERHAL_PLANES_Y16S;
3915                 break;
3916 
3917             case Format_R8G8SN:
3918             case Format_V8U8:
3919                 PlaneDefinition = RENDERHAL_PLANES_V8U8;
3920                 break;
3921 
3922             case Format_R16U:
3923                 PlaneDefinition = RENDERHAL_PLANES_R16U;
3924                 break;
3925 
3926             case Format_R16S:
3927                 PlaneDefinition = RENDERHAL_PLANES_R16S;
3928                 break;
3929 
3930             case Format_R8G8UN:
3931                 PlaneDefinition = RENDERHAL_PLANES_R8G8_UNORM;
3932                 break;
3933 
3934             case Format_X8R8G8B8:
3935                 // h/w doesn't support XRGB render target
3936                 PlaneDefinition =
3937                     (pParams->isOutput) ? RENDERHAL_PLANES_ARGB : RENDERHAL_PLANES_XRGB;
3938                 break;
3939 
3940             case Format_A8B8G8R8:
3941                 PlaneDefinition = RENDERHAL_PLANES_ABGR;
3942                 break;
3943 
3944             case Format_X8B8G8R8:
3945                 // h/w doesn't support XBGR render target
3946                 PlaneDefinition =
3947                     (pParams->isOutput) ? RENDERHAL_PLANES_ABGR : RENDERHAL_PLANES_XBGR;
3948                 break;
3949 
3950             case Format_R5G6B5:
3951                 PlaneDefinition = RENDERHAL_PLANES_RGB16;
3952                 break;
3953 
3954             case Format_R8G8B8:
3955                 PlaneDefinition = RENDERHAL_PLANES_RGB24;
3956                 break;
3957 
3958             case Format_AYUV    :
3959                 PlaneDefinition = RENDERHAL_PLANES_AYUV;
3960                 break;
3961 
3962             case Format_AI44    :
3963                 PlaneDefinition = (pRenderHalSurface->iPaletteID == 0) ?
3964                                                 RENDERHAL_PLANES_AI44_PALLETE_0 :
3965                                                 RENDERHAL_PLANES_AI44_PALLETE_1;
3966                 break;
3967 
3968             case Format_IA44:
3969                 PlaneDefinition = (pRenderHalSurface->iPaletteID == 0) ?
3970                                                 RENDERHAL_PLANES_IA44_PALLETE_0 :
3971                                                 RENDERHAL_PLANES_IA44_PALLETE_1;
3972                 break;
3973 
3974             case Format_P8:
3975                 PlaneDefinition = (pRenderHalSurface->iPaletteID == 0) ?
3976                                                 RENDERHAL_PLANES_P8_PALLETE_0 :
3977                                                 RENDERHAL_PLANES_P8_PALLETE_1;
3978                 break;
3979 
3980             case Format_A8P8:
3981                 PlaneDefinition = (pRenderHalSurface->iPaletteID == 0) ?
3982                                                 RENDERHAL_PLANES_A8P8_PALLETE_0 :
3983                                                 RENDERHAL_PLANES_A8P8_PALLETE_1;
3984                 break;
3985 
3986             case Format_STMM:
3987                 PlaneDefinition = RENDERHAL_PLANES_STMM;
3988                 break;
3989 
3990             case Format_L8:
3991                 PlaneDefinition = RENDERHAL_PLANES_L8;
3992                 break;
3993 
3994             case Format_A8:
3995             case Format_Buffer_2D:
3996                 PlaneDefinition = RENDERHAL_PLANES_A8;
3997                 break;
3998 
3999             case Format_R8U:
4000             case Format_R8UN:
4001                 PlaneDefinition = RENDERHAL_PLANES_R8;
4002                 break;
4003 
4004             case Format_R16UN:
4005             case Format_D16:
4006             case Format_R16:
4007                 PlaneDefinition = RENDERHAL_PLANES_R16_UNORM;
4008                 break;
4009 
4010             case Format_A16B16G16R16:
4011                 PlaneDefinition = RENDERHAL_PLANES_A16B16G16R16;
4012                 break;
4013             case Format_Y416:
4014                 if (pRenderHalSurface->SurfType == RENDERHAL_SURF_OUT_RENDERTARGET)
4015                 {
4016                     PlaneDefinition = RENDERHAL_PLANES_Y416_RT;
4017                 }
4018                 else
4019                 {
4020                     PlaneDefinition = RENDERHAL_PLANES_A16B16G16R16;
4021                 }
4022                 break;
4023             case Format_A16B16G16R16F:
4024                 PlaneDefinition = RENDERHAL_PLANES_A16B16G16R16F;
4025                 break;
4026             case Format_A16R16G16B16F:
4027                 PlaneDefinition = RENDERHAL_PLANES_A16R16G16B16F;
4028                 break;
4029             case Format_R32G32B32A32F:
4030                 PlaneDefinition = RENDERHAL_PLANES_R32G32B32A32F;
4031                 break;
4032 
4033             case Format_NV21:
4034                 PlaneDefinition = RENDERHAL_PLANES_NV21;
4035                 break;
4036             case Format_L16:
4037                 PlaneDefinition = RENDERHAL_PLANES_L16;
4038                 break;
4039 
4040             case Format_R10G10B10A2:
4041             case Format_Y410:
4042                 PlaneDefinition = RENDERHAL_PLANES_R10G10B10A2;
4043                 break;
4044 
4045             case Format_Y210:
4046             case Format_Y216:
4047                 MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->GetPlaneDefForFormatY216(
4048                     (pRenderHalSurface->SurfType == RENDERHAL_SURF_OUT_RENDERTARGET),
4049                     pRenderHal,
4050                     PlaneDefinition));
4051                 break;
4052 
4053             case Format_B10G10R10A2:
4054                 PlaneDefinition = RENDERHAL_PLANES_B10G10R10A2;
4055                 break;
4056 
4057             case Format_IRW0:
4058                 PlaneDefinition = RENDERHAL_PLANES_IRW0;
4059                 break;
4060 
4061             case Format_IRW1:
4062                 PlaneDefinition = RENDERHAL_PLANES_IRW1;
4063                 break;
4064 
4065             case Format_IRW2:
4066                 PlaneDefinition = RENDERHAL_PLANES_IRW2;
4067                 break;
4068 
4069             case Format_IRW3:
4070                 PlaneDefinition = RENDERHAL_PLANES_IRW3;
4071                 break;
4072 
4073             case Format_R16G16UN:
4074                 PlaneDefinition = RENDERHAL_PLANES_R16G16_UNORM;
4075                 break;
4076 
4077             case Format_R16G16S:
4078                 PlaneDefinition = RENDERHAL_PLANES_R16G16_SINT;
4079                 break;
4080 
4081             case Format_R16F:
4082                 PlaneDefinition = RENDERHAL_PLANES_R16_FLOAT;
4083                 break;
4084 
4085             case Format_R24G8:
4086             case Format_D24S8UN:
4087                 PlaneDefinition = RENDERHAL_PLANES_R24_UNORM_X8_TYPELESS;
4088                 break;
4089 
4090             case Format_R32G8X24:
4091             case Format_D32S8X24_FLOAT:
4092                 PlaneDefinition = RENDERHAL_PLANES_R32_FLOAT_X8X24_TYPELESS;
4093                 break;
4094 
4095             default:
4096                 return eStatus;
4097         }
4098     }
4099 
4100     if (pParams->forceCommonSurfaceMessage)
4101     {
4102         MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pfnGetPlaneDefinitionForCommonMessage);
4103         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnGetPlaneDefinitionForCommonMessage(pRenderHal, pSurface->Format, pParams, pRenderHalSurface->SurfType == RENDERHAL_SURF_OUT_RENDERTARGET, PlaneDefinition));
4104     }
4105 
4106     // Get plane definitions
4107     MHW_RENDERHAL_ASSERT(PlaneDefinition < RENDERHAL_PLANES_DEFINITION_COUNT);
4108     *piNumEntries   = pRenderHal->pPlaneDefinitions[PlaneDefinition].dwNumPlanes;
4109     pPlane          = pRenderHal->pPlaneDefinitions[PlaneDefinition].Plane;
4110     if (*piNumEntries == 0)
4111     {
4112         return eStatus;
4113     }
4114 
4115     // Surface state allocation/setting loop
4116     for (i = 0; i < *piNumEntries; i++, pPlane++)
4117     {
4118         // Assign a New Surface State Entry
4119         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnAssignSurfaceState(pRenderHal,
4120                                                    pParams->Type,
4121                                                    &pSurfaceEntry));
4122 
4123         // Save surface entry
4124         ppSurfaceEntries[i] = pSurfaceEntry;
4125 
4126         // Adjust the surface height and width
4127         pRenderHal->pfnAdjustBoundary(pRenderHal,
4128                                         pRenderHalSurface,
4129                                         pParams->Boundary,
4130                                         &dwSurfaceWidth,
4131                                         &dwSurfaceHeight);
4132 
4133         //set dwSurfaceHeight = roundup(dwSurfaceHeight / pPlane->ui8ScaleHeight) to support NV12 format with odd height
4134         dwSurfaceHeight = (dwSurfaceHeight + pPlane->ui8ScaleHeight - 1) / pPlane->ui8ScaleHeight;
4135         dwSurfaceWidth  = dwSurfaceWidth  / pPlane->ui8ScaleWidth;
4136 
4137         // U/V/UV plane
4138         if (pPlane->ui8PlaneID == MHW_U_PLANE ||
4139             pPlane->ui8PlaneID == MHW_V_PLANE)
4140         {
4141             bWidthInDword = pParams->bWidthInDword_UV;
4142         }
4143         else
4144         {
4145             bWidthInDword = pParams->bWidthInDword_Y;
4146         }
4147 
4148         // Adjust the width
4149         if (bWidthInDword)
4150         {
4151             if (pParams->forceCommonSurfaceMessage &&
4152                 (PlaneDefinition == RENDERHAL_PLANES_R8 ||
4153                  PlaneDefinition == RENDERHAL_PLANES_R16_UNORM))
4154             {
4155                 //For packed 422 formats, single channel format is used for writing, so the width need to be double.
4156                 dwSurfaceWidth = dwSurfaceWidth << 1;
4157             }
4158             else if (PlaneDefinition == RENDERHAL_PLANES_R32G32B32A32F)
4159             {
4160                 dwSurfaceWidth = dwSurfaceWidth << 2;
4161             }
4162             else if (PlaneDefinition == RENDERHAL_PLANES_A16B16G16R16     ||
4163                 PlaneDefinition == RENDERHAL_PLANES_A16B16G16R16_ADV      ||
4164                 PlaneDefinition == RENDERHAL_PLANES_A16B16G16R16F         ||
4165                 PlaneDefinition == RENDERHAL_PLANES_A16R16G16B16F         ||
4166                 PlaneDefinition == RENDERHAL_PLANES_G32R32F               ||
4167                 PlaneDefinition == RENDERHAL_PLANES_Y210_RT               ||
4168                 PlaneDefinition == RENDERHAL_PLANES_Y416_RT               ||
4169                 PlaneDefinition == RENDERHAL_PLANES_R32_FLOAT_X8X24_TYPELESS)
4170             {
4171                 dwSurfaceWidth = dwSurfaceWidth << 1;
4172             }
4173             else if (MEDIA_IS_SKU(pRenderHal->pSkuTable, FtrDisableRenderTargetWidthAdjust) &&
4174                      (PlaneDefinition == RENDERHAL_PLANES_NV12_2PLANES                    ||
4175                       PlaneDefinition == RENDERHAL_PLANES_P010                            ||
4176                       PlaneDefinition == RENDERHAL_PLANES_YUY2_2PLANES                    ||
4177                       PlaneDefinition == RENDERHAL_PLANES_YUY2                            ||
4178                       PlaneDefinition == RENDERHAL_PLANES_RGBP                            ||
4179                       PlaneDefinition == RENDERHAL_PLANES_PL3                             ||
4180                       PlaneDefinition == RENDERHAL_PLANES_YV12                            ||
4181                       PlaneDefinition == RENDERHAL_PLANES_R16_UNORM                       ||
4182                       PlaneDefinition == RENDERHAL_PLANES_R8                              ||
4183                       PlaneDefinition == RENDERHAL_PLANES_A8                              ||
4184                       PlaneDefinition == RENDERHAL_PLANES_RGB16                           ||
4185                       PlaneDefinition == RENDERHAL_PLANES_BGRP))
4186             {
4187                 dwSurfaceWidth = dwSurfaceWidth / OutputSurfaceWidthRatio;
4188             }
4189             else
4190             {
4191                 dwSurfaceWidth = (dwSurfaceWidth + pPlane->ui8PixelsPerDword - 1) /
4192                                                         pPlane->ui8PixelsPerDword;
4193             }
4194         }
4195 
4196         if (pParams->bVertStride)
4197         {
4198             dwSurfaceHeight /= 2;
4199             dwSurfaceHeight = MOS_MAX(dwSurfaceHeight, 1);
4200         }
4201 
4202         dwSurfaceHeight = MOS_ALIGN_FLOOR(dwSurfaceHeight, pPlane->ui8AlignHeight);
4203         dwSurfaceWidth  = MOS_ALIGN_FLOOR(dwSurfaceWidth , pPlane->ui8AlignWidth);
4204 
4205         // Setup surface state entry
4206         *(pSurfaceEntry->pSurface)   = *pSurface;
4207         pSurfaceEntry->dwFormat      = pPlane->dwFormat;
4208         pSurfaceEntry->dwWidth       = MOS_MAX(1, dwSurfaceWidth);
4209         pSurfaceEntry->dwHeight      = MOS_MAX(1, dwSurfaceHeight);
4210         pSurfaceEntry->bWidthInDword = bWidthInDword;
4211 
4212         if (pPlane->ui8PlaneID == MHW_U_PLANE || pPlane->ui8PlaneID == MHW_V_PLANE)
4213         {
4214             if (bIsTri9YV12)
4215             {
4216                 pSurfaceEntry->dwPitch = (pPlane->ui8PlaneID == MHW_U_PLANE) ? pSurface->dwUPitch : pSurface->dwVPitch;
4217             }
4218             else
4219             {
4220                 pSurfaceEntry->dwPitch = dwUVPitch;
4221             }
4222         }
4223         else
4224         {
4225             pSurfaceEntry->dwPitch = bIsTri9YV12 ? pSurface->dwYPitch : pSurface->dwPitch;
4226         }
4227 
4228         pSurfaceEntry->dwQPitch          = pSurface->dwQPitch;
4229 
4230         pSurfaceEntry->YUVPlane          = pPlane->ui8PlaneID;
4231         pSurfaceEntry->bAVS              = pPlane->bAdvanced;
4232         pSurfaceEntry->isOutput          = pParams->isOutput;
4233         pSurfaceEntry->bVertStride       = pParams->bVertStride;
4234         pSurfaceEntry->bVertStrideOffs   = pParams->bVertStrideOffs;
4235         pSurfaceEntry->bTiledSurface     = (pSurface->TileType != MOS_TILE_LINEAR)
4236                                                 ? true
4237                                                 : false;
4238         pSurfaceEntry->bTileWalk         = IS_Y_MAJOR_TILE_FORMAT(pSurface->TileType)
4239                                                 ? GFX3DSTATE_TILEWALK_YMAJOR
4240                                                 : GFX3DSTATE_TILEWALK_XMAJOR;
4241         // AVS/ADI parameters
4242         pSurfaceEntry->bHalfPitchChroma  = bHalfPitchForChroma;
4243         pSurfaceEntry->bInterleaveChroma = bInterleaveChroma;
4244         pSurfaceEntry->DirectionV        = Direction & 0x7;
4245         pSurfaceEntry->DirectionU        = Direction >> 0x3;
4246         pSurfaceEntry->wUXOffset         = wUXOffset;
4247         pSurfaceEntry->wUYOffset         = wUYOffset;
4248         pSurfaceEntry->wVXOffset         = wVXOffset;
4249         pSurfaceEntry->wVYOffset         = wVYOffset;
4250         pSurfaceEntry->AddressControl    = pParams->AddressControl;
4251     }
4252 
4253     eStatus = MOS_STATUS_SUCCESS;
4254 
4255     return eStatus;
4256 }
4257 
4258 //!
4259 //! \brief    Get Plane Definition For L0 FC
4260 //! \details  Get Specific Plane Definition for L0 FC usage
4261 //! \param    PRENDERHAL_INTERFACE pRenderHal
4262 //!           [in] Pointer to Hardware Interface Structure
4263 //! \param    MOS_FORMAT format
4264 //!           [in] surface format
4265 //! \param    bool isRenderTaget
4266 //!           [in] the surface type is RENDERHAL_SURF_OUT_RENDERTARGET
4267 //! \param    RENDERHAL_PLANE_DEFINITION &planeDefinition
4268 //!           [out] Plane Definition
4269 //! \return   MOS_STATUS
4270 //!           Error code if invalid parameters, MOS_STATUS_SUCCESS otherwise
4271 //!
RenderHal_GetPlaneDefinitionForCommonMessage(PRENDERHAL_INTERFACE pRenderHal,MOS_FORMAT format,PRENDERHAL_SURFACE_STATE_PARAMS & pParam,bool isRenderTarget,RENDERHAL_PLANE_DEFINITION & planeDefinition)4272 MOS_STATUS RenderHal_GetPlaneDefinitionForCommonMessage(
4273     PRENDERHAL_INTERFACE             pRenderHal,
4274     MOS_FORMAT                       format,
4275     PRENDERHAL_SURFACE_STATE_PARAMS &pParam,
4276     bool                             isRenderTarget,
4277     RENDERHAL_PLANE_DEFINITION      &planeDefinition)
4278 {
4279     switch (format)
4280     {
4281     case Format_A8R8G8B8:
4282     case Format_X8R8G8B8:
4283     case Format_A16R16G16B16:
4284     case Format_R10G10B10A2:
4285     case Format_AYUV:
4286     case Format_A16R16G16B16F:
4287     case Format_A8B8G8R8:
4288     case Format_X8B8G8R8:
4289     case Format_A16B16G16R16:
4290     case Format_B10G10R10A2:
4291     case Format_A16B16G16R16F:
4292     case Format_Y410:
4293     case Format_P210:
4294     case Format_P216:
4295     case Format_R5G6B5:
4296     case Format_R8G8B8:
4297     case Format_RGBP:
4298     case Format_BGRP:
4299     case Format_444P:
4300         //already handled rightly in normal non-adv GetPlaneDefinition
4301         break;
4302     case Format_NV12:
4303         if (pParam->combineChannelY)
4304         {
4305             planeDefinition = RENDERHAL_PLANES_NV12_2PLANES_COMBINED;
4306         }
4307         break;
4308     case Format_P010:
4309     case Format_P016:
4310         if (pParam->combineChannelY)
4311         {
4312             planeDefinition = RENDERHAL_PLANES_P016_2PLANES_COMBINED;
4313         }
4314         break;
4315     case Format_400P:
4316         planeDefinition = RENDERHAL_PLANES_R8;
4317         break;
4318     case Format_YUY2:
4319     case Format_YUYV:
4320     case Format_YVYU:
4321     case Format_UYVY:
4322     case Format_VYUY:
4323         if (isRenderTarget)
4324         {
4325             //For writing, packed 422 formats use R8 to write each channel separately
4326             planeDefinition = RENDERHAL_PLANES_R8;
4327         }
4328         else
4329         {
4330             //For reading, packed 422 formats use R8G8 for Y and A8R8G8B8 for UV
4331             planeDefinition = RENDERHAL_PLANES_YUY2_2PLANES_WIDTH_UNALIGNED;
4332         }
4333         break;
4334     case Format_Y210:
4335     case Format_Y216:
4336         if (isRenderTarget)
4337         {
4338             //For writing, packed 422 formats use R16 to write each channel separately
4339             planeDefinition = RENDERHAL_PLANES_R16_UNORM;
4340         }
4341         else
4342         {
4343             //For reading, packed 422 formats use RG16 for Y and ARGB16 for UV
4344             planeDefinition = RENDERHAL_PLANES_Y210;
4345         }
4346         break;
4347     case Format_Y416:
4348         planeDefinition = RENDERHAL_PLANES_A16B16G16R16;
4349         break;
4350     default:
4351         return MOS_STATUS_INVALID_PARAMETER;
4352     }
4353 
4354     return MOS_STATUS_SUCCESS;
4355 }
4356 
4357 //!
4358 //! \brief    Enable Palette
4359 //! \details  Enable HW palette - reuse previous palette data
4360 //! \param    PRENDERHAL_INTERFACE pRenderHal
4361 //!           [in] Pointer to Hardware Interface Structure
4362 //! \param    uint32_t uiPaletteID
4363 //!           [in] Palette ID (0 to available palettes - 1)
4364 //! \param    int32_t iPaletteSize
4365 //!           [in] Palette Size (<=0 - disable palette)
4366 //! \return   MOS_STATUS
4367 //!           Error code if invalid parameters, MOS_STATUS_SUCCESS otherwise
4368 //!
RenderHal_EnablePalette(PRENDERHAL_INTERFACE pRenderHal,int32_t iPaletteID,int32_t iPaletteSize)4369 MOS_STATUS RenderHal_EnablePalette(
4370     PRENDERHAL_INTERFACE    pRenderHal,
4371     int32_t                 iPaletteID,
4372     int32_t                 iPaletteSize)
4373 {
4374     PMHW_PALETTE_PARAMS      pPalette;
4375 
4376     //-------------------------------------
4377     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4378     MHW_RENDERHAL_ASSERT(iPaletteID >= 0);
4379     MHW_RENDERHAL_ASSERT(iPaletteID < pRenderHal->iMaxPalettes);
4380     //-------------------------------------
4381 
4382     // Palette ID provided invalid or allocation failed
4383     //pHwCommands = pRenderHal->pHwCommands;
4384 
4385     // Set palette size - 0 disables palette send command
4386     iPaletteSize = MOS_MAX(iPaletteSize, 0);
4387     iPaletteSize = MOS_MIN(iPaletteSize, pRenderHal->iMaxPaletteEntries);
4388     pPalette = &(pRenderHal->Palette[iPaletteID]);
4389     pPalette->iNumEntries = iPaletteSize;
4390 
4391     return MOS_STATUS_SUCCESS;
4392 }
4393 
4394 //!
4395 //! \brief    Allocate Palette ID
4396 //! \details  Allocate palette ID for Client
4397 //! \param    PRENDERHAL_INTERFACE pRenderHal
4398 //!           [in] Pointer to RenderHal Interface structure
4399 //! \param    int32_t *pPaletteID
4400 //!           [out] Pointer to Palette ID
4401 //! \return   MOS_STATUS
4402 //!           MOS_STATUS_SUCCESS, otherwise MOS_STATUS_NO_SPACE or MOS_STATUS_NULL_POINTER
4403 //!
RenderHal_AllocatePaletteID(PRENDERHAL_INTERFACE pRenderHal,int32_t * pPaletteID)4404 MOS_STATUS RenderHal_AllocatePaletteID(
4405                             PRENDERHAL_INTERFACE    pRenderHal,
4406                             int32_t                 *pPaletteID)
4407 {
4408     int32_t                 i;
4409     PMHW_PALETTE_PARAMS     pOutPalette;
4410     MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
4411 
4412     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4413     MHW_RENDERHAL_CHK_NULL_RETURN(pPaletteID);
4414 
4415     *pPaletteID = -1;
4416 
4417     pOutPalette = pRenderHal->Palette;
4418     // search first palette not in use
4419     for (i = 0;
4420          i < pRenderHal->iMaxPalettes;
4421          i++, pOutPalette++)
4422     {
4423         if (pOutPalette->iNumEntries == 0)
4424         {
4425             pOutPalette->iNumEntries = -1;
4426             break;
4427         }
4428     }
4429 
4430     // Allocation failed
4431     if (i < 0 || i >= pRenderHal->iMaxPalettes)
4432     {
4433         MHW_RENDERHAL_ASSERTMESSAGE("cannot find valid palette ID.");
4434         eStatus = MOS_STATUS_NO_SPACE;
4435         return eStatus;
4436     }
4437     else
4438     {
4439         *pPaletteID = i;
4440     }
4441 
4442     return eStatus;
4443 }
4444 
4445 //!
4446 //! \brief    Get Palette Entry Size and Address
4447 //! \details  Get Palette Entry Size and Address for Client to load palette
4448 //! \param    PRENDERHAL_INTERFACE pRenderHal
4449 //!           [in] Pointer to RenderHal Interface structure
4450 //! \param    int32_t iPaletteID
4451 //!           [in] Input Palette ID
4452 //! \param    int32_t iInNumEntries
4453 //!           [in] Number of Input Palette entries
4454 //! \param    int32_t *piOutNumEntries
4455 //!           [out] Number of Output Palette entries
4456 //! \param    void  **pPaletteData
4457 //!           [out] Pointer to Output Palette data address
4458 //! \return   MOS_STATUS
4459 //!           MOS_STATUS_SUCCESS, otherwise MOS_STATUS_INVALID_PARAMETER or MOS_STATUS_NULL_POINTER
4460 //!
RenderHal_GetPaletteEntry(PRENDERHAL_INTERFACE pRenderHal,int32_t iPaletteID,int32_t iInNumEntries,int32_t * piOutNumEntries,void ** pPaletteData)4461 MOS_STATUS RenderHal_GetPaletteEntry(
4462     PRENDERHAL_INTERFACE    pRenderHal,
4463     int32_t                 iPaletteID,
4464     int32_t                 iInNumEntries,
4465     int32_t                 *piOutNumEntries,
4466     void                    **pPaletteData)
4467 {
4468     PMHW_PALETTE_PARAMS     pOutPalette;
4469     int32_t                 iSize;
4470     MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
4471 
4472     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4473     MHW_RENDERHAL_CHK_NULL_RETURN(piOutNumEntries);
4474     MHW_RENDERHAL_CHK_NULL_RETURN(pPaletteData);
4475 
4476     *piOutNumEntries    = -1;
4477     *pPaletteData       = nullptr;
4478     // Palette Index provided invalid
4479     if (iPaletteID < 0 || iPaletteID >= pRenderHal->iMaxPalettes)
4480     {
4481         MHW_RENDERHAL_ASSERTMESSAGE("invalid palette ID.");
4482         eStatus = MOS_STATUS_INVALID_PARAMETER;
4483         return eStatus;
4484     }
4485 
4486     // Input Palette entry number invalid
4487     if (iInNumEntries < 1)
4488     {
4489         MHW_RENDERHAL_ASSERTMESSAGE("invalid Input Palette entries.");
4490         eStatus = MOS_STATUS_INVALID_PARAMETER;
4491         return eStatus;
4492     }
4493 
4494     // Get pointer to output palette
4495     pOutPalette = &(pRenderHal->Palette[iPaletteID]);
4496 
4497     // Pallete is too large - truncate
4498     if (iInNumEntries > pRenderHal->iMaxPaletteEntries)
4499     {
4500         iSize = pRenderHal->iMaxPaletteEntries;
4501         MHW_RENDERHAL_ASSERTMESSAGE("Palette truncated from %d to %d.", iInNumEntries, iSize);
4502     }
4503     else
4504     {
4505         iSize = iInNumEntries;
4506     }
4507     // Pallete is being overwritten - just log
4508     if (pOutPalette->iNumEntries != 0 &&
4509         pOutPalette->iNumEntries != -1)
4510     {
4511         MHW_RENDERHAL_ASSERTMESSAGE("overwriting palette %d.", iPaletteID);
4512     }
4513 
4514     pOutPalette->iNumEntries    = iSize;
4515     *piOutNumEntries            = iSize;
4516     *pPaletteData               = pOutPalette->pPaletteData;
4517 
4518     return eStatus;
4519 }
4520 //!
4521 //! \brief    Free Palette ID
4522 //! \details  Free palette ID
4523 //! \param    PRENDERHAL_INTERFACE pRenderHal
4524 //!           [in] Pointer to RenderHal Interface structure
4525 //! \param    int32_t *pPaletteID
4526 //!           [in/out] Pointer to Palette ID
4527 //! \return   MOS_STATUS
4528 //!           MOS_STATUS_SUCCESS, otherwise MOS_STATUS_INVALID_PARAMETER or MOS_STATUS_NULL_POINTER
4529 //!
RenderHal_FreePaletteID(PRENDERHAL_INTERFACE pRenderHal,int32_t * pPaletteID)4530 MOS_STATUS RenderHal_FreePaletteID(
4531                             PRENDERHAL_INTERFACE    pRenderHal,
4532                             int32_t                 *pPaletteID)
4533 {
4534     PMHW_PALETTE_PARAMS     pOutPalette;
4535     int32_t                 iPaletteID;
4536     MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
4537 
4538     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4539     MHW_RENDERHAL_CHK_NULL_RETURN(pPaletteID);
4540 
4541     iPaletteID      = *pPaletteID;
4542     if (iPaletteID < 0 || iPaletteID >= pRenderHal->iMaxPalettes)
4543     {
4544         MHW_RENDERHAL_ASSERTMESSAGE("invalid palette ID.");
4545         eStatus = MOS_STATUS_INVALID_PARAMETER;
4546         return eStatus;
4547     }
4548 
4549     pOutPalette                 = &(pRenderHal->Palette[iPaletteID]);
4550     pOutPalette->iNumEntries    = 0;
4551     *pPaletteID                 = -1;
4552 
4553     return eStatus;
4554 }
4555 
4556 //!
4557 //! \brief    Allocate ChromaKey
4558 //! \details  Allocate chroma key for use with sampler
4559 //! \param    PRENDERHAL_INTERFACE pRenderHal
4560 //!           [in] Pointer to Hardware Interface Structure
4561 //! \param    uint32_t dwLow
4562 //!           Min Key Range
4563 //! \param    uint32_t dwHigh
4564 //!           Max Key Range
4565 //! \return   int32_t
4566 //!           Chroma key index
4567 //!           -1 if not available
4568 //!
RenderHal_AllocateChromaKey(PRENDERHAL_INTERFACE pRenderHal,uint32_t dwLow,uint32_t dwHigh)4569 int32_t RenderHal_AllocateChromaKey(
4570     PRENDERHAL_INTERFACE     pRenderHal,
4571     uint32_t                 dwLow,
4572     uint32_t                 dwHigh)
4573 {
4574     PMHW_CHROMAKEY_PARAMS    pChromaKey;
4575     int32_t                  iChromaKeyIndex = -1;
4576 
4577     // Validate parameters
4578     if (pRenderHal == nullptr)
4579     {
4580         MHW_RENDERHAL_ASSERTMESSAGE("Invalid RenderHal interface.");
4581         return iChromaKeyIndex;
4582     }
4583 
4584     if (pRenderHal->iChromaKeyCount > pRenderHal->iMaxChromaKeys)
4585     {
4586         MHW_RENDERHAL_ASSERTMESSAGE("Reached max number of chroma keys.");
4587         return iChromaKeyIndex;
4588     }
4589 
4590     // Get chroma index - setup command
4591     iChromaKeyIndex = pRenderHal->iChromaKeyCount++;
4592     pChromaKey = &pRenderHal->ChromaKey[iChromaKeyIndex];
4593     pChromaKey->dwLow  = dwLow;
4594     pChromaKey->dwHigh = dwHigh;
4595 
4596     // Return Chroma Key Index
4597     return iChromaKeyIndex;
4598 }
4599 
4600 //!
4601 //! \brief    Assign Media State
4602 //! \details  Gets a pointer to the next available media state in GSH;
4603 //!           fails if not available
4604 //! \param    PRENDERHAL_INTERFACE pRenderHal
4605 //!           [in] Pointer to Hadrware Interface Structure
4606 //! \param    RENDERHAL_COMPONENT componentID
4607 //!           [in] Identifier of the requesting component
4608 //! \return   PRENDERHAL_MEDIA_STATE
4609 //!           gets a new Media State, returns pointer to Media State structure
4610 //!           nullptr - invalid, no states available + timeout
4611 //!
RenderHal_AssignMediaState(PRENDERHAL_INTERFACE pRenderHal,RENDERHAL_COMPONENT componentID)4612 PRENDERHAL_MEDIA_STATE RenderHal_AssignMediaState(
4613     PRENDERHAL_INTERFACE     pRenderHal,
4614     RENDERHAL_COMPONENT      componentID)
4615 {
4616     uint32_t                dwWaitMs, dwWaitTag;
4617     PMOS_INTERFACE          pOsInterface = nullptr;   // OS interface
4618     PRENDERHAL_STATE_HEAP   pStateHeap   = nullptr;   // State Heap control struct
4619     PRENDERHAL_MEDIA_STATE  pCurMediaState;        // Media state control in GSH struct
4620     uint8_t                 *pCurrentPtr;
4621     int                     i;
4622     size_t                  mediaStateSize = 0;
4623     uint8_t                 *ptrMediaState = nullptr;
4624 
4625     pCurMediaState = nullptr;
4626     pCurrentPtr    = nullptr;
4627 
4628     if (pRenderHal)
4629     {
4630         pOsInterface = pRenderHal->pOsInterface;
4631         pStateHeap   = pRenderHal->pStateHeap;
4632     }
4633 
4634     // Validate state
4635     if (pRenderHal   == nullptr ||             // invalid Hw state
4636         pOsInterface == nullptr ||             // invalid OS interface
4637         pStateHeap   == nullptr ||             // invalid State Heap
4638         pStateHeap->pMediaStates == nullptr || // invalid Media State Array
4639         pStateHeap->bGshLocked == false ||  // State Heap not locked
4640         pRenderHal->pRenderHalPltInterface == nullptr || // invalid RenderHal Platform Interface
4641         pRenderHal->StateHeapSettings.iMediaStateHeaps == 0)
4642     {
4643         MHW_RENDERHAL_ASSERTMESSAGE("Invalid state.");
4644         return pCurMediaState;
4645     }
4646     mediaStateSize  = pRenderHal->pRenderHalPltInterface->GetRenderHalMediaStateSize();
4647     // Refresh sync tag for all media states
4648     pRenderHal->pfnRefreshSync(pRenderHal);
4649 
4650     // Get next media state and tag to check
4651     ptrMediaState  = (uint8_t*)pStateHeap->pMediaStates;
4652     ptrMediaState += pStateHeap->iNextMediaState * mediaStateSize;
4653     pCurMediaState = (PRENDERHAL_MEDIA_STATE)ptrMediaState;
4654 
4655     // The code below is unlikely to be executed - unless all media states are in use
4656     // If this ever happens, please consider increasing the number of media states
4657     if (pCurMediaState->bBusy)
4658     {
4659         dwWaitTag   = pCurMediaState->dwSyncTag;
4660 
4661         // Wait for Batch Buffer complete event OR timeout
4662         for (dwWaitMs = pRenderHal->dwTimeoutMs; dwWaitMs > 0; dwWaitMs--)
4663         {
4664             //MOS_GPU_CONTEXT_RENDER or MOS_GPU_CONTEXT_RENDER3
4665             pOsInterface->pfnWaitForBBCompleteNotifyEvent(pOsInterface, pOsInterface->CurrentGpuContextOrdinal, RENDERHAL_EVENT_TIMEOUT_MS);
4666 
4667             // Wait for tag (end of command buffer, start of next command buffer)
4668             if ((int32_t)(pStateHeap->pSync[0] - dwWaitTag) >  0) break;
4669         }
4670 
4671         // Timeout
4672         if (dwWaitMs == 0)
4673         {
4674             MHW_RENDERHAL_ASSERTMESSAGE("Timeout for waiting free media state.");
4675             pStateHeap->pCurMediaState = pCurMediaState = nullptr;
4676             return pCurMediaState;
4677         }
4678     }
4679 
4680     // Setup the Current Media State
4681     pStateHeap->pCurMediaState    = pCurMediaState;
4682     pStateHeap->iCurMediaState    = pStateHeap->iNextMediaState;
4683 
4684     // Point to the next media state
4685     pStateHeap->iNextMediaState   = (pStateHeap->iNextMediaState + 1) %
4686                               (pRenderHal->StateHeapSettings.iMediaStateHeaps);
4687 
4688     // Reset media state
4689     pCurMediaState->dwSyncTag    = pStateHeap->dwNextTag;
4690     pCurMediaState->dwSyncCount  = 0;
4691     pCurMediaState->iCurbeOffset = 0;
4692     MOS_FillMemory( pCurMediaState->piAllocation,
4693                 pRenderHal->StateHeapSettings.iMediaIDs * sizeof(int32_t),
4694                 -1);
4695 
4696     // Reset HW allocations
4697     pRenderHal->iChromaKeyCount = 0;
4698     for (i = 0; i < pRenderHal->iMaxPalettes; i++)
4699     {
4700         pRenderHal->Palette[i].iNumEntries = 0;
4701     }
4702 
4703     // Zero Memory start time and end time
4704     pCurrentPtr = pStateHeap->pGshBuffer +           // GSH base
4705                   pStateHeap->pCurMediaState->dwOffset +
4706                   pStateHeap->dwOffsetStartTime;
4707 
4708     if(pCurrentPtr)
4709     {
4710         // Start time
4711         *((uint64_t*)pCurrentPtr) = 0;
4712     }
4713 
4714     // End time
4715     pCurrentPtr += pStateHeap->dwStartTimeSize;
4716     *((uint64_t*)pCurrentPtr) = 0;
4717 
4718     // Component ID
4719     pCurrentPtr += pStateHeap->dwEndTimeSize;
4720     *((RENDERHAL_COMPONENT *)pCurrentPtr) = componentID;
4721 
4722     return pCurMediaState;
4723 }
4724 
4725 //!
4726 //! \brief    Destroy
4727 //! \details  Free all resources allocated by RenderHal
4728 //! \param    PRENDERHAL_INTERFACE pRenderHal
4729 //! \return   void
4730 //!
RenderHal_Destroy(PRENDERHAL_INTERFACE pRenderHal)4731 MOS_STATUS RenderHal_Destroy(PRENDERHAL_INTERFACE pRenderHal)
4732 {
4733     MOS_STATUS            eStatus;
4734 
4735     //------------------------------------------------
4736     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4737     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
4738     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
4739     //------------------------------------------------
4740     eStatus      = MOS_STATUS_UNKNOWN;
4741 
4742     // Free State Heaps
4743     eStatus = (MOS_STATUS)(pRenderHal->pfnFreeStateHeaps(pRenderHal));
4744     if (eStatus != MOS_STATUS_SUCCESS)
4745     {
4746         MHW_RENDERHAL_ASSERTMESSAGE("Failed to free state heeps, eStatus:%d.\n", eStatus);
4747     }
4748 
4749     // Destroy MHW Render Interface
4750     pRenderHal->pRenderHalPltInterface->DestoryMhwInterface(pRenderHal);
4751 
4752     // Release pBatchBufferMemPool
4753     if (pRenderHal->pBatchBufferMemPool)
4754     {
4755         MOS_Delete(pRenderHal->pBatchBufferMemPool);
4756         pRenderHal->pBatchBufferMemPool = nullptr;
4757     }
4758 
4759     // Release PredicationBuffer
4760     if (!Mos_ResourceIsNull(&pRenderHal->PredicationBuffer))
4761     {
4762         pRenderHal->pOsInterface->pfnFreeResource(
4763             pRenderHal->pOsInterface,
4764             &pRenderHal->PredicationBuffer);
4765     }
4766 
4767     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->DestroyPerfProfiler(pRenderHal));
4768 
4769     // Destruct Platform Interface
4770     if (pRenderHal->pRenderHalPltInterface)
4771     {
4772         MOS_Delete(pRenderHal->pRenderHalPltInterface);
4773         pRenderHal->pRenderHalPltInterface = nullptr;
4774     }
4775 
4776     // Free multiple trackers
4777     pRenderHal->trackerProducer.~FrameTrackerProducer();
4778 
4779     // Free Debug Surface
4780     RenderHal_FreeDebugSurface(pRenderHal);
4781 
4782     // Decrease reference count for shared pointer
4783     pRenderHal->userSettingPtr = nullptr;
4784 
4785     eStatus = MOS_STATUS_SUCCESS;
4786 
4787     return eStatus;
4788 }
4789 
4790 //!
4791 //! \brief    Load Curbe Data
4792 //! \details  Allocates and load CURBE data for Media
4793 //! \param    PRENDERHAL_INTERFACE pRenderHal
4794 //!           [in]  Pointer to RenderHal Interface structure
4795 //! \param    PRENDERHAL_MEDIA_STATE pCurMediaState
4796 //!           [out] Pointer to Current Media State structure
4797 //! \param    void  *pData
4798 //!           [in]  Pointer to Data
4799 //! \param    int32_t iSize
4800 //!           [in]  Number of bytes to allocate
4801 //! \return   int32_t
4802 //!           Offset of the CURBE block from CURBE base (in bytes)
4803 //!           -1 if no CURBE space available in GSH
4804 //!
RenderHal_LoadCurbeData(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_MEDIA_STATE pCurMediaState,void * pData,int32_t iSize)4805 int32_t RenderHal_LoadCurbeData(
4806     PRENDERHAL_INTERFACE pRenderHal,
4807     PRENDERHAL_MEDIA_STATE  pCurMediaState,
4808     void                *pData,
4809     int32_t             iSize)
4810 {
4811     int32_t               iOffset;
4812     int32_t               iCurbeSize;
4813     uint8_t               *pPtrCurbe;
4814     PRENDERHAL_STATE_HEAP pStateHeap;
4815 
4816     iOffset    = -1;
4817     pStateHeap = (pRenderHal) ? pRenderHal->pStateHeap : nullptr;
4818     if (pStateHeap && pCurMediaState)
4819     {
4820         iCurbeSize = MOS_ALIGN_CEIL(iSize, pRenderHal->dwCurbeBlockAlign);
4821         if (pCurMediaState->iCurbeOffset + iCurbeSize <= (int)pStateHeap->dwSizeCurbe)
4822         {
4823             iOffset = pCurMediaState->iCurbeOffset;
4824             pCurMediaState->iCurbeOffset += iCurbeSize;
4825 
4826             if (pData)
4827             {
4828                 pPtrCurbe = pStateHeap->pGshBuffer +                // GSH base
4829                             pStateHeap->pCurMediaState->dwOffset +  // Offset to media state
4830                             pStateHeap->dwOffsetCurbe +             // Offset to curbe area
4831                             iOffset;                                // Current curbe offset
4832 
4833                 // Copy data to CURBE
4834                 MOS_SecureMemcpy(pPtrCurbe, iSize, pData, iSize);
4835 
4836                 // Zero remaining CURBE (for buffer alignment)
4837                 iCurbeSize -= iSize;
4838                 if (iCurbeSize > 0)
4839                 {
4840                     MOS_ZeroMemory(pPtrCurbe + iSize, iCurbeSize);
4841                 }
4842             }
4843         }
4844     }
4845 
4846     return iOffset;
4847 }
4848 
4849 //!
4850 //! \brief    Send Curbe Load
4851 //! \details  Send Curbe Load command
4852 //! \param    PRENDERHAL_INTERFACE pRenderHal
4853 //!           [in] Pointer to Hardware Interface Structure
4854 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
4855 //!           [in] Pointer to Command Buffer
4856 //! \return   MOS_STATUS
4857 //!
RenderHal_SendCurbeLoad(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)4858 MOS_STATUS RenderHal_SendCurbeLoad(
4859     PRENDERHAL_INTERFACE    pRenderHal,
4860     PMOS_COMMAND_BUFFER     pCmdBuffer)
4861 {
4862     MHW_CURBE_LOAD_PARAMS CurbeLoadParams;
4863     PRENDERHAL_STATE_HEAP pStateHeap;
4864     MOS_STATUS            eStatus = MOS_STATUS_SUCCESS;
4865     PMOS_INTERFACE        pOsInterface = nullptr;
4866     MOS_CONTEXT           *pOsContext = nullptr;
4867     MOS_OCA_BUFFER_HANDLE hOcaBuf = 0;
4868 
4869     //-----------------------------------------
4870     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4871     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
4872     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
4873     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->pCurMediaState);
4874     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
4875     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface->pOsContext);
4876     //-----------------------------------------
4877 
4878     eStatus                 = MOS_STATUS_SUCCESS;
4879     pStateHeap              = pRenderHal->pStateHeap;
4880     pOsInterface            = pRenderHal->pOsInterface;
4881     pOsContext              = pOsInterface->pOsContext;
4882 
4883     // CURBE size is in bytes
4884     if (pStateHeap->pCurMediaState->iCurbeOffset != 0)
4885     {
4886         CurbeLoadParams.pKernelState            = nullptr;
4887         CurbeLoadParams.bOldInterface           = false;
4888         CurbeLoadParams.dwCURBETotalDataLength  = pStateHeap->pCurMediaState->iCurbeOffset;
4889         CurbeLoadParams.dwCURBEDataStartAddress = pStateHeap->pCurMediaState->dwOffset + pStateHeap->dwOffsetCurbe;
4890 
4891         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMediaCurbeLoadCmd(pRenderHal, pCmdBuffer, &CurbeLoadParams));
4892 
4893         HalOcaInterfaceNext::OnIndirectState(*pCmdBuffer, (MOS_CONTEXT_HANDLE)pOsContext, pRenderHal->StateBaseAddressParams.presDynamicState,
4894             CurbeLoadParams.dwCURBEDataStartAddress, false, CurbeLoadParams.dwCURBETotalDataLength);
4895     }
4896 
4897     return eStatus;
4898 }
4899 
RenderHal_SendMediaIdLoad(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)4900 MOS_STATUS RenderHal_SendMediaIdLoad(
4901     PRENDERHAL_INTERFACE        pRenderHal,
4902     PMOS_COMMAND_BUFFER         pCmdBuffer)
4903 {
4904     MHW_ID_LOAD_PARAMS    IdLoadParams;
4905     PRENDERHAL_STATE_HEAP pStateHeap;
4906     MOS_STATUS            eStatus = MOS_STATUS_SUCCESS;
4907     PMOS_INTERFACE        pOsInterface = nullptr;
4908     MOS_CONTEXT           *pOsContext = nullptr;
4909     MOS_OCA_BUFFER_HANDLE hOcaBuf = 0;
4910 
4911     //-----------------------------------------
4912     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4913     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
4914     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
4915     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->pCurMediaState);
4916     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
4917     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface->pOsContext);
4918     //-----------------------------------------
4919 
4920     eStatus                 = MOS_STATUS_SUCCESS;
4921     pStateHeap              = pRenderHal->pStateHeap;
4922     pOsInterface            = pRenderHal->pOsInterface;
4923     pOsContext              = pOsInterface->pOsContext;
4924 
4925     IdLoadParams.pKernelState                     = nullptr;
4926     IdLoadParams.dwInterfaceDescriptorStartOffset = pStateHeap->pCurMediaState->dwOffset +  pStateHeap->dwOffsetMediaID;
4927     IdLoadParams.dwInterfaceDescriptorLength      = pRenderHal->StateHeapSettings.iMediaIDs * pStateHeap->dwSizeMediaID;
4928 
4929     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMediaIDLoadCmd(pRenderHal, pCmdBuffer, &IdLoadParams));
4930 
4931     HalOcaInterfaceNext::OnIndirectState(*pCmdBuffer, (MOS_CONTEXT_HANDLE)pOsContext, pRenderHal->StateBaseAddressParams.presDynamicState,
4932         IdLoadParams.dwInterfaceDescriptorStartOffset, false, IdLoadParams.dwInterfaceDescriptorLength);
4933 
4934     return eStatus;
4935  }
4936 
4937 //!
4938 //! \brief    Send Chroma Key
4939 //! \details  Sends Chroma Key
4940 //! \param    PRENDERHAL_INTERFACE pRenderHal
4941 //!           [in] Pointer to Hardware Interface Structure
4942 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
4943 //!           [in] Pointer to Command Buffer
4944 //! \return   MOS_STATUS
4945 //!
RenderHal_SendChromaKey(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)4946 MOS_STATUS RenderHal_SendChromaKey(
4947     PRENDERHAL_INTERFACE    pRenderHal,
4948     PMOS_COMMAND_BUFFER     pCmdBuffer)
4949 {
4950     PMHW_CHROMAKEY_PARAMS        pChromaKeyParams;
4951     int32_t                      i;
4952     MOS_STATUS                   eStatus;
4953 
4954     //----------------------------------
4955     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4956     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
4957     //----------------------------------
4958 
4959     eStatus     = MOS_STATUS_SUCCESS;
4960 
4961     // Send Chroma Keys in use
4962     pChromaKeyParams = pRenderHal->ChromaKey;
4963     for (i = pRenderHal->iChromaKeyCount; i > 0; i--, pChromaKeyParams++)
4964     {
4965         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SendChromaKey(pRenderHal, pCmdBuffer, pChromaKeyParams));
4966     }
4967 
4968     return eStatus;
4969 }
4970 
4971 //!
4972 //! \brief    Send Palette
4973 //! \details  Sends Palette
4974 //! \param    PRENDERHAL_INTERFACE pRenderHal
4975 //!           [in] Pointer to Hardware Interface Structure
4976 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
4977 //!           [in] Pointer to Command Buffer
4978 //! \return   MOS_STATUS
4979 //!
RenderHal_SendPalette(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)4980 MOS_STATUS RenderHal_SendPalette(
4981     PRENDERHAL_INTERFACE    pRenderHal,
4982     PMOS_COMMAND_BUFFER     pCmdBuffer)
4983 {
4984     PMHW_PALETTE_PARAMS          pPaletteLoadParams;
4985     int32_t                      i;
4986     MOS_STATUS                   eStatus;
4987 
4988     //-----------------------------------------
4989     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
4990     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
4991     //-----------------------------------------
4992 
4993     eStatus     = MOS_STATUS_SUCCESS;
4994 
4995     // Send Palettes in use
4996     pPaletteLoadParams = pRenderHal->Palette;
4997     for (i = pRenderHal->iMaxPalettes; i > 0; i--, pPaletteLoadParams++)
4998     {
4999         if (pPaletteLoadParams->iNumEntries > 0)
5000         {
5001             MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SendPalette(pRenderHal, pCmdBuffer, pPaletteLoadParams));
5002         }
5003     }
5004 
5005     return eStatus;
5006 }
5007 
5008 //!
5009 //! \brief    Reset RenderHal States
5010 //! \details  Reset RenderHal States in preparation for a new command buffer
5011 //! \param    PRENDERHAL_INTERFACE pRenderHal
5012 //!           [in] Pointer to RenderHal Interface Structure
5013 //! \return   MOS_STATUS
5014 //!
RenderHal_Reset(PRENDERHAL_INTERFACE pRenderHal)5015 MOS_STATUS RenderHal_Reset(
5016     PRENDERHAL_INTERFACE pRenderHal)
5017 {
5018     PMOS_INTERFACE          pOsInterface;
5019     MOS_STATUS              eStatus;
5020 
5021     //----------------------------------
5022     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5023     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
5024     //----------------------------------
5025 
5026     eStatus         = MOS_STATUS_SUCCESS;
5027     pOsInterface    = pRenderHal->pOsInterface;
5028 
5029     if (pRenderHal->pStateHeap == nullptr)
5030     {
5031         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnAllocateStateHeaps(pRenderHal, &pRenderHal->StateHeapSettings));
5032         if (pRenderHal->pStateHeap)
5033         {
5034             MHW_STATE_BASE_ADDR_PARAMS *pStateBaseParams = &pRenderHal->StateBaseAddressParams;
5035 
5036             pStateBaseParams->presGeneralState           = &pRenderHal->pStateHeap->GshOsResource;
5037             pStateBaseParams->dwGeneralStateSize         = pRenderHal->pStateHeap->dwSizeGSH;
5038             pStateBaseParams->presDynamicState           = &pRenderHal->pStateHeap->GshOsResource;
5039             pStateBaseParams->dwDynamicStateSize         = pRenderHal->pStateHeap->dwSizeGSH;
5040             pStateBaseParams->bDynamicStateRenderTarget  = false;
5041             pStateBaseParams->presIndirectObjectBuffer   = &pRenderHal->pStateHeap->GshOsResource;
5042             pStateBaseParams->dwIndirectObjectBufferSize = pRenderHal->pStateHeap->dwSizeGSH;
5043             pStateBaseParams->presInstructionBuffer      = &pRenderHal->pStateHeap->IshOsResource;
5044             pStateBaseParams->dwInstructionBufferSize    = pRenderHal->pStateHeap->dwSizeISH;
5045         }
5046     }
5047 
5048     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnRegisterResource(pOsInterface,
5049                                             &pRenderHal->pStateHeap->GshOsResource,
5050                                             true,
5051                                             true));
5052 
5053     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnRegisterResource(pOsInterface,
5054                                             &pRenderHal->pStateHeap->IshOsResource,
5055                                             true,
5056                                             true));
5057 
5058     // Reset Slice Shutdown Mode
5059     pRenderHal->bRequestSingleSlice   = false;
5060     pRenderHal->PowerOption.nSlice    = 0;
5061     pRenderHal->PowerOption.nEU       = 0;
5062     pRenderHal->PowerOption.nSubSlice = 0;
5063 
5064     return eStatus;
5065 }
5066 
5067 //!
5068 //! \brief    Assign Ssh Instance
5069 //! \details  Get a pointer to the next available SSH Buffer Instance in SSH,
5070 //!           Reset SSH allocations
5071 //! \param    PRENDERHAL_INTERFACE pRenderHal
5072 //!           [in] Pointer to RenderHal Interface Structure
5073 //! \return   MOS_STATUS
5074 //!           MOS_STATUS_SUCCESS if succeded, MOS_STATUS_UNKOWN otherwise
5075 //!
RenderHal_AssignSshInstance(PRENDERHAL_INTERFACE pRenderHal)5076 MOS_STATUS RenderHal_AssignSshInstance(
5077     PRENDERHAL_INTERFACE     pRenderHal)
5078 {
5079     MOS_STATUS eStatus;
5080     PRENDERHAL_STATE_HEAP pStateHeap;
5081 
5082     //-----------------------------------------
5083     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5084     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
5085     //-----------------------------------------
5086 
5087     eStatus    = MOS_STATUS_SUCCESS;
5088     pStateHeap = pRenderHal->pStateHeap;
5089 
5090     if (pRenderHal->isBindlessHeapInUse)
5091     {
5092         MHW_RENDERHAL_NORMALMESSAGE("BindlessHeap does not need SSH Instance!");
5093         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnAssignBindlessSurfaceStates(pRenderHal));
5094         return eStatus;
5095     }
5096 
5097     // Init SSH Params
5098     if (pStateHeap)
5099     {
5100         pStateHeap->iCurrentBindingTable = 0;
5101         pStateHeap->iCurrentSurfaceState = 0;
5102     }
5103     else
5104     {
5105         eStatus = MOS_STATUS_UNKNOWN;
5106     }
5107 
5108     return eStatus;
5109 }
5110 
5111 //!
5112 //! \brief    Initializes command buffer attributes and inserts prolog
5113 //! \param    PRENDERHAL_INTERFACE pRenderHal
5114 //!           [in] Pointer to RenderHal Interface Structure
5115 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
5116 //!           [in] Pointer to Command Buffer
5117 //! \param    PRENDERHAL_GENERIC_PROLOG_PARAMS pGenericPrologParam
5118 //!           [in] Pointer to MHW generic prolog parameters
5119 //! \return   MOS_STATUS
5120 //!
RenderHal_InitCommandBuffer(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer,PRENDERHAL_GENERIC_PROLOG_PARAMS pGenericPrologParams)5121 MOS_STATUS RenderHal_InitCommandBuffer(
5122     PRENDERHAL_INTERFACE        pRenderHal,
5123     PMOS_COMMAND_BUFFER         pCmdBuffer,
5124     PRENDERHAL_GENERIC_PROLOG_PARAMS  pGenericPrologParams)
5125 {
5126     PMOS_INTERFACE              pOsInterface;
5127     MHW_GENERIC_PROLOG_PARAMS   genericPrologParams;
5128     MOS_STATUS                  eStatus;
5129     bool                        isRender;
5130 
5131     //---------------------------------------------
5132     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5133     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
5134     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
5135     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
5136     //---------------------------------------------
5137 
5138     eStatus         = MOS_STATUS_SUCCESS;
5139     pOsInterface    = pRenderHal->pOsInterface;
5140 
5141     // Send Start Marker command
5142     isRender = MOS_RCS_ENGINE_USED(pOsInterface->pfnGetGpuContext(pOsInterface));
5143     if (pRenderHal->SetMarkerParams.setMarkerEnabled)
5144     {
5145         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SendMarkerCommand(
5146             pRenderHal, pCmdBuffer, isRender));
5147     }
5148 
5149     // Init Cmd Buffer
5150 #ifdef _MMC_SUPPORTED
5151     if (isRender)
5152     {
5153         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SetCompositePrologCmd(pRenderHal, pCmdBuffer));
5154     }
5155 #endif // _MMC_SUPPORTED
5156 
5157     if (isRender)
5158     {
5159         // Set indirect heap size - limits the size of the command buffer available for rendering
5160         MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnSetIndirectStateSize(pOsInterface, pRenderHal->dwIndirectHeapSize));
5161     }
5162 
5163     pCmdBuffer->Attributes.bIsMdfLoad = pRenderHal->IsMDFLoad;
5164     pCmdBuffer->Attributes.bTurboMode = pRenderHal->bTurboMode;
5165 
5166     // Set power option status
5167     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SetPowerOptionStatus(pRenderHal, pCmdBuffer));
5168 
5169     // Preemption: Need to set UsesMediaPipeline, UsesGPGPUPipeline, NeedsMidBatchPreEmptionSupport in command buffer header
5170     // Use IsMDFLoad to distinguish MDF context from other Media Contexts
5171     pCmdBuffer->Attributes.bMediaPreemptionEnabled =
5172         (pRenderHal->bEnableGpgpuMidBatchPreEmption ||
5173         pRenderHal->bEnableGpgpuMidThreadPreEmption ||
5174             pRenderHal->pRenderHalPltInterface->IsPreemptionEnabled(pRenderHal)) &&
5175         !pRenderHal->forceDisablePreemption;
5176 
5177     if (pGenericPrologParams)
5178     {
5179         if (pGenericPrologParams->bEnableMediaFrameTracking)
5180         {
5181             MHW_RENDERHAL_CHK_NULL_RETURN(pGenericPrologParams->presMediaFrameTrackingSurface);
5182             pCmdBuffer->Attributes.bEnableMediaFrameTracking = pGenericPrologParams->bEnableMediaFrameTracking;
5183             pCmdBuffer->Attributes.dwMediaFrameTrackingTag = pGenericPrologParams->dwMediaFrameTrackingTag;
5184             pCmdBuffer->Attributes.dwMediaFrameTrackingAddrOffset = pGenericPrologParams->dwMediaFrameTrackingAddrOffset;
5185             pCmdBuffer->Attributes.resMediaFrameTrackingSurface   = pGenericPrologParams->presMediaFrameTrackingSurface;
5186         }
5187         else
5188         {
5189             pCmdBuffer->Attributes.bEnableMediaFrameTracking = false;
5190         }
5191     }
5192 
5193     // Check if Override is needed
5194     if (pRenderHal->pRenderHalPltInterface)
5195     {
5196         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->IsOvrdNeeded(pRenderHal, pCmdBuffer, pGenericPrologParams));
5197     }
5198 
5199     MOS_ZeroMemory(&genericPrologParams, sizeof(genericPrologParams));
5200     genericPrologParams.pOsInterface        = pRenderHal->pOsInterface;
5201     genericPrologParams.pvMiInterface       = pRenderHal->pMhwMiInterface;
5202     genericPrologParams.bMmcEnabled         = pGenericPrologParams ? pGenericPrologParams->bMmcEnabled : false;
5203 
5204     if (pRenderHal->pRenderHalPltInterface)
5205     {
5206         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SendGenericPrologCmd(pRenderHal, pCmdBuffer, &genericPrologParams));
5207     }
5208 
5209     // Send predication command
5210     if (pRenderHal->pRenderHalPltInterface && pRenderHal->PredicationParams.predicationEnabled)
5211     {
5212         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SendPredicationCommand(pRenderHal, pCmdBuffer));
5213     }
5214 
5215     return eStatus;
5216 }
5217 
5218 //!
5219 //! \brief    Send Sync Tag
5220 //! \details  Sends Synchronization Tags
5221 //! \param    PRENDERHAL_INTERFACE pRenderHal
5222 //!           [in] Pointer to RenderHal Interface Structure
5223 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
5224 //!           [in] Pointer to Command Buffer
5225 //! \return   MOS_STATUS
5226 //!
RenderHal_SendSyncTag(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)5227 MOS_STATUS RenderHal_SendSyncTag(
5228     PRENDERHAL_INTERFACE    pRenderHal,
5229     PMOS_COMMAND_BUFFER     pCmdBuffer)
5230 {
5231     PRENDERHAL_STATE_HEAP           pStateHeap;
5232     MOS_STATUS                      eStatus = MOS_STATUS_SUCCESS;
5233     MHW_PIPE_CONTROL_PARAMS         PipeCtl;
5234 
5235     //-------------------------------------
5236     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5237     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
5238     //-------------------------------------
5239 
5240     pStateHeap      = pRenderHal->pStateHeap;
5241 
5242     // Send PIPE_CONTROL Token
5243     // CMD_MI_FLUSH is disabled by default on GT, use PIPE_CONTROL
5244     // Requires a token and the actual pipe control command
5245     // Flush write caches
5246     PipeCtl = g_cRenderHal_InitPipeControlParams;
5247     PipeCtl.presDest          = &pStateHeap->GshOsResource;
5248     PipeCtl.dwPostSyncOp      = MHW_FLUSH_NOWRITE;
5249     PipeCtl.dwFlushMode       = MHW_FLUSH_WRITE_CACHE;
5250     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMiPipeControl(pRenderHal, pCmdBuffer, &PipeCtl));
5251 
5252     // Invalidate read-only caches and perform a post sync write
5253     PipeCtl = g_cRenderHal_InitPipeControlParams;
5254     PipeCtl.presDest          = &pStateHeap->GshOsResource;
5255     PipeCtl.dwResourceOffset  = pStateHeap->dwOffsetSync;
5256     PipeCtl.dwPostSyncOp      = MHW_FLUSH_WRITE_IMMEDIATE_DATA;
5257     PipeCtl.dwFlushMode       = MHW_FLUSH_READ_CACHE;
5258     PipeCtl.dwDataDW1         = pStateHeap->dwNextTag;
5259     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMiPipeControl(pRenderHal, pCmdBuffer, &PipeCtl));
5260 
5261     return eStatus;
5262 }
5263 
RenderHal_SendSyncTagIndex(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer,int32_t iIndex)5264 MOS_STATUS RenderHal_SendSyncTagIndex(
5265     PRENDERHAL_INTERFACE    pRenderHal,
5266     PMOS_COMMAND_BUFFER     pCmdBuffer,
5267     int32_t                 iIndex)
5268 {
5269     PRENDERHAL_STATE_HEAP           pStateHeap;
5270     MOS_STATUS                      eStatus = MOS_STATUS_SUCCESS;
5271     MHW_PIPE_CONTROL_PARAMS         PipeCtl;
5272 
5273     //-------------------------------------
5274     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5275     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
5276     //-------------------------------------
5277 
5278     pStateHeap      = pRenderHal->pStateHeap;
5279 
5280     // Invalidate read-only caches and perform a post sync write
5281     PipeCtl = g_cRenderHal_InitPipeControlParams;
5282     PipeCtl.presDest = &pStateHeap->GshOsResource;
5283     PipeCtl.dwResourceOffset = pStateHeap->dwOffsetSync + iIndex * 8;
5284     PipeCtl.dwPostSyncOp = MHW_FLUSH_WRITE_IMMEDIATE_DATA;
5285     PipeCtl.dwFlushMode = MHW_FLUSH_READ_CACHE;
5286     PipeCtl.dwDataDW1 = pStateHeap->dwNextTag;
5287 
5288     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMiPipeControl(pRenderHal, pCmdBuffer, &PipeCtl));
5289 
5290     return eStatus;
5291 }
5292 
5293 //!
5294 //! \brief    Initialize
5295 //! \details  Initialize HW states
5296 //! \param    PRENDERHAL_INTERFACE pRenderHal
5297 //!           [in] Pointer to RenderHal Interface Structure
5298 //! \param    PCRENDERHAL_SETTINGS pSettings
5299 //!           [in] Pointer to Settings
5300 //! \return   MOS_STATUS
5301 //!           MOS_STATUS_SUCCESS    if succeeded
5302 //!           others                if failed to allocate/initialize HW commands
5303 //!
RenderHal_Initialize(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SETTINGS pSettings)5304 MOS_STATUS RenderHal_Initialize(
5305     PRENDERHAL_INTERFACE   pRenderHal,
5306     PRENDERHAL_SETTINGS    pSettings)
5307 {
5308     MOS_STATUS          eStatus = MOS_STATUS_SUCCESS;
5309     PMOS_INTERFACE      pOsInterface;
5310     MHW_STATE_BASE_ADDR_PARAMS *pStateBaseParams;
5311     MOS_ALLOC_GFXRES_PARAMS     AllocParams;
5312 
5313     //------------------------------------------------
5314     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5315     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
5316     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
5317     //------------------------------------------------
5318 
5319     pOsInterface = pRenderHal->pOsInterface;
5320 
5321     // Apply settings
5322     if (pSettings)
5323     {
5324         pRenderHal->StateHeapSettings.iMediaStateHeaps = pSettings->iMediaStates;
5325     }
5326 
5327     // Apply SSH settings for the current platform
5328     pRenderHal->StateHeapSettings.iSurfaceStateHeaps =
5329                                 pRenderHal->StateHeapSettings.iMediaStateHeaps;
5330 
5331     if (pOsInterface->CurrentGpuContextOrdinal == MOS_GPU_CONTEXT_RENDER ||
5332         pOsInterface->CurrentGpuContextOrdinal == MOS_GPU_CONTEXT_COMPUTE)
5333     {
5334         if ((pRenderHal->pOsInterface->osStreamState == nullptr) ||
5335             (pRenderHal->pOsInterface->osStreamState &&
5336             (pRenderHal->pOsInterface->osStreamState->component != COMPONENT_Encode   &&
5337              pRenderHal->pOsInterface->osStreamState->component != COMPONENT_Decode)))
5338         {
5339             // Initialize MHW interfaces
5340             // Allocate and initialize state heaps (GSH, SSH, ISH)
5341             MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnAllocateStateHeaps(pRenderHal, &pRenderHal->StateHeapSettings));
5342         }
5343     }
5344 
5345     // If ASM debug is enabled, allocate debug resource
5346     MHW_RENDERHAL_CHK_STATUS_RETURN(RenderHal_AllocateDebugSurface(pRenderHal));
5347 
5348     // Allocate Predication buffer
5349     MOS_ZeroMemory(&AllocParams, sizeof(AllocParams));
5350     AllocParams.Type        = MOS_GFXRES_BUFFER;
5351     AllocParams.TileType    = MOS_TILE_LINEAR;
5352     AllocParams.Format      = Format_Buffer;
5353     AllocParams.dwBytes     = MHW_PAGE_SIZE;
5354     AllocParams.pBufName    = "PredicationBuffer";
5355 
5356     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnAllocateResource(
5357         pOsInterface,
5358         &AllocParams,
5359         &pRenderHal->PredicationBuffer));
5360 
5361     // Setup State Base Address command
5362     pStateBaseParams   = &pRenderHal->StateBaseAddressParams;
5363     if (pRenderHal->pStateHeap)
5364     {
5365         pStateBaseParams->presGeneralState           = &pRenderHal->pStateHeap->GshOsResource;
5366         pStateBaseParams->dwGeneralStateSize         = pRenderHal->pStateHeap->dwSizeGSH;
5367         pStateBaseParams->presDynamicState           = &pRenderHal->pStateHeap->GshOsResource;
5368         pStateBaseParams->dwDynamicStateSize         = pRenderHal->pStateHeap->dwSizeGSH;
5369         pStateBaseParams->bDynamicStateRenderTarget  = false;
5370         pStateBaseParams->presIndirectObjectBuffer   = &pRenderHal->pStateHeap->GshOsResource;
5371         pStateBaseParams->dwIndirectObjectBufferSize = pRenderHal->pStateHeap->dwSizeGSH;
5372         pStateBaseParams->presInstructionBuffer      = &pRenderHal->pStateHeap->IshOsResource;
5373         pStateBaseParams->dwInstructionBufferSize    = pRenderHal->pStateHeap->dwSizeISH;
5374     }
5375 
5376     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->CreatePerfProfiler(pRenderHal));
5377     new(&pRenderHal->trackerProducer) FrameTrackerProducer();
5378 
5379     return eStatus;
5380 }
5381 
5382 //!
5383 //! \brief    Send Rcs Status Tag
5384 //! \details  Adds pipe control command in Command Buffer
5385 //! \param    PRENDERHAL_INTERFACE pRenderHal
5386 //!           [in] Pointer to RenderHal Interface Structure
5387 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
5388 //!           [in] Pointer to Command Buffer
5389 //! \return   MOS_STATUS
5390 //!           MOS_STATUS_SUCCESS  if succeeded
5391 //!           MOS_STATUS_UNKNOWN if failed to allocate/initialize HW commands
5392 //!
RenderHal_SendRcsStatusTag(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)5393 MOS_STATUS RenderHal_SendRcsStatusTag(
5394     PRENDERHAL_INTERFACE         pRenderHal,
5395     PMOS_COMMAND_BUFFER          pCmdBuffer)
5396 {
5397     MOS_STATUS                   eStatus = MOS_STATUS_SUCCESS;
5398     PMOS_INTERFACE               pOsInterface;
5399     MHW_PIPE_CONTROL_PARAMS      PipeCtl;
5400     PMOS_RESOURCE                osResource = nullptr;
5401 
5402     //------------------------------------
5403     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5404     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
5405     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
5406     //------------------------------------
5407 
5408     pOsInterface    = pRenderHal->pOsInterface;
5409 
5410     // Get the Os Resource
5411     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnGetGpuStatusBufferResource(pOsInterface, osResource));
5412     MHW_RENDERHAL_CHK_NULL_RETURN(osResource);
5413 
5414     // Register the buffer
5415     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnRegisterResource(pOsInterface, osResource, true, true));
5416 
5417     // Issue pipe control to write GPU Status Tag
5418     PipeCtl                   = g_cRenderHal_InitPipeControlParams;
5419     PipeCtl.presDest          = osResource;
5420     PipeCtl.dwResourceOffset  = pOsInterface->pfnGetGpuStatusTagOffset(pOsInterface, pOsInterface->CurrentGpuContextOrdinal); //MOS_GPU_CONTEXT_RENDER or MOS_GPU_CONTEXT_RENDER3
5421     PipeCtl.dwDataDW1         = pOsInterface->pfnGetGpuStatusTag(pOsInterface, pOsInterface->CurrentGpuContextOrdinal);
5422     PipeCtl.dwPostSyncOp      = MHW_FLUSH_WRITE_IMMEDIATE_DATA;
5423     PipeCtl.dwFlushMode       = MHW_FLUSH_NONE;
5424     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMiPipeControl(pRenderHal, pCmdBuffer, &PipeCtl));
5425 
5426     // Increment GPU Status Tag
5427     pOsInterface->pfnIncrementGpuStatusTag(pOsInterface, pOsInterface->CurrentGpuContextOrdinal);
5428 
5429     return eStatus;
5430 }
5431 
5432 //!
5433 //! \brief    Send CSC Coefficient surface
5434 //! \details  Adds pipe control command in Command Buffer
5435 //! \param    PRENDERHAL_INTERFACE pRenderHal
5436 //!           [in] Pointer to RenderHal Interface Structure
5437 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
5438 //!           [in] Pointer to Command Buffer
5439 //! \param    PMOS_RESOURCE presCscCoeff
5440 //!           [in] Pointer to CSC Coefficient Surface
5441 //! \param    Kdll_CacheEntry *pKernelEntry
5442 //!           [in] Pointer to Kernel Entry
5443 //! \return   MOS_STATUS
5444 //!           MOS_STATUS_SUCCESS  if succeeded
5445 //!           MOS_STATUS_UNKNOWN if failed to allocate/initialize HW commands
5446 //!
RenderHal_SendCscCoeffSurface(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer,PMOS_RESOURCE presCscCoeff,Kdll_CacheEntry * pKernelEntry)5447 MOS_STATUS RenderHal_SendCscCoeffSurface(
5448     PRENDERHAL_INTERFACE         pRenderHal,
5449     PMOS_COMMAND_BUFFER          pCmdBuffer,
5450     PMOS_RESOURCE                presCscCoeff,
5451     Kdll_CacheEntry              *pKernelEntry)
5452 {
5453     MOS_STATUS                   eStatus = MOS_STATUS_SUCCESS;
5454     PMOS_INTERFACE               pOsInterface;
5455     MHW_PIPE_CONTROL_PARAMS      PipeCtl;
5456     MOS_SURFACE                  Surface;
5457     uint64_t                     *pTempCoeff;
5458     uint32_t                     dwLow;
5459     uint32_t                     dwHigh;
5460     uint32_t                     dwOffset;
5461     uint32_t                     dwCount;
5462     uint8_t                      uiPatchMatrixID;
5463 
5464     //------------------------------------
5465     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5466     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
5467     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
5468     MHW_RENDERHAL_CHK_NULL_RETURN(presCscCoeff);
5469     MHW_RENDERHAL_CHK_NULL_RETURN(pKernelEntry);
5470     MHW_RENDERHAL_CHK_NULL_RETURN(pKernelEntry->pCscParams);
5471     //------------------------------------
5472 
5473     pOsInterface    = pRenderHal->pOsInterface;
5474     dwOffset        = 0;
5475     static_assert(
5476         (sizeof(pKernelEntry->pCscParams->Matrix[0].Coeff) % sizeof(uint64_t)) == 0,
5477         "Coeff array size must be multiple of 8");
5478     dwCount         = sizeof(pKernelEntry->pCscParams->Matrix[0].Coeff) / (sizeof(uint64_t));
5479     MOS_ZeroMemory(&Surface, sizeof(Surface));
5480 
5481     // Register the buffer
5482     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnRegisterResource(pOsInterface, presCscCoeff, true, true));
5483     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnGetResourceInfo(pOsInterface, presCscCoeff, &Surface));
5484 
5485     PipeCtl              = g_cRenderHal_InitPipeControlParams;
5486     PipeCtl.presDest     = presCscCoeff;
5487     PipeCtl.dwPostSyncOp = MHW_FLUSH_WRITE_IMMEDIATE_DATA;
5488     PipeCtl.dwFlushMode  = MHW_FLUSH_READ_CACHE;
5489 
5490     for (uint32_t j = 0; j < pKernelEntry->pCscParams->PatchMatrixNum; j++)
5491     {
5492         uiPatchMatrixID = pKernelEntry->pCscParams->PatchMatrixID[j];
5493         pTempCoeff = (uint64_t *)pKernelEntry->pCscParams->Matrix[uiPatchMatrixID].Coeff;
5494 
5495         // Issue pipe control to write CSC Coefficient Surface
5496         for (uint16_t i = 0; i < dwCount; i++, pTempCoeff++)
5497         {
5498             dwLow = (uint32_t)((*pTempCoeff) & 0xFFFFFFFF);
5499             dwHigh = (uint32_t)(((*pTempCoeff) >> 32) & 0xFFFFFFFF);
5500             PipeCtl.dwResourceOffset = dwOffset + sizeof(uint64_t) * i;
5501             PipeCtl.dwDataDW1 = dwLow;
5502             PipeCtl.dwDataDW2 = dwHigh;
5503             MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMiPipeControl(pRenderHal, pCmdBuffer, &PipeCtl));
5504         }
5505 
5506         dwOffset += Surface.dwPitch;
5507     }
5508 
5509     return eStatus;
5510 }
5511 
RenderHal_SendStateBaseAddress(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)5512 MOS_STATUS RenderHal_SendStateBaseAddress(
5513     PRENDERHAL_INTERFACE        pRenderHal,
5514     PMOS_COMMAND_BUFFER         pCmdBuffer)
5515 {
5516     MOS_STATUS            eStatus;
5517 
5518     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5519     MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
5520 
5521     eStatus = pRenderHal->pRenderHalPltInterface->SendStateBaseAddress(pRenderHal,
5522         pCmdBuffer);
5523 
5524     return eStatus;
5525 }
5526 
5527 //!
5528 //! \brief    Send Media States
5529 //! \details  Send Media States
5530 //! \param    PRENDERHAL_INTERFACE pRenderHal
5531 //!           [in] Pointer to Hardware Interface Structure
5532 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
5533 //!           [in] Pointer to Command Buffer
5534 //! \param    PRENDERHAL_GPGPU_WALKER_PARAMS pGpGpuWalkerParams
5535 //!           [in]    Pointer to GPGPU walker parameters
5536 //! \return   MOS_STATUS
5537 //!
RenderHal_SendMediaStates(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_WALKER_PARAMS pWalkerParams,PMHW_GPGPU_WALKER_PARAMS pGpGpuWalkerParams)5538 MOS_STATUS RenderHal_SendMediaStates(
5539     PRENDERHAL_INTERFACE      pRenderHal,
5540     PMOS_COMMAND_BUFFER       pCmdBuffer,
5541     PMHW_WALKER_PARAMS        pWalkerParams,
5542     PMHW_GPGPU_WALKER_PARAMS  pGpGpuWalkerParams)
5543 {
5544     PMOS_INTERFACE               pOsInterface = nullptr;
5545     PRENDERHAL_STATE_HEAP        pStateHeap = nullptr;
5546     MOS_STATUS                   eStatus = MOS_STATUS_SUCCESS;
5547     MHW_VFE_PARAMS               *pVfeStateParams = nullptr;
5548     MOS_CONTEXT                  *pOsContext = nullptr;
5549     MHW_MI_LOAD_REGISTER_IMM_PARAMS loadRegisterImmParams = {};
5550     PMHW_MI_MMIOREGISTERS        pMmioRegisters = nullptr;
5551     MOS_OCA_BUFFER_HANDLE        hOcaBuf = 0;
5552 
5553     //---------------------------------------
5554     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5555     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
5556     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
5557     MHW_RENDERHAL_ASSERT(pRenderHal->pStateHeap->bGshLocked);
5558     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface->GetMmioRegisters(pRenderHal));
5559 
5560     //---------------------------------------
5561     pOsInterface            = pRenderHal->pOsInterface;
5562     pStateHeap              = pRenderHal->pStateHeap;
5563     pOsContext              = pOsInterface->pOsContext;
5564     pMmioRegisters          = pRenderHal->pRenderHalPltInterface->GetMmioRegisters(pRenderHal);
5565 
5566     // This need not be secure, since PPGTT will be used here. But moving this after
5567     // L3 cache configuration will delay UMD from fetching another media state.
5568     // Send Sync Tag
5569     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSendSyncTag(pRenderHal, pCmdBuffer));
5570 
5571     // Setup L3$ Config, LRI commands used here & hence must be launched from a secure bb
5572     pRenderHal->L3CacheSettings.bEnableSLM = (pGpGpuWalkerParams && pGpGpuWalkerParams->SLMSize > 0);
5573     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnEnableL3Caching(pRenderHal, &pRenderHal->L3CacheSettings));
5574 
5575     // Send L3 Cache Configuration
5576     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SetL3Cache(pRenderHal, pCmdBuffer));
5577 
5578     // if forceDisablePreemption is true, preemption will be disabled by NeedsMidBatchPreEmptionSupport in command buffer header.
5579     // skip preemption control bit configure as it won't take effect.
5580     if (!pRenderHal->forceDisablePreemption)
5581     {
5582         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->EnablePreemption(pRenderHal, pCmdBuffer));
5583     }
5584 
5585     // Send Debug Control, LRI commands used here & hence must be launched from a secure bb
5586     MHW_RENDERHAL_CHK_STATUS_RETURN(RenderHal_AddDebugControl(pRenderHal, pCmdBuffer));
5587 
5588     // Send Pipeline Select command
5589     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddPipelineSelectCmd(pRenderHal, pCmdBuffer, (pGpGpuWalkerParams) ? true : false));
5590 
5591     // The binding table for surface states is at end of command buffer. No need to add it to indirect state heap.
5592     HalOcaInterfaceNext::OnIndirectState(*pCmdBuffer, (MOS_CONTEXT_HANDLE)pOsContext, pRenderHal->StateBaseAddressParams.presInstructionBuffer,
5593         pStateHeap->CurIDEntryParams.dwKernelOffset, false, pStateHeap->iKernelUsedForDump);
5594 
5595     // Send State Base Address command
5596     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSendStateBaseAddress(pRenderHal, pCmdBuffer));
5597 
5598     if (pRenderHal->bComputeContextInUse)
5599     {
5600         pRenderHal->pRenderHalPltInterface->SendTo3DStateBindingTablePoolAlloc(pRenderHal, pCmdBuffer);
5601     }
5602 
5603     // Send Surface States
5604     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSendSurfaces(pRenderHal, pCmdBuffer));
5605 
5606     // Send SIP State if ASM debug enabled
5607     if (pRenderHal->bIsaAsmDebugEnable)
5608     {
5609         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddSipStateCmd(pRenderHal, pCmdBuffer));
5610     }
5611 
5612     pVfeStateParams = pRenderHal->pRenderHalPltInterface->GetVfeStateParameters();
5613     if (!pRenderHal->bComputeContextInUse)
5614     {
5615         // set VFE State
5616         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMediaVfeCmd(pRenderHal, pCmdBuffer, pVfeStateParams));
5617     }
5618     else
5619     {
5620         // set CFE State
5621         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddCfeStateCmd(pRenderHal, pCmdBuffer, pVfeStateParams));
5622     }
5623 
5624     // Send CURBE Load
5625     if (!pRenderHal->bComputeContextInUse)
5626     {
5627         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSendCurbeLoad(pRenderHal, pCmdBuffer));
5628     }
5629 
5630     // Send Interface Descriptor Load
5631     if (!pRenderHal->bComputeContextInUse)
5632     {
5633         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSendMediaIdLoad(pRenderHal, pCmdBuffer));
5634     }
5635 
5636     // Send Chroma Keys
5637     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSendChromaKey(pRenderHal, pCmdBuffer));
5638 
5639     // Send Palettes in use
5640     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSendPalette(pRenderHal, pCmdBuffer));
5641 
5642     pRenderHal->pRenderHalPltInterface->OnDispatch(pRenderHal, pCmdBuffer, pOsInterface, pMmioRegisters);
5643 
5644     // Send Media object walker
5645     if(pWalkerParams)
5646     {
5647         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddMediaObjectWalkerCmd(
5648             pRenderHal,
5649             pCmdBuffer,
5650             pWalkerParams));
5651     }
5652     else if (pGpGpuWalkerParams && (!pRenderHal->bComputeContextInUse))
5653     {
5654         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->AddGpGpuWalkerStateCmd(
5655             pRenderHal,
5656             pCmdBuffer,
5657             pGpGpuWalkerParams));
5658     }
5659     else if (pGpGpuWalkerParams && pRenderHal->bComputeContextInUse)
5660     {
5661         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SendComputeWalker(
5662             pRenderHal,
5663             pCmdBuffer,
5664             pGpGpuWalkerParams));
5665     }
5666 
5667     return eStatus;
5668 }
5669 
RenderHal_AssignBindlessSurfaceStates(PRENDERHAL_INTERFACE pRenderHal)5670 MOS_STATUS RenderHal_AssignBindlessSurfaceStates(
5671     PRENDERHAL_INTERFACE pRenderHal)
5672 {
5673     PRENDERHAL_STATE_HEAP pStateHeap = nullptr;
5674     MOS_STATUS            eStatus    = MOS_STATUS_UNKNOWN;
5675 
5676     //----------------------------------------
5677     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5678     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
5679     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->surfaceStateMgr);
5680 
5681     pStateHeap = pRenderHal->pStateHeap;
5682     if (pStateHeap->surfaceStateMgr->m_usedStates.size() >0)
5683     {
5684         pStateHeap->surfaceStateMgr->m_usedStates.clear();
5685     }
5686 
5687     eStatus = MOS_STATUS_SUCCESS;
5688 
5689     return eStatus;
5690 }
5691 
RenderHal_SendSurfaces_Bindelss(PRENDERHAL_INTERFACE pRenderHal,bool bNeedNullPatch)5692 MOS_STATUS RenderHal_SendSurfaces_Bindelss(
5693     PRENDERHAL_INTERFACE pRenderHal,
5694     bool                 bNeedNullPatch)
5695 {
5696     PRENDERHAL_STATE_HEAP pStateHeap = nullptr;
5697     MOS_STATUS            eStatus    = MOS_STATUS_SUCCESS;
5698     MHW_SURFACE_STATE_SEND_PARAMS SendSurfaceParams;
5699     PMOS_INTERFACE                pOsInterface;
5700     //----------------------------------------
5701     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5702     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
5703     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->surfaceStateMgr);
5704     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->surfaceStateMgr->m_surfStateHeap);
5705     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
5706 
5707     pStateHeap = pRenderHal->pStateHeap;
5708     pOsInterface = pRenderHal->pOsInterface;
5709 
5710     if (pStateHeap->surfaceStateMgr->m_usedStates.size() == 0)
5711     {
5712         MHW_RENDERHAL_NORMALMESSAGE("m_usedStates is null!");
5713         return eStatus;
5714     }
5715 
5716     for (uint32_t i = 0; i < pStateHeap->surfaceStateMgr->m_usedStates.size(); i++)
5717     {
5718         uint32_t index = pStateHeap->surfaceStateMgr->m_usedStates[i];
5719         // Null Patch is only enabled for Media Patchless
5720         SendSurfaceParams.bNeedNullPatch     = bNeedNullPatch;
5721         SendSurfaceParams.pIndirectStateBase = pStateHeap->surfaceStateMgr->m_surfStateHeap->pLockedOsResourceMem;
5722         SendSurfaceParams.iIndirectStateBase = 0; // No need
5723 
5724         SendSurfaceParams.pSurfaceToken       = (uint8_t *)&pStateHeap->pSurfaceEntry[index].SurfaceToken;
5725         SendSurfaceParams.pSurfaceStateSource = (uint8_t *)pStateHeap->pSurfaceEntry[index].pSurfaceState;
5726         SendSurfaceParams.iSurfaceStateOffset = index * pStateHeap->surfaceStateMgr->m_surfStateHeap->uiInstanceSize;
5727         pRenderHal->pfnSendSurfaceStateEntry(pRenderHal, nullptr, &SendSurfaceParams);
5728     }
5729 
5730     return eStatus;
5731 }
5732 
5733 //!
5734 //! \brief    Assign binding Table
5735 //! \details  Assigns binding Table
5736 //! \param    PRENDERHAL_INTERFACE pRenderHal
5737 //!           [in] Pointer to Hardware Interface Structure
5738 //! \param    int32_t *piBindingTable
5739 //!           [out] Pointer to Binding Table
5740 //! \return   MOS_STATUS
5741 //!
RenderHal_AssignBindingTable(PRENDERHAL_INTERFACE pRenderHal,int32_t * piBindingTable)5742 MOS_STATUS RenderHal_AssignBindingTable(
5743     PRENDERHAL_INTERFACE     pRenderHal,
5744     int32_t                  *piBindingTable)
5745 {
5746     PRENDERHAL_STATE_HEAP     pStateHeap;
5747     uint32_t                  dwOffset;
5748     MOS_STATUS                eStatus;
5749 
5750     //----------------------------------------
5751     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5752     MHW_RENDERHAL_CHK_NULL_RETURN(piBindingTable);
5753     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
5754     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pMhwStateHeap);
5755     //----------------------------------------
5756 
5757     *piBindingTable = -1;
5758     pStateHeap      = pRenderHal->pStateHeap;
5759     eStatus         = MOS_STATUS_UNKNOWN;
5760 
5761     if (pRenderHal->isBindlessHeapInUse)
5762     {
5763         MHW_RENDERHAL_NORMALMESSAGE("BindlessHeap does not need binding table!");
5764         return MOS_STATUS_SUCCESS;
5765     }
5766 
5767     if (pStateHeap->iCurrentBindingTable >= pRenderHal->StateHeapSettings.iBindingTables)
5768     {
5769         MHW_RENDERHAL_ASSERTMESSAGE("Unable to allocate Binding Table. Exceeds Maximum.");
5770         return eStatus;
5771     }
5772 
5773     *piBindingTable = pStateHeap->iCurrentBindingTable;
5774 
5775     // Get Offset to Current Binding Table
5776     dwOffset    = *piBindingTable * pStateHeap->iBindingTableSize;            // Moves the pointer to a Particular Binding Table
5777 
5778     // Reset Binding Table
5779     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->pSshBuffer);
5780     MOS_ZeroMemory(pStateHeap->pSshBuffer + dwOffset, pStateHeap->iBindingTableSize);
5781 
5782     // Setup Debug surface state if needed
5783     MHW_RENDERHAL_CHK_STATUS_RETURN(RenderHal_SetupDebugSurfaceState(pRenderHal));
5784 
5785     // Increment the Current Binding Table
5786     ++pStateHeap->iCurrentBindingTable;
5787 
5788     eStatus = MOS_STATUS_SUCCESS;
5789 
5790     return eStatus;
5791 }
5792 
5793 //!
5794 //! \brief    Setup Buffer Surface State
5795 //! \details  Setup Buffer Surface States
5796 //!           For buffer surfaces, the number of entries in the buffer
5797 //!           ranges from 1 to 2^27.   After subtracting one from the number
5798 //!           of entries, software must place the fields of the resulting
5799 //!           27-bit value into the Height, Width, and Depth fields as
5800 //!           indicated, right-justified in each field.
5801 //!           Unused upper bits must be set to zero.
5802 //!
5803 //!           Width:  contains bits [6:0] of the number of entries in the
5804 //!                   buffer 1 [0,127]  --> 7 Bits
5805 //!           Height: contains bits [20:7] of the number of entries in the
5806 //!                   buffer 1 [0,16383] --> 14 Bits
5807 //!           Depth:  contains bits [26:21] of the number of entries in the
5808 //!                   buffer 1 [0,63]  --> 6 Bits
5809 //! \param    PRENDERHAL_INTERFACE pRenderHal
5810 //!           [in]  Pointer to RenderHal Interface
5811 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
5812 //!           [in]  Pointer to MOS Command Buffer
5813 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
5814 //!           [in]  Pointer to Render Hal Surface
5815 //! \param    PRENDERHAL_SURFACE_STATE_PARAMS pParams
5816 //!           [in]  Pointer to Surface state parameters
5817 //! \param    PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntry
5818 //!           [out] Pointer to Surface entry
5819 //! \return   MOS_STATUS
5820 //!
RenderHal_SetupBufferSurfaceState(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface,PRENDERHAL_SURFACE_STATE_PARAMS pParams,PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntry)5821 MOS_STATUS RenderHal_SetupBufferSurfaceState(
5822     PRENDERHAL_INTERFACE             pRenderHal,
5823     PRENDERHAL_SURFACE               pRenderHalSurface,
5824     PRENDERHAL_SURFACE_STATE_PARAMS  pParams,
5825     PRENDERHAL_SURFACE_STATE_ENTRY   *ppSurfaceEntry)
5826 {
5827     MOS_STATUS                      eStatus;
5828     PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntry;
5829     MHW_RCS_SURFACE_PARAMS          RcsSurfaceParams;
5830 
5831     //--------------------------------------
5832     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
5833     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHalSurface);
5834     MHW_RENDERHAL_CHK_NULL_RETURN(pParams);
5835     MHW_RENDERHAL_CHK_NULL_RETURN(ppSurfaceEntry);
5836     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
5837     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pMhwStateHeap);
5838     MHW_RENDERHAL_ASSERT(pRenderHalSurface->OsSurface.dwWidth > 0);
5839     //--------------------------------------
5840 
5841     eStatus    = MOS_STATUS_SUCCESS;
5842 
5843     // Force surface type to Default (non-AVS)
5844     pParams->Type = pRenderHal->SurfaceTypeDefault;
5845 
5846     // Assign Surface State
5847     // Assign a New Surface State Entry
5848     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnAssignSurfaceState(
5849         pRenderHal,
5850         pRenderHal->SurfaceTypeDefault,
5851         ppSurfaceEntry));
5852 
5853     pSurfaceEntry = *ppSurfaceEntry;
5854     MHW_RENDERHAL_CHK_NULL_RETURN(pSurfaceEntry);
5855 
5856     // Update surface state offset in SSH
5857     *pSurfaceEntry->pSurface = pRenderHalSurface->OsSurface;
5858 
5859     if (pRenderHal->isBindlessHeapInUse)
5860     {
5861         pSurfaceEntry->dwSurfStateOffset = pSurfaceEntry->iSurfStateID * pRenderHal->pHwSizes->dwSizeSurfaceState; // No binding table
5862     }
5863     else
5864     {
5865         pSurfaceEntry->dwSurfStateOffset =
5866             pRenderHal->pStateHeap->iSurfaceStateOffset +
5867             pSurfaceEntry->iSurfStateID * pRenderHal->pHwSizes->dwSizeSurfaceState;
5868     }
5869 
5870     // Setup MHW parameters
5871     MOS_ZeroMemory(&RcsSurfaceParams, sizeof(MHW_RCS_SURFACE_PARAMS));
5872     RcsSurfaceParams.psSurface             = &pRenderHalSurface->OsSurface;
5873     RcsSurfaceParams.dwOffsetInSSH         = pSurfaceEntry->dwSurfStateOffset;
5874     RcsSurfaceParams.dwCacheabilityControl = pRenderHal->pfnGetSurfaceMemoryObjectControl(pRenderHal, pParams);
5875     if (pParams->surfaceType)
5876     {
5877         MOS_CACHE_ELEMENT element(MOS_CODEC_RESOURCE_USAGE_BEGIN_CODEC, MOS_CODEC_RESOURCE_USAGE_BEGIN_CODEC);
5878         bool              res = pRenderHal->pOsInterface->pfnGetCacheSetting(pParams->Component, pParams->surfaceType, pParams->isOutput, RENDER_ENGINE, element, false);
5879         if (res)
5880         {
5881             RcsSurfaceParams.dwCacheabilityControl = (pRenderHal->pOsInterface->pfnCachePolicyGetMemoryObject(
5882                                       element.mocsUsageType,
5883                                       pRenderHal->pOsInterface->pfnGetGmmClientContext(pRenderHal->pOsInterface)))
5884                                      .DwordValue;
5885         }
5886         else
5887         {
5888             MHW_RENDERHAL_ASSERTMESSAGE("Not found cache settings!");
5889         }
5890     }
5891     else
5892     {
5893         MHW_RENDERHAL_NORMALMESSAGE("Not implemented yet! Will use MemObjCtl value %d", pParams->MemObjCtl);
5894     }
5895 
5896     RcsSurfaceParams.bIsWritable           = pParams->isOutput;
5897     RcsSurfaceParams.bRenderTarget         = pParams->isOutput;
5898 
5899     // Call MHW to setup the Surface State Heap entry for Buffer
5900     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSetSurfaceStateBuffer(pRenderHal, &RcsSurfaceParams, pSurfaceEntry->pSurfaceState));
5901 
5902     // Setup OS Specific States
5903     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSetupSurfaceStatesOs(pRenderHal, pParams, pSurfaceEntry));
5904 
5905     return eStatus;
5906 }
5907 
5908 //!
5909 //! \brief    Set surface state buffer
5910 //! \param    [in] pRenderHal
5911 //!           pointer to render hal
5912 //!           [in] pParams
5913 //!           pointer to surface parameters
5914 //! \param    void  *pSurfaceState
5915 //!           [in/out] Surface State Pointer
5916 //!
RenderHal_SetSurfaceStateBuffer(PRENDERHAL_INTERFACE pRenderHal,PMHW_RCS_SURFACE_PARAMS pParams,void * pSurfaceState)5917 MOS_STATUS RenderHal_SetSurfaceStateBuffer(
5918     PRENDERHAL_INTERFACE        pRenderHal,
5919     PMHW_RCS_SURFACE_PARAMS     pParams,
5920     void                        *pSurfaceState)
5921 {
5922     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
5923 
5924     MHW_MI_CHK_NULL(pParams);
5925     MHW_MI_CHK_NULL(pParams->psSurface);
5926     MHW_MI_CHK_NULL(pSurfaceState);
5927 
5928     MHW_SURFACE_STATE_PARAMS Params;
5929     MOS_ZeroMemory(&Params, sizeof(Params));
5930     PMOS_SURFACE pSurface = pParams->psSurface;
5931     uint32_t dwBufferSize = pSurface->dwWidth - 1;
5932     Params.SurfaceType3D = MOS_GFXRES_SCRATCH == pSurface->Type?
5933             GFX3DSTATE_SURFACETYPE_SCRATCH
5934             : GFX3DSTATE_SURFACETYPE_BUFFER;
5935 
5936     if (MOS_GFXRES_SCRATCH == pSurface->Type)
5937     {
5938         Params.dwPitch = 1023;
5939         uint32_t entry_count = pSurface->dwWidth/(Params.dwPitch + 1);
5940         Params.dwWidth = (entry_count - 1) & MOS_MASKBITS32(0, 6);
5941         Params.dwHeight = (((entry_count - 1) & MOS_MASKBITS32(7, 20)) >> 7);
5942         Params.dwDepth = (((entry_count - 1) & 0xFFE00000) >> 21);
5943         Params.dwFormat = MHW_GFX3DSTATE_SURFACEFORMAT_RAW;
5944     }
5945     else
5946     {
5947         // Width  contains bits [ 6:0] of the number of entries in the buffer
5948         Params.dwWidth = (uint8_t)(dwBufferSize & MOS_MASKBITS32(0, 6));
5949         // Height contains bits [20:7] of the number of entries in the buffer
5950         Params.dwHeight = (uint16_t)((dwBufferSize & MOS_MASKBITS32(7, 20)) >> 7);
5951         // For SURFTYPE_BUFFER, pitch is defaulted to 0. Resetting is unnecessary.
5952 
5953         uint32_t depthMaskBuffer = pRenderHal->pRenderHalPltInterface
5954                 ->GetDepthBitMaskForBuffer();
5955         uint32_t depthMaskRawBuffer = pRenderHal->pRenderHalPltInterface
5956                 ->GetDepthBitMaskForRawBuffer();
5957         switch (pSurface->Format)
5958         {
5959             // We consider MOS's Format_Buffer as MHW_GFX3DSTATE_SURFACEFORMAT_L8_UNORM
5960             // format for most of cases
5961             case Format_Buffer:
5962                 Params.dwFormat = MHW_GFX3DSTATE_SURFACEFORMAT_L8_UNORM;
5963                 Params.dwDepth
5964                         = (uint16_t)((dwBufferSize & depthMaskBuffer) >> 21);
5965                 break;
5966 
5967             case Format_RAW:
5968                 Params.dwFormat = MHW_GFX3DSTATE_SURFACEFORMAT_RAW;
5969                 Params.dwDepth
5970                         = (uint16_t)((dwBufferSize & depthMaskRawBuffer) >> 21);
5971                 break;
5972 
5973             case Format_L8:
5974                 Params.dwFormat = MHW_GFX3DSTATE_SURFACEFORMAT_L8_UNORM;
5975                 Params.dwDepth
5976                         = (uint16_t)((dwBufferSize & depthMaskBuffer) >> 21);
5977                 break;
5978 
5979             default:
5980                 MHW_ASSERTMESSAGE("Invalid buffer Resource format");
5981                 break;
5982         }
5983     }
5984 
5985     Params.pSurfaceState = (uint8_t*)pSurfaceState;
5986     Params.dwCacheabilityControl = pParams->dwCacheabilityControl;
5987 
5988     // Default tile mode of surface state buffer is linear
5989     Params.bGMMTileEnabled       = true;
5990 
5991     // Setup Surface State Entry via MHW state heap interface
5992     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pMhwStateHeap->SetSurfaceStateEntry(&Params));
5993 
5994     return eStatus;
5995 }
5996 
5997 //!
5998 //! \brief      Setup Interface Descriptor
5999 //! \details    Set interface descriptor
6000 //! \param      PRENDERHAL_INTERFACE                    pRenderHal
6001 //!             [in]    Pointer to HW interface
6002 //! \param      PRENDERHAL_MEDIA_STATE                  pMediaState
6003 //!             [in]    Pointer to media state
6004 //! \param      PRENDERHAL_KRN_ALLOCATION               pKernelAllocation
6005 //!             [in]    Pointer to kernel allocation
6006 //! \param      PRENDERHAL_INTERFACE_DESCRIPTOR_PARAMS  pInterfaceDescriptorParams
6007 //!             [in]    Pointer to interface descriptor parameters
6008 //! \param      PMHW_GPGPU_WALKER_PARAMS          pGpGpuWalkerParams
6009 //!             [in]    Pointer to gpgpu walker parameters
6010 //! \return     MOS_STATUS
6011 //!
RenderHal_SetupInterfaceDescriptor(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_MEDIA_STATE pMediaState,PRENDERHAL_KRN_ALLOCATION pKernelAllocation,PRENDERHAL_INTERFACE_DESCRIPTOR_PARAMS pInterfaceDescriptorParams)6012 MOS_STATUS RenderHal_SetupInterfaceDescriptor(
6013     PRENDERHAL_INTERFACE                   pRenderHal,
6014     PRENDERHAL_MEDIA_STATE                 pMediaState,
6015     PRENDERHAL_KRN_ALLOCATION              pKernelAllocation,
6016     PRENDERHAL_INTERFACE_DESCRIPTOR_PARAMS pInterfaceDescriptorParams)
6017 {
6018     MOS_STATUS               eStatus = MOS_STATUS_SUCCESS;
6019     PMHW_ID_ENTRY_PARAMS     pParams = nullptr;
6020     PRENDERHAL_STATE_HEAP    pStateHeap = nullptr;
6021 
6022     //-----------------------------------------
6023     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6024     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pMhwStateHeap);
6025     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
6026     MHW_RENDERHAL_CHK_NULL_RETURN(pMediaState);
6027     MHW_RENDERHAL_CHK_NULL_RETURN(pKernelAllocation);
6028     MHW_RENDERHAL_CHK_NULL_RETURN(pInterfaceDescriptorParams);
6029     //-----------------------------------------
6030 
6031     // Get states, params
6032     pStateHeap      = pRenderHal->pStateHeap;
6033     pParams         = &pStateHeap->CurIDEntryParams;
6034 
6035     pParams->dwMediaIdOffset      = pMediaState->dwOffset + pStateHeap->dwOffsetMediaID;
6036     pParams->iMediaId             = pInterfaceDescriptorParams->iMediaID;
6037     pParams->dwKernelOffset       = pKernelAllocation->dwOffset;
6038     pParams->dwSamplerOffset      = pMediaState->dwOffset + pStateHeap->dwOffsetSampler +
6039                                   pInterfaceDescriptorParams->iMediaID * pStateHeap->dwSizeSamplers;
6040     pParams->dwSamplerCount       = pKernelAllocation->Params.Sampler_Count;
6041     pParams->dwBindingTableOffset = pInterfaceDescriptorParams->iBindingTableID * pStateHeap->iBindingTableSize;
6042     pParams->iCurbeOffset         = pInterfaceDescriptorParams->iCurbeOffset;
6043     pParams->iCurbeLength         = pInterfaceDescriptorParams->iCurbeLength;
6044 
6045     pParams->bBarrierEnable                   = pInterfaceDescriptorParams->blBarrierEnable;
6046     pParams->bGlobalBarrierEnable             = pInterfaceDescriptorParams->blGlobalBarrierEnable;    //It's only applied for BDW+
6047     pParams->dwNumberofThreadsInGPGPUGroup    = pInterfaceDescriptorParams->iNumberThreadsInGroup;
6048     pParams->dwSharedLocalMemorySize          = pRenderHal->pfnEncodeSLMSize(pRenderHal, pInterfaceDescriptorParams->iSLMSize);
6049     pParams->iCrsThdConDataRdLn               = pInterfaceDescriptorParams->iCrsThrdConstDataLn;
6050     pParams->pGeneralStateHeap                = nullptr;
6051 
6052     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pMhwStateHeap->SetInterfaceDescriptorEntry(pParams));
6053 
6054     return eStatus;
6055 }
6056 
6057 //!
6058 //! \brief      Get Media Walker Status
6059 //! \details    Returns Media Walker Enabled / Disabled
6060 //! \param      PRENDERHAL_INTERFACE pRenderHal
6061 //!             [in]    Pointer to RenderHal Interface
6062 //! \return     bool
6063 //!
RenderHal_GetMediaWalkerStatus(PRENDERHAL_INTERFACE pRenderHal)6064 bool RenderHal_GetMediaWalkerStatus(
6065     PRENDERHAL_INTERFACE pRenderHal)
6066 {
6067     //-----------------------------------------
6068     if (pRenderHal == nullptr)
6069     {
6070         MHW_RENDERHAL_ASSERTMESSAGE("Invalid renderhal.");
6071         return false;
6072     }
6073     //-----------------------------------------
6074 
6075     if (pRenderHal->MediaWalkerMode == MHW_WALKER_MODE_DISABLED)
6076     {
6077         return false;
6078     }
6079 
6080     return true;
6081 }
6082 
6083 //!
6084 //! \brief      Get surface memory object control \
6085 //! \details    Returns surface memory object control
6086 //! \param      PRENDERHAL_INTERFACE pRenderHal
6087 //!             [in] Pointer to RenderHal Interface
6088 //! \param      PRENDERHAL_SURFACE_STATE_PARAMS pParams
6089 //!             [in] Pointer to surface state params
6090 //! \return     uint32_t
6091 //!
RenderHal_GetSurfaceMemoryObjectControl(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE_STATE_PARAMS pParams)6092 uint32_t RenderHal_GetSurfaceMemoryObjectControl(
6093     PRENDERHAL_INTERFACE            pRenderHal,
6094     PRENDERHAL_SURFACE_STATE_PARAMS pParams)
6095 {
6096     MHW_RENDERHAL_UNUSED(pRenderHal);
6097 
6098     //-----------------------------------------
6099     if (pParams == nullptr)
6100     {
6101         MHW_RENDERHAL_ASSERTMESSAGE("nullptr pointer.");
6102         return 0;
6103     }
6104     //-----------------------------------------
6105 
6106     return pParams->MemObjCtl;
6107 }
6108 
6109 //!
6110 //! \brief      Get the size of Scratch Space
6111 //! \details    Get scratch space size based on max gen config and scratch space
6112 //!             size per thread
6113 //!             FFTID is used by HW to access scratch space; since FFTID generated
6114 //!             is not continuous, need to allocate scratch space based on maximum gen config
6115 //! \param      PRENDERHAL_INTERFACE pRenderHal
6116 //!             [in]     Hardware interface
6117 //! \param      uint32_t iPerThreadScratchSpaceSize
6118 //!             [in]     Per thread scratch space size
6119 //! \return     uint32_t
6120 //!
RenderHal_GetScratchSpaceSize(PRENDERHAL_INTERFACE pRenderHal,uint32_t iPerThreadScratchSpaceSize)6121 uint32_t RenderHal_GetScratchSpaceSize(
6122     PRENDERHAL_INTERFACE       pRenderHal,
6123     uint32_t                   iPerThreadScratchSpaceSize)
6124 {
6125     MEDIA_SYSTEM_INFO             *pGtSystemInfo;
6126 
6127     //-----------------------------------------
6128     if (pRenderHal == nullptr)
6129     {
6130         MHW_RENDERHAL_ASSERTMESSAGE("Invalid renderhal.");
6131         return 0;
6132     }
6133     //-----------------------------------------
6134 
6135     pGtSystemInfo                       = pRenderHal->pOsInterface->pfnGetGtSystemInfo(pRenderHal->pOsInterface);
6136     uint32_t numHWThreadsPerEU          = pGtSystemInfo->ThreadCount / pGtSystemInfo->EUCount;
6137 
6138     uint32_t dwNumberOfScratchSpaceEntries = pGtSystemInfo->MaxEuPerSubSlice * numHWThreadsPerEU * pGtSystemInfo->MaxSubSlicesSupported;
6139     uint32_t dwScratchSpaceSize            = dwNumberOfScratchSpaceEntries * iPerThreadScratchSpaceSize;
6140 
6141     return dwScratchSpaceSize;
6142 }
6143 
6144 //!
6145 //! \brief    Setup OS specific surface state parameters
6146 //! \details  Setup Platform and Operating System Specific Surface State
6147 //! \param    PRENDERHAL_INTERFACE pRenderHal
6148 //!           [in] Pointer to Hardware Interface Structure
6149 //! \param    PRENDERHAL_SURFACE_STATE_PARAMS pParams
6150 //!           [in] Pointer to Surface Params
6151 //! \param    PRENDERHAL_SURFACE_STATE_ENTRY pSurfaceEntry
6152 //!           [in] Pointer to Surface State Entry
6153 //! \return   MOS_STATUS
6154 //!           MOS_STATUS_SUCCESS if successful
6155 //!
RenderHal_SetupSurfaceStatesOs(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE_STATE_PARAMS pParams,PRENDERHAL_SURFACE_STATE_ENTRY pSurfaceEntry)6156 MOS_STATUS RenderHal_SetupSurfaceStatesOs(
6157     PRENDERHAL_INTERFACE            pRenderHal,
6158     PRENDERHAL_SURFACE_STATE_PARAMS pParams,
6159     PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntry)
6160 {
6161     PMOS_SURFACE                    pSurface;
6162     MOS_STATUS                      eStatus = MOS_STATUS_SUCCESS;
6163     MHW_SURFACE_TOKEN_PARAMS        TokenParams;
6164 
6165     uint32_t additional_plane_offset = 0;
6166     uint32_t vertical_offset_in_surface_state = 0;
6167 
6168     //-----------------------------------------
6169     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6170     MHW_RENDERHAL_CHK_NULL_RETURN(pParams);
6171     MHW_RENDERHAL_CHK_NULL_RETURN(pSurfaceEntry);
6172     //-----------------------------------------
6173 
6174     pSurface = pSurfaceEntry->pSurface;
6175 
6176     // Surface, plane, offset
6177     TokenParams.pOsSurface         = pSurface;
6178     TokenParams.YUVPlane           = pSurfaceEntry->YUVPlane;
6179 
6180     switch (pSurfaceEntry->YUVPlane)
6181     {
6182         case MHW_U_PLANE:
6183             vertical_offset_in_surface_state = pSurface->UPlaneOffset.iYOffset;
6184             vertical_offset_in_surface_state &= 0x1C;  // The offset value in surface state commands.
6185             additional_plane_offset = pSurface->UPlaneOffset.iYOffset
6186                     - vertical_offset_in_surface_state;
6187             additional_plane_offset *= pSurface->dwPitch;
6188             TokenParams.dwSurfaceOffset = pSurface->UPlaneOffset.iSurfaceOffset
6189                     + additional_plane_offset;
6190             break;
6191         case MHW_V_PLANE:
6192             vertical_offset_in_surface_state = pSurface->VPlaneOffset.iYOffset;
6193             vertical_offset_in_surface_state &= 0x1C;
6194             additional_plane_offset = pSurface->VPlaneOffset.iYOffset
6195                     - vertical_offset_in_surface_state;
6196             additional_plane_offset *= pSurface->dwPitch;
6197             TokenParams.dwSurfaceOffset = pSurface->VPlaneOffset.iSurfaceOffset
6198                     + additional_plane_offset;
6199             break;
6200         default:
6201             vertical_offset_in_surface_state = pSurface->YPlaneOffset.iYOffset;
6202             vertical_offset_in_surface_state &= 0x1C;
6203             additional_plane_offset = pSurface->YPlaneOffset.iYOffset
6204                     - vertical_offset_in_surface_state;
6205             additional_plane_offset *= pSurface->dwPitch;
6206             TokenParams.dwSurfaceOffset
6207                     = pSurface->dwOffset + additional_plane_offset;
6208             //force it to 0 for 1D buffer
6209             if (pParams->bBufferUse)
6210             {
6211                 TokenParams.dwSurfaceOffset = 0;
6212             }
6213             break;
6214     }
6215 
6216     // Surface type
6217     TokenParams.bRenderTarget   = pParams->isOutput;
6218     TokenParams.bSurfaceTypeAvs = pSurfaceEntry->bAVS;
6219 
6220     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSetSurfaceStateToken(
6221             pRenderHal,
6222             &TokenParams,
6223             &pSurfaceEntry->SurfaceToken));
6224 
6225     return eStatus;
6226 }
6227 
6228 //!
6229 //! \brief    Bind Surface State
6230 //! \details  Binds Surface State
6231 //! \param    PRENDERHAL_INTERFACE pRenderHal
6232 //!           [in] Pointer to RenderHal Interface
6233 //! \param    int32_t iBindingTableIndex
6234 //!           [in] Binding Table Index
6235 //! \param    int32_t iBindingTableEntry
6236 //!           [out] Binding Table Entry
6237 //! \param    PRENDERHAL_SURFACE_STATE_ENTRY pSurfaceEntry
6238 //!           [in] Pointer to Surface State Entry
6239 //! \return   MOS_STATUS
6240 //!
RenderHal_BindSurfaceState(PRENDERHAL_INTERFACE pRenderHal,int32_t iBindingTableIndex,int32_t iBindingTableEntry,PRENDERHAL_SURFACE_STATE_ENTRY pSurfaceEntry)6241 MOS_STATUS RenderHal_BindSurfaceState(
6242     PRENDERHAL_INTERFACE            pRenderHal,
6243     int32_t                         iBindingTableIndex,
6244     int32_t                         iBindingTableEntry,
6245     PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntry)
6246 {
6247     PRENDERHAL_STATE_HEAP       pStateHeap;
6248     PMHW_RENDER_STATE_SIZES     pHwSizes;
6249     MHW_BINDING_TABLE_PARAMS    Params;
6250     uint32_t                    dwOffset;
6251     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
6252 
6253     //--------------------------------------------
6254     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6255     MHW_RENDERHAL_CHK_NULL_RETURN(pSurfaceEntry);
6256     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
6257     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
6258     MHW_RENDERHAL_ASSERT(iBindingTableIndex >= 0);
6259     MHW_RENDERHAL_ASSERT(iBindingTableEntry >= 0);
6260     if (iBindingTableEntry >= pRenderHal->StateHeapSettings.iSurfacesPerBT)
6261     {
6262         MHW_RENDERHAL_ASSERTMESSAGE("Unable to Bind Surface State. Exceeds Maximum. BTI %d. Maximum %d", iBindingTableEntry, pRenderHal->StateHeapSettings.iSurfacesPerBT);
6263         return MOS_STATUS_INVALID_PARAMETER;
6264     }
6265     //--------------------------------------------
6266 
6267     pStateHeap = pRenderHal->pStateHeap;
6268     pHwSizes   = pRenderHal->pHwSizes;
6269 
6270     // Get Offset to Current Binding Table
6271     dwOffset    = (pStateHeap->iCurSshBufferIndex * pStateHeap->dwSshIntanceSize) + // Points to the Base of Current SSH Buffer Instance
6272                   (pStateHeap->iBindingTableOffset)                               + // Moves the pointer to Base of Array of Binding Tables
6273                   (iBindingTableIndex * pStateHeap->iBindingTableSize)            + // Moves the pointer to a Particular Binding Table
6274                   (iBindingTableEntry * pHwSizes->dwSizeBindingTableState);         // Move the pointer to correct entry
6275 
6276     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->pSshBuffer);
6277     Params.pBindingTableEntry   = pStateHeap->pSshBuffer + dwOffset;
6278     Params.dwSurfaceStateOffset = pSurfaceEntry->dwSurfStateOffset;
6279     Params.bSurfaceStateAvs     = (pSurfaceEntry->Type == pRenderHal->SurfaceTypeAdvanced ) ? true : false;
6280     Params.iBindingTableEntry   = iBindingTableEntry;
6281 
6282     // Set binding table entry in MHW
6283     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pMhwStateHeap->SetBindingTableEntry(&Params));
6284 
6285     return eStatus;
6286 }
6287 
6288 //!
6289 //! \brief    Set Vfe State Params
6290 //! \details  Sets VFE State parameters
6291 //!           this functions must be called to setup
6292 //!           parameters for Mhw Render->AddMediaVfeCmd()
6293 //! \param    PRENDERHAL_INTERFACE pRenderHal
6294 //!           [in] Pointer to Hardware Interface Structure
6295 //! \param    uint32_t dwDebugCounterControl
6296 //!           [in] Debug Counter Control
6297 //! \param    uint32_t dwMaximumNumberofThreads
6298 //!           [in] Maximum Number of Threads
6299 //! \param    uint32_t dwCURBEAllocationSize
6300 //!           [in] CURBE Allocation Size
6301 //! \param    uint32_t dwURBEntryAllocationSize
6302 //!           [in] URB Entry Allocation Size
6303 //! \param    PRENDERHAL_SCOREBOARD_PARAMS pScoreboardParams
6304 //!           [in] Pointer to Scoreboard Params
6305 //! \return   MOS_STATUS
6306 //!
RenderHal_SetVfeStateParams(PRENDERHAL_INTERFACE pRenderHal,uint32_t dwDebugCounterControl,uint32_t dwMaximumNumberofThreads,uint32_t dwCURBEAllocationSize,uint32_t dwURBEntryAllocationSize,PMHW_VFE_SCOREBOARD pScoreboardParams)6307 MOS_STATUS RenderHal_SetVfeStateParams(
6308     PRENDERHAL_INTERFACE    pRenderHal,
6309     uint32_t                dwDebugCounterControl,
6310     uint32_t                dwMaximumNumberofThreads,
6311     uint32_t                dwCURBEAllocationSize,
6312     uint32_t                dwURBEntryAllocationSize,
6313     PMHW_VFE_SCOREBOARD     pScoreboardParams)
6314 {
6315     PMHW_VFE_PARAMS                 pVfeParams;
6316     PRENDERHAL_STATE_HEAP           pStateHeap;
6317     PMHW_RENDER_ENGINE_CAPS         pHwCaps;
6318     PRENDERHAL_STATE_HEAP_SETTINGS  pSettings;
6319     uint32_t                        dwMaxURBSize;
6320     uint32_t                        dwMaxCURBEAllocationSize;
6321     uint32_t                        dwMaxURBEntryAllocationSize;
6322     uint32_t                        dwNumberofURBEntries;
6323     uint32_t                        dwMaxURBEntries;
6324     uint32_t                        dwMaxInterfaceDescriptorEntries;
6325     MOS_STATUS                      eStatus;
6326     uint32_t i;
6327 
6328     //---------------------------------------------
6329     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6330     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pWaTable);
6331     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
6332     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwCaps);
6333     //---------------------------------------------
6334 
6335     eStatus     = MOS_STATUS_SUCCESS;
6336     pStateHeap  = pRenderHal->pStateHeap;
6337     pHwCaps     = pRenderHal->pHwCaps;
6338     pVfeParams  = pRenderHal->pRenderHalPltInterface->GetVfeStateParameters();
6339     MHW_RENDERHAL_CHK_NULL_RETURN(pVfeParams);
6340     pSettings   = &(pRenderHal->StateHeapSettings);
6341 
6342     pVfeParams->pKernelState             = nullptr;
6343     pVfeParams->eVfeSliceDisable         = MHW_VFE_SLICE_ALL;
6344 
6345     //-------------------------------------------------------------------------
6346     // --Gen6 GT1--
6347     // In this calculation, URBEntryAllocationSize and CURBEAllocationSize are
6348     // in 256-bit units:
6349     // (URBEntryAllocationSize * NumberofURBEntries + CURBEAllocationSize +
6350     //  MaxInterfaceDescriptorEntries) <= 1024
6351     //
6352     // --Gen6 GT2 + Gen7--
6353     // In this calculation, URBEntryAllocationSize and CURBEAllocationSize are
6354     // in 256-bit units:
6355     // (URBEntryAllocationSize * NumberofURBEntries + CURBEAllocationSize +
6356     //  MaxInterfaceDescriptorEntries) <= 2048
6357     //-------------------------------------------------------------------------
6358 
6359     // get the Max for all the fields
6360     dwMaxURBSize                    = pHwCaps->dwMaxURBSize;
6361     dwMaxURBEntries                 = pHwCaps->dwMaxURBEntries;
6362     dwMaxURBEntryAllocationSize     = pHwCaps->dwMaxURBEntryAllocationSize;
6363     dwMaxCURBEAllocationSize        = pHwCaps->dwMaxCURBEAllocationSize;
6364     dwMaxInterfaceDescriptorEntries = pHwCaps->dwMaxInterfaceDescriptorEntries;
6365 
6366     // CURBEAllocationSize must be >= CurbeTotalDataLength in CURBE_LOAD.
6367     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->pCurMediaState);
6368     dwCURBEAllocationSize = MOS_MAX(dwCURBEAllocationSize, (uint32_t)pStateHeap->pCurMediaState->iCurbeOffset);
6369 
6370     // CURBEAllocationSize is in 256-bit (32-byte) units, so we round up to
6371     // 32. We do not force it to be greater than zero because a Kernel may not
6372     // be using any CURBE parameters.
6373     dwCURBEAllocationSize = MOS_ROUNDUP_SHIFT(dwCURBEAllocationSize, 5);
6374 
6375     // URBEntryAllocationSize is in 256-bit (32-byte) units, so we round up to
6376     // 32. We ensure that it is greater than zero, because we will use this in
6377     // division when we calculate dwNumberofURBEntries, so we need a value
6378     // that is greater than zero.
6379     // URBEntryAllocationSize sets the size of the Inline Data. All the Inline
6380     // Data will be placed in the URB which is a buffer that is managed by the
6381     // hardware. When the thread is dispatched, the data in the URB will be
6382     // copied to the GRF.
6383     dwURBEntryAllocationSize = MOS_ROUNDUP_SHIFT(dwURBEntryAllocationSize, 5);
6384     dwURBEntryAllocationSize = MOS_MAX(1, dwURBEntryAllocationSize);
6385 
6386     // NumberofURBEntries defines the depth of the dispatch queue. Up to this
6387     // many threads can be in the queue. It's related to performance. For hardware,
6388     // we use the size of the Inline Data to calculate the maximum number of entries
6389     // we can use. We cap it to 32 URB entries, and then ensure that it is greater
6390     // than zero.
6391     dwNumberofURBEntries =
6392         (dwMaxURBSize - dwCURBEAllocationSize - dwMaxInterfaceDescriptorEntries) /
6393          dwURBEntryAllocationSize;
6394     dwNumberofURBEntries = MOS_CLAMP_MIN_MAX(dwNumberofURBEntries, 1, 32);
6395 
6396     pVfeParams->dwDebugCounterControl    = dwDebugCounterControl;
6397     pVfeParams->dwNumberofURBEntries     = dwNumberofURBEntries;
6398     pVfeParams->dwMaximumNumberofThreads = (dwMaximumNumberofThreads == RENDERHAL_USE_MEDIA_THREADS_MAX) ?
6399                                             pHwCaps->dwMaxThreads :
6400                                             MOS_MIN(dwMaximumNumberofThreads, pHwCaps->dwMaxThreads);
6401     pVfeParams->dwCURBEAllocationSize    = dwCURBEAllocationSize << 5;
6402     pVfeParams->dwURBEntryAllocationSize = dwURBEntryAllocationSize;
6403 
6404     MHW_RENDERHAL_ASSERT(dwNumberofURBEntries     <= dwMaxURBEntries);
6405     MHW_RENDERHAL_ASSERT(dwCURBEAllocationSize    <= dwMaxCURBEAllocationSize);
6406     MHW_RENDERHAL_ASSERT(dwURBEntryAllocationSize <= dwMaxURBEntryAllocationSize);
6407     MHW_RENDERHAL_ASSERT(dwNumberofURBEntries * dwURBEntryAllocationSize +
6408                          dwCURBEAllocationSize + dwMaxInterfaceDescriptorEntries <= dwMaxURBSize);
6409 
6410     // Setup Scoreboard Parameters
6411     if (pScoreboardParams)
6412     {
6413         MHW_RENDERHAL_ASSERT(pScoreboardParams->ScoreboardMask < 8);
6414 
6415         pRenderHal->VfeScoreboard.ScoreboardEnable = true;
6416         pRenderHal->VfeScoreboard.ScoreboardMask   = (1 << pScoreboardParams->ScoreboardMask) - 1;
6417         pRenderHal->VfeScoreboard.ScoreboardType   = pScoreboardParams->ScoreboardType;
6418         for (i = 0; i < pScoreboardParams->ScoreboardMask; i++)
6419         {
6420             pRenderHal->VfeScoreboard.ScoreboardDelta[i].x = pScoreboardParams->ScoreboardDelta[i].x;
6421             pRenderHal->VfeScoreboard.ScoreboardDelta[i].y = pScoreboardParams->ScoreboardDelta[i].y;
6422         }
6423     }
6424     else
6425     {
6426         pRenderHal->VfeScoreboard.ScoreboardEnable = true;
6427         pRenderHal->VfeScoreboard.ScoreboardMask   = 0x0;
6428     }
6429 
6430     // Setup VFE Scoreboard parameters
6431     pVfeParams->Scoreboard = pRenderHal->VfeScoreboard;
6432 
6433     // Setup Kernel Scratch Space
6434     if (pSettings->iPerThreadScratchSize > 0)
6435     {
6436         int32_t iSize;
6437         int32_t iRemain;
6438         int32_t iPerThreadScratchSize;
6439 
6440         MHW_RENDERHAL_ASSERT(pSettings->iPerThreadScratchSize ==
6441                              MOS_ALIGN_CEIL(pSettings->iPerThreadScratchSize, 1024));
6442 
6443         iPerThreadScratchSize = pSettings->iPerThreadScratchSize >> 10;
6444 
6445         iRemain               = iPerThreadScratchSize % 2;
6446         iPerThreadScratchSize = iPerThreadScratchSize / 2;
6447         iSize = 0;
6448         while (!iRemain && (iPerThreadScratchSize / 2))
6449         {
6450             iSize++;
6451             iRemain               = iPerThreadScratchSize % 2;
6452             iPerThreadScratchSize = iPerThreadScratchSize / 2;
6453         }
6454 
6455         MHW_RENDERHAL_ASSERT(!iRemain && iPerThreadScratchSize);
6456         MHW_RENDERHAL_ASSERT(iSize < 12);
6457         // Specifies the amount of scratch space allowed to be used by each
6458         // thread.  The driver must allocate enough contiguous scratch space,
6459         // pointed to by the Scratch Space Pointer, to ensure that the Maximum
6460         // Number of Threads each get Per Thread Scratch Space size without
6461         // exceeding the driver-allocated scratch space.
6462         // Range = [0,11] indicating [1k bytes, 12k bytes]
6463         pVfeParams->dwPerThreadScratchSpace = (uint32_t) iSize;
6464 
6465         // Specifies the 1k-byte aligned address offset to scratch space for
6466         // use by the kernel.  This pointer is relative to the
6467         // General State Base Address (1k aligned)
6468         // Format = GeneralStateOffset[31:10]
6469         pVfeParams->dwScratchSpaceBasePointer = pStateHeap->dwScratchSpaceBase;
6470     }
6471     else
6472     {
6473         pVfeParams->dwPerThreadScratchSpace   = 0;
6474         pVfeParams->dwScratchSpaceBasePointer = 0;
6475     }
6476 
6477     return eStatus;
6478 }
6479 
6480 //!
6481 //! \brief      Is two Planes NV12 Needed
6482 //! \details    Judge whether 2 plane NV12 is needed based on the width/height
6483 //!             and its rectangle for each boundary type
6484 //! \param      PRENDERHAL_INTERFACE pRenderHal
6485 //!             [in] pointer to RenderHal Interface
6486 //! \param      PRENDERHAL_SURFACE pRenderHalSurface
6487 //!             [in] pointer to input Surface
6488 //! \param      RENDERHAL_SS_BOUNDARY Boundary
6489 //!             [in] How the adjustment needs to be done
6490 //! \return     bool
6491 //!
RenderHal_Is2PlaneNV12Needed(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface,RENDERHAL_SS_BOUNDARY Boundary)6492 bool RenderHal_Is2PlaneNV12Needed(
6493     PRENDERHAL_INTERFACE   pRenderHal,
6494     PRENDERHAL_SURFACE     pRenderHalSurface,
6495     RENDERHAL_SS_BOUNDARY  Boundary)
6496 {
6497     PMOS_SURFACE pSurface;
6498     uint16_t wWidthAlignUnit;
6499     uint16_t wHeightAlignUnit;
6500     uint32_t dwSurfaceHeight;
6501     uint32_t dwSurfaceWidth;
6502     uint32_t widthAlignUnit;
6503     uint32_t heightAlignUnit;
6504     bool bRet = false;
6505 
6506     //---------------------------------------------
6507     if (pRenderHal == nullptr
6508      || pRenderHalSurface == nullptr)
6509     {
6510         MHW_RENDERHAL_ASSERTMESSAGE("nullptr pointer detected.");
6511         return bRet;
6512     }
6513     //---------------------------------------------
6514 
6515     pRenderHal->pfnGetAlignUnit(&wWidthAlignUnit, &wHeightAlignUnit, pRenderHalSurface);
6516     pSurface = &pRenderHalSurface->OsSurface;
6517 
6518      switch (Boundary)
6519     {
6520         case RENDERHAL_SS_BOUNDARY_SRCRECT:
6521             dwSurfaceHeight = pSurface->dwHeight;
6522             dwSurfaceWidth  = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwWidth, (uint32_t)pRenderHalSurface->rcSrc.right), wWidthAlignUnit);
6523             break;
6524 
6525         // align with max src rect
6526         case RENDERHAL_SS_BOUNDARY_MAXSRCRECT:
6527             dwSurfaceHeight = pSurface->dwHeight;
6528             dwSurfaceWidth  = MOS_ALIGN_CEIL(MOS_MIN(pSurface->dwWidth, (uint32_t)pRenderHalSurface->rcMaxSrc.right), wWidthAlignUnit);
6529             break;
6530 
6531         default:
6532             dwSurfaceHeight = MOS_ALIGN_CEIL(pSurface->dwHeight, wHeightAlignUnit);
6533             dwSurfaceWidth  = MOS_ALIGN_CEIL(pSurface->dwWidth,  wWidthAlignUnit);
6534             break;
6535     }
6536 
6537     // NV12 format needs the width and height to be a multiple for both 3D sampler and 8x8 sampler.
6538     // For AVS sampler, no limitation for 4 alignment.
6539     pRenderHal->pRenderHalPltInterface->GetSamplerResolutionAlignUnit(pRenderHal,
6540         RENDERHAL_SCALING_AVS == pRenderHalSurface->ScalingMode,
6541         widthAlignUnit,
6542         heightAlignUnit);
6543 
6544     bRet = (!MOS_IS_ALIGNED(dwSurfaceHeight, heightAlignUnit) || !MOS_IS_ALIGNED(dwSurfaceWidth, widthAlignUnit));
6545 
6546     // Note: Always using 2 plane NV12 as WA for the corruption of NV12 input, of which the height is greater than 16352
6547     // For 16k case, the height (16384) > 16383 which is the maximum capacity of DW (13:0).
6548     // Gmm (OS level) need 32 aligned for planar height in the driver and we are processing height as 16384 for the height from 16353 to 16384.
6549     bRet = bRet || (dwSurfaceHeight > 16352);
6550 
6551     return bRet;
6552 }
6553 
6554 //!
6555 //! \brief      Print Sampler Params
6556 //! \details
6557 //! \param      PMHW_SAMPLER_STATE_PARAM pSamplerParams
6558 //!             [in]    SamplerParams
PrintSamplerParams(int32_t iSamplerIndex,PMHW_SAMPLER_STATE_PARAM pSamplerParams)6559 void PrintSamplerParams(int32_t iSamplerIndex, PMHW_SAMPLER_STATE_PARAM pSamplerParams)
6560 {
6561 #if (_DEBUG || _RELEASE_INTERNAL)
6562     if (pSamplerParams == nullptr)
6563     {
6564         MHW_RENDERHAL_ASSERTMESSAGE("The SamplerParams pointer is null");
6565         return;
6566     }
6567 
6568     if (pSamplerParams->SamplerType == MHW_SAMPLER_TYPE_3D)
6569     {
6570         MHW_RENDERHAL_VERBOSEMESSAGE("SamplerParams: index = %x, bInUse = %x, SamplerType = %x, ElementType = %x, SamplerFilterMode = %x, MagFilter = %x, MinFilter = %x",
6571             iSamplerIndex,
6572             pSamplerParams->bInUse,
6573             pSamplerParams->SamplerType,
6574             pSamplerParams->ElementType,
6575             pSamplerParams->Unorm.SamplerFilterMode,
6576             pSamplerParams->Unorm.MagFilter,
6577             pSamplerParams->Unorm.MinFilter);
6578         MHW_RENDERHAL_VERBOSEMESSAGE("SamplerParams: index = %x, AddressU = %x, AddressV = %x, AddressW = %x, SurfaceFormat = %x, BorderColorRedU = %x, BorderColorGreenU = %x",
6579             iSamplerIndex,
6580             pSamplerParams->Unorm.AddressU,
6581             pSamplerParams->Unorm.AddressV,
6582             pSamplerParams->Unorm.AddressW,
6583             pSamplerParams->Unorm.SurfaceFormat,
6584             pSamplerParams->Unorm.BorderColorRedU,
6585             pSamplerParams->Unorm.BorderColorGreenU);
6586         MHW_RENDERHAL_VERBOSEMESSAGE("SamplerParams: index = %x, BorderColorBlueU = %x, BorderColorAlphaU = %x, IndirectStateOffset = %x, bBorderColorIsValid = %x, bChromaKeyEnable = %x, ChromaKeyIndex = %x, ChromaKeyMode = %x",
6587             iSamplerIndex,
6588             pSamplerParams->Unorm.BorderColorBlueU,
6589             pSamplerParams->Unorm.BorderColorAlphaU,
6590             pSamplerParams->Unorm.IndirectStateOffset,
6591             pSamplerParams->Unorm.bBorderColorIsValid,
6592             pSamplerParams->Unorm.bChromaKeyEnable,
6593             pSamplerParams->Unorm.ChromaKeyIndex,
6594             pSamplerParams->Unorm.ChromaKeyMode);
6595     }
6596     else
6597     {
6598         MHW_RENDERHAL_VERBOSEMESSAGE("SamplerParams: index = %x, bInUse = %x, SamplerType = %x, ElementType = %x",
6599             iSamplerIndex,
6600             pSamplerParams->bInUse,
6601             pSamplerParams->SamplerType,
6602             pSamplerParams->ElementType);
6603     }
6604 #endif
6605 }
6606 
6607 //!
6608 //! \brief      Sets Sampler States for Gen8
6609 //! \details    Initialize and set sampler states
6610 //! \param      PRENDERHAL_INTERFACE pRenderHal
6611 //!             [in]    Pointer to HW interface
6612 //! \param      int32_t iMediaID
6613 //!             [in]    Media Interface Descriptor ID
6614 //! \param      PRENDERHAL_SAMPLER_STATE_PARAMS pSamplerParams
6615 //!             [in]    Pointer to sampler state parameters
6616 //! \param      int32_t iSamplers
6617 //!             [in]    Number of samplers
6618 //! \return     MOS_STATUS MOS_STATUS_SUCCESS if success, otherwise MOS_STATUS_UNKNOWN
6619 //!
RenderHal_SetSamplerStates(PRENDERHAL_INTERFACE pRenderHal,int32_t iMediaID,PMHW_SAMPLER_STATE_PARAM pSamplerParams,int32_t iSamplers)6620 MOS_STATUS RenderHal_SetSamplerStates(
6621     PRENDERHAL_INTERFACE        pRenderHal,
6622     int32_t                     iMediaID,
6623     PMHW_SAMPLER_STATE_PARAM    pSamplerParams,
6624     int32_t                     iSamplers)
6625 {
6626     MOS_STATUS                  eStatus;
6627     PRENDERHAL_STATE_HEAP       pStateHeap;
6628     PMHW_SAMPLER_STATE_PARAM    pSamplerStateParams;
6629     PRENDERHAL_MEDIA_STATE      pMediaState;
6630     int32_t                     iOffsetSampler;
6631     uint8_t                     *pPtrSampler;
6632     uint8_t                     *pPtrSamplerAvs;
6633     int32_t                     i;
6634 
6635     eStatus = MOS_STATUS_UNKNOWN;
6636 
6637     //-----------------------------------------------
6638     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6639     MHW_RENDERHAL_CHK_NULL_RETURN(pSamplerParams);
6640     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
6641     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->pCurMediaState);
6642     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
6643     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pMhwStateHeap);
6644     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->pGshBuffer);
6645     MHW_RENDERHAL_ASSERT( iSamplers <= pRenderHal->StateHeapSettings.iSamplers );
6646     MHW_RENDERHAL_ASSERT((iMediaID >= 0) && (iMediaID < pRenderHal->StateHeapSettings.iMediaIDs));
6647     //-----------------------------------------------
6648     pStateHeap  = pRenderHal->pStateHeap;
6649     pMediaState = pRenderHal->pStateHeap->pCurMediaState;
6650 
6651     // Offset/Pointer to Samplers
6652     iOffsetSampler   = pMediaState->dwOffset +                      // Offset to media state
6653                        pStateHeap->dwOffsetSampler +                // Offset to sampler area
6654                        iMediaID * pStateHeap->dwSizeSamplers;       // Samplers for media ID
6655     pPtrSampler      = pStateHeap->pGshBuffer + iOffsetSampler;     // Pointer to Samplers
6656 
6657     iOffsetSampler   = pMediaState->dwOffset +                      // Offset to media state
6658                        pStateHeap->dwOffsetSamplerAVS +             // Offset to sampler area
6659                        iMediaID * pStateHeap->dwSizeSamplers;       // Samplers for media ID
6660     pPtrSamplerAvs   = pStateHeap->pGshBuffer + iOffsetSampler;     // Pointer to AVS Samplers
6661 
6662     // Setup sampler states
6663     pSamplerStateParams = pSamplerParams;  // Pointer to First Sampler State in array
6664     for (i = 0; i < iSamplers; i++, pSamplerStateParams++,
6665         pPtrSampler += pRenderHal->pHwSizes->dwSizeSamplerState)
6666     {
6667         PrintSamplerParams(i, pSamplerStateParams);
6668         if (pSamplerStateParams->bInUse)
6669         {
6670             MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pOsInterface->pfnSetCmdBufferDebugInfo(
6671                 pRenderHal->pOsInterface,
6672                 true,    //bSamplerState
6673                 false,   //bSurfaceState
6674                 i,
6675                 pSamplerStateParams->SamplerType));
6676 
6677             switch (pSamplerStateParams->SamplerType)
6678             {
6679             case MHW_SAMPLER_TYPE_3D:
6680                 eStatus = pRenderHal->pMhwStateHeap->SetSamplerState(pPtrSampler, pSamplerStateParams);
6681                 break;
6682             case MHW_SAMPLER_TYPE_AVS:
6683                 eStatus = pRenderHal->pMhwStateHeap->SetSamplerState(pPtrSamplerAvs, pSamplerStateParams);
6684                 pPtrSamplerAvs += pRenderHal->dwSamplerAvsIncrement;
6685                 break;
6686             default:
6687                 eStatus = MOS_STATUS_INVALID_PARAMETER;
6688                 MHW_RENDERHAL_ASSERTMESSAGE("Unknown Sampler Type.");
6689                 break;
6690             }
6691 
6692             if (MOS_FAILED(eStatus))
6693             {
6694                 MHW_RENDERHAL_ASSERTMESSAGE("Failed to setup Sampler");
6695                 return eStatus;
6696             }
6697         }
6698     }
6699 
6700     eStatus = MOS_STATUS_SUCCESS;
6701 
6702     return eStatus;
6703 }
6704 
6705 //!
6706 //! \brief      Sets Sampler States for Gen8
6707 //! \details    Initialize and set sampler states
6708 //! \param      PRENDERHAL_INTERFACE pRenderHal
6709 //!             [in]    Pointer to HW interface
6710 //! \param      int32_t iMediaID
6711 //!             [in]    Media Interface Descriptor ID
6712 //! \param      PRENDERHAL_SAMPLER_STATE_PARAMS pSamplerParams
6713 //!             [in]    Pointer to sampler state parameters
6714 //! \param      int32_t iSamplers
6715 //!             [in]    Number of samplers
6716 //! \return     MOS_STATUS MOS_STATUS_SUCCESS if success, otherwise MOS_STATUS_UNKNOWN
6717 //!
RenderHal_SetAndGetSamplerStates(PRENDERHAL_INTERFACE pRenderHal,int32_t iMediaID,PMHW_SAMPLER_STATE_PARAM pSamplerParams,int32_t iSamplers,std::map<uint32_t,uint32_t> & samplerMap)6718 MOS_STATUS RenderHal_SetAndGetSamplerStates(
6719     PRENDERHAL_INTERFACE     pRenderHal,
6720     int32_t                  iMediaID,
6721     PMHW_SAMPLER_STATE_PARAM pSamplerParams,
6722     int32_t                  iSamplers,
6723     std::map<uint32_t, uint32_t> &samplerMap)
6724 {
6725     MOS_STATUS               eStatus;
6726     PRENDERHAL_STATE_HEAP    pStateHeap;
6727     PMHW_SAMPLER_STATE_PARAM pSamplerStateParams;
6728     PRENDERHAL_MEDIA_STATE   pMediaState;
6729     int32_t                  iOffsetSampler;
6730     uint8_t                 *pPtrSampler;
6731     int32_t                  i;
6732     uint32_t                 stateOffsets = 0;
6733 
6734     eStatus = MOS_STATUS_UNKNOWN;
6735 
6736     //-----------------------------------------------
6737     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6738     MHW_RENDERHAL_CHK_NULL_RETURN(pSamplerParams);
6739     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
6740     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->pCurMediaState);
6741     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
6742     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pMhwStateHeap);
6743     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap->pGshBuffer);
6744     MHW_RENDERHAL_ASSERT(iSamplers <= pRenderHal->StateHeapSettings.iSamplers);
6745     MHW_RENDERHAL_ASSERT((iMediaID >= 0) && (iMediaID < pRenderHal->StateHeapSettings.iMediaIDs));
6746     //-----------------------------------------------
6747 
6748 
6749     if (pRenderHal->isBindlessHeapInUse == false)
6750     {
6751         return RenderHal_SetSamplerStates(pRenderHal, iMediaID, pSamplerParams, iSamplers);
6752     }
6753     else
6754     {
6755         pStateHeap  = pRenderHal->pStateHeap;
6756         pMediaState = pRenderHal->pStateHeap->pCurMediaState;
6757 
6758         // Offset/Pointer to Samplers
6759         iOffsetSampler = pMediaState->dwOffset +                 // Offset to media state
6760                          pStateHeap->dwOffsetSampler +           // Offset to sampler area
6761                          iMediaID * pStateHeap->dwSizeSamplers;  // Samplers for media ID
6762 
6763         pPtrSampler = pStateHeap->pGshBuffer + iOffsetSampler;  // Pointer to Samplers
6764 
6765         // Setup sampler states
6766         pSamplerStateParams = pSamplerParams;  // Pointer to First Sampler State in array
6767         if (samplerMap.size() != 0)
6768         {
6769             MHW_RENDERHAL_ASSERTMESSAGE("samplerMap is not empty!");
6770             samplerMap.clear();
6771         }
6772         for (i = 0; i < iSamplers; i++, pSamplerStateParams++, pPtrSampler += pRenderHal->pHwSizes->dwSizeSamplerState)
6773         {
6774             PrintSamplerParams(i, pSamplerStateParams);
6775             if (pSamplerStateParams->bInUse)
6776             {
6777                 MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pOsInterface->pfnSetCmdBufferDebugInfo(
6778                     pRenderHal->pOsInterface,
6779                     true,   //bSamplerState
6780                     false,  //bSurfaceState
6781                     i,
6782                     pSamplerStateParams->SamplerType));
6783 
6784                 switch (pSamplerStateParams->SamplerType)
6785                 {
6786                 case MHW_SAMPLER_TYPE_3D:
6787                     stateOffsets = iOffsetSampler + i * pRenderHal->pHwSizes->dwSizeSamplerState;
6788                     eStatus      = pRenderHal->pMhwStateHeap->SetSamplerState(pPtrSampler, pSamplerStateParams);
6789                     break;
6790                 default:
6791                     eStatus = MOS_STATUS_INVALID_PARAMETER;
6792                     MHW_RENDERHAL_ASSERTMESSAGE("Unknown Sampler Type.");
6793                     break;
6794                 }
6795 
6796                 samplerMap.insert(std::make_pair(i, stateOffsets));
6797 
6798                 if (MOS_FAILED(eStatus))
6799                 {
6800                     MHW_RENDERHAL_ASSERTMESSAGE("Failed to setup Sampler");
6801                     return eStatus;
6802                 }
6803             }
6804         }
6805 
6806         eStatus = MOS_STATUS_SUCCESS;
6807 
6808         return eStatus;
6809 
6810     }
6811 
6812 }
6813 
6814     //!
6815 //! \brief    Setup Surface State
6816 //! \details  Setup Surface States
6817 //! \param    PRENDERHAL_INTERFACE pRenderHal
6818 //!           [in] Pointer to Hardware Interface Structure
6819 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
6820 //!           [in] Pointer to Render Hal Surface
6821 //! \param    PRENDERHAL_SURFACE_STATE_PARAMS pParams
6822 //!           [in] Pointer to Surface State Params
6823 //! \param    int32_t *piNumEntries
6824 //!           [out] Pointer to Number of Surface State Entries (Num Planes)
6825 //! \param    PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntries
6826 //!           [out] Array of Surface State Entries
6827 //! \param    PRENDERHAL_OFFSET_OVERRIDE pOffsetOverride
6828 //!           [in] If not nullptr, provides adjustments to Y, UV plane offsets,
6829 //!           used for kernel in a few cases. nullptr is the most common usage.
6830 //! \return   MOS_STATUS
6831 //!
RenderHal_SetupSurfaceState(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface,PRENDERHAL_SURFACE_STATE_PARAMS pParams,int32_t * piNumEntries,PRENDERHAL_SURFACE_STATE_ENTRY * ppSurfaceEntries,PRENDERHAL_OFFSET_OVERRIDE pOffsetOverride)6832 MOS_STATUS RenderHal_SetupSurfaceState(
6833     PRENDERHAL_INTERFACE            pRenderHal,
6834     PRENDERHAL_SURFACE              pRenderHalSurface,
6835     PRENDERHAL_SURFACE_STATE_PARAMS pParams,
6836     int32_t                         *piNumEntries,
6837     PRENDERHAL_SURFACE_STATE_ENTRY  *ppSurfaceEntries,
6838     PRENDERHAL_OFFSET_OVERRIDE      pOffsetOverride)
6839 {
6840     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
6841 
6842     //-----------------------------------------------
6843     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6844     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
6845     //-----------------------------------------------
6846 
6847     if (pParams->surfaceType)
6848     {
6849         MOS_CACHE_ELEMENT element(MOS_CODEC_RESOURCE_USAGE_BEGIN_CODEC, MOS_CODEC_RESOURCE_USAGE_BEGIN_CODEC);
6850         bool              res = pRenderHal->pOsInterface->pfnGetCacheSetting(pParams->Component, pParams->surfaceType, pParams->isOutput, RENDER_ENGINE, element, false);
6851         if (res)
6852         {
6853             pParams->MemObjCtl = (pRenderHal->pOsInterface->pfnCachePolicyGetMemoryObject(
6854                                                             element.mocsUsageType,
6855                                                             pRenderHal->pOsInterface->pfnGetGmmClientContext(pRenderHal->pOsInterface)))
6856                                                             .DwordValue;
6857         }
6858         else
6859         {
6860             MHW_RENDERHAL_ASSERTMESSAGE("Not found cache settings!");
6861         }
6862     }
6863     else
6864     {
6865         MHW_RENDERHAL_NORMALMESSAGE("Not implemented yet! Will use MemObjCtl value %d", pParams->MemObjCtl);
6866     }
6867     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SetupSurfaceState(
6868         pRenderHal, pRenderHalSurface, pParams, piNumEntries, ppSurfaceEntries, pOffsetOverride));
6869 
6870     return eStatus;
6871 }
6872 
6873 //!
6874 //! \brief    Get offset and/or pointer to sampler state
6875 //! \details  Get offset and/or pointer to sampler state in General State Heap
6876 //! \param    PRENDERHAL_INTERFACE pRenderHal
6877 //!           [in] Pointer to RenderHal Interface
6878 //! \param    int32_t iMediaID
6879 //!           [in] Media ID associated with sampler
6880 //! \param    int32_t iSamplerID
6881 //!           [in] Sampler ID
6882 //! \param    uint32_t *pdwSamplerOffset
6883 //!           [out] optional; offset of sampler state from GSH base
6884 //! \param    void  **ppSampler
6885 //!           [out] optional; pointer to sampler state in GSH
6886 //! \return   MOS_STATUS
6887 //!
RenderHal_GetSamplerOffsetAndPtr(PRENDERHAL_INTERFACE pRenderHal,int32_t iMediaID,int32_t iSamplerID,PMHW_SAMPLER_STATE_PARAM pSamplerParams,uint32_t * pdwSamplerOffset,void ** ppSampler)6888 MOS_STATUS RenderHal_GetSamplerOffsetAndPtr(
6889     PRENDERHAL_INTERFACE     pRenderHal,
6890     int32_t                  iMediaID,
6891     int32_t                  iSamplerID,
6892     PMHW_SAMPLER_STATE_PARAM pSamplerParams,
6893     uint32_t                 *pdwSamplerOffset,
6894     void                    **ppSampler)
6895 {
6896     PRENDERHAL_STATE_HEAP        pStateHeap;
6897     uint32_t                     dwOffset = 0;
6898     MHW_SAMPLER_ELEMENT_TYPE     ElementType;
6899     MHW_SAMPLER_TYPE             SamplerType;
6900     MOS_STATUS                   eStatus = MOS_STATUS_SUCCESS;
6901     uint32_t                     ElementSize[MHW_SamplerTotalElements] = {1, 2, 4, 8, 64, 128};
6902 
6903     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
6904     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pStateHeap);
6905     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwSizes);
6906     pStateHeap = pRenderHal->pStateHeap;
6907 
6908     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->pCurMediaState);
6909     MHW_RENDERHAL_CHK_NULL_RETURN(pStateHeap->pGshBuffer);
6910     MHW_ASSERT(iMediaID   < pRenderHal->StateHeapSettings.iMediaIDs);
6911     MHW_ASSERT(iSamplerID < pRenderHal->StateHeapSettings.iSamplers);
6912     MHW_RENDERHAL_CHK_NULL_RETURN(pSamplerParams);
6913 
6914     ElementType = pSamplerParams->ElementType;
6915     SamplerType = pSamplerParams->SamplerType;
6916 
6917     if (SamplerType == MHW_SAMPLER_TYPE_VME)
6918     {
6919         dwOffset = pStateHeap->pCurMediaState->dwOffset +                 // Offset to current media state base
6920             pStateHeap->dwOffsetSampler +                                 // Go to base of the sampler area
6921             iMediaID   * pStateHeap->dwSizeSampler +                      // Go to base of media ID's sampler area
6922             iSamplerID * pRenderHal->pHwSizes->dwSizeSamplerState;        // Goto to "samplerID" sampler state
6923     }
6924     else
6925     {
6926         switch (ElementType)
6927         {
6928         case MHW_Sampler1Element:
6929         case MHW_Sampler4Elements:
6930         {
6931             dwOffset = pStateHeap->pCurMediaState->dwOffset +             // Offset to current media state base
6932                 pStateHeap->dwOffsetSampler +                             // Go to base of the sampler area
6933                 iMediaID   * pStateHeap->dwSizeSampler +                  // Go to base of media ID's sampler area
6934                 iSamplerID * pRenderHal->pHwSizes->dwSizeSamplerState;    // Goto to "samplerID" sampler state
6935             if (pSamplerParams)
6936             {
6937                 pSamplerParams->Unorm.IndirectStateOffset =
6938                     pStateHeap->pCurMediaState->dwOffset +                // Offset to current media state base
6939                     pStateHeap->dwOffsetSamplerIndirect +                 // Go to base of the sampler indirect area
6940                     iMediaID   * pStateHeap->dwSizeSampler +              // Go to base of media ID's sampler area
6941                     iSamplerID * pRenderHal->pHwSizes->dwSizeSamplerIndirectState;   // Goto to "samplerID" sampler indirect state
6942                 pSamplerParams->Unorm.pIndirectState = (void *)(pStateHeap->pGshBuffer + pSamplerParams->Unorm.IndirectStateOffset);
6943             }
6944             break;
6945         }
6946         case MHW_Sampler2Elements:
6947         case MHW_Sampler8Elements:
6948             dwOffset = pStateHeap->pCurMediaState->dwOffset +             // Offset to current media state base
6949                 pStateHeap->dwOffsetSampler +                             // Go to base of the sampler area
6950                 iMediaID   * pStateHeap->dwSizeSampler +                  // Go to base of media ID's sampler area
6951                 iSamplerID * ElementSize[ElementType] * 16;               // Goto to "samplerID" sampler state
6952             break;
6953 
6954         case MHW_Sampler64Elements:
6955             dwOffset = pStateHeap->pCurMediaState->dwOffset +             // Offset to current media state base
6956                 pStateHeap->dwOffsetSampler +                             // Go to base of the sampler area
6957                 iMediaID   * pStateHeap->dwSizeSampler +                  // Go to base of media ID's sampler area
6958                 iSamplerID * 32 * 16;                                     // Goto to "samplerID" sampler state
6959             break;
6960 
6961         case MHW_Sampler128Elements:
6962             if (pRenderHal->pRenderHalPltInterface->IsSampler128ElementsSupported())
6963             {
6964                 dwOffset = pStateHeap->pCurMediaState->dwOffset +         // Offset to current media state base
6965                 pStateHeap->dwOffsetSampler +                             // Go to base of the sampler area
6966                 iMediaID   * pStateHeap->dwSizeSampler +                  // Go to base of media ID's sampler area
6967                 iSamplerID * ElementSize[ElementType] * 16;                                        // Goto to "samplerID" sampler state
6968             } else
6969             {
6970                 MHW_RENDERHAL_NORMALMESSAGE("Platform doesn't have any 128 element sampler, quit!");
6971                 eStatus = MOS_STATUS_INVALID_PARAMETER;
6972             }
6973             break;
6974         default:
6975             MHW_RENDERHAL_NORMALMESSAGE("Failed to parse sampler - invalid sampler type.");
6976             eStatus = MOS_STATUS_INVALID_PARAMETER;
6977             break;
6978         }
6979     }
6980     if (pdwSamplerOffset)
6981     {
6982         *pdwSamplerOffset = dwOffset;
6983     }
6984 
6985     if (ppSampler)
6986     {
6987         *ppSampler = (void *)(pStateHeap->pGshBuffer + dwOffset);
6988     }
6989 
6990     return eStatus;
6991 }
6992 
6993 //!
6994 //! \brief      Checks how per thread scratch space size bits in VFE state are interpreted by HW
6995 //! \details    For BDW GT1/2/3 A0 steppings, per thread scratch space size in VFE state
6996 //!             is 11 bits indicating [2k bytes, 2 Mbytes]: 0=2k, 1=4k, 2=8k ... 10=2M
6997 //!             BDW+ excluding A0 step is 12 bits indicating [1k bytes, 2 Mbytes]: 0=1k, 1=2k, 2=4k, 3=8k ... 11=2M
6998 //! \param      PRENDERHAL_INTERFACE pRenderHal
6999 //!             [in]    Pointer to RenderHal interface
7000 //! \return     true if BDW A0 stepping, false otherwise
7001 //!
RenderHal_PerThreadScratchSpaceStart2K(PRENDERHAL_INTERFACE pRenderHal)7002 bool RenderHal_PerThreadScratchSpaceStart2K(
7003     PRENDERHAL_INTERFACE pRenderHal)
7004 {
7005     if (pRenderHal == nullptr || pRenderHal->pRenderHalPltInterface == nullptr)
7006     {
7007         MHW_RENDERHAL_ASSERTMESSAGE("Invalid (nullptr) Pointer.");
7008         return false;
7009     }
7010 
7011     return pRenderHal->pRenderHalPltInterface->PerThreadScratchSpaceStart2K(pRenderHal);
7012 }
7013 
7014 //!
7015 //! \brief    Encode SLM Size for Interface Descriptor
7016 //! \details  Setup SLM size
7017 //! \param      PRENDERHAL_INTERFACE pRenderHal
7018 //!             [in]    Pointer to RenderHal interface
7019 //! \param    uint32_t SLMSize
7020 //!             [in] SLM size in 1K
7021 //! \return   encoded output
7022 //!
RenderHal_EncodeSLMSize(PRENDERHAL_INTERFACE pRenderHal,uint32_t SLMSize)7023 uint32_t RenderHal_EncodeSLMSize(
7024     PRENDERHAL_INTERFACE pRenderHal,
7025     uint32_t             SLMSize)
7026 {
7027     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7028     if (pRenderHal == nullptr || pRenderHal->pRenderHalPltInterface == nullptr)
7029     {
7030         MHW_RENDERHAL_ASSERTMESSAGE("Invalid (nullptr) Pointer.");
7031         return 0;
7032     }
7033 
7034     return pRenderHal->pRenderHalPltInterface->EncodeSLMSize(SLMSize);
7035 }
7036 
7037 //!
7038 //! \brief    Set Chroma Direction
7039 //! \details  Setup Chroma Direction
7040 //! \param    PRENDERHAL_INTERFACE pRenderHal
7041 //!           [in]  Pointer to Hardware Interface
7042 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
7043 //!           [in]  Pointer to Render Hal Surface
7044 //! \return   uint8_t
7045 //!
RenderHal_SetChromaDirection(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface)7046 uint8_t RenderHal_SetChromaDirection(
7047     PRENDERHAL_INTERFACE pRenderHal,
7048     PRENDERHAL_SURFACE   pRenderHalSurface)
7049 {
7050     if (pRenderHal == nullptr || pRenderHal->pRenderHalPltInterface == nullptr)
7051     {
7052         MHW_RENDERHAL_ASSERTMESSAGE("Invalid (nullptr) Pointer.");
7053         return false;
7054     }
7055 
7056     return pRenderHal->pRenderHalPltInterface->SetChromaDirection(pRenderHal, pRenderHalSurface);
7057 }
7058 
7059 //!
7060 //! \brief    Convert To Nano Seconds
7061 //! \details  Convert to Nano Seconds
7062 //! \param    PRENDERHAL_INTERFACE pRenderHal
7063 //!           [in] Pointer to Hardware Interface Structure
7064 //! \param    uint64_t iTicks
7065 //!           [in] Ticks
7066 //! \param    uint64_t *piNs
7067 //!           [in] Nano Seconds
7068 //! \return   void
7069 //!
RenderHal_ConvertToNanoSeconds(PRENDERHAL_INTERFACE pRenderHal,uint64_t iTicks,uint64_t * piNs)7070 void RenderHal_ConvertToNanoSeconds(
7071     PRENDERHAL_INTERFACE                pRenderHal,
7072     uint64_t                            iTicks,
7073     uint64_t                            *piNs)
7074 {
7075     if (pRenderHal == nullptr || pRenderHal->pRenderHalPltInterface == nullptr)
7076     {
7077         MHW_RENDERHAL_ASSERTMESSAGE("Invalid (nullptr) Pointer.");
7078         return;
7079     }
7080     pRenderHal->pRenderHalPltInterface->ConvertToNanoSeconds(pRenderHal, iTicks, piNs);
7081 }
7082 
7083 //!
7084 //! \brief    Enables L3 cacheing flag and sets related registers/values
7085 //! \param    PRENDERHAL_INTERFACE    pRenderHal
7086 //!           [in]  Pointer to Hardware Interface
7087 //! \param    pCacheSettings
7088 //!           [in] L3 Cache Configurations
7089 //! \return   MOS_STATUS
7090 //!           MOS_STATUS_SUCCESS if success, else fail reason
7091 //!
RenderHal_EnableL3Caching(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_L3_CACHE_SETTINGS pCacheSettings)7092 MOS_STATUS RenderHal_EnableL3Caching(
7093     PRENDERHAL_INTERFACE                pRenderHal,
7094     PRENDERHAL_L3_CACHE_SETTINGS        pCacheSettings)
7095 {
7096     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7097     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
7098     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
7099 
7100     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->EnableL3Caching(pRenderHal, pCacheSettings));
7101 
7102     return eStatus;
7103 }
7104 
7105 //!
7106 //! \brief      Set L3 cache override config parameters
7107 //! \param      [in] pRenderHal
7108 //!             Pointer to RenderHal Interface Structure
7109 //! \param      [in,out] pCacheSettings
7110 //!             Pointer to pCacheSettings
7111 //! \param      [in] bEnableSLM
7112 //!             Flag to enable SLM
7113 //! \return     MOS_STATUS
7114 //!             MOS_STATUS_SUCCESS if success. Error code otherwise
7115 //!
RenderHal_SetCacheOverrideParams(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_L3_CACHE_SETTINGS pCacheSettings,bool bEnableSLM)7116 MOS_STATUS RenderHal_SetCacheOverrideParams(
7117     PRENDERHAL_INTERFACE            pRenderHal,
7118     PRENDERHAL_L3_CACHE_SETTINGS    pCacheSettings,
7119     bool                            bEnableSLM)
7120 {
7121     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
7122 
7123     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
7124     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
7125 
7126     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pRenderHalPltInterface->SetCacheOverrideParams(
7127         pRenderHal,
7128         pCacheSettings,
7129         bEnableSLM)
7130     );
7131 
7132     pCacheSettings->bOverride =
7133         pCacheSettings->bCntlRegOverride  ||
7134         pCacheSettings->bCntlReg2Override ||
7135         pCacheSettings->bCntlReg3Override ||
7136         pCacheSettings->bLra1RegOverride  ||
7137         pCacheSettings->bSqcReg1Override;
7138 
7139     return eStatus;
7140 }
7141 
7142 //!
7143 //! \brief    Send Surface State Entry
7144 //! \param    [in] pRenderHal
7145 //!           pointer to render hal
7146 //! \param    [in] pCmdBuffer
7147 //!           pointer to command buffer
7148 //! \param    [in] pParams
7149 //!           pointer to surface state send parameters
7150 //! \return   MOS_STATUS
7151 //!           MOS_STATUS_SUCCESS if success, else fail reason
7152 //!
RenderHal_SendSurfaceStateEntry(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_SURFACE_STATE_SEND_PARAMS pParams)7153 MOS_STATUS RenderHal_SendSurfaceStateEntry(
7154     PRENDERHAL_INTERFACE            pRenderHal,
7155     PMOS_COMMAND_BUFFER             pCmdBuffer,
7156     PMHW_SURFACE_STATE_SEND_PARAMS  pParams)
7157 {
7158     //-----------------------------------------------
7159     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
7160     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
7161     MHW_RENDERHAL_CHK_NULL_RETURN(pParams);
7162     //-----------------------------------------------
7163     uint8_t *pbPtrCmdBuf;
7164     if (pRenderHal->isBindlessHeapInUse)
7165     {
7166         MHW_RENDERHAL_CHK_NULL_RETURN(pParams->pIndirectStateBase);
7167         pbPtrCmdBuf = pParams->pIndirectStateBase;
7168     }
7169     else
7170     {
7171         MHW_RENDERHAL_CHK_NULL_RETURN(pCmdBuffer);
7172         pbPtrCmdBuf = (uint8_t *)pCmdBuffer->pCmdBase;
7173     }
7174 
7175     PMOS_INTERFACE     pOsInterface = pRenderHal->pOsInterface;
7176     uint8_t            *pSurfaceState = pParams->pSurfaceStateSource;
7177     int32_t            iSurfaceStateOffset = pParams->iSurfaceStateOffset;
7178     int32_t            iIndirectStateBase = pParams->iIndirectStateBase;
7179 
7180     SURFACE_STATE_TOKEN_COMMON *pSurfaceStateToken = (SURFACE_STATE_TOKEN_COMMON*)pParams->pSurfaceToken;
7181 
7182     uint32_t* pdwCmd = (uint32_t*)(pParams->pIndirectStateBase + iSurfaceStateOffset);
7183     uint32_t locationInCmd = 0;
7184 
7185     // Copy surface state from system memory to graphics memory/indirect state
7186     if (pSurfaceStateToken->DW3.SurfaceStateType == MEDIASTATE_BTS_DEFAULT_TYPE)
7187     {
7188         MOS_SecureMemcpy(pdwCmd, pRenderHal->pHwSizes->dwSizeSurfaceState,
7189             pSurfaceState, pRenderHal->pHwSizes->dwSizeSurfaceState);
7190 
7191         // Patch offset is 8 DW from the surface state base
7192         pdwCmd += 8;
7193         iSurfaceStateOffset += 8 * sizeof(uint32_t);
7194         locationInCmd = 8;
7195     }
7196     else
7197     {
7198         MOS_SecureMemcpy(pdwCmd, pRenderHal->pHwSizes->dwSizeSurfaceStateAvs,
7199             pSurfaceState, pRenderHal->pHwSizes->dwSizeSurfaceStateAvs);
7200 
7201         // Patch offset is 6 DW from the surface state base
7202         pdwCmd += 6;
7203         iSurfaceStateOffset += 6 * sizeof(uint32_t);
7204         locationInCmd = 6;
7205     }
7206 
7207     if (pOsInterface->bUsesGfxAddress)
7208     {
7209         *pdwCmd = pSurfaceStateToken->DW4.SurfaceBaseAddress;
7210         *(pdwCmd + 1) = pSurfaceStateToken->DW5.SurfaceBaseAddress64;
7211     }
7212 
7213     if (pSurfaceStateToken->pResourceInfo)
7214     {
7215         HalOcaInterfaceNext::DumpResourceInfo(*pCmdBuffer, *pOsInterface, *(PMOS_RESOURCE)(pSurfaceStateToken->pResourceInfo), (MOS_HW_COMMAND)pSurfaceStateToken->DW0.DriverID,
7216             locationInCmd, 0);
7217     }
7218 
7219     MOS_PATCH_ENTRY_PARAMS PatchEntryParams;
7220 
7221     MOS_ZeroMemory(&PatchEntryParams, sizeof(PatchEntryParams));
7222     PatchEntryParams.uiAllocationIndex  = pSurfaceStateToken->DW1.SurfaceAllocationIndex;
7223     PatchEntryParams.uiResourceOffset = pSurfaceStateToken->DW2.SurfaceOffset;
7224     PatchEntryParams.uiPatchOffset    = iIndirectStateBase + iSurfaceStateOffset;
7225     PatchEntryParams.bWrite           = pSurfaceStateToken->DW3.RenderTargetEnable;
7226     PatchEntryParams.HwCommandType    = (MOS_HW_COMMAND)pSurfaceStateToken->DW0.DriverID;
7227     PatchEntryParams.forceDwordOffset = 0;
7228     PatchEntryParams.cmdBufBase       = pbPtrCmdBuf;
7229     PatchEntryParams.presResource     = (PMOS_RESOURCE)pSurfaceStateToken->pResourceInfo;
7230 
7231     // Set patch for surface state address
7232     pOsInterface->pfnSetPatchEntry(
7233         pOsInterface,
7234         &PatchEntryParams);
7235 
7236     MOS_MEMCOMP_STATE mmcMode = MOS_MEMCOMP_DISABLED;
7237     PMOS_RESOURCE pMosResource = (PMOS_RESOURCE)pSurfaceStateToken->pResourceInfo;
7238     MHW_RENDERHAL_CHK_NULL_RETURN(pMosResource);
7239     if (pOsInterface->pfnGetMemoryCompressionMode)
7240     {
7241         pOsInterface->pfnGetMemoryCompressionMode(pOsInterface, pMosResource, &mmcMode);
7242     }
7243 
7244     if (mmcMode == MOS_MEMCOMP_RC && pSurfaceStateToken->DW3.SurfaceStateType == MEDIASTATE_BTS_DEFAULT_TYPE)
7245     {
7246 # if !EMUL
7247         if (pOsInterface->bUsesGfxAddress)
7248         {
7249             uint64_t ui64GfxAddress = 0;
7250             uint64_t ui64GfxAddressWithoutOffset = 0;
7251             ui64GfxAddress |= (uint64_t)(pSurfaceStateToken->DW5.SurfaceBaseAddress64 & 0x0000FFFF) << 32;
7252             ui64GfxAddress |= (uint64_t)(pSurfaceStateToken->DW4.SurfaceBaseAddress);
7253             //Original Resouce Address without surface offset
7254             ui64GfxAddressWithoutOffset = ui64GfxAddress - pSurfaceStateToken->DW2.SurfaceOffset;
7255 
7256             pdwCmd = (uint32_t*)(pParams->pIndirectStateBase + pParams->iSurfaceStateOffset); //point to the start of current RENDER_SURFACE_STATE_CMD
7257 
7258             if (pMosResource->pGmmResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS))
7259             {
7260                 // Set GFX address of AuxiliarySurfaceBaseAddress
7261                 // Should use original resource address here
7262                 uint64_t auxAddress = ui64GfxAddressWithoutOffset + (uint64_t)pMosResource->pGmmResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS);
7263                 *(pdwCmd + 10) = (*(pdwCmd + 10) & 0x00000FFF) | (uint32_t)(auxAddress & 0x00000000FFFFF000);
7264                 *(pdwCmd + 11) = *(pdwCmd + 11) | (uint32_t)((auxAddress & 0x0000FFFF00000000) >> 32);
7265             }
7266 
7267             uint64_t clearAddress = 0;
7268             if (pOsInterface->trinityPath != TRINITY_DISABLED)
7269             {
7270                 clearAddress = pOsInterface->pfnGetResourceClearAddress(pOsInterface, pMosResource);
7271             }
7272             else if (pMosResource->pGmmResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CC))
7273             {
7274                 // Set GFX address of ClearAddress
7275                 // Should use original resource address here
7276                 clearAddress = ui64GfxAddressWithoutOffset + (uint32_t)pMosResource->pGmmResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CC);
7277             }
7278             if (clearAddress)
7279             {
7280                 *(pdwCmd + 12) = (*(pdwCmd + 12) & 0x0000001F) | (uint32_t)(clearAddress & 0x00000000FFFFFFE0);
7281                 *(pdwCmd + 13) = *(pdwCmd + 13) | (uint32_t)((clearAddress & 0x0000FFFF00000000) >> 32);
7282             }
7283         }
7284         else
7285         {
7286             // Set patch for AuxiliarySurfaceBaseAddress
7287             MOS_ZeroMemory(&PatchEntryParams, sizeof(PatchEntryParams));
7288             PatchEntryParams.uiAllocationIndex  = pSurfaceStateToken->DW1.SurfaceAllocationIndex;
7289             PatchEntryParams.uiResourceOffset = pSurfaceStateToken->DW2.SurfaceOffset
7290                                                 + (uint32_t)pMosResource->pGmmResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS);
7291             PatchEntryParams.uiPatchOffset    = iIndirectStateBase + pParams->iSurfaceStateOffset + 10 * sizeof(uint32_t);
7292             PatchEntryParams.bWrite           = pSurfaceStateToken->DW3.RenderTargetEnable;
7293             PatchEntryParams.HwCommandType    = (MOS_HW_COMMAND)pSurfaceStateToken->DW0.DriverID;
7294             PatchEntryParams.forceDwordOffset = 0;
7295             PatchEntryParams.cmdBufBase       = pbPtrCmdBuf;
7296             PatchEntryParams.presResource     = (PMOS_RESOURCE)pSurfaceStateToken->pResourceInfo;
7297             pOsInterface->pfnSetPatchEntry(pOsInterface, &PatchEntryParams);
7298 
7299             // Set patch for ClearAddress
7300             MOS_ZeroMemory(&PatchEntryParams, sizeof(PatchEntryParams));
7301             PatchEntryParams.uiAllocationIndex  = pSurfaceStateToken->DW1.SurfaceAllocationIndex;
7302             PatchEntryParams.uiResourceOffset = pSurfaceStateToken->DW2.SurfaceOffset
7303                                                 + (uint32_t)pMosResource->pGmmResInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CC);
7304             PatchEntryParams.uiPatchOffset    = iIndirectStateBase + pParams->iSurfaceStateOffset + 12 * sizeof(uint32_t);
7305             PatchEntryParams.bWrite           = pSurfaceStateToken->DW3.RenderTargetEnable;
7306             PatchEntryParams.HwCommandType    = (MOS_HW_COMMAND)pSurfaceStateToken->DW0.DriverID;
7307             PatchEntryParams.forceDwordOffset = 0;
7308             PatchEntryParams.cmdBufBase       = pbPtrCmdBuf;
7309             PatchEntryParams.presResource     = (PMOS_RESOURCE)pSurfaceStateToken->pResourceInfo;
7310             pOsInterface->pfnSetPatchEntry(pOsInterface, &PatchEntryParams);
7311         }
7312 #endif
7313     }
7314 
7315     return MOS_STATUS_SUCCESS;
7316 }
7317 
7318 //!
7319 //! \brief    Init Interface
7320 //! \details  Initializes RenderHal Interface structure, responsible for HW
7321 //!           abstraction of HW Rendering Engine for CM(MDF) and VP.
7322 //! \param    PRENDERHAL_INTERFACE pRenderHal
7323 //!           [in] Pointer to RenderHal Interface Structure
7324 //! \param    MhwCpInterface** ppCpInterface
7325 //!           [in/out] Pointer of pointer to MHW CP Interface Structure, which
7326 //!           is created during renderhal initialization
7327 //! \param    PMOS_INTERFACE pOsInterface
7328 //!           [in] Pointer to OS Interface Structure
7329 //! \return   MOS_STATUS
7330 //!           MOS_STATUS_UNKNOWN : Invalid parameters
7331 //!
RenderHal_InitInterface(PRENDERHAL_INTERFACE pRenderHal,MhwCpInterface ** ppCpInterface,PMOS_INTERFACE pOsInterface)7332 MOS_STATUS RenderHal_InitInterface(
7333     PRENDERHAL_INTERFACE pRenderHal,
7334     MhwCpInterface       **ppCpInterface,
7335     PMOS_INTERFACE       pOsInterface)
7336 {
7337     MOS_STATUS                      eStatus = MOS_STATUS_SUCCESS;
7338     MHW_VFE_PARAMS                  *pVfeStateParams = nullptr;
7339 
7340     //---------------------------------------
7341     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
7342     MHW_RENDERHAL_CHK_NULL_RETURN(ppCpInterface);
7343     MHW_RENDERHAL_CHK_NULL_RETURN(pOsInterface);
7344     //---------------------------------------
7345 
7346     // Basic initialization
7347     pRenderHal->pOsInterface                  = pOsInterface;
7348 
7349     pRenderHal->bKerneltimeDump        = false;
7350     MOS_ZeroMemory(&pRenderHal->kernelTime, sizeof(pRenderHal->kernelTime));
7351 
7352     pOsInterface->pfnGetPlatform(pOsInterface, &pRenderHal->Platform);
7353 
7354     pRenderHal->pSkuTable                     = pOsInterface->pfnGetSkuTable(pOsInterface);
7355     pRenderHal->pWaTable                      = pOsInterface->pfnGetWaTable(pOsInterface);
7356     pRenderHal->userSettingPtr                = pOsInterface->pfnGetUserSettingInstance(pOsInterface);
7357 
7358     // Initialize hardware resources for the current Os/Platform
7359     pRenderHal->pRenderHalPltInterface = RenderHalDevice::CreateFactory(pOsInterface);
7360     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pRenderHalPltInterface);
7361 
7362     // create mhw interfaces including mhw_render, cp, and mi
7363     pRenderHal->pRenderHalPltInterface->CreateMhwInterfaces(pRenderHal, pOsInterface);
7364 
7365     // Set Cp Interface
7366     *ppCpInterface = pRenderHal->pCpInterface;
7367 
7368     // Initialize MHW State Heap Interface
7369     // Note: there are two pStateHeapInterface in below line. First one is pointer to legacy MHW_STATE_HEAP
7370     // sturcture, while the last one points to the new class.
7371     if (pRenderHal->pRenderHalPltInterface->GetStateHeapInterface(pRenderHal) != nullptr)
7372     {
7373         pRenderHal->pMhwStateHeap = pRenderHal->pRenderHalPltInterface->GetStateHeapInterface(pRenderHal)->pStateHeapInterface;
7374     }
7375 
7376     pRenderHal->pHwCaps = pRenderHal->pRenderHalPltInterface->GetHwCaps(pRenderHal);
7377     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pHwCaps);
7378     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pMhwStateHeap);
7379     pRenderHal->pHwSizes = pRenderHal->pMhwStateHeap->GetHwSizesPointer();
7380 
7381     pRenderHal->dwTimeoutMs            = RENDERHAL_TIMEOUT_MS_DEFAULT;
7382     pRenderHal->iMaxPalettes           = RENDERHAL_PALETTE_MAX;
7383     pRenderHal->iMaxPaletteEntries     = RENDERHAL_PALETTE_ENTRIES_MAX;
7384     pRenderHal->iMaxChromaKeys         = RENDERHAL_CHROMA_KEY_MAX;
7385 
7386     //set MDF load to default value false
7387     pRenderHal->IsMDFLoad = false;
7388 
7389     //set AVS to default value false
7390     pRenderHal->bIsAVS = false;
7391 
7392     pRenderHal->iChromaKeyCount        = 0;
7393     for (int i = 0; i < pRenderHal->iMaxChromaKeys; i++)
7394     {
7395         pRenderHal->ChromaKey[i].dwIndex = i;
7396     }
7397 
7398     pRenderHal->bVDIWalker = true;
7399     int32_t  walkerMode    = MHW_WALKER_MODE_NOT_SET;
7400 #if (_DEBUG || _RELEASE_INTERNAL)
7401     if (pRenderHal->userSettingPtr != nullptr)
7402     {
7403     // Read VDI Walker Regkey once during initialization
7404         ReadUserSettingForDebug(
7405             pRenderHal->userSettingPtr,
7406             pRenderHal->bVDIWalker,
7407             __MEDIA_USER_FEATURE_VALUE_VDI_MODE,
7408             MediaUserSetting::Group::Device,
7409             true,
7410             true);
7411     // Read Media Walker Mode from RegKey once in initialization
7412         ReadUserSettingForDebug(
7413             pRenderHal->userSettingPtr,
7414             walkerMode,
7415             __MEDIA_USER_FEATURE_VALUE_MEDIA_WALKER_MODE,
7416             MediaUserSetting::Group::Device,
7417             int32_t(-1),
7418             true);
7419     }
7420 #endif
7421     pRenderHal->MediaWalkerMode               = (MHW_WALKER_MODE)walkerMode;
7422 
7423     pRenderHal->pPlaneDefinitions             = g_cRenderHal_SurfacePlanes;
7424 
7425     // disable RenderHal kernel debugging.
7426     pRenderHal->bIsaAsmDebugEnable            = false;
7427 
7428     pRenderHal->iMaxPalettes                  = RENDERHAL_PALETTE_COUNT;
7429     pRenderHal->iMaxPaletteEntries            = RENDERHAL_PALETTE_ENTRIES;
7430     pRenderHal->iMaxChromaKeys                = RENDERHAL_CHROMA_KEY_COUNT;
7431 
7432     MOS_ZeroMemory(&pRenderHal->PredicationParams, sizeof(pRenderHal->PredicationParams));
7433     MOS_ZeroMemory(&pRenderHal->SetMarkerParams, sizeof(pRenderHal->SetMarkerParams));
7434 
7435     // CMFC CSC Coefficient Surface update
7436     pRenderHal->bCmfcCoeffUpdate              = false;
7437     pRenderHal->iKernelAllocationID           = RENDERHAL_KERNEL_LOAD_FAIL;
7438     pRenderHal->pCmfcCoeffSurface             = nullptr;
7439 
7440     // Initialization/Cleanup function
7441     pRenderHal->pfnInitialize                 = RenderHal_Initialize;
7442     pRenderHal->pfnDestroy                    = RenderHal_Destroy;
7443 
7444     // Allocate/Destroy state heaps
7445     pRenderHal->pfnAllocateStateHeaps                = RenderHal_AllocateStateHeaps;
7446     pRenderHal->pfnFreeStateHeaps                    = RenderHal_FreeStateHeaps;
7447     pRenderHal->pfnReAllocateStateHeapsforAdvFeatureWithSshEnlarged      = RenderHal_ReAllocateStateHeapsforAdvFeatureWithSshEnlarged;
7448     pRenderHal->pfnReAllocateStateHeapsforAdvFeatureWithAllHeapsEnlarged = RenderHal_ReAllocateStateHeapsforAdvFeatureWithAllHeapsEnlarged;
7449 
7450     // Slice Shutdown Mode
7451     pRenderHal->pfnSetSliceShutdownMode       = RenderHal_SetSliceShutdownMode;
7452     pRenderHal->pfnSetPowerOptionMode         = RenderHal_SetPowerOptionMode;
7453 
7454     // Preemption
7455     pRenderHal->pfnEnableGpgpuMiddleBatchBufferPreemption  =
7456          RenderHal_EnableGpgpuMiddleBatchBufferPreemption;
7457     pRenderHal->pfnEnableGpgpuMiddleThreadPreemption       =
7458          RenderHal_EnableGpgpuMiddleThreadPreemption;
7459 
7460     // Surface State and Binding Table management functions
7461     pRenderHal->pfnSetSurfacesPerBT           = RenderHal_SetSurfacesPerBT;
7462     pRenderHal->pfnGetSurfaceStateEntries     = RenderHal_GetSurfaceStateEntries;
7463     pRenderHal->pfnAssignSurfaceState         = RenderHal_AssignSurfaceState;
7464     pRenderHal->pfnGetAlignUnit               = RenderHal_GetAlignUnit;
7465     pRenderHal->pfnAdjustBoundary             = RenderHal_AdjustBoundary;
7466     pRenderHal->pfnAssignBindingTable         = RenderHal_AssignBindingTable;
7467     pRenderHal->pfnSetupBufferSurfaceState    = RenderHal_SetupBufferSurfaceState;
7468     pRenderHal->pfnSetupSurfaceStatesOs       = RenderHal_SetupSurfaceStatesOs;
7469     pRenderHal->pfnBindSurfaceState           = RenderHal_BindSurfaceState;
7470     pRenderHal->pfnSendSurfaces               = RenderHal_SendSurfaces_PatchList;
7471     pRenderHal->pfnSendSurfaceStateEntry      = RenderHal_SendSurfaceStateEntry;
7472     pRenderHal->pfnSetSurfaceStateToken       = RenderHal_SetSurfaceStateToken;
7473     pRenderHal->pfnSetSurfaceStateBuffer      = RenderHal_SetSurfaceStateBuffer;
7474     pRenderHal->pfnCalculateYOffset           = RenderHal_CalculateYOffset;
7475     pRenderHal->pfnAssignBindlessSurfaceStates = RenderHal_AssignBindlessSurfaceStates;
7476     pRenderHal->pfnSendBindlessSurfaceStates   = RenderHal_SendSurfaces_Bindelss;
7477 
7478     pRenderHal->pfnGetPlaneDefinitionForCommonMessage = RenderHal_GetPlaneDefinitionForCommonMessage;
7479 
7480     // Media states management functions
7481     pRenderHal->pfnAllocateBB                 = RenderHal_AllocateBB;
7482     pRenderHal->pfnFreeBB                     = RenderHal_FreeBB;
7483     pRenderHal->pfnLockBB                     = RenderHal_LockBB;
7484     pRenderHal->pfnUnlockBB                   = RenderHal_UnlockBB;
7485     pRenderHal->pfnEnablePalette              = RenderHal_EnablePalette;
7486     pRenderHal->pfnGetPaletteEntry            = RenderHal_GetPaletteEntry;
7487     pRenderHal->pfnAllocatePaletteID          = RenderHal_AllocatePaletteID;
7488     pRenderHal->pfnFreePaletteID              = RenderHal_FreePaletteID;
7489     pRenderHal->pfnAllocateChromaKey          = RenderHal_AllocateChromaKey;
7490     pRenderHal->pfnAssignMediaState           = RenderHal_AssignMediaState;
7491     pRenderHal->pfnAllocateMediaID            = RenderHal_AllocateMediaID;
7492     pRenderHal->pfnGetMediaID                 = RenderHal_GetMediaID;
7493 
7494     // Old-style Kernel management functions
7495     pRenderHal->pfnRefreshSync                = RenderHal_RefreshSync;
7496     pRenderHal->pfnLoadKernel                 = RenderHal_LoadKernel;
7497     pRenderHal->pfnUnloadKernel               = RenderHal_UnloadKernel;
7498     pRenderHal->pfnResetKernels               = RenderHal_ResetKernels;
7499     pRenderHal->pfnTouchKernel                = RenderHal_TouchKernel;
7500     pRenderHal->pfnGetKernelOffset            = RenderHal_GetKernelOffset;
7501 
7502     // Command buffer programming functions
7503     pRenderHal->pfnLoadCurbeData              = RenderHal_LoadCurbeData;
7504     pRenderHal->pfnSendCurbeLoad              = RenderHal_SendCurbeLoad;
7505     pRenderHal->pfnSendMediaIdLoad            = RenderHal_SendMediaIdLoad;
7506     pRenderHal->pfnSendChromaKey              = RenderHal_SendChromaKey;
7507     pRenderHal->pfnSendPalette                = RenderHal_SendPalette;
7508     pRenderHal->pfnSendMediaStates            = RenderHal_SendMediaStates;
7509     pRenderHal->pfnSendStateBaseAddress       = RenderHal_SendStateBaseAddress;
7510 
7511     // Initialize OS dependent RenderHal Interfaces common to all platforms
7512     pRenderHal->pfnReset                      = RenderHal_Reset;
7513     pRenderHal->pfnAssignSshInstance          = RenderHal_AssignSshInstance;
7514     pRenderHal->pfnInitCommandBuffer          = RenderHal_InitCommandBuffer;
7515     pRenderHal->pfnSendTimingData             = RenderHal_SendTimingData;
7516     pRenderHal->pfnSendRcsStatusTag           = RenderHal_SendRcsStatusTag;
7517     pRenderHal->pfnSendSyncTag                = RenderHal_SendSyncTag;
7518     pRenderHal->pfnSendCscCoeffSurface        = RenderHal_SendCscCoeffSurface;
7519 
7520     // InterfaceDescriptor
7521     pRenderHal->pfnSetupInterfaceDescriptor   = RenderHal_SetupInterfaceDescriptor;
7522 
7523     // Media Walker
7524     pRenderHal->pfnGetMediaWalkerStatus       = RenderHal_GetMediaWalkerStatus;
7525 
7526     //Surface Memory Object Control
7527     pRenderHal->pfnGetSurfaceMemoryObjectControl
7528                                               = RenderHal_GetSurfaceMemoryObjectControl;
7529     //Scratch Space
7530     pRenderHal->pfnGetScratchSpaceSize        = RenderHal_GetScratchSpaceSize;
7531 
7532     // Other states
7533     pRenderHal->pfnSetVfeStateParams          = RenderHal_SetVfeStateParams;
7534     pRenderHal->pfnSetSamplerStates           = RenderHal_SetSamplerStates;
7535     pRenderHal->pfnSetAndGetSamplerStates     = RenderHal_SetAndGetSamplerStates;
7536 
7537     pRenderHal->pfnIs2PlaneNV12Needed         = RenderHal_Is2PlaneNV12Needed;
7538 
7539     // Set the platform-specific fields in renderhal
7540     // Set State Heap settings
7541     MOS_ZeroMemory(&pRenderHal->enlargeStateHeapSettingsForAdv, sizeof(pRenderHal->enlargeStateHeapSettingsForAdv));
7542     pRenderHal->pRenderHalPltInterface->InitStateHeapSettings(pRenderHal);
7543 
7544     // Set default / advanced surface types
7545     pRenderHal->pRenderHalPltInterface->InitSurfaceTypes(pRenderHal);
7546 
7547     // Set MMC Enabled status
7548     pRenderHal->pRenderHalPltInterface->IsRenderHalMMCEnabled(pRenderHal);
7549 
7550     // Set platform dependent parameters
7551     pRenderHal->bHasCombinedAVSSamplerState   = true;
7552     pRenderHal->bEnableYV12SinglePass         = pRenderHal->pRenderHalPltInterface->IsEnableYV12SinglePass(pRenderHal);
7553     pRenderHal->dwSamplerAvsIncrement         = pRenderHal->pRenderHalPltInterface->GetSizeSamplerStateAvs(pRenderHal);
7554     pRenderHal->bComputeContextInUse          = pRenderHal->pRenderHalPltInterface->IsComputeContextInUse(pRenderHal);
7555     pRenderHal->isBindlessHeapInUse           = pRenderHal->pRenderHalPltInterface->IsBindlessHeapInUse(pRenderHal);
7556 
7557     pRenderHal->dwMaskCrsThdConDataRdLn       = (uint32_t) -1;
7558     pRenderHal->dwMinNumberThreadsInGroup     = 1;
7559     pRenderHal->dwCurbeBlockAlign             = RENDERHAL_CURBE_BLOCK_ALIGN;
7560     pRenderHal->dwScratchSpaceMaxThreads      = pRenderHal->pHwCaps->dwMaxThreads;
7561 
7562     // Set palette data
7563     for (int i = 0; i < pRenderHal->iMaxPalettes; i++)
7564     {
7565         pRenderHal->Palette[i].iPaletteID   = i;
7566         pRenderHal->Palette[i].iNumEntries  = 0;
7567         pRenderHal->Palette[i].pPaletteData =
7568             pRenderHal->pRenderHalPltInterface->GetPaletteDataAddress(i);
7569     }
7570 
7571     // Set default VFEState Params
7572     pVfeStateParams = pRenderHal->pRenderHalPltInterface->GetVfeStateParameters();
7573     pVfeStateParams->dwDebugCounterControl    = MEDIASTATE_DEBUG_COUNTER_FREE_RUNNING;
7574     pVfeStateParams->dwMaximumNumberofThreads = pRenderHal->pHwCaps->dwMaxThreads;
7575 
7576     // Hardware dependent calls
7577     pRenderHal->pfnGetSamplerOffsetAndPtr     = RenderHal_GetSamplerOffsetAndPtr;
7578     pRenderHal->pfnSetupSurfaceState          = RenderHal_SetupSurfaceState;
7579     pRenderHal->pfnEncodeSLMSize              = RenderHal_EncodeSLMSize;
7580     pRenderHal->pfnSetChromaDirection         = RenderHal_SetChromaDirection;
7581     pRenderHal->pfnEnableL3Caching            = RenderHal_EnableL3Caching;
7582     pRenderHal->pfnSetCacheOverrideParams     = RenderHal_SetCacheOverrideParams;
7583 
7584     // CM specific function
7585     pRenderHal->pfnConvertToNanoSeconds       = RenderHal_ConvertToNanoSeconds;
7586 
7587     pRenderHal->pfnPerThreadScratchSpaceStart2K = RenderHal_PerThreadScratchSpaceStart2K;
7588 
7589     // Special functions
7590     RenderHal_InitInterfaceEx(pRenderHal);
7591 
7592     return eStatus;
7593 }
7594 
7595 //!
7596 //! \brief    Set Surface for HW Access
7597 //! \details  Common Function for setting up surface state
7598 //! \param    PRENDERHAL_INTERFACE pRenderHal
7599 //!           [in] Pointer to RenderHal Interface Structure
7600 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
7601 //!           [in] Pointer to RenderHal Surface
7602 //! \param    PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams
7603 //!           [in] Pointer to Surface Params
7604 //! \param    int32_t iBindingTable
7605 //!           [in] Binding Table to bind surface
7606 //! \param    int32_t iBTEntry
7607 //!           [in] Binding Table Entry index
7608 //! \param    bool bWrite
7609 //!           [in] Write mode flag
7610 //! \return   MOS_STATUS
7611 //!           MOS_STATUS_SUCCESS if success. Error code otherwise
7612 //!
RenderHal_SetSurfaceForHwAccess(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface,PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams,int32_t iBindingTable,int32_t iBTEntry,bool bWrite)7613 MOS_STATUS RenderHal_SetSurfaceForHwAccess(
7614     PRENDERHAL_INTERFACE            pRenderHal,
7615     PRENDERHAL_SURFACE              pRenderHalSurface,
7616     PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams,
7617     int32_t                         iBindingTable,
7618     int32_t                         iBTEntry,
7619     bool                            bWrite)
7620 {
7621 
7622     PMOS_INTERFACE                  pOsInterface;
7623     PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntries[MHW_MAX_SURFACE_PLANES];
7624     int32_t                         iSurfaceEntries;
7625     int32_t                         i;
7626     MOS_STATUS                      eStatus;
7627 
7628     //---------------------------------------
7629     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
7630     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
7631     //---------------------------------------
7632 
7633     // Initialize Variables
7634     eStatus                 = MOS_STATUS_SUCCESS;
7635     pOsInterface            = pRenderHal->pOsInterface;
7636 
7637     // Register surfaces for rendering (GfxAddress/Allocation index)
7638     // Register resource
7639     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnRegisterResource(
7640         pOsInterface,
7641         &pRenderHalSurface->OsSurface.OsResource,
7642         bWrite,
7643         true));
7644 
7645     // Setup surface states-----------------------------------------------------
7646     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSetupSurfaceState(
7647         pRenderHal,
7648         pRenderHalSurface,
7649         pSurfaceParams,
7650         &iSurfaceEntries,
7651         pSurfaceEntries,
7652         nullptr));
7653 
7654     // Bind surface states------------------------------------------------------
7655     for (i = 0; i < iSurfaceEntries; i++, iBTEntry++)
7656     {
7657         MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnBindSurfaceState(
7658             pRenderHal,
7659             iBindingTable,
7660             iBTEntry,
7661             pSurfaceEntries[i]));
7662     }
7663 
7664     return eStatus;
7665 }
7666 
7667 //!
7668 //! \brief    Set Buffer Surface for HW Access
7669 //! \details  Common Function for setting up buffer surface state
7670 //! \param    PRENDERHAL_INTERFACE pRenderHal
7671 //!           [in] Pointer to RenderHal Interface Structure
7672 //! \param    PRENDERHAL_SURFACE pRenderHalSurface
7673 //!           [in] Pointer to RenderHal Surface
7674 //! \param    PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams
7675 //!           [in] Pointer to Surface Params
7676 //! \param    int32_t iBindingTable
7677 //!           [in] Binding Table to Bind Surface
7678 //! \param    int32_t iBTEntry
7679 //!           [in] Binding Table Entry index
7680 //! \param    bool bWrite
7681 //!           Write mode flag
7682 //! \return   MOS_STATUS
7683 //!           MOS_STATUS_SUCCESS if success. Error code otherwise
7684 //!
RenderHal_SetBufferSurfaceForHwAccess(PRENDERHAL_INTERFACE pRenderHal,PRENDERHAL_SURFACE pRenderHalSurface,PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams,int32_t iBindingTable,int32_t iBTEntry,bool bWrite)7685 MOS_STATUS RenderHal_SetBufferSurfaceForHwAccess(
7686     PRENDERHAL_INTERFACE            pRenderHal,
7687     PRENDERHAL_SURFACE              pRenderHalSurface,
7688     PRENDERHAL_SURFACE_STATE_PARAMS pSurfaceParams,
7689     int32_t                         iBindingTable,
7690     int32_t                         iBTEntry,
7691     bool                            bWrite)
7692 {
7693     PMOS_INTERFACE                  pOsInterface;
7694     RENDERHAL_SURFACE_STATE_PARAMS  SurfaceParam;
7695     PRENDERHAL_SURFACE_STATE_ENTRY  pSurfaceEntry;
7696     MOS_STATUS                      eStatus;
7697 
7698     //---------------------------------------
7699     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal);
7700     MHW_RENDERHAL_CHK_NULL_RETURN(pRenderHal->pOsInterface);
7701     //---------------------------------------
7702 
7703     // Initialize Variables
7704     eStatus                         = MOS_STATUS_SUCCESS;
7705     pOsInterface                    = pRenderHal->pOsInterface;
7706 
7707     // Register surfaces for rendering (GfxAddress/Allocation index)
7708     // Register resource
7709     MHW_RENDERHAL_CHK_STATUS_RETURN(pOsInterface->pfnRegisterResource(
7710         pOsInterface,
7711         &pRenderHalSurface->OsSurface.OsResource,
7712         bWrite,
7713         true));
7714 
7715     // Setup Buffer surface-----------------------------------------------------
7716     if (pSurfaceParams == nullptr)
7717     {
7718         MOS_ZeroMemory(&SurfaceParam, sizeof(SurfaceParam));
7719 
7720         auto memObjCtrlState = pOsInterface->pfnGetResourceCachePolicyMemoryObject(pRenderHal->pOsInterface, &pRenderHalSurface->OsSurface.OsResource);
7721         SurfaceParam.MemObjCtl = memObjCtrlState.DwordValue;
7722 
7723         pSurfaceParams = &SurfaceParam;
7724     }
7725 
7726     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnSetupBufferSurfaceState(
7727         pRenderHal,
7728         pRenderHalSurface,
7729         pSurfaceParams,
7730         &pSurfaceEntry));
7731 
7732     // Bind surface state-------------------------------------------------------
7733     MHW_RENDERHAL_CHK_STATUS_RETURN(pRenderHal->pfnBindSurfaceState(
7734         pRenderHal,
7735         iBindingTable,
7736         iBTEntry,
7737         pSurfaceEntry));
7738 
7739     return eStatus;
7740 }
7741 
7742