1 /*===================== begin_copyright_notice ==================================
2 
3 # Copyright (c) 2020, 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       renderhal_xe_hpc.cpp
26 //! \brief      implementation of Gen12_8 hardware functions
27 //! \details    Render functions
28 //!
29 
30 #include "renderhal.h"
31 #include "renderhal_xe_hpc.h"
32 #include "mhw_mi_g12_X.h"
33 #include "vp_utils.h"
34 
35 //!
36 //! \brief    Send Compute Walker
37 //! \details  Send Compute Walker
38 //! \param    PRENDERHAL_INTERFACE pRenderHal
39 //!           [in] Pointer to Hardware Interface Structure
40 //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
41 //!           [in] Pointer to Command Buffer
42 //! \param    PRENDERHAL_GPGPU_WALKER_PARAMS pGpGpuWalkerParams
43 //!           [in]    Pointer to GPGPU walker parameters
44 //! \return   MOS_STATUS
45 //!
SendComputeWalker(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_GPGPU_WALKER_PARAMS pGpGpuWalkerParams)46 MOS_STATUS XRenderHal_Interface_Xe_Hpc::SendComputeWalker(
47     PRENDERHAL_INTERFACE        pRenderHal,
48     PMOS_COMMAND_BUFFER         pCmdBuffer,
49     PMHW_GPGPU_WALKER_PARAMS    pGpGpuWalkerParams)
50 {
51     VP_FUNC_CALL();
52 
53     MhwRenderInterface          *pMhwRender;
54     MOS_STATUS                  eStatus;
55     MHW_ID_ENTRY_PARAMS         mhwIdEntryParams;
56     PRENDERHAL_KRN_ALLOCATION   pKernelEntry;
57     PRENDERHAL_MEDIA_STATE      pCurMediaState;
58 
59     MHW_RENDERHAL_CHK_NULL(pRenderHal);
60     MHW_RENDERHAL_CHK_NULL(pCmdBuffer);
61     MHW_RENDERHAL_CHK_NULL(pRenderHal->pMhwRenderInterface);
62     MHW_RENDERHAL_CHK_NULL(pGpGpuWalkerParams);
63     MHW_RENDERHAL_CHK_NULL(pRenderHal->pStateHeap);
64     MHW_RENDERHAL_CHK_NULL(pRenderHal->pStateHeap->pKernelAllocation);
65 
66     MOS_ZeroMemory(&mhwIdEntryParams, sizeof(mhwIdEntryParams));
67 
68     pKernelEntry = &pRenderHal->pStateHeap->pKernelAllocation[pRenderHal->iKernelAllocationID];
69     pCurMediaState = pRenderHal->pStateHeap->pCurMediaState;
70 
71     MHW_RENDERHAL_CHK_NULL(pKernelEntry);
72     MHW_RENDERHAL_CHK_NULL(pCurMediaState);
73 
74     mhwIdEntryParams.dwKernelOffset = pKernelEntry->dwOffset;
75     // PVC don't have sampler, so the sampler Count should be set as 0;
76     mhwIdEntryParams.dwSamplerCount = 0;
77     mhwIdEntryParams.dwSamplerOffset = pCurMediaState->dwOffset +
78                                         pRenderHal->pStateHeap->dwOffsetSampler +
79                                         pGpGpuWalkerParams->InterfaceDescriptorOffset * pRenderHal->pStateHeap->dwSizeSampler;
80     mhwIdEntryParams.dwBindingTableOffset = pGpGpuWalkerParams->BindingTableID * pRenderHal->pStateHeap->iBindingTableSize;
81     mhwIdEntryParams.dwSharedLocalMemorySize = pGpGpuWalkerParams->SLMSize;
82     mhwIdEntryParams.dwNumberofThreadsInGPGPUGroup = pGpGpuWalkerParams->ThreadWidth * pGpGpuWalkerParams->ThreadHeight;
83     pGpGpuWalkerParams->IndirectDataStartAddress = pGpGpuWalkerParams->IndirectDataStartAddress + pRenderHal->pStateHeap->pCurMediaState->dwOffset;
84 
85     // prepare postsync resource;
86     if (Mos_ResourceIsNull(&m_PostSyncBuffer))
87     {
88         MOS_ALLOC_GFXRES_PARAMS     AllocParams;
89         // Allocate Predication buffer
90         MOS_ZeroMemory(&AllocParams, sizeof(AllocParams));
91         AllocParams.Type = MOS_GFXRES_BUFFER;
92         AllocParams.TileType = MOS_TILE_LINEAR;
93         AllocParams.Format = Format_Buffer;
94         AllocParams.dwBytes = MHW_PAGE_SIZE;
95         AllocParams.pBufName = "PostSyncBuffer";
96 
97         MHW_RENDERHAL_CHK_NULL(pRenderHal->pOsInterface);
98 
99         m_pOsInterface = pRenderHal->pOsInterface;
100         MHW_RENDERHAL_CHK_STATUS(m_pOsInterface->pfnAllocateResource(
101             m_pOsInterface,
102             &AllocParams,
103             &m_PostSyncBuffer));
104     }
105 
106     MHW_RENDERHAL_CHK_STATUS(static_cast<MhwRenderInterfaceXe_Hpc*>(pRenderHal->pMhwRenderInterface)->AddComputeWalkerCmd(pCmdBuffer,
107         pGpGpuWalkerParams,
108         &mhwIdEntryParams,
109         &m_PostSyncBuffer,
110         0));
111 
112 finish:
113     return eStatus;
114 }
115 
116 //! \brief    Send To 3DState Binding Table Pool Alloc
117 //! \details    Send To 3DState Binding Table Pool Alloc
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 //! \return   MOS_STATUS
SendTo3DStateBindingTablePoolAlloc(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer)123 MOS_STATUS XRenderHal_Interface_Xe_Hpc::SendTo3DStateBindingTablePoolAlloc(
124     PRENDERHAL_INTERFACE        pRenderHal,
125     PMOS_COMMAND_BUFFER         pCmdBuffer)
126 {
127     VP_FUNC_CALL();
128 
129     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
130     mhw_render_xe_xpm_base::_3DSTATE_BINDING_TABLE_POOL_ALLOC_CMD cmd;
131     MHW_STATE_COMPUTE_MODE_PARAMS compute_mode_state;
132 
133     MHW_RENDERHAL_CHK_NULL(pRenderHal);
134     MHW_RENDERHAL_CHK_NULL(pCmdBuffer);
135     MHW_RENDERHAL_CHK_NULL(pRenderHal->pMhwRenderInterface);
136 
137 
138     compute_mode_state.enableLargeGrf = true;
139     eStatus = static_cast<MhwRenderInterfaceXe_Hpc*>(pRenderHal->pMhwRenderInterface)->AddStateComputeModeCmd(compute_mode_state, pCmdBuffer);
140 
141     MHW_RENDERHAL_CHK_STATUS(static_cast<MhwRenderInterfaceXe_Hpc*>(pRenderHal->pMhwRenderInterface)->Add3DStateBindingTablePoolAllocCmd(pCmdBuffer, cmd));
142 
143 finish:
144     return eStatus;
145 }
146 
~XRenderHal_Interface_Xe_Hpc()147 XRenderHal_Interface_Xe_Hpc::~XRenderHal_Interface_Xe_Hpc()
148 {
149     // Release PostSyncBuffer
150     if ((!Mos_ResourceIsNull(&m_PostSyncBuffer)) && (m_pOsInterface !=nullptr))
151     {
152         m_pOsInterface->pfnFreeResource(
153             m_pOsInterface,
154             &m_PostSyncBuffer);
155     }
156 }
157 
IsRenderHalMMCEnabled(PRENDERHAL_INTERFACE pRenderHal)158 MOS_STATUS XRenderHal_Interface_Xe_Hpc::IsRenderHalMMCEnabled(PRENDERHAL_INTERFACE pRenderHal)
159 {
160     MOS_STATUS                      eStatus = MOS_STATUS_SUCCESS;
161     MOS_USER_FEATURE_VALUE_DATA     UserFeatureData;
162 
163     MHW_RENDERHAL_CHK_NULL_NO_STATUS(pRenderHal);
164 
165     // Read user feature key to set MMC for Fast Composition surfaces
166     MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
167     UserFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
168 #ifdef LINUX
169     UserFeatureData.bData = !MEDIA_IS_WA(pRenderHal->pWaTable, WaDisableVPMmc) || !MEDIA_IS_WA(pRenderHal->pWaTable, WaDisableCodecMmc);
170 #else
171     UserFeatureData.bData = false; // init as default value to disable MMCD
172 #endif
173 
174 #if (_DEBUG || _RELEASE_INTERNAL)
175     MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
176         nullptr,
177         __MEDIA_USER_FEATURE_ENABLE_RENDER_ENGINE_MMC_ID,
178         &UserFeatureData,
179         pRenderHal->pOsInterface ? pRenderHal->pOsInterface->pOsContext : nullptr));
180 #endif
181 
182     m_renderHalMMCEnabled = UserFeatureData.bData && MEDIA_IS_SKU(pRenderHal->pSkuTable, FtrE2ECompression);
183     pRenderHal->isMMCEnabled = m_renderHalMMCEnabled;
184 
185 finish:
186     return eStatus;
187 }