1 /*===================== begin_copyright_notice ==================================
2 
3 # Copyright (c) 2022, Intel Corporation
4 
5 # Permission is hereby granted, free of charge, to any person obtaining a
6 # copy of this software and associated documentation files (the "Software"),
7 # to deal in the Software without restriction, including without limitation
8 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 # and/or sell copies of the Software, and to permit persons to whom the
10 # Software is furnished to do so, subject to the following conditions:
11 
12 # The above copyright notice and this permission notice shall be included
13 # in all copies or substantial portions of the Software.
14 
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 # OTHER DEALINGS IN THE SOFTWARE.
22 
23 ======================= end_copyright_notice ==================================*/
24 //!
25 //! \file      mhw_state_heap_xe_hpg.h
26 //! \brief         This modules implements HW interface layer to be used on all platforms on
27 //!            all operating systems/DDIs, across MHW components.
28 //!
29 
30 #ifndef __MHW_STATE_HEAP_XE_HPG_H__
31 #define __MHW_STATE_HEAP_XE_HPG_H__
32 
33 #include "mhw_state_heap_generic.h"
34 #include "mhw_state_heap_hwcmd_xe_hpg.h"
35 
36 struct MHW_STATE_HEAP_INTERFACE_XE_HPG : public MHW_STATE_HEAP_INTERFACE_GENERIC<mhw_state_heap_xe_hpg>
37 {
38 private:
39     uint16_t m_wSizeOfInterfaceDescriptor;
40     uint32_t m_dwSizeSurfaceState;
41     uint32_t m_dwSizeSurfaceStateAdv;
42     PMHW_STATE_HEAP m_pLastDSHPinter = nullptr;
43     PMHW_STATE_HEAP m_pLastISHPinter = nullptr;
44     uint32_t        m_lastDwNumDsh = 0;
45     uint32_t        m_lastDwNumIsh = 0;
46 
47 public:
48     MHW_STATE_HEAP_INTERFACE_XE_HPG(PMOS_INTERFACE pInputOSInterface, int8_t bDynamicMode);
49 
50     ~MHW_STATE_HEAP_INTERFACE_XE_HPG();
51 
52     MOS_STATUS SetInterfaceDescriptorEntry(
53         PMHW_ID_ENTRY_PARAMS pParams);
54 
55     MOS_STATUS AddInterfaceDescriptorData(
56         PMHW_ID_ENTRY_PARAMS pParams);
57 
58     MOS_STATUS SetSurfaceStateEntry(
59         PMHW_SURFACE_STATE_PARAMS pParams);
60 
61     MOS_STATUS SetSurfaceState(
62         PMHW_KERNEL_STATE       pKernelState,
63         PMOS_COMMAND_BUFFER     pCmdBuffer,
64         uint32_t                dwNumSurfaceStatesToSet,
65         PMHW_RCS_SURFACE_PARAMS pParams);
66 
67     MOS_STATUS SetSamplerState(
68         void                    *pSampler,
69         PMHW_SAMPLER_STATE_PARAM pParam);
70 
71     MOS_STATUS AddSamplerStateData(
72         uint32_t                 samplerOffset,
73         MemoryBlock             *memoryBlock,
74         PMHW_SAMPLER_STATE_PARAM pParam);
75 
76     MOS_STATUS InitSamplerStates(
77         void   *pSamplerStates,
78         int32_t iSamplers);
79 
80     MOS_STATUS LoadSamplerAvsTable(
81         void                        *pTable,
82         PMHW_SAMPLER_AVS_TABLE_PARAM pMhwSamplerAvsTableParam);
83 
84     MOS_STATUS InitHwSizes();
85 
86     MOS_STATUS SetInterfaceDescriptor(
87         uint32_t                         dwNumIdsToSet,
88         PMHW_INTERFACE_DESCRIPTOR_PARAMS pParams);
89 
90     MOS_STATUS SetMissingShaderChannels(
91         mhw_state_heap_xe_hpg::RENDER_SURFACE_STATE_CMD *pSurfaceState,
92         uint32_t                                         dwFormat);
93 
GetDSHPointerMHW_STATE_HEAP_INTERFACE_XE_HPG94     PMHW_STATE_HEAP GetDSHPointer()
95     {
96         PMHW_STATE_HEAP pDSHPinter = XMHW_STATE_HEAP_INTERFACE::GetDSHPointer();
97         uint32_t        numDSH     = XMHW_STATE_HEAP_INTERFACE::GetNumDsh();
98         if (numDSH > 1)
99         {
100             if (numDSH != m_lastDwNumDsh)
101             {
102                 for (uint32_t i = 0; i < (numDSH - 1); i++)
103                 {
104                     pDSHPinter = pDSHPinter->pNext;
105                 }
106                 m_lastDwNumDsh = numDSH;
107                 m_pLastDSHPinter = pDSHPinter;
108             }
109             else
110             {
111                 pDSHPinter = m_pLastDSHPinter;
112             }
113 
114         }
115         return pDSHPinter;
116     }
117 
GetISHPointerMHW_STATE_HEAP_INTERFACE_XE_HPG118     PMHW_STATE_HEAP GetISHPointer()
119     {
120         PMHW_STATE_HEAP pISHPinter = XMHW_STATE_HEAP_INTERFACE::GetISHPointer();
121         uint32_t        numISH     = XMHW_STATE_HEAP_INTERFACE::GetNumIsh();
122         if (numISH > 1)
123         {
124             if (numISH != m_lastDwNumIsh)
125             {
126                 for (uint32_t i = 0; i < (numISH - 1); i++)
127                 {
128                     pISHPinter = pISHPinter->pNext;
129                 }
130                 m_lastDwNumIsh = numISH;
131                 m_pLastISHPinter = pISHPinter;
132             }
133             else
134             {
135                 pISHPinter = m_pLastISHPinter;
136             }
137         }
138         return pISHPinter;
139     }
140 };
141 #endif
142