1 /* 2 * Copyright (c) 2018-2020, 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 //! 24 //! \file media_scalability.h 25 //! \brief Defines the common interface for media scalability 26 //! \details The media scalability interface is further sub-divided by component, 27 //! this file is for the base interface which is shared by all components. 28 //! 29 30 #ifndef __MEDIA_SCALABILITY_H__ 31 #define __MEDIA_SCALABILITY_H__ 32 #include <stdint.h> 33 #include <memory> 34 #include "mos_defs.h" 35 #include "mos_os_specific.h" 36 37 #include "mos_os_virtualengine_specific.h" 38 39 #include "mos_os.h" 40 41 #include "mhw_mi_itf.h" 42 class MediaScalabilityOption; 43 44 struct ComponentState; 45 struct ScalabilityPars; 46 #define COMMAND_BUFFER_RESERVED_SPACE 0x80 47 class MediaStatusReport; 48 class MediaContext; 49 class MediaScalability : public mhw::mi::Itf::ParSetting 50 { 51 friend class MediaContext; 52 53 public: 54 //! 55 //! \brief Media scalability constructor 56 //! 57 MediaScalability(MediaContext *mediaContext); 58 MediaScalability()59 MediaScalability(){}; 60 //! 61 //! \brief Media scalability destructor 62 //! ~MediaScalability()63 virtual ~MediaScalability() {} 64 65 //! 66 //! \brief Copy constructor 67 //! 68 MediaScalability(const MediaScalability &) = delete; 69 70 //! 71 //! \brief Copy assignment operator 72 //! 73 MediaScalability &operator=(const MediaScalability &) = delete; 74 75 //! 76 //! \brief Check if the scalability mode decided by parameters matched with current 77 //! \param [in] params 78 //! Pointer to the input parameters 79 //! \return bool 80 //! true if mode decided by input parameters matched with current mode, 81 //! false if not matched. 82 //! 83 bool IsScalabilityModeMatched(ScalabilityPars *params); 84 85 //! 86 //! \brief Check if the scalability mode matched with current 87 //! \param [in] scalabOption 88 //! Scalability option to match with current 89 //! \return bool 90 //! true if mode matched with current mode, 91 //! false if not matched. 92 //! 93 bool IsScalabilityModeMatched(MediaScalabilityOption &scalabOption); 94 95 //! 96 //! \brief Check if the Gpu ctx create option matched 97 //! \param [in] gpuCtxCreateOption1 98 //! Pointer to the input gpu ctx create option for compare 99 //! \param [in] gpuCtxCreateOption2 100 //! Pointer to the input gpu ctx create option for compare 101 //! \return bool 102 //! true if the two option are matched and can share one gpu ctx, 103 //! false if not matched. 104 //! 105 bool IsGpuCtxCreateOptionMatched(PMOS_GPUCTX_CREATOPTIONS_ENHANCED gpuCtxCreateOption1, PMOS_GPUCTX_CREATOPTIONS_ENHANCED gpuCtxCreateOption2); 106 107 //! 108 //! \brief Initialize the media scalability 109 //! \details It will prepare the resources needed in scalability 110 //! and initialize the state of scalability 111 //! \param [in] option 112 //! Input scalability option 113 //! \return MOS_STATUS 114 //! MOS_STATUS_SUCCESS if success, else fail reason 115 //! 116 virtual MOS_STATUS Initialize(const MediaScalabilityOption &option) = 0; 117 118 //! 119 //! \brief Construct parameters for GPU context create. 120 //! \param [in, out] gpuCtxCreateOption 121 //! Pointer to the GPU Context Create Option 122 //! \return MOS_STATUS 123 //! MOS_STATUS_SUCCESS if success, else fail reason 124 //! 125 virtual MOS_STATUS GetGpuCtxCreationOption(MOS_GPUCTX_CREATOPTIONS *gpuCtxCreateOption) = 0; 126 127 //! 128 //! \brief Destroy the media scalability 129 //! \return MOS_STATUS 130 //! MOS_STATUS_SUCCESS if success, else fail reason 131 //! 132 virtual MOS_STATUS Destroy(); 133 134 //! 135 //! \brief Update the media scalability state 136 //! \param [in] statePars 137 //! parameters to update the state 138 //! \return MOS_STATUS 139 //! MOS_STATUS_SUCCESS if success, else fail reason 140 //! 141 virtual MOS_STATUS UpdateState(void *statePars) = 0; 142 143 //! 144 //! \brief Verify command buffer 145 //! \param [in] requestedSize 146 //! requested size for command buffer 147 //! \param [in] requestedPatchListSize 148 //! requested size for patched list 149 //! \param [out] singleTaskPhaseSupportedInPak 150 //! Inidcate if to use single task phase in pak. 151 //! \return MOS_STATUS 152 //! MOS_STATUS_SUCCESS if success, else fail reason 153 //! 154 virtual MOS_STATUS VerifyCmdBuffer(uint32_t requestedSize, uint32_t requestedPatchListSize, bool &singleTaskPhaseSupportedInPak) = 0; 155 156 //! 157 //! \brief Get command buffer 158 //! \param [in, out] cmdBuffer 159 //! Pointer to command buffer 160 //! \return MOS_STATUS 161 //! MOS_STATUS_SUCCESS if success, else fail reason 162 //! 163 virtual MOS_STATUS GetCmdBuffer(PMOS_COMMAND_BUFFER cmdBuffer, bool frameTrackingRequested = true) = 0; 164 165 //! 166 167 //! \brief Return command buffer 168 //! \param [in, out] cmdBuffer 169 //! Pointer to command buffer 170 //! \return MOS_STATUS 171 //! MOS_STATUS_SUCCESS if success, else fail reason 172 //! 173 virtual MOS_STATUS ReturnCmdBuffer(PMOS_COMMAND_BUFFER cmdBuffer) = 0; 174 175 //! 176 //! \brief Submit command buffer 177 //! \param [in, out] cmdBuffer 178 //! Pointer to command buffer 179 //! \return MOS_STATUS 180 //! MOS_STATUS_SUCCESS if success, else fail reason 181 //! 182 virtual MOS_STATUS SubmitCmdBuffer(PMOS_COMMAND_BUFFER cmdBuffer) = 0; 183 184 //! 185 //! \brief Add synchronization for pipes. 186 //! \param [in] syncType 187 //! type of pipe sync 188 //! \param [in] semaphoreId 189 //! Id of the semaphore used for this sync 190 //! \param [in, out] cmdBuffer 191 //! Pointer to command buffer 192 //! \return MOS_STATUS 193 //! MOS_STATUS_SUCCESS if success, else fail reason 194 //! 195 virtual MOS_STATUS SyncPipe(uint32_t syncType, uint32_t semaphoreId, PMOS_COMMAND_BUFFER cmdBuffer) = 0; 196 197 //! 198 //! \brief Reset semaphore 199 //! \param [in] syncType 200 //! type of pipe sync 201 //! \param [in] semaphoreId 202 //! Id of the semaphore used for this sync 203 //! \param [in, out] cmdBuffer 204 //! Pointer to command buffer 205 //! \return MOS_STATUS 206 //! MOS_STATUS_SUCCESS if success, else fail reason 207 //! 208 virtual MOS_STATUS ResetSemaphore(uint32_t syncType, uint32_t semaphoreId, PMOS_COMMAND_BUFFER cmdBuffer) = 0; 209 210 //! 211 //! \brief Oca 1st Level BB Start 212 //! \param [in, out] cmdBuffer 213 //! Reference to command buffer 214 //! \return MOS_STATUS 215 //! MOS_STATUS_SUCCESS if success, else fail reason 216 //! Oca1stLevelBBStart(MOS_COMMAND_BUFFER & cmdBuffer)217 virtual MOS_STATUS Oca1stLevelBBStart(MOS_COMMAND_BUFFER &cmdBuffer) { return MOS_STATUS_SUCCESS; }; 218 219 //! 220 //! \brief Oca 1st Level BB End 221 //! \param [in, out] cmdBuffer 222 //! Reference to command buffer 223 //! \return MOS_STATUS 224 //! MOS_STATUS_SUCCESS if success, else fail reason 225 //! Oca1stLevelBBEnd(MOS_COMMAND_BUFFER & cmdBuffer)226 virtual MOS_STATUS Oca1stLevelBBEnd(MOS_COMMAND_BUFFER &cmdBuffer) { return MOS_STATUS_SUCCESS; }; 227 228 //! 229 //! \brief Get pipe number 230 //! \return Pipe number 231 //! GetPipeNumber()232 uint8_t GetPipeNumber() { return m_pipeNum; }; 233 234 //! 235 //! \brief Get current pipe 236 //! \return Current pipe index 237 //! GetCurrentPipe()238 uint8_t GetCurrentPipe() { return m_currentPipe; }; 239 240 //! 241 //! \brief Get pass number 242 //! \return Pass number 243 //! GetPassNumber()244 uint16_t GetPassNumber() { return m_passNum; }; 245 246 //! 247 //! \brief Get current pass 248 //! \return Current pass index 249 //! GetCurrentPass()250 uint16_t GetCurrentPass() { return m_currentPass; }; 251 252 //! 253 //! \brief Set pass number 254 //! \return void 255 //! SetPassNumber(uint16_t num)256 void SetPassNumber(uint16_t num) { m_passNum = num; }; 257 258 //! 259 //! \brief Set pass index 260 //! \return void 261 //! SetCurrentPassIndex(uint8_t num)262 void SetCurrentPassIndex(uint8_t num) { m_currentPass = num; }; 263 264 //! 265 //! \brief Set pipe number 266 //! \return void 267 //! SetPipeNumber(uint8_t num)268 void SetPipeNumber(uint8_t num) { m_pipeNum = num; }; 269 270 //! 271 //! \brief Set pipe index 272 //! \return void 273 //! SetCurrentPipeIndex(uint8_t num)274 void SetCurrentPipeIndex(uint8_t num) { m_currentPipe = num; }; 275 GetCurrentRow()276 uint8_t GetCurrentRow() { return m_currentRow; }; 277 GetCurrentSubPass()278 uint8_t GetCurrentSubPass() { return m_currentSubPass; }; 279 280 //! 281 //! \brief Get component state 282 //! \return point to component state 283 //! GetComponentState()284 ComponentState *GetComponentState() { return m_componentState; }; 285 286 //! 287 //! \brief Send Cmd buffer Attributes with frame tracking info 288 //! 289 //! \param [in] cmdBuffer 290 //! Reference to command buffer 291 //! \param [in] frameTrackingRequested 292 //! Indicate if frame tracking is requested 293 //! 294 //! \return MOS_STATUS 295 //! MOS_STATUS_SUCCESS if success, else fail reason 296 //! 297 virtual MOS_STATUS SendAttrWithFrameTracking(MOS_COMMAND_BUFFER &cmdBuffer, bool frameTrackingRequested) = 0; 298 299 //! 300 //! \brief Get if frame tracking is enabled from scalability 301 //! \return bool 302 //! true if enabled, else false 303 //! IsFrameTrackingEnabled()304 bool IsFrameTrackingEnabled() { return m_frameTrackingEnabled; }; 305 306 protected: 307 //! 308 //! \brief Resizes the cmd buffer and patch list with cmd buffer header 309 //! 310 //! \param [in] requestedCommandBufferSize 311 //! Requested resize command buffer size 312 //! \param [in] requestedPatchListSize 313 //! Requested resize patchlist size 314 //! 315 //! \return MOS_STATUS 316 //! MOS_STATUS_SUCCESS if success, else fail reason 317 //! ResizeCommandBufferAndPatchList(uint32_t requestedCommandBufferSize,uint32_t requestedPatchListSize)318 virtual MOS_STATUS ResizeCommandBufferAndPatchList( 319 uint32_t requestedCommandBufferSize, 320 uint32_t requestedPatchListSize) 321 { 322 return MOS_STATUS_SUCCESS; 323 } 324 325 //! 326 //! \brief Verify command buffer 327 //! \param [in] requestedSize 328 //! requested size for command buffer 329 //! \param [in] requestedPatchListSize 330 //! requested size for patched list 331 //! \param [out] singleTaskPhaseSupportedInPak 332 //! Inidcate if to use single task phase in pak. 333 //! \return MOS_STATUS 334 //! MOS_STATUS_SUCCESS if success, else fail reason 335 //! 336 virtual MOS_STATUS VerifySpaceAvailable(uint32_t requestedSize, uint32_t requestedPatchListSize, bool &singleTaskPhaseSupportedInPak); 337 338 uint8_t m_currentPipe = 0; //!< Current pipe index 339 uint16_t m_currentPass = 0; //!< Current pass index 340 341 uint8_t m_pipeNum = 1; //!< Pipe number 342 uint16_t m_passNum = 1; //!< Pass number 343 bool m_singleTaskPhaseSupported = true; //!< Indicate if single task phase is supported 344 uint8_t m_pipeIndexForSubmit = 0; //!< Pipe index to submit cmdbuffer 345 346 uint8_t m_currentRow = 0; //!< Current row index when tile replay is enabled 347 uint8_t m_currentSubPass = 0; //!< Current tile row pass index when tile replay is enabled 348 349 ComponentState *m_componentState = nullptr; //!< Component state 350 351 uint8_t m_componentType = 0; 352 PMOS_INTERFACE m_osInterface = nullptr; //!< OS interface 353 MediaScalabilityOption * m_scalabilityOption = nullptr; 354 PMOS_GPUCTX_CREATOPTIONS m_gpuCtxCreateOption = nullptr; //!<For MultiPipe cases, it should be converted to PMOS_GPUCTX_CREATOPTIONS_ENHANCED; 355 MediaStatusReport * m_statusReport = nullptr; //!< Media status report ptr 356 MediaContext * m_mediaContext = nullptr; //!< Media context ptr 357 bool m_attrReady = false; //!< Indicate if cmd buf attribute is ready 358 bool m_frameTrackingEnabled = true; //!< Indicate if frame tracking is enabled 359 360 PMOS_VIRTUALENGINE_HINT_PARAMS m_veHitParams = nullptr; //!< Virtual Engine hint parameters 361 362 MOS_VE_HANDLE m_veState = nullptr; //!< Virtual Engine State 363 std::shared_ptr<mhw::mi::Itf> m_miItf = nullptr; 364 PMOS_VIRTUALENGINE_INTERFACE m_veInterface = nullptr; //!< Virtual Engine Interface 365 366 MEDIA_CLASS_DEFINE_END(MediaScalability) 367 }; 368 #endif // !__MEDIA_SCALABILITY_H__ 369