1 /*
2 * Copyright (c) 2021-2023, 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_platform_interface_next.h
24 //! \brief     abstract the platfrom specific APIs into one class
25 //!
26 //!
27 //! \file     renderhal.h
28 //! \brief    Render Engine Interfaces shared across platforms
29 //! \details  Platform Independent Hardware Interfaces
30 //!
31 #ifndef __RENDERHAL_PLATFORM_INTERFACE_NEXT_H__
32 #define __RENDERHAL_PLATFORM_INTERFACE_NEXT_H__
33 
34 #include <memory>
35 #include "media_class_trace.h"
36 #include "mhw_mi.h"
37 #include "mhw_mmio.h"
38 #include "mhw_render.h"
39 #include "mhw_state_heap.h"
40 #include "mhw_utilities_next.h"
41 #include "mos_defs.h"
42 #include "mos_os_specific.h"
43 #include "vp_common.h"
44 #include "renderhal_platform_interface.h"
45 #include "mhw_render_itf.h"
46 class MediaFeatureManager;
47 namespace mhw { namespace mi { class Itf; } }
48 
49 typedef struct _RENDERHAL_GENERIC_PROLOG_PARAMS_NEXT : _RENDERHAL_GENERIC_PROLOG_PARAMS
50 {
51     MOS_VIRTUALENGINE_HINT_PARAMS VEngineHintParams = {{0}, 0, {{0}, {0}, {0}, {0}}, {0, 0, 0, 0}};
52 } RENDERHAL_GENERIC_PROLOG_PARAMS_NEXT, *PRENDERHAL_GENERIC_PROLOG_PARAMS_NEXT;
53 
54 class XRenderHal_Platform_Interface_Next : public XRenderHal_Platform_Interface, public mhw::render::Itf::ParSetting
55 {
56 public:
57     XRenderHal_Platform_Interface_Next();
~XRenderHal_Platform_Interface_Next()58     virtual ~XRenderHal_Platform_Interface_Next() {}
59 
60     MOS_STATUS AddPipelineSelectCmd(
61         PRENDERHAL_INTERFACE        pRenderHal,
62         PMOS_COMMAND_BUFFER         pCmdBuffer,
63         bool                        gpGpuPipe);
64 
65     MOS_STATUS SendStateBaseAddress(
66         PRENDERHAL_INTERFACE        pRenderHal,
67         PMOS_COMMAND_BUFFER         pCmdBuffer);
68 
69     MOS_STATUS AddSipStateCmd(
70         PRENDERHAL_INTERFACE        pRenderHal,
71         PMOS_COMMAND_BUFFER         pCmdBuffer);
72 
73     MOS_STATUS AddCfeStateCmd(
74         PRENDERHAL_INTERFACE        pRenderHal,
75         PMOS_COMMAND_BUFFER         pCmdBuffer,
76         PMHW_VFE_PARAMS             params);
77 
78     MOS_STATUS SendChromaKey(
79         PRENDERHAL_INTERFACE        pRenderHal,
80         PMOS_COMMAND_BUFFER         pCmdBuffer,
81         PMHW_CHROMAKEY_PARAMS       pChromaKeyParams);
82 
83     MOS_STATUS SendPalette(
84         PRENDERHAL_INTERFACE        pRenderHal,
85         PMOS_COMMAND_BUFFER         pCmdBuffer,
86         PMHW_PALETTE_PARAMS         pPaletteLoadParams);
87 
88     MOS_STATUS SetL3Cache(
89         PRENDERHAL_INTERFACE        pRenderHal,
90         PMOS_COMMAND_BUFFER         pCmdBuffer);
91 
92     //!
93     //! \brief    Get the size of render hal media state
94     //! \return   size_t
95     //!           The size of render hal media state
96     //!
97     size_t GetRenderHalMediaStateSize();
98 
99     //!
100     //! \brief    Get the size of render hal state heap
101     //! \return   size_t
102     //!           The size of render hal state heap
103     //!
104     size_t GetRenderHalStateHeapSize();
105 
106     PMHW_MI_MMIOREGISTERS GetMmioRegisters(
107         PRENDERHAL_INTERFACE        pRenderHal);
108 
109     MOS_STATUS EnablePreemption(
110         PRENDERHAL_INTERFACE            pRenderHal,
111         PMOS_COMMAND_BUFFER             pCmdBuffer);
112 
113     MOS_STATUS SendPredicationCommand(
114         PRENDERHAL_INTERFACE        pRenderHal,
115         PMOS_COMMAND_BUFFER         pCmdBuffer);
116 
117     //! \brief    Adds marker attributes in command buffer
118     //! \param    PRENDERHAL_INTERFACE pRenderHal
119     //!           [in] Pointer to RenderHal Interface Structure
120     //! \param    PMOS_COMMAND_BUFFER pcmdBuffer
121     //!           [in] Pointer to Command Buffer
122     //! \param    bool isRender
123     //!           [in] Flag of Render Engine
124     //! \return   MOS_STATUS
125     MOS_STATUS SendMarkerCommand(
126         PRENDERHAL_INTERFACE    pRenderHal,
127         PMOS_COMMAND_BUFFER     cmdBuffer,
128         bool                    isRender);
129 
130     MOS_STATUS AddMiPipeControl(
131         PRENDERHAL_INTERFACE    pRenderHal,
132         PMOS_COMMAND_BUFFER        pCmdBuffer,
133         MHW_PIPE_CONTROL_PARAMS*   params);
134 
135     //!
136     //! \brief    Adds MI_LOAD_REGISTER_IMM to the command buffer
137     //! \param    PRENDERHAL_INTERFACE pRenderHal
138     //!           [in] Pointer to RenderHal Interface Structure
139     //! \param    [in] pCmdBuffer
140     //!           Command buffer to which requested command is added
141     //! \param    [in] params
142     //!           Parameters used to populate the requested command
143     //! \return   MOS_STATUS
144     //!           MOS_STATUS_SUCCESS if success, else fail reason
145     //!
146     MOS_STATUS AddMiLoadRegisterImmCmd(
147         PRENDERHAL_INTERFACE             pRenderHal,
148         PMOS_COMMAND_BUFFER              pCmdBuffer,
149         PMHW_MI_LOAD_REGISTER_IMM_PARAMS params);
150 
151     MOS_STATUS SendGenericPrologCmd(
152         PRENDERHAL_INTERFACE        pRenderHal,
153         PMOS_COMMAND_BUFFER         pCmdBuffer,
154         PMHW_GENERIC_PROLOG_PARAMS  pParams,
155         MHW_MI_MMIOREGISTERS* pMmioReg = nullptr);
156 
157     MOS_STATUS CreateMhwInterfaces(
158         PRENDERHAL_INTERFACE        pRenderHal,
159         PMOS_INTERFACE              pOsInterface);
160 
161     MOS_STATUS On1stLevelBBStart(
162         PRENDERHAL_INTERFACE pRenderHal,
163         PMOS_COMMAND_BUFFER  pCmdBuffer,
164         PMOS_CONTEXT         pOsContext,
165         uint32_t             gpuContextHandle,
166         MHW_MI_MMIOREGISTERS *pMmioReg);
167 
168     MOS_STATUS OnDispatch(
169         PRENDERHAL_INTERFACE pRenderHal,
170         PMOS_COMMAND_BUFFER  pCmdBuffer,
171         PMOS_INTERFACE       pOsInterface,
172         MHW_MI_MMIOREGISTERS *pMmioReg);
173 
174     MOS_STATUS CreatePerfProfiler(
175         PRENDERHAL_INTERFACE pRenderHal);
176 
177     MOS_STATUS DestroyPerfProfiler(
178         PRENDERHAL_INTERFACE pRenderHal);
179 
180     MOS_STATUS AddPerfCollectStartCmd(
181         PRENDERHAL_INTERFACE pRenderHal,
182         MOS_INTERFACE        *osInterface,
183         MOS_COMMAND_BUFFER   *cmdBuffer);
184 
185     MOS_STATUS StartPredicate(
186         PRENDERHAL_INTERFACE pRenderHal,
187         PMOS_COMMAND_BUFFER  cmdBuffer);
188 
189     MOS_STATUS StopPredicate(
190         PRENDERHAL_INTERFACE pRenderHal,
191         PMOS_COMMAND_BUFFER  cmdBuffer);
192 
193     MOS_STATUS AddPerfCollectEndCmd(
194         PRENDERHAL_INTERFACE pRenderHal,
195         PMOS_INTERFACE       pOsInterface,
196         MOS_COMMAND_BUFFER   *cmdBuffer);
197 
198     MOS_STATUS AddMediaVfeCmd(
199         PRENDERHAL_INTERFACE    pRenderHal,
200         PMOS_COMMAND_BUFFER     pCmdBuffer,
201         MHW_VFE_PARAMS          *params);
202 
203     MOS_STATUS AddMediaStateFlush(
204         PRENDERHAL_INTERFACE         pRenderHal,
205         PMOS_COMMAND_BUFFER          pCmdBuffer,
206         MHW_MEDIA_STATE_FLUSH_PARAM  *params);
207 
208     MOS_STATUS AddMiBatchBufferEnd(
209         PRENDERHAL_INTERFACE         pRenderHal,
210         PMOS_COMMAND_BUFFER          pCmdBuffer,
211         PMHW_BATCH_BUFFER            batchBuffer);
212 
213     MOS_STATUS AddMediaObjectWalkerCmd(
214         PRENDERHAL_INTERFACE         pRenderHal,
215         PMOS_COMMAND_BUFFER          pCmdBuffer,
216         PMHW_WALKER_PARAMS           params);
217 
218     MOS_STATUS AddGpGpuWalkerStateCmd(
219         PRENDERHAL_INTERFACE     pRenderHal,
220         PMOS_COMMAND_BUFFER      pCmdBuffer,
221         PMHW_GPGPU_WALKER_PARAMS params);
222 
223     MOS_STATUS AllocateHeaps(
224         PRENDERHAL_INTERFACE     pRenderHal,
225         MHW_STATE_HEAP_SETTINGS  MhwStateHeapSettings);
226 
227     PMHW_STATE_HEAP_INTERFACE GetStateHeapInterface(
228         PRENDERHAL_INTERFACE     pRenderHal);
229 
230     MOS_STATUS DestoryMhwInterface(
231         PRENDERHAL_INTERFACE     pRenderHal);
232 
233     MOS_STATUS AddMediaCurbeLoadCmd(
234         PRENDERHAL_INTERFACE         pRenderHal,
235         PMOS_COMMAND_BUFFER          pCmdBuffer,
236         PMHW_CURBE_LOAD_PARAMS       params);
237 
238     MOS_STATUS AddMediaIDLoadCmd(
239         PRENDERHAL_INTERFACE         pRenderHal,
240         PMOS_COMMAND_BUFFER          pCmdBuffer,
241         PMHW_ID_LOAD_PARAMS          params);
242 
243     bool IsPreemptionEnabled(
244         PRENDERHAL_INTERFACE         pRenderHal);
245 
246     void GetSamplerResolutionAlignUnit(
247         PRENDERHAL_INTERFACE         pRenderHal,
248         bool                         isAVSSampler,
249         uint32_t                     &widthAlignUnit,
250         uint32_t                     &heightAlignUnit);
251 
252     PMHW_RENDER_ENGINE_CAPS GetHwCaps(
253         PRENDERHAL_INTERFACE         pRenderHal);
254 
255     bool IsComputeContextInUse(
256          PRENDERHAL_INTERFACE    pRenderHal) override;
257 
258     //!
259     //! \brief    Check if Sampler128Elements is supported
260     //! \return   true of false
261     //!
262     bool IsSampler128ElementsSupported() override;
263 
264     //!
265     //! \brief      Checks how per thread scratch space size bits in VFE state are interpreted by HW
266     //! \details    For BDW GT1/2/3 A0 steppings, per thread scratch space size in VFE state
267     //!             is 11 bits indicating [2k bytes, 2 Mbytes]: 0=2k, 1=4k, 2=8k ... 10=2M
268     //!             BDW+ excluding A0 step is 12 bits indicating [1k bytes, 2 Mbytes]: 0=1k, 1=2k, 2=4k, 3=8k ... 11=2M
269     //! \param      PRENDERHAL_INTERFACE pRenderHal
270     //!             [in]    Pointer to RenderHal interface
271     //! \return     true if BDW A0 stepping, false otherwise
272     //!
273     bool PerThreadScratchSpaceStart2K(PRENDERHAL_INTERFACE pRenderHal) override;
274 
275     //!
276     //! \brief      Checks how per thread scratch space size bits in VFE state are interpreted by HW.
277     //! \details    per thread scratch space size can be 2^n (n >= 6) bytes.
278     //! \param      PRENDERHAL_INTERFACE pRenderHal
279     //!             [in]    Pointer to RenderHal interface
280     //! \return     bool.
281     //!
282     bool PerThreadScratchSpaceStart64Byte(RENDERHAL_INTERFACE *renderHal) override;
283 
284     //!
285     //! \brief    Encode SLM Size for Interface Descriptor
286     //! \details  Setup SLM size
287     //! \param    uint32_t SLMSize
288     //!           [in] SLM size
289     //! \return   encoded output
290     //!
291     uint32_t EncodeSLMSize(uint32_t SLMSize) override;
292 
293     //!
294     //! \brief    Calculate Preferred Slm Allocation Size for Interface Descriptor
295     //! \details  Setup Preferred Slm Allocation Size size
296     //! \param    PRENDERHAL_INTERFACE pRenderHal
297     //!           [in]    Pointer to RenderHal interface
298     //! \param    uint32_t SLMSize
299     //!           [in] SLM size
300     //! \return   Preferred Slm Allocation Size
301     //!
302     virtual uint32_t CalculatePreferredSlmAllocationSizeFromSlmSize(
303         RENDERHAL_INTERFACE *renderHal,
304         uint32_t             slmSize,
305         uint32_t             numberOfThreadsPerThreadGroup);
306 
307     //!
308     //! \brief    Set Chroma Direction
309     //! \details  Setup Chroma Direction for hpg_base
310     //! \param    PRENDERHAL_INTERFACE pRenderHal
311     //!           [in]  Pointer to Hardware Interface
312     //! \param    PRENDERHAL_SURFACE pRenderHalSurface
313     //!           [in]  Pointer to Render Hal Surface
314     //! \return   uint8_t
315     //!
316     uint8_t SetChromaDirection(
317         PRENDERHAL_INTERFACE pRenderHal,
318         PRENDERHAL_SURFACE   pRenderHalSurface) override;
319 
320     //!
321     //! \brief    Initialize the default surface type and advanced surface type  per platform
322     //! \param    PRENDERHAL_INTERFACE    pRenderHal
323     //!           [out] Pointer to PRENDERHAL_INTERFACE
324     //! \return   void
325     //!
326     void InitSurfaceTypes(PRENDERHAL_INTERFACE pRenderHal) override;
327 
328     //!
329     //! \brief    Check if YV12 Single Pass is supported
330     //! \param    PRENDERHAL_INTERFACE pRenderHal
331     //!           [in]  Pointer to Hardware Interface
332     //! \return   true of false
333     //!
334     bool IsEnableYV12SinglePass(PRENDERHAL_INTERFACE pRenderHal) override;
335 
336     //!
337     //! \brief     Get the Size of AVS Sampler State
338     //! \param    PRENDERHAL_INTERFACE pRenderHal
339     //!           [in]  Pointer to Hardware Interface
340     //! \return   size
341     //!
342     uint32_t GetSizeSamplerStateAvs(PRENDERHAL_INTERFACE pRenderHal) override;
343 
344     //!
345     //! \brief    Set Power Option Status
346     //! \param    [in] pRenderHal
347     //!           Pointer to Hardware Interface
348     //! \param    [in,out] pCmdBuffer
349     //!           Pointer to Command Buffer
350     //! \return   MOS_STATUS
351     //!           MOS_STATUS_SUCCESS if success, else fail reason
352     //!
353     MOS_STATUS SetPowerOptionStatus(
354         PRENDERHAL_INTERFACE pRenderHal,
355         PMOS_COMMAND_BUFFER  pCmdBuffer) override;
356 
357     //!
358     //! \brief    Set Composite Prolog CMD
359     //! \param    [in] pRenderHal
360     //!           Pointer to Hardware Interface
361     //! \param    [in,out] pCmdBuffer
362     //!           Pointer to Command Buffer
363     //! \return   MOS_STATUS
364     //!           MOS_STATUS_SUCCESS if success, else fail reason
365     //!
366     MOS_STATUS SetCompositePrologCmd(
367         PRENDERHAL_INTERFACE pRenderHal,
368         PMOS_COMMAND_BUFFER  pCmdBuffer) override;
369 
370     //!
371     //! \brief    Send Compute Walker
372     //! \details  Send Compute Walker
373     //! \param    PRENDERHAL_INTERFACE pRenderHal
374     //!           [in] Pointer to Hardware Interface Structure
375     //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
376     //!           [in] Pointer to Command Buffer
377     //! \param    PRENDERHAL_GPGPU_WALKER_PARAMS pGpGpuWalkerParams
378     //!           [in]    Pointer to GPGPU walker parameters
379     //! \return   MOS_STATUS
380     //!
381     MOS_STATUS SendComputeWalker(
382         PRENDERHAL_INTERFACE     pRenderHal,
383         PMOS_COMMAND_BUFFER      pCmdBuffer,
384         PMHW_GPGPU_WALKER_PARAMS pGpGpuWalkerParams) override;
385 
386     //!
387     //! \brief    Send To 3DState Binding Table Pool Alloc
388     //! \details  Send To 3DState Binding Table Pool Alloc
389     //! \param    PRENDERHAL_INTERFACE pRenderHal
390     //!           [in] Pointer to RenderHal Interface Structure
391     //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
392     //!           [in] Pointer to Command Buffer
393     //! \return   MOS_STATUS
394     //!
395     MOS_STATUS SendTo3DStateBindingTablePoolAlloc(
396         PRENDERHAL_INTERFACE pRenderHal,
397         PMOS_COMMAND_BUFFER  pCmdBuffer) override;
398 
399     //!
400     //! \brief    Get Render Engine MMC Enable/Disable Flag
401     //! \param    [in] pRenderHal
402     //!           Pointer to Hardware Interface
403     //! \return   MOS_STATUS
404     //!           MOS_STATUS_SUCCESS if success, else fail reason
405     //!
406     MOS_STATUS IsRenderHalMMCEnabled(
407         PRENDERHAL_INTERFACE pRenderHal) override;
408 
409     //!
410     //! \brief    Check if Over ride is needed or not
411     //! \param    [in] pRenderHal
412     //!           Pointer to Hardware Interface
413     //! \param    [in,out] pCmdBuffer
414     //!           Pointer to Command Buffer
415     //! \param    [in] pGenericPrologParam
416     //!           Pointer to MHW generic prolog parameters
417     //! \return   MOS_STATUS
418     //!           MOS_STATUS_SUCCESS if success, else fail reason
419     //!
420     MOS_STATUS IsOvrdNeeded(
421         PRENDERHAL_INTERFACE             pRenderHal,
422         PMOS_COMMAND_BUFFER              pCmdBuffer,
423         PRENDERHAL_GENERIC_PROLOG_PARAMS pGenericPrologParams) override;
424 
425     //!
426     //! \brief    Allocates scratch space buffer.
427     //! \details  A single scratch space buffer is allocated and used for all threads.
428     //! \param    [in] perThreadScratchSpace
429     //!           scratch space
430     //! \param    [in] renderHal
431     //!           Pointer to Hardware Interface
432     //! \return   MOS_STATUS
433     //!           MOS_STATUS_SUCCESS if success, else fail reason
434     //!
435     MOS_STATUS AllocateScratchSpaceBuffer(
436         uint32_t                perThreadScratchSpace,
437         RENDERHAL_INTERFACE     *renderHal) override;
438 
439     //!
440     //! \brief    Frees scratch space buffer.
441     //! \details  A single scratch space buffer is allocated and used for all threads.
442     //! \param    [in] renderHal
443     //!           Pointer to Hardware Interface
444     //! \return   MOS_STATUS
445     //!           MOS_STATUS_SUCCESS if success, else fail reason
446     //!
447     MOS_STATUS FreeScratchSpaceBuffer(
448         RENDERHAL_INTERFACE *renderHal) override;
449 
450     //!
451     //! \brief      Get Surface Compression support caps
452     //! \param      [in] format
453     //!             surface format
454     //! \return     bool
455     //!             true or false
456     //!
457     virtual bool IsFormatMMCSupported(MOS_FORMAT format);
458 
459     //!
460     //! \brief      Is L8 format support
461     //! \return     bool
462     //!             true or false
463     //!
464     virtual bool IsL8FormatSupported();
465 
466     std::shared_ptr<mhw::mi::Itf> GetMhwMiItf();
467 
468     MHW_SETPAR_DECL_HDR(STATE_BASE_ADDRESS);
469 
470     MHW_SETPAR_DECL_HDR(_3DSTATE_CHROMA_KEY);
471 
472     MHW_SETPAR_DECL_HDR(STATE_SIP);
473 
474     MHW_SETPAR_DECL_HDR(COMPUTE_WALKER);
475 
476     MHW_SETPAR_DECL_HDR(_3DSTATE_BINDING_TABLE_POOL_ALLOC);
477 
478 protected:
479 
480     PRENDERHAL_INTERFACE              m_renderHal = nullptr;
481     MediaFeatureManager               *m_featureManager = nullptr;
482     PMHW_GPGPU_WALKER_PARAMS          m_gpgpuWalkerParams = nullptr;
483     PMHW_ID_ENTRY_PARAMS              m_interfaceDescriptorParams = nullptr;
484     bool                              m_renderHalMMCEnabled = false;
485     MOS_RESOURCE                      m_scratchSpaceResource;
486     std::shared_ptr<mhw::render::Itf> m_renderItf = nullptr;
487     std::shared_ptr<mhw::mi::Itf>     m_miItf     = nullptr;
488 
489 MEDIA_CLASS_DEFINE_END(XRenderHal_Platform_Interface_Next)
490 };
491 
492 #endif // __RENDERHAL_PLATFORM_INTERFACE_NEXT_H__
493