blob: e2fde191579e2dc372576a46bcc4d840036d8ead [file] [log] [blame]
/*
* Copyright (c) 2017-2018, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file codechal_encode_sw_scoreboard.h
//! \brief Defines base class for SW scoreboard init kernel
//!
#ifndef __CODECHAL_ENCODE_SW_SCOREBOARD_H__
#define __CODECHAL_ENCODE_SW_SCOREBOARD_H__
#include "codechal.h"
#include "codechal_hw.h"
#define CODECHAL_ENCODE_SW_SCOREBOARD_SURFACE_NUM MOS_MAX(dependencyPatternNum, CODECHAL_ENCODE_RECYCLED_BUFFER_NUM)
enum DependencyPattern
{
dependencyWavefrontNone = 0x00,
dependencyWavefrontHorizontal = 0x01,
dependencyWavefrontVertical = 0x02,
dependencyWavefront45Degree = 0x03,
dependencyWavefront26Degree = 0x04,
dependencyWavefront45XDegree = 0x05,
dependencyWavefront26XDegree = 0x06,
dependencyWavefront45XVp9Degree = 0x07,
dependencyWavefront26ZDegree = 0x08,
dependencyWavefront26ZigDegree = 0x09,
dependencyWavefront45DDegree = 0x0A,
dependencyWavefront26DDegree = 0x0B, // not support yet
dependencyWavefront45XDegreeAlt = 0x0C,
dependencyWavefront26XDegreeAlt = 0x0D,
dependencyWavefront45XDDegree = 0x0E, // 45X diamond
dependencyWavefront26XDDegree = 0x0F, // 26X diamond, not support yet
dependencyWavefrontCustom = 0x10,
dependencyPatternNum = dependencyWavefrontCustom + 1
};
//!
//! SW scoreboard init kernel base class
//! \details Entry point to create SW scoreboard init class instance
//!
//! This class defines the base class for SW scoreboard init feature, it includes
//! common member fields, functions, interfaces etc shared by all Gens.
//!
//! To create an instance, client needs to call #CodechalEncodeSWScoreboard::CreateSWScoreboardState()
//!
class CodechalEncodeSwScoreboard
{
public:
//!
//! \brief SW scoreboard init kernel binding table
//!
enum KernelBTI
{
swScoreboardInitSurface = 0,
swScoreboardInitLcuInfoSurface = 1,
swScoreboardNumSurfaces = 2,
};
//!< \cond SKIP_DOXYGEN
//!
//! \brief Curbe params for SW scoreboard init kernel
//!
struct CurbeParams
{
uint32_t scoreboardWidth = 0;
uint32_t scoreboardHeight = 0;
bool isHevc = false;
uint32_t numberOfWaveFrontSplit = 0;
uint32_t numberOfChildThread = 0;
};
//!
//! \brief Surface params for SW scoreboard init kernel
//!
struct SurfaceParams
{
bool isHevc = false;
uint32_t swScoreboardSurfaceWidth = 0;
uint32_t swScoreboardSurfaceHeight = 0;
MOS_SURFACE swScoreboardSurface[CODECHAL_ENCODE_SW_SCOREBOARD_SURFACE_NUM] = {};
uint32_t surfaceIndex = 0;
PMOS_SURFACE lcuInfoSurface = nullptr;
};
//!
//! \brief Kernel params for SW scoreboard init kernel
//!
struct KernelParams
{
uint32_t scoreboardWidth = 0;
uint32_t scoreboardHeight = 0;
bool isHevc = false;
uint32_t numberOfWaveFrontSplit = 0;
uint32_t numberOfChildThread = 0;
uint32_t swScoreboardSurfaceWidth = 0;
uint32_t swScoreboardSurfaceHeight = 0;
uint32_t surfaceIndex = 0;
PMOS_SURFACE lcuInfoSurface = nullptr;
};
//!
//! \brief Get current SW scoreboard init surface
//!
//! \param [in] index
//! Index to SW scorboard surface array
//!
//! \return void
//!
void SetCurSwScoreboardSurfaceIndex(uint32_t index) { m_surfaceParams.surfaceIndex = index; }
//!
//! \brief Set current dependency pattern
//!
//! \return Currern dependency pattern
//!
void SetDependencyPattern(DependencyPattern pattern) { m_dependencyPatternIdx = pattern; }
//!
//! \brief Get current dependency pattern
//!
//! \return Currern dependency pattern
//!
DependencyPattern GetDependencyPattern() { return (DependencyPattern)m_dependencyPatternIdx; }
//!
//! \brief Get current SW scoreboard init surface
//!
//! \return Pointer to current SW scoreboard init surface
//!
PMOS_SURFACE GetCurSwScoreboardSurface() { return &m_surfaceParams.swScoreboardSurface[m_surfaceParams.surfaceIndex]; }
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeSwScoreboard();
//!
//! \brief Get SW scoreboard init BT count
//!
//! \return Number of BTI
//!
virtual uint8_t GetBTCount();
//!
//! \brief Initialize SW scoreboard init kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelState() { return MOS_STATUS_SUCCESS; }
//!
//! \brief SW scoreboard init kernel function
//!
//! \param [in] params
//! Pointer to KernelParams
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Execute(KernelParams *params);
//!
//! \brief Release SW scoreboard init surface
//!
//! \return void
//!
void ReleaseResources();
//!
//! \brief Constructor
//!
CodechalEncodeSwScoreboard(CodechalEncoderState* encoder);
//!
//! \brief Copy constructor
//!
CodechalEncodeSwScoreboard(const CodechalEncodeSwScoreboard&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalEncodeSwScoreboard& operator=(const CodechalEncodeSwScoreboard&) = delete;
//! \endcond
protected:
//!
//! \brief SW scoreboard init kernel header struct
//!
struct KernelHeader
{
int kernelCount = 0;
CODECHAL_KERNEL_HEADER header = {};
};
CodechalEncoderState* m_encoder = nullptr; //!< Pointer to ENCODER base class
MOS_INTERFACE *m_osInterface = nullptr; //!< OS interface
CodechalHwInterface *m_hwInterface = nullptr; //!< HW interface
CodechalDebugInterface *m_debugInterface = nullptr; //!< Debug interface
MhwMiInterface *m_miInterface = nullptr; //!< Common Mi Interface
MhwRenderInterface *m_renderInterface = nullptr; //!< Render engine interface
XMHW_STATE_HEAP_INTERFACE *m_stateHeapInterface = nullptr; //!< State heap class interface
MHW_KERNEL_STATE *m_kernelState = nullptr; //!< SW scoreboard init kernel state
uint32_t m_curbeLength = 0; //!< SW scoreboard init kernel Curbe length
uint32_t m_kernelUID = 0; //!< SW scoreboard init kernel UID
uint32_t m_kuidCommon = 0; //!< Combined kernel UID
uint32_t m_combinedKernelSize = 0; //!< Combined kernel size
uint8_t *m_kernelBase = nullptr; //!< kernel binary base address
CurbeParams m_curbeParams = {}; //!< Curbe parameters
SurfaceParams m_surfaceParams = {}; //!< Surface parameters
uint8_t m_dependencyPatternIdx = 0; //!< Dependency pattern
//!
//! Reference to data members in Encoder class
//!
bool& m_useHwScoreboard;
bool& m_renderContextUsesNullHw;
bool& m_groupIdSelectSupported;
bool& m_singleTaskPhaseSupported;
bool& m_firstTaskInPhase;
bool& m_lastTaskInPhase;
uint8_t& m_groupId;
uint16_t& m_pictureCodingType;
uint32_t& m_mode;
uint32_t& m_verticalLineStride;
uint32_t& m_maxBtCount;
uint32_t& m_vmeStatesSize;
uint32_t& m_storeData;
MHW_WALKER_MODE& m_walkerMode;
protected:
//!
//! \brief SW scoreboard init kernel Curbe data
//!
struct CurbeData
{
// DW0
union
{
struct
{
uint32_t scoreboardWidth : MOS_BITFIELD_RANGE( 0, 15);
uint32_t scoreboardHeight : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW0;
// DW1
union
{
struct
{
uint32_t isHevc : MOS_BITFIELD_BIT ( 0);
uint32_t reserved : MOS_BITFIELD_RANGE( 1, 31);
};
struct
{
uint32_t value;
};
} DW1;
// DW2
union
{
struct
{
uint32_t numberOfWaveFrontsSplits : MOS_BITFIELD_RANGE( 0, 7);
uint32_t numberofChildThreads : MOS_BITFIELD_RANGE( 8, 15);
uint32_t reserved : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW2;
// DW3
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW3;
// DW4
union
{
struct
{
uint32_t dependencyPattern : MOS_BITFIELD_RANGE( 0, 15);
uint32_t reserved : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW4;
// DW5
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW5;
// DW6
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW6;
// DW7
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW7;
// DW8
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW8;
// DW9
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW9;
// DW10
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW10;
// DW11
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW11;
// DW12
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW12;
// DW13
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW13;
// DW14
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW14;
// DW15
union
{
struct
{
uint32_t reserved : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW15;
// DW16
union
{
struct
{
uint32_t softwareScoreboard : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW16;
// DW17
union
{
struct
{
uint32_t lcuInfoSurface : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW17;
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CurbeData)) == 18);
//!
//! \brief Allocate SW scoreboard init surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources();
//!
//! \brief Setup Curbe
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbe();
//!
//! \brief Send surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendSurface(PMOS_COMMAND_BUFFER cmdBuffer);
};
#endif // __CODECHAL_ENCODE_SW_SCOREBOARD_H__