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_hpg.cpp
26 //! \brief      implementation of Gen12_7 hardware functions
27 //! \details    Render functions
28 //!
29 
30 #include "renderhal_legacy.h"
31 #include "renderhal_xe_hpg.h"
32 #include "vp_utils.h"
33 #include "mhw_render_xe_hp_base.h"
34 #include "mhw_state_heap.h"
35 #include "mos_os.h"
36 #include "mos_utilities.h"
37 #include "mos_utilities_common.h"
38 #include "vp_common.h"
39 
40 #define RENDERHAL_SAMPLERS_AVS_HPG 0
41 #define ENLARGE_KERNEL_COUNT_HPG   RENDERHAL_KERNEL_COUNT * 3
42 #define ENLARGE_KERNEL_HEAP_HPG    RENDERHAL_KERNEL_HEAP * 3
43 #define ENLARGE_CURBE_SIZE_HPG     RENDERHAL_CURBE_SIZE * 16
44 
45 extern const RENDERHAL_STATE_HEAP_SETTINGS g_cRenderHal_State_Heap_Settings_xe_hpg =
46 {
47     // Global GSH Allocation parameters
48     RENDERHAL_SYNC_SIZE,                       //!< iSyncSize
49 
50     // Media State Allocation parameters
51     RENDERHAL_MEDIA_STATES,                    //!< iMediaStateHeaps - Set by Initialize
52     RENDERHAL_MEDIA_IDS,                       //!< iMediaIDs
53     RENDERHAL_CURBE_SIZE,                      //!< iCurbeSize
54     RENDERHAL_SAMPLERS,                        //!< iSamplers
55     RENDERHAL_SAMPLERS_AVS_HPG,                //!< iSamplersAVS
56     RENDERHAL_SAMPLERS_VA,                     //!< iSamplersVA
57     RENDERHAL_KERNEL_COUNT,                    //!< iKernelCount
58     RENDERHAL_KERNEL_HEAP,                     //!< iKernelHeapSize
59     RENDERHAL_KERNEL_BLOCK_SIZE,               //!< iKernelBlockSize
60 
61     // Media VFE/ID configuration, limits
62     0,                                         //!< iPerThreadScratchSize
63     RENDERHAL_MAX_SIP_SIZE,                    //!< iSipSize
64 
65     // Surface State Heap Settings
66     RENDERHAL_SSH_INSTANCES,                   //!< iSurfaceStateHeaps
67     RENDERHAL_SSH_BINDING_TABLES,              //!< iBindingTables
68     RENDERHAL_SSH_SURFACE_STATES,              //!< iSurfaceStates
69     RENDERHAL_SSH_SURFACES_PER_BT,             //!< iSurfacesPerBT
70     RENDERHAL_SSH_BINDING_TABLE_ALIGN,         //!< iBTAlignment
71     MOS_CODEC_RESOURCE_USAGE_BEGIN_CODEC       //!< heapUsageType
72 };
73 
74 extern const RENDERHAL_ENLARGE_PARAMS g_cRenderHal_Enlarge_State_Heap_Settings_Adv_xe_hpg =
75 {
76     RENDERHAL_SSH_BINDING_TABLES_MAX,  //!< iBindingTables
77     RENDERHAL_SSH_SURFACE_STATES_MAX,  //!< iSurfaceStates
78     RENDERHAL_SSH_SURFACES_PER_BT,      //!< iSurfacesPerBT
79     ENLARGE_KERNEL_COUNT_HPG,          //!< iKernelCount
80     ENLARGE_KERNEL_HEAP_HPG,           //!< iKernelHeapSize
81     ENLARGE_CURBE_SIZE_HPG             //!< iCurbeSize
82 };
83 
IsRenderHalMMCEnabled(PRENDERHAL_INTERFACE pRenderHal)84 MOS_STATUS XRenderHal_Interface_Xe_Hpg::IsRenderHalMMCEnabled(
85     PRENDERHAL_INTERFACE pRenderHal)
86 {
87     VP_FUNC_CALL();
88 
89     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
90     MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
91 
92     MHW_RENDERHAL_CHK_NULL_NO_STATUS(pRenderHal);
93 
94     // Read user feature key to set MMC for Fast Composition surfaces
95     MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
96     UserFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
97 #if defined(LINUX) && (!defined(WDDM_LINUX))
98     UserFeatureData.bData = !MEDIA_IS_WA(pRenderHal->pWaTable, WaDisableVPMmc) || !MEDIA_IS_WA(pRenderHal->pWaTable, WaDisableCodecMmc);
99 #else
100     UserFeatureData.bData = true;  // turn on MMC for DG2
101 #endif
102 
103 #if (_DEBUG || _RELEASE_INTERNAL)
104     MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
105         nullptr,
106         __MEDIA_USER_FEATURE_ENABLE_RENDER_ENGINE_MMC_ID,
107         &UserFeatureData,
108         pRenderHal->pOsInterface ? pRenderHal->pOsInterface->pOsContext : nullptr));
109 #endif
110 
111     m_renderHalMMCEnabled    = UserFeatureData.bData && MEDIA_IS_SKU(pRenderHal->pSkuTable, FtrE2ECompression);
112     pRenderHal->isMMCEnabled = m_renderHalMMCEnabled;
113 
114 finish:
115     return eStatus;
116 }
117 
SendComputeWalker(PRENDERHAL_INTERFACE pRenderHal,PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_GPGPU_WALKER_PARAMS pGpGpuWalkerParams)118 MOS_STATUS XRenderHal_Interface_Xe_Hpg::SendComputeWalker(
119     PRENDERHAL_INTERFACE        pRenderHal,
120     PMOS_COMMAND_BUFFER         pCmdBuffer,
121     PMHW_GPGPU_WALKER_PARAMS    pGpGpuWalkerParams)
122 {
123     VP_FUNC_CALL();
124 
125     MhwRenderInterface          *pMhwRender;
126     MOS_STATUS                  eStatus;
127     MHW_ID_ENTRY_PARAMS         mhwIdEntryParams;
128     PRENDERHAL_KRN_ALLOCATION   pKernelEntry;
129     PRENDERHAL_MEDIA_STATE      pCurMediaState;
130     PRENDERHAL_INTERFACE_LEGACY pRenderHalLegacy = (PRENDERHAL_INTERFACE_LEGACY)pRenderHal;
131 
132     MHW_RENDERHAL_CHK_NULL(pRenderHalLegacy);
133     MHW_RENDERHAL_CHK_NULL(pCmdBuffer);
134     MHW_RENDERHAL_CHK_NULL(pRenderHalLegacy->pMhwRenderInterface);
135     MHW_RENDERHAL_CHK_NULL(pGpGpuWalkerParams);
136     MHW_RENDERHAL_CHK_NULL(pRenderHalLegacy->pStateHeap);
137     MHW_RENDERHAL_CHK_NULL(pRenderHalLegacy->pStateHeap->pKernelAllocation);
138 
139     MOS_ZeroMemory(&mhwIdEntryParams, sizeof(mhwIdEntryParams));
140 
141     pKernelEntry = &pRenderHalLegacy->pStateHeap->pKernelAllocation[pRenderHalLegacy->iKernelAllocationID];
142     pCurMediaState = pRenderHalLegacy->pStateHeap->pCurMediaState;
143 
144     MHW_RENDERHAL_CHK_NULL(pKernelEntry);
145     MHW_RENDERHAL_CHK_NULL(pCurMediaState);
146 
147     mhwIdEntryParams.dwKernelOffset = pKernelEntry->dwOffset;
148     mhwIdEntryParams.dwSamplerCount = pKernelEntry->Params.Sampler_Count;
149     mhwIdEntryParams.dwSamplerOffset = pCurMediaState->dwOffset +
150                                         pRenderHalLegacy->pStateHeap->dwOffsetSampler +
151                                         pGpGpuWalkerParams->InterfaceDescriptorOffset * pRenderHalLegacy->pStateHeap->dwSizeSampler;
152     mhwIdEntryParams.dwBindingTableOffset = pGpGpuWalkerParams->BindingTableID * pRenderHalLegacy->pStateHeap->iBindingTableSize;
153     mhwIdEntryParams.dwSharedLocalMemorySize = pGpGpuWalkerParams->SLMSize;
154     mhwIdEntryParams.dwNumberofThreadsInGPGPUGroup = pGpGpuWalkerParams->ThreadWidth * pGpGpuWalkerParams->ThreadHeight;
155     //This only a WA to disable EU fusion for multi-layer blending cases.
156     //Need remove it after kernel and compiler fix it.
157     mhwIdEntryParams.bBarrierEnable = pRenderHalLegacy->eufusionBypass ? 1: 0;
158     pGpGpuWalkerParams->IndirectDataStartAddress = pGpGpuWalkerParams->IndirectDataStartAddress + pRenderHalLegacy->pStateHeap->pCurMediaState->dwOffset;
159 
160     MHW_RENDERHAL_CHK_STATUS(static_cast<MhwRenderInterfaceXe_Xpm_Base*>(pRenderHalLegacy->pMhwRenderInterface)->AddComputeWalkerCmd(pCmdBuffer,
161         pGpGpuWalkerParams,
162         &mhwIdEntryParams,
163         nullptr,
164         0));
165 
166 finish:
167     return eStatus;
168 }
169 
170 //!
171 //! \brief    Initialize the State Heap Settings per platform
172 //! \param    PRENDERHAL_STATE_HEAP_SETTINGS pSettings
173 //!           [out] Pointer to PRENDERHAL_STATE_HEAP_SETTINGSStructure
174 //! \return   void
175 //!
InitStateHeapSettings(PRENDERHAL_INTERFACE pRenderHal)176 void XRenderHal_Interface_Xe_Hpg::InitStateHeapSettings(
177     PRENDERHAL_INTERFACE    pRenderHal)
178 {
179     MHW_RENDERHAL_CHK_NULL_NO_STATUS_RETURN(pRenderHal);
180     // Set State Heap settings for xe hpg
181     pRenderHal->StateHeapSettings              = g_cRenderHal_State_Heap_Settings_xe_hpg;
182     pRenderHal->enlargeStateHeapSettingsForAdv = g_cRenderHal_Enlarge_State_Heap_Settings_Adv_xe_hpg;
183 }
184