blob: 342e5739ee587abfa524e74189914c8444ce43b1 [file] [log] [blame]
/*
* Copyright (c) 2017-2020, 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 mhw_vdbox_vdenc_interface.h
//! \brief MHW interface for constructing Vdenc commands for the Vdbox engine
//! \details Defines the interfaces for constructing MHW Vdbox Vdenc commands across all platforms
//!
#ifndef _MHW_VDBOX_VDENC_INTERFACE_H_
#define _MHW_VDBOX_VDENC_INTERFACE_H_
#include "mhw_vdbox.h"
#include "mhw_mi.h"
#include "codec_def_encode_hevc.h"
#include "mhw_vdbox_vdenc_itf.h"
typedef struct _MHW_VDBOX_VD_PIPE_FLUSH_PARAMS
{
union
{
struct
{
uint16_t bWaitDoneHEVC : 1;
uint16_t bWaitDoneVDENC : 1;
uint16_t bWaitDoneMFL : 1;
uint16_t bWaitDoneMFX : 1;
uint16_t bWaitDoneVDCmdMsgParser : 1;
uint16_t bFlushHEVC : 1;
uint16_t bFlushVDENC : 1;
uint16_t bFlushMFL : 1;
uint16_t bFlushMFX : 1;
uint16_t : 7;
};
struct
{
uint16_t Value;
};
}Flags;
} MHW_VDBOX_VD_PIPE_FLUSH_PARAMS, *PMHW_VDBOX_VD_PIPE_FLUSH_PARAMS;
typedef struct _MHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS
{
uint8_t maxTuSize;
uint8_t maxCuSize;
uint8_t numImePredictors;
uint8_t numMergeCandidateCu64x64;
uint8_t numMergeCandidateCu32x32;
uint8_t numMergeCandidateCu16x16;
uint8_t numMergeCandidateCu8x8;
bool setQpRoiCtrl;
int8_t forceQp[4];
uint8_t roiCtrl;
uint8_t puTypeCtrl;
}MHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS, *PMHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS;
typedef struct _MHW_VDBOX_VDENC_CQPT_STATE_PARAMS
{
uint16_t wPictureCodingType;
bool bFTQEnabled;
bool bBlockBasedSkip;
bool bTransform8x8Flag;
} MHW_VDBOX_VDENC_CQPT_STATE_PARAMS, *PMHW_VDBOX_VDENC_CQPT_STATE_PARAMS;
typedef struct _MHW_VDBOX_VDENC_WEIGHT_OFFSET_PARAMS
{
bool bWeightedPredEnabled = false;
uint32_t dwDenom = 0;
uint8_t ucList = 0;
char LumaWeights[2][CODEC_MAX_NUM_REF_FRAME_HEVC] = {};
int16_t LumaOffsets[2][CODEC_MAX_NUM_REF_FRAME_HEVC] = {};
char ChromaWeights[2][CODEC_MAX_NUM_REF_FRAME_HEVC][2] = {};
int16_t ChromaOffsets[2][CODEC_MAX_NUM_REF_FRAME_HEVC][2] = {};
uint32_t dwChromaDenom = 0;
bool isLowDelay = true;
} MHW_VDBOX_VDENC_WEIGHT_OFFSET_PARAMS, *PMHW_VDBOX_VDENC_WEIGHT_OFFSET_PARAMS;
typedef struct _MHW_VDBOX_VDENC_CMD1_PARAMS
{
uint32_t Mode = 0;
PCODEC_HEVC_ENCODE_PICTURE_PARAMS pHevcEncPicParams = nullptr;
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS pHevcEncSeqParams = nullptr;
PCODEC_HEVC_ENCODE_SLICE_PARAMS pHevcEncSlcParams = nullptr;
PCODEC_VP9_ENCODE_PIC_PARAMS pVp9EncPicParams = nullptr;
uint8_t *pucVdencMvCosts = nullptr;
uint8_t *pucVdencRdMvCosts = nullptr;
uint8_t *pucVdencHmeMvCosts = nullptr;
uint8_t *pucVdencModeCosts = nullptr;
void *pInputParams = nullptr;
uint16_t usSADQPLambda = 0;
uint16_t usRDQPLambda = 0;
uint8_t frame_type = 0;
uint8_t qp = 0;
bool isLowDelay = false;
bool bHevcVisualQualityImprovement = false; //!< VQI enable flag
} MHW_VDBOX_VDENC_CMD1_PARAMS, *PMHW_VDBOX_VDENC_CMD1_PARAMS;
struct MHW_VDBOX_VDENC_CMD2_STATE
{
uint32_t Mode = 0;
// HEVC
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS pHevcEncSeqParams = nullptr;
PCODEC_HEVC_ENCODE_PICTURE_PARAMS pHevcEncPicParams = nullptr;
PCODEC_HEVC_ENCODE_SLICE_PARAMS pHevcEncSlcParams = nullptr;
bool bSAOEnable = false;
bool bRoundingEnabled = false;
bool bStreamInEnabled = false;
bool bROIStreamInEnabled = false;
bool bUseDefaultQpDeltas = false;
bool bPanicEnabled = false;
bool bPartialFrameUpdateEnable = false;
uint32_t roundInterValue = 0;
uint32_t roundIntraValue = 0;
uint8_t bStreaminRoiMode = 0;
// VP9
PCODEC_VP9_ENCODE_PIC_PARAMS pVp9EncPicParams = nullptr;
bool bSegmentationEnabled = false;
PMHW_VDBOX_VP9_SEGMENT_STATE pVp9SegmentState = nullptr;
PCODEC_VP9_ENCODE_SEQUENCE_PARAMS pVp9EncSeqParams = nullptr;
bool bPrevFrameSegEnabled = false;
bool bDynamicScalingEnabled = false;
bool temporalMVpEnable = false;
// Common
uint8_t ucNumRefIdxL0ActiveMinus1 = 0;
uint8_t ucNumRefIdxL1ActiveMinus1 = 0;
uint16_t usSADQPLambda = 0;
uint16_t usRDQPLambda = 0;
bool bPakOnlyMultipassEnable = false;
void *pInputParams = nullptr;
bool bHevcVisualQualityImprovement = false; //!< VQI enable flag
bool bTileReplayEnable = false;
bool bCaptureModeEnable = false;
uint8_t m_WirelessSessionID = 0;
bool bIsLowDelayB = false;
int8_t *pRefIdxMapping = nullptr;
uint8_t recNotFilteredID = 0;
virtual ~MHW_VDBOX_VDENC_CMD2_STATE() {}
};
using PMHW_VDBOX_VDENC_CMD2_STATE = std::shared_ptr<MHW_VDBOX_VDENC_CMD2_STATE>;
struct MHW_VDBOX_VDENC_WALKER_STATE_PARAMS
{
uint32_t Mode = 0;
uint32_t slcIdx = 0;
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pAvcSeqParams = nullptr;
PCODEC_AVC_ENCODE_PIC_PARAMS pAvcPicParams = nullptr;
PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSlcParams = nullptr;
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS pHevcEncSeqParams = nullptr;
PCODEC_HEVC_ENCODE_PICTURE_PARAMS pHevcEncPicParams = nullptr;
PCODEC_HEVC_ENCODE_SLICE_PARAMS pEncodeHevcSliceParams = nullptr;
PCODEC_VP9_ENCODE_PIC_PARAMS pVp9EncPicParams = nullptr;
virtual ~MHW_VDBOX_VDENC_WALKER_STATE_PARAMS() {}
};
using PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS = MHW_VDBOX_VDENC_WALKER_STATE_PARAMS * ;
//! MHW Vdbox Vdenc interface
/*!
This class defines the interfaces for constructing Vdbox Vdenc commands across all platforms
*/
class MhwVdboxVdencInterface
{
protected:
PMOS_INTERFACE m_osInterface = nullptr; //!< Pointer to OS interface
MHW_MEMORY_OBJECT_CONTROL_PARAMS m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_END_CODEC] = {}; //!< Cacheability settings
bool m_rowstoreCachingSupported = 0;
MHW_VDBOX_ROWSTORE_CACHE m_vdencRowStoreCache = {}; //!< vdenc row store cache
MHW_VDBOX_ROWSTORE_CACHE m_vdencIpdlRowstoreCache = {}; //!< vdenc IntraPred row store cache
bool m_rhoDomainStatsEnabled = false; //! indicate if rho domain stats is enabled
bool m_perfModeSupported = true; //! indicate perf mode is supported
std::shared_ptr<mhw::vdbox::vdenc::Itf> m_vdencItfNew = nullptr;
static const bool m_vdencFTQEnabled[NUM_VDENC_TARGET_USAGE_MODES];
static const bool m_vdencBlockBasedSkipEnabled[NUM_VDENC_TARGET_USAGE_MODES];
//!
//! \brief Constructor
//!
MhwVdboxVdencInterface(PMOS_INTERFACE osInterface);
//!
//! \brief Add a resource to the command buffer
//! \details Internal function to add either a graphics address of a resource or
//! add the resource to the patch list for the requested buffer
//!
//! \param [in] osInterface
//! OS interface
//! \param [in] cmdBuffer
//! Command buffer to which resource is added
//! \param [in] params
//! Parameters necessary to add the resource
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
MOS_STATUS(*AddResourceToCmd) (
PMOS_INTERFACE osInterface,
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_RESOURCE_PARAMS params);
virtual MOS_STATUS InitRowstoreUserFeatureSettings() = 0;
//!
//! \brief Translate MOS type format to Mediastate surface format
//! \details VDBOX protected function to translate mos format to media state format
//! \param [in] format
//! MOS type format
//! \return uint32_t
//! media state surface format
//!
uint32_t MosToMediaStateFormat(MOS_FORMAT format);
public:
//!
//! \brief Destructor
//!
virtual ~MhwVdboxVdencInterface() {}
//!
//! \brief Get new VDENC interface, temporal solution before switching from
//! old interface to new one
//!
//! \return pointer to new VDENC interface
//!
virtual std::shared_ptr<mhw::vdbox::vdenc::Itf> GetNewVdencInterface() { return nullptr; }
//!
//! \brief Judge if row store caching supported
//!
//! \return bool
//! true if supported, else false
//!
inline bool IsRowStoreCachingSupported()
{
return m_rowstoreCachingSupported;
}
//!
//! \brief Judge if vdenc row store caching enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsvdencRowstoreCacheEnabled()
{
return m_vdencRowStoreCache.bEnabled ? true : false;
}
//!
//! \brief Judge if rho domain stats is enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsRhoDomainStatsEnabled()
{
return m_rhoDomainStatsEnabled;
}
//!
//! \brief Judge if perf mode is supported
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsPerfModeSupported()
{
return m_perfModeSupported;
}
//!
//! \brief get vdenc FTQ supported
//!
//! \param [in] idx
//! index of the array
//! \return bool
//! true if enabled, else false
//!
inline bool VdencFTQEnabled(uint32_t idx)
{
return m_vdencFTQEnabled[idx];
}
//!
//! \brief get Vdenc img state size
//!
//! \return uint32_t
//! Vdenc img state size got
//!
virtual uint32_t GetVdencAvcImgStateSize() = 0;
//!
//! \brief get Vdenc cost state size
//!
//! \return uint32_t
//! Vdenc cost state size got
//!
virtual uint32_t GetVdencAvcCostStateSize() = 0;
//!
//! \brief get cmd1
//!
//! \return uint32_t
//! cmd1 size got
//!
virtual uint32_t GetVdencCmd1Size() = 0;
//!
//! \brief get cmd2
//!
//! \return uint32_t
//! cmd2 size got
//!
virtual uint32_t GetVdencCmd2Size() = 0;
//!
//! \brief get Vdenc state commands data size
//!
//! \return uint32_t
//! Vdenc state commands data size got
//!
virtual MOS_STATUS GetVdencStateCommandsDataSize(
uint32_t mode,
uint32_t waAddDelayInVDEncDynamicSlice,
uint32_t *commandsSize,
uint32_t *patchListSize) = 0;
//!
//! \brief get Vdenc slice commands data size
//!
//! \return uint32_t
//! Vdenc slice commands data size got
//!
virtual MOS_STATUS GetVdencPrimitiveCommandsDataSize(
uint32_t mode,
uint32_t *commandsSize,
uint32_t *patchListSize) = 0;
//!
//! \brief Set cacheability settings
//!
//! \param [in] cacheabilitySettings
//! Cacheability settings
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
MOS_STATUS SetCacheabilitySettings(
MHW_MEMORY_OBJECT_CONTROL_PARAMS cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_END_CODEC])
{
MHW_FUNCTION_ENTER;
uint32_t size = MOS_CODEC_RESOURCE_USAGE_END_CODEC * sizeof(MHW_MEMORY_OBJECT_CONTROL_PARAMS);
return MOS_SecureMemcpy(m_cacheabilitySettings, size, cacheabilitySettings, size);
}
//!
//! \brief Programs base address of rowstore scratch buffers
//! \details Internal function to get base address of rowstore scratch buffers
//!
//! \param [in] rowstoreParams
//! Rowstore parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS GetRowstoreCachingAddrs(
PMHW_VDBOX_ROWSTORE_PARAMS rowstoreParams) = 0;
//!
//! \brief Adds VD Pipeline Flush command in command buffer
//! \details Client facing function to add VD Pipeline Flush command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdPipelineFlushCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_VD_PIPE_FLUSH_PARAMS params) = 0;
//!
//! \brief Adds VDENC Pipe Mode Select command in command buffer
//! \details Client facing function to add VDENC Pipe Mode Select command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencPipeModeSelectCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS params) = 0;
//!
//! \brief Adds VDENC Pipe Buffer Address State command in command buffer
//! \details Client facing function to add VDENC Pipe Buffer Address State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencPipeBufAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS params) = 0;
//!
//! \brief Adds VDENC Src Surface State command in command buffer
//! \details Client facing function to add VDENC Src Surface State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencSrcSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params) = 0;
//!
//! \brief Adds VDENC Ref Surface State command in command buffer
//! \details Client facing function to add VDENC Ref Surface State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencRefSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params) = 0;
//!
//! \brief Adds VDENC Dst Surface State command in command buffer
//! \details Client facing function to add VDENC Dst Surface State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \param [in] numSurfaces
//! Number of surfaces
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencDsRefSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params,
uint8_t numSurfaces) = 0;
virtual MOS_STATUS AddVdencAvcCostStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_AVC_IMG_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Adds VDENC AVC Image State command in command buffer
//! \details Client facing function to add VDENC AVC Image State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to add to VDBOX_BUFFER_START
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencImgStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_AVC_IMG_PARAMS params) = 0;
//!
//! \brief Adds VDENC Walker State command in command buffer
//! \details Client facing function to add VDENC Walker State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencWalkerStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS params) = 0;
//!
//! \brief Adds VDENC Const QPT State command in command buffer
//! \details Client facing function to add VDENC Const QPT State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencConstQPStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_VDENC_CQPT_STATE_PARAMS params) = 0;
//!
//! \brief Adds VDENC WeightsOffsets State command in command buffer
//! \details Client facing function to add VDENC WeightsOffsets State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencAvcWeightsOffsetsStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_AVC_WEIGHTOFFSET_PARAMS params) = 0;
//!
//! \brief Adds VDENC Costs State command in command buffer
//! \details Client facing function to add VDENC Costs State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to add to VDBOX_BUFFER_START
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencWeightsOffsetsStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VDENC_WEIGHT_OFFSET_PARAMS params) = 0;
virtual MOS_STATUS AddVdencSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_AVC_SLICE_STATE params)
{
return MOS_STATUS_SUCCESS;
}
virtual MOS_STATUS AddVdencControlStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Adds CMD1 command in command buffer
//! \details Client facing function to add CMD1 command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to add to VDBOX_BUFFER_START
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencCmd1Cmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VDENC_CMD1_PARAMS params) = 0;
//!
//! \brief Adds CMD2 command in command buffer
//! \details Client facing function to add VDENC HEVC VP9 IMG State command in command buffer
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to add to VDBOX_BUFFER_START
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail type
//!
virtual MOS_STATUS AddVdencCmd2Cmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VDENC_CMD2_STATE params) = 0;
virtual PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS CreateMhwVdboxPipeModeSelectParams() = 0;
virtual void ReleaseMhwVdboxPipeModeSelectParams(PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS pipeModeSelectParams) = 0;
};
#endif