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