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