1 /* 2 * Copyright (c) 2017-2018, 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 //! \file codechal_encode_sw_scoreboard.h 24 //! \brief Defines base class for SW scoreboard init kernel 25 //! 26 27 #ifndef __CODECHAL_ENCODE_SW_SCOREBOARD_H__ 28 #define __CODECHAL_ENCODE_SW_SCOREBOARD_H__ 29 30 #include "codechal.h" 31 #include "codechal_hw.h" 32 33 #define CODECHAL_ENCODE_SW_SCOREBOARD_SURFACE_NUM MOS_MAX(dependencyPatternNum, CODECHAL_ENCODE_RECYCLED_BUFFER_NUM) 34 35 enum DependencyPattern 36 { 37 dependencyWavefrontNone = 0x00, 38 dependencyWavefrontHorizontal = 0x01, 39 dependencyWavefrontVertical = 0x02, 40 dependencyWavefront45Degree = 0x03, 41 dependencyWavefront26Degree = 0x04, 42 dependencyWavefront45XDegree = 0x05, 43 dependencyWavefront26XDegree = 0x06, 44 dependencyWavefront45XVp9Degree = 0x07, 45 dependencyWavefront26ZDegree = 0x08, 46 dependencyWavefront26ZigDegree = 0x09, 47 dependencyWavefront45DDegree = 0x0A, 48 dependencyWavefront26DDegree = 0x0B, // not support yet 49 dependencyWavefront45XDegreeAlt = 0x0C, 50 dependencyWavefront26XDegreeAlt = 0x0D, 51 dependencyWavefront45XDDegree = 0x0E, // 45X diamond 52 dependencyWavefront26XDDegree = 0x0F, // 26X diamond, not support yet 53 dependencyWavefrontCustom = 0x10, 54 dependencyPatternNum = dependencyWavefrontCustom + 1 55 }; 56 57 //! 58 //! SW scoreboard init kernel base class 59 //! \details Entry point to create SW scoreboard init class instance 60 //! 61 //! This class defines the base class for SW scoreboard init feature, it includes 62 //! common member fields, functions, interfaces etc shared by all Gens. 63 //! 64 //! To create an instance, client needs to call #CodechalEncodeSWScoreboard::CreateSWScoreboardState() 65 //! 66 class CodechalEncodeSwScoreboard 67 { 68 public: 69 //! 70 //! \brief SW scoreboard init kernel binding table 71 //! 72 enum KernelBTI 73 { 74 swScoreboardInitSurface = 0, 75 swScoreboardInitLcuInfoSurface = 1, 76 swScoreboardNumSurfaces = 2, 77 }; 78 79 //!< \cond SKIP_DOXYGEN 80 //! 81 //! \brief Curbe params for SW scoreboard init kernel 82 //! 83 struct CurbeParams 84 { 85 uint32_t scoreboardWidth = 0; 86 uint32_t scoreboardHeight = 0; 87 bool isHevc = false; 88 uint32_t numberOfWaveFrontSplit = 0; 89 uint32_t numberOfChildThread = 0; 90 }; 91 92 //! 93 //! \brief Surface params for SW scoreboard init kernel 94 //! 95 struct SurfaceParams 96 { 97 bool isHevc = false; 98 uint32_t swScoreboardSurfaceWidth = 0; 99 uint32_t swScoreboardSurfaceHeight = 0; 100 MOS_SURFACE swScoreboardSurface[CODECHAL_ENCODE_SW_SCOREBOARD_SURFACE_NUM] = {}; 101 uint32_t surfaceIndex = 0; 102 PMOS_SURFACE lcuInfoSurface = nullptr; 103 }; 104 105 //! 106 //! \brief Kernel params for SW scoreboard init kernel 107 //! 108 struct KernelParams 109 { 110 uint32_t scoreboardWidth = 0; 111 uint32_t scoreboardHeight = 0; 112 bool isHevc = false; 113 uint32_t numberOfWaveFrontSplit = 0; 114 uint32_t numberOfChildThread = 0; 115 uint32_t swScoreboardSurfaceWidth = 0; 116 uint32_t swScoreboardSurfaceHeight = 0; 117 uint32_t surfaceIndex = 0; 118 PMOS_SURFACE lcuInfoSurface = nullptr; 119 }; 120 121 //! 122 //! \brief Get current SW scoreboard init surface 123 //! 124 //! \param [in] index 125 //! Index to SW scorboard surface array 126 //! 127 //! \return void 128 //! SetCurSwScoreboardSurfaceIndex(uint32_t index)129 void SetCurSwScoreboardSurfaceIndex(uint32_t index) { m_surfaceParams.surfaceIndex = index; } 130 131 //! 132 //! \brief Set current dependency pattern 133 //! 134 //! \return Currern dependency pattern 135 //! SetDependencyPattern(DependencyPattern pattern)136 void SetDependencyPattern(DependencyPattern pattern) { m_dependencyPatternIdx = pattern; } 137 138 //! 139 //! \brief Get current dependency pattern 140 //! 141 //! \return Currern dependency pattern 142 //! GetDependencyPattern()143 DependencyPattern GetDependencyPattern() { return (DependencyPattern)m_dependencyPatternIdx; } 144 145 //! 146 //! \brief Get current SW scoreboard init surface 147 //! 148 //! \return Pointer to current SW scoreboard init surface 149 //! GetCurSwScoreboardSurface()150 PMOS_SURFACE GetCurSwScoreboardSurface() { return &m_surfaceParams.swScoreboardSurface[m_surfaceParams.surfaceIndex]; } 151 152 //! 153 //! \brief Destructor 154 //! 155 virtual ~CodechalEncodeSwScoreboard(); 156 157 //! 158 //! \brief Get SW scoreboard init BT count 159 //! 160 //! \return Number of BTI 161 //! 162 virtual uint8_t GetBTCount(); 163 164 //! 165 //! \brief Initialize SW scoreboard init kernel state 166 //! 167 //! \return MOS_STATUS 168 //! MOS_STATUS_SUCCESS if success, else fail reason 169 //! InitKernelState()170 virtual MOS_STATUS InitKernelState() { return MOS_STATUS_SUCCESS; } 171 172 //! 173 //! \brief SW scoreboard init kernel function 174 //! 175 //! \param [in] params 176 //! Pointer to KernelParams 177 //! 178 //! \return MOS_STATUS 179 //! MOS_STATUS_SUCCESS if success, else fail reason 180 //! 181 virtual MOS_STATUS Execute(KernelParams *params); 182 183 //! 184 //! \brief Release SW scoreboard init surface 185 //! 186 //! \return void 187 //! 188 void ReleaseResources(); 189 190 //! 191 //! \brief Constructor 192 //! 193 CodechalEncodeSwScoreboard(CodechalEncoderState* encoder); 194 195 //! 196 //! \brief Copy constructor 197 //! 198 CodechalEncodeSwScoreboard(const CodechalEncodeSwScoreboard&) = delete; 199 200 //! 201 //! \brief Copy assignment operator 202 //! 203 CodechalEncodeSwScoreboard& operator=(const CodechalEncodeSwScoreboard&) = delete; 204 205 //! \endcond 206 protected: 207 //! 208 //! \brief SW scoreboard init kernel header struct 209 //! 210 struct KernelHeader 211 { 212 int kernelCount = 0; 213 CODECHAL_KERNEL_HEADER header = {}; 214 }; 215 216 CodechalEncoderState* m_encoder = nullptr; //!< Pointer to ENCODER base class 217 MOS_INTERFACE *m_osInterface = nullptr; //!< OS interface 218 CodechalHwInterface *m_hwInterface = nullptr; //!< HW interface 219 CodechalDebugInterface *m_debugInterface = nullptr; //!< Debug interface 220 MhwMiInterface *m_miInterface = nullptr; //!< Common Mi Interface 221 MhwRenderInterface *m_renderInterface = nullptr; //!< Render engine interface 222 XMHW_STATE_HEAP_INTERFACE *m_stateHeapInterface = nullptr; //!< State heap class interface 223 MHW_KERNEL_STATE *m_kernelState = nullptr; //!< SW scoreboard init kernel state 224 225 uint32_t m_curbeLength = 0; //!< SW scoreboard init kernel Curbe length 226 uint32_t m_kernelUID = 0; //!< SW scoreboard init kernel UID 227 uint32_t m_kuidCommon = 0; //!< Combined kernel UID 228 uint32_t m_combinedKernelSize = 0; //!< Combined kernel size 229 uint8_t *m_kernelBase = nullptr; //!< kernel binary base address 230 CurbeParams m_curbeParams = {}; //!< Curbe parameters 231 SurfaceParams m_surfaceParams = {}; //!< Surface parameters 232 uint8_t m_dependencyPatternIdx = 0; //!< Dependency pattern 233 234 //! 235 //! Reference to data members in Encoder class 236 //! 237 bool& m_useHwScoreboard; 238 bool& m_renderContextUsesNullHw; 239 bool& m_groupIdSelectSupported; 240 bool& m_singleTaskPhaseSupported; 241 bool& m_firstTaskInPhase; 242 bool& m_lastTaskInPhase; 243 uint8_t& m_groupId; 244 uint16_t& m_pictureCodingType; 245 uint32_t& m_mode; 246 uint32_t& m_verticalLineStride; 247 uint32_t& m_maxBtCount; 248 uint32_t& m_vmeStatesSize; 249 uint32_t& m_storeData; 250 MHW_WALKER_MODE& m_walkerMode; 251 252 protected: 253 //! 254 //! \brief SW scoreboard init kernel Curbe data 255 //! 256 struct CurbeData 257 { 258 // DW0 259 union 260 { 261 struct 262 { 263 uint32_t scoreboardWidth : MOS_BITFIELD_RANGE( 0, 15); 264 uint32_t scoreboardHeight : MOS_BITFIELD_RANGE(16, 31); 265 }; 266 struct 267 { 268 uint32_t value; 269 }; 270 } DW0; 271 272 // DW1 273 union 274 { 275 struct 276 { 277 uint32_t isHevc : MOS_BITFIELD_BIT ( 0); 278 uint32_t reserved : MOS_BITFIELD_RANGE( 1, 31); 279 }; 280 struct 281 { 282 uint32_t value; 283 }; 284 } DW1; 285 286 // DW2 287 union 288 { 289 struct 290 { 291 uint32_t numberOfWaveFrontsSplits : MOS_BITFIELD_RANGE( 0, 7); 292 uint32_t numberofChildThreads : MOS_BITFIELD_RANGE( 8, 15); 293 uint32_t reserved : MOS_BITFIELD_RANGE(16, 31); 294 }; 295 struct 296 { 297 uint32_t value; 298 }; 299 } DW2; 300 301 // DW3 302 union 303 { 304 struct 305 { 306 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 307 }; 308 struct 309 { 310 uint32_t value; 311 }; 312 } DW3; 313 314 // DW4 315 union 316 { 317 struct 318 { 319 uint32_t dependencyPattern : MOS_BITFIELD_RANGE( 0, 15); 320 uint32_t reserved : MOS_BITFIELD_RANGE(16, 31); 321 }; 322 struct 323 { 324 uint32_t value; 325 }; 326 } DW4; 327 328 // DW5 329 union 330 { 331 struct 332 { 333 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 334 }; 335 struct 336 { 337 uint32_t value; 338 }; 339 } DW5; 340 341 // DW6 342 union 343 { 344 struct 345 { 346 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 347 }; 348 struct 349 { 350 uint32_t value; 351 }; 352 } DW6; 353 354 // DW7 355 union 356 { 357 struct 358 { 359 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 360 }; 361 struct 362 { 363 uint32_t value; 364 }; 365 } DW7; 366 367 // DW8 368 union 369 { 370 struct 371 { 372 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 373 }; 374 struct 375 { 376 uint32_t value; 377 }; 378 } DW8; 379 380 // DW9 381 union 382 { 383 struct 384 { 385 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 386 }; 387 struct 388 { 389 uint32_t value; 390 }; 391 } DW9; 392 393 // DW10 394 union 395 { 396 struct 397 { 398 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 399 }; 400 struct 401 { 402 uint32_t value; 403 }; 404 } DW10; 405 406 // DW11 407 union 408 { 409 struct 410 { 411 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 412 }; 413 struct 414 { 415 uint32_t value; 416 }; 417 } DW11; 418 419 // DW12 420 union 421 { 422 struct 423 { 424 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 425 }; 426 struct 427 { 428 uint32_t value; 429 }; 430 } DW12; 431 432 // DW13 433 union 434 { 435 struct 436 { 437 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 438 }; 439 struct 440 { 441 uint32_t value; 442 }; 443 } DW13; 444 445 // DW14 446 union 447 { 448 struct 449 { 450 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 451 }; 452 struct 453 { 454 uint32_t value; 455 }; 456 } DW14; 457 458 // DW15 459 union 460 { 461 struct 462 { 463 uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31); 464 }; 465 struct 466 { 467 uint32_t value; 468 }; 469 } DW15; 470 471 // DW16 472 union 473 { 474 struct 475 { 476 uint32_t softwareScoreboard : MOS_BITFIELD_RANGE( 0, 31); 477 }; 478 struct 479 { 480 uint32_t value; 481 }; 482 } DW16; 483 484 // DW17 485 union 486 { 487 struct 488 { 489 uint32_t lcuInfoSurface : MOS_BITFIELD_RANGE( 0, 31); 490 }; 491 struct 492 { 493 uint32_t value; 494 }; 495 } DW17; 496 }; 497 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CurbeData)) == 18); 498 499 //! 500 //! \brief Allocate SW scoreboard init surface 501 //! 502 //! \return MOS_STATUS 503 //! MOS_STATUS_SUCCESS if success, else fail reason 504 //! 505 MOS_STATUS AllocateResources(); 506 507 //! 508 //! \brief Setup Curbe 509 //! 510 //! \return MOS_STATUS 511 //! MOS_STATUS_SUCCESS if success, else fail reason 512 //! 513 virtual MOS_STATUS SetCurbe(); 514 515 //! 516 //! \brief Send surface 517 //! 518 //! \return MOS_STATUS 519 //! MOS_STATUS_SUCCESS if success, else fail reason 520 //! 521 MOS_STATUS SendSurface(PMOS_COMMAND_BUFFER cmdBuffer); 522 }; 523 524 #endif // __CODECHAL_ENCODE_SW_SCOREBOARD_H__ 525