blob: bdcb803419437892dc6b5c7788ad70549d45b29d [file] [log] [blame]
/*
* Copyright (c) 2014-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_render.h
//! \brief MHW interface for constructing commands for the render engine
//! \details Impelements the functionalities common across all platforms for MHW_RENDER
//!
#ifndef __MHW_RENDER_H__
#define __MHW_RENDER_H__
#include "mos_os.h"
#include "mhw_utilities.h"
#include "mhw_state_heap.h"
#include "mhw_mi.h"
#define MHW_RENDER_ENGINE_SSH_SURFACES_PER_BT_MAX 256
#define MHW_RENDER_ENGINE_SAMPLERS_MAX 16
#define MHW_RENDER_ENGINE_SAMPLERS_AVS_MAX 8
#define MHW_RENDER_ENGINE_MEDIA_PALOAD_SIZE_MAX 512
#define MHW_RENDER_ENGINE_URB_SIZE_MAX 2048
#define MHW_RENDER_ENGINE_URB_ENTRIES_MAX 128
#define MHW_RENDER_ENGINE_INTERFACE_DESCRIPTOR_ENTRIES_MAX 64
#define MHW_RENDER_ENGINE_EU_INDEX_MAX 12
#define MHW_RENDER_ENGINE_SIZE_REGISTERS_PER_THREAD 0x1800
#define MHW_MAX_DEPENDENCY_COUNT 8
typedef struct _MHW_RENDER_ENGINE_L3_CACHE_SETTINGS
{
uint32_t dwCntlReg = 0;
uint32_t dwCntlReg2 = 0;
uint32_t dwCntlReg3 = 0;
uint32_t dwSqcReg1 = 0;
uint32_t dwSqcReg4 = 0;
uint32_t dwLra1Reg = 0;
virtual ~_MHW_RENDER_ENGINE_L3_CACHE_SETTINGS() {}
} MHW_RENDER_ENGINE_L3_CACHE_SETTINGS, *PMHW_RENDER_ENGINE_L3_CACHE_SETTINGS;
typedef struct _MHW_RENDER_ENGINE_L3_CACHE_CONFIG
{
uint32_t dwL3CacheCntlReg_Register = 0;
uint32_t dwL3CacheCntlReg_Setting = 0;
uint32_t dwL3CacheCntlReg2_Register = 0;
uint32_t dwL3CacheCntlReg2_Setting = 0;
uint32_t dwL3CacheCntlReg3_Register = 0;
uint32_t dwL3CacheCntlReg3_Setting = 0;
uint32_t dwL3CacheSqcReg1_Register = 0;
uint32_t dwL3CacheSqcReg1_Setting = 0;
uint32_t dwL3CacheSqcReg4_Register = 0;
uint32_t dwL3CacheSqcReg4_Setting = 0;
uint32_t dwL3LRA1Reg_Register = 0;
uint32_t dwL3LRA1Reg_Setting = 0;
bool bL3CachingEnabled = false;
bool bL3LRA1Reset = false;
} MHW_RENDER_ENGINE_L3_CACHE_CONFIG, *PMHW_RENDER_ENGINE_L3_CACHE_CONFIG;
typedef enum _MHW_RENDER_ENGINE_ADDRESS_SHIFT
{
MHW_RENDER_ENGINE_STATE_BASE_ADDRESS_SHIFT = 12
} MHW_RENDER_ENGINE_ADDRESS_SHIFT;
typedef enum _MHW_VFE_SLICE_DISABLE
{
MHW_VFE_SLICE_ALL = 0,
MHW_VFE_SLICE0_SUBSLICE_ALL,
MHW_VFE_SLICE0_SUBSLICE0
} MHW_VFE_SLICE_DISABLE;
typedef enum _MHW_WALKER_MODE
{
MHW_WALKER_MODE_NOT_SET = -1,
MHW_WALKER_MODE_DISABLED = 0,
MHW_WALKER_MODE_SINGLE = 1, // dual = 0, repel = 1
MHW_WALKER_MODE_DUAL = 2, // dual = 1, repel = 0)
MHW_WALKER_MODE_TRI = 3, // applies in BDW GT2 which has 1 slice and 3 sampler/VME per slice
MHW_WALKER_MODE_QUAD = 4, // applies in HSW GT3 which has 2 slices and 2 sampler/VME per slice
MHW_WALKER_MODE_HEX = 6, // applies in BDW GT2 which has 2 slices and 3 sampler/VME per slice
MHW_WALKER_MODE_OCT = 8 // may apply in future Gen media architectures
} MHW_WALKER_MODE;
//!
//! \brief Structure to capture HW capabilities
//!
typedef struct _MHW_RENDER_ENGINE_CAPS
{
uint32_t dwMaxUnormSamplers; // Max UNORM Sampler States supported
uint32_t dwMaxAVSSamplers; // Max AVS Sampler States supported
uint32_t dwMaxBTIndex; // Max Binding Table index per Binding Table
uint32_t dwMaxThreads; // Max Threads supported
uint32_t dwMaxMediaPayloadSize; // Max Media payload size
uint32_t dwMaxURBSize; // Max URB Size
uint32_t dwMaxURBEntries; // Max URB Entries
uint32_t dwMaxURBEntryAllocationSize; // Max URB Entry Allocation Size
uint32_t dwMaxCURBEAllocationSize;
uint32_t dwMaxInterfaceDescriptorEntries; // Max Interface Descriptor Entries
uint32_t dwMaxSubslice; // Max number of subslice
uint32_t dwMaxEUIndex; // Max EU index (sometimes != number of EU)
uint32_t dwNumThreadsPerEU; // Num threads per EU
uint32_t dwSizeRegistersPerThread; // Size of all registers per thread (for ASM Debug)
} MHW_RENDER_ENGINE_CAPS, *PMHW_RENDER_ENGINE_CAPS;
typedef struct _MHW_STATE_BASE_ADDR_PARAMS
{
PMOS_RESOURCE presGeneralState;
uint32_t dwGeneralStateSize;
PMOS_RESOURCE presDynamicState;
uint32_t dwDynamicStateSize;
bool bDynamicStateRenderTarget;
PMOS_RESOURCE presIndirectObjectBuffer;
uint32_t dwIndirectObjectBufferSize;
PMOS_RESOURCE presInstructionBuffer;
uint32_t dwInstructionBufferSize;
uint32_t mocs4InstructionCache;
uint32_t mocs4GeneralState;
uint32_t mocs4DynamicState;
uint32_t mocs4SurfaceState;
uint32_t mocs4IndirectObjectBuffer;
uint32_t mocs4StatelessDataport;
uint32_t l1CacheConfig;
} MHW_STATE_BASE_ADDR_PARAMS, *PMHW_STATE_BASE_ADDR_PARAMS;
typedef struct _MHW_VFE_SCOREBOARD_DELTA
{
uint8_t x : 4;
uint8_t y : 4;
} MHW_VFE_SCOREBOARD_DELTA, *PMHW_VFE_SCOREBOARD_DELTA;
typedef struct _MHW_VFE_SCOREBOARD
{
struct
{
uint32_t ScoreboardMask : 8;
uint32_t ScoreboardColor : 4;
uint32_t : 18;
uint32_t ScoreboardType : 1;
uint32_t ScoreboardEnable : 1;
};
union
{
MHW_VFE_SCOREBOARD_DELTA ScoreboardDelta[MHW_MAX_DEPENDENCY_COUNT];
struct
{
uint32_t Value[2];
};
};
} MHW_VFE_SCOREBOARD, *PMHW_VFE_SCOREBOARD;
struct MHW_VFE_PARAMS
{
uint32_t dwDebugCounterControl = 0; // Debug Counter Control
uint32_t dwMaximumNumberofThreads = 0;
uint32_t dwNumberofURBEntries = 0;
uint32_t dwCURBEAllocationSize = 0;
uint32_t dwURBEntryAllocationSize = 0;
uint32_t dwPerThreadScratchSpace = 0;
uint32_t dwScratchSpaceBasePointer = 0;
MHW_VFE_SLICE_DISABLE eVfeSliceDisable = MHW_VFE_SLICE_ALL;
MHW_VFE_SCOREBOARD Scoreboard = {};
PMHW_KERNEL_STATE pKernelState = nullptr;
virtual ~MHW_VFE_PARAMS() {}
};
typedef MHW_VFE_PARAMS *PMHW_VFE_PARAMS;
typedef struct _MHW_CURBE_LOAD_PARAMS
{
PMHW_KERNEL_STATE pKernelState;
bool bOldInterface;
uint32_t dwCURBETotalDataLength;
uint32_t dwCURBEDataStartAddress;
} MHW_CURBE_LOAD_PARAMS, *PMHW_CURBE_LOAD_PARAMS;
typedef struct _MHW_ID_LOAD_PARAMS
{
PMHW_KERNEL_STATE pKernelState;
uint32_t dwNumKernelsLoaded;
uint32_t dwIdIdx;
uint32_t dwInterfaceDescriptorStartOffset;
uint32_t dwInterfaceDescriptorLength;
} MHW_ID_LOAD_PARAMS, *PMHW_ID_LOAD_PARAMS;
typedef struct _MHW_SIP_STATE_PARAMS
{
bool bSipKernel;
uint32_t dwSipBase;
} MHW_SIP_STATE_PARAMS, *PMHW_SIP_STATE_PARAMS;
typedef struct _MHW_WALKER_XY
{
union
{
struct
{
uint32_t x : 16;
uint32_t y : 16;
};
uint32_t value;
};
} MHW_WALKER_XY, *PMHW_WALKER_XY;
typedef struct _MHW_PALETTE_PARAMS
{
int32_t iPaletteID; //!< Palette ID
int32_t iNumEntries; //!< Palette entries in use
void* pPaletteData; //!< Palette data
} MHW_PALETTE_PARAMS, *PMHW_PALETTE_PARAMS;
typedef struct _MHW_CHROMAKEY_PARAMS
{
uint32_t dwIndex; //!< Chroma Key Index
uint32_t dwLow; //!< Chroma Key Low
uint32_t dwHigh; //!< Chroma Key High
} MHW_CHROMAKEY_PARAMS, *PMHW_CHROMAKEY_PARAMS;
// IMPORTANT - changes in this structure must
// be ported to CM_HAL_WALKER_PARAMS in cm_common.h
typedef struct _MHW_WALKER_PARAMS
{
uint32_t InterfaceDescriptorOffset : 5;
uint32_t CmWalkerEnable : 1;
uint32_t ColorCountMinusOne : 8;
uint32_t UseScoreboard : 1;
uint32_t ScoreboardMask : 8;
uint32_t MidLoopUnitX : 2;
uint32_t MidLoopUnitY : 2;
uint32_t MiddleLoopExtraSteps : 5;
uint32_t GroupIdLoopSelect : 24;
uint32_t : 8;
uint32_t InlineDataLength;
uint8_t* pInlineData;
uint32_t dwLocalLoopExecCount;
uint32_t dwGlobalLoopExecCount;
MHW_WALKER_MODE WalkerMode;
MHW_WALKER_XY BlockResolution;
MHW_WALKER_XY LocalStart;
MHW_WALKER_XY LocalEnd;
MHW_WALKER_XY LocalOutLoopStride;
MHW_WALKER_XY LocalInnerLoopUnit;
MHW_WALKER_XY GlobalResolution;
MHW_WALKER_XY GlobalStart;
MHW_WALKER_XY GlobalOutlerLoopStride;
MHW_WALKER_XY GlobalInnerLoopUnit;
bool bAddMediaFlush;
bool bRequestSingleSlice;
uint32_t IndirectDataLength;
uint32_t IndirectDataStartAddress;
} MHW_WALKER_PARAMS, *PMHW_WALKER_PARAMS;
typedef struct _MHW_GPGPU_WALKER_PARAMS
{
uint32_t InterfaceDescriptorOffset : 5;
uint32_t GpGpuEnable : 1;
uint32_t : 26;
uint32_t ThreadWidth;
uint32_t ThreadHeight;
uint32_t ThreadDepth;
uint32_t GroupWidth;
uint32_t GroupHeight;
uint32_t GroupDepth;
uint32_t GroupStartingX;
uint32_t GroupStartingY;
uint32_t GroupStartingZ;
uint32_t SLMSize;
uint32_t IndirectDataLength;
uint32_t IndirectDataStartAddress;
uint32_t BindingTableID;
} MHW_GPGPU_WALKER_PARAMS, *PMHW_GPGPU_WALKER_PARAMS;
typedef struct _MHW_MEDIA_OBJECT_PARAMS
{
uint32_t dwInterfaceDescriptorOffset;
uint32_t dwHalfSliceDestinationSelect;
uint32_t dwSliceDestinationSelect;
uint32_t dwIndirectLoadLength;
uint32_t dwIndirectDataStartAddress;
void* pInlineData;
uint32_t dwInlineDataSize;
bool bForceDestination;
MHW_VFE_SCOREBOARD VfeScoreboard;
} MHW_MEDIA_OBJECT_PARAMS, *PMHW_MEDIA_OBJECT_PARAMS;
class MhwRenderInterface
{
public:
PMHW_STATE_HEAP_INTERFACE m_stateHeapInterface = nullptr;
virtual ~MhwRenderInterface()
{
if (m_stateHeapInterface)
{
m_stateHeapInterface->pfnDestroy(m_stateHeapInterface);
}
}
//!
//! \brief Allocates the MHW render interface internal parameters
//! \details Internal MHW function to allocate all parameters needed for the
//! render interface including the state heap interface
//! \param MHW_STATE_HEAP_SETTINGS stateHeapSettings
//! [in] Setting used to initialize the state heap interface
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateHeaps(
MHW_STATE_HEAP_SETTINGS stateHeapSettings);
//!
//! \brief Adds PIPELINE_SELECT to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which commands are added
//! \param gpGpuPipe
//! [in] false: MEDIA pipe; true: GPGPU pipe
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddPipelineSelectCmd (
PMOS_COMMAND_BUFFER cmdBuffer,
bool gpGpuPipe) = 0;
//!
//! \brief Adds STATE_BASE_ADDRESS to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddStateBaseAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_STATE_BASE_ADDR_PARAMS params) = 0;
//!
//! \brief Adds MEDIA_VFE_STATE to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddMediaVfeCmd (
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VFE_PARAMS params) = 0;
//!
//! \brief Adds CFE_STATE to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddCfeStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VFE_PARAMS params)
{
MOS_UNUSED(cmdBuffer);
MOS_UNUSED(params);
// CFE_STATE will replace the MEDIA_VFE_STATE on some platform; Just keep the
// platform which really uses CFE to implement it on inheriting class .
MHW_ASSERTMESSAGE("Don't support it on this platform");
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Adds MEDIA_CURBE_LOAD to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddMediaCurbeLoadCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_CURBE_LOAD_PARAMS params) = 0;
//!
//! \brief Adds MEDIA_INTERFACE_DESCRIPTOR_LOAD to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddMediaIDLoadCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_ID_LOAD_PARAMS params) = 0;
//!
//! \brief Adds MEDIA_OBJECT to the buffer provided
//! \details MEDIA_OBJCET is added to either the command buffer or
//! batch buffer (whichever is valid)
//! \param cmdBuffer
//! [in] If valid, command buffer to which HW command is added
//! \param batchBuffer
//! [in] If valid, Batch buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddMediaObject(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_MEDIA_OBJECT_PARAMS params) = 0;
//!
//! \brief Adds MEDIA_OBJECT_WALKER to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddMediaObjectWalkerCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_WALKER_PARAMS params) = 0;
//!
//! \brief Adds GPGPU_WALKER to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddGpGpuWalkerStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_GPGPU_WALKER_PARAMS params) = 0;
//!
//! \brief Adds 3DSTATE_CHROMA_KEY to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddChromaKeyCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_CHROMAKEY_PARAMS params) = 0;
//!
//! \brief Adds 3DSTATE_SAMPLER_PALETTE_LOADX to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddPaletteLoadCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_PALETTE_PARAMS params) = 0;
//!
//! \brief Adds STATE_SIP to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param params
//! [in] Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddSipStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_SIP_STATE_PARAMS params) = 0;
//!
//! \brief Adds GPGPU_CSR_BASE_ADDRESS to the command buffer
//! \param cmdBuffer
//! [in] Command buffer to which HW command is added
//! \param csrResource
//! [in] Resource to be used for GPGPU CSR
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddGpgpuCsrBaseAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMOS_RESOURCE csrResource) = 0;
//!
//! \brief get the size of hw command
//! \details Internal function to get the size of MEDIA_OBJECT_CMD
//! \return commandSize
//! The command size
//!
virtual uint32_t GetMediaObjectCmdSize() = 0;
//!
//! \brief Enables L3 cacheing flag and sets related registers/values
//! \param cacheSettings
//! [in] L3 Cache Configurations, if a null pointer is passed
//! in, it will use default settings.
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EnableL3Caching(
PMHW_RENDER_ENGINE_L3_CACHE_SETTINGS cacheSettings) = 0;
//!
//! \brief Setup L3 cache configuration for kernel workload
//! \details Enable L3 cacheing in kernel workload by configuring the
//! appropriate MMIO registers.
//! \param cmdBuffer
//! [in] Command buffer to which HW commands is added
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetL3Cache(
PMOS_COMMAND_BUFFER cmdBuffer) = 0;
//!
//! \brief Enables preemption for media workloads on render engine
//! \details Sets the MMIO register for preemption so that HW can preempt
//! the submitted workload if required
//! \param cmdBuffer
//! [in] Command buffer to which HW commands is added
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EnablePreemption(
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Accessor for m_l3CacheConfig
//! \return L3 cache configuration information
//!
virtual MHW_RENDER_ENGINE_L3_CACHE_CONFIG* GetL3CacheConfig() = 0;
//!
//! \brief Accessor for m_hwCaps, temporarily returns pointer to m_hwCaps until clients move to using not a pointer
//! \return Pointer to HW capabilities
//!
MHW_RENDER_ENGINE_CAPS *GetHwCaps() { return &m_hwCaps; }
//!
//! \brief Accessor for m_preemptionEnabled
//! \return true if preemption is enabled, false otherwise
//!
bool IsPreemptionEnabled() { return m_preemptionEnabled; }
//!
//! \brief Setter for os interface, used in MFE scenario
//! \return void
//!
void SetOsInterface(PMOS_INTERFACE osInterface) { m_osInterface = osInterface;}
//!
//! \brief Get mmio registers address
//! \details Get mmio registers address
//! \return [out] PMHW_MI_MMIOREGISTERS*
//! mmio registers got.
//!
virtual PMHW_MI_MMIOREGISTERS GetMmioRegisters() = 0;
//!
//! \brief Get AVS sampler state Inc unit
//! \details Get AVS sampler state Inc unit
//! \return [out] uint32_t
//! AVS sampler unit.
virtual uint32_t GetSamplerStateAVSIncUnit() = 0;
//!
//! \brief Get Conv sampler state Inc unit
//! \details Get Conv sampler state Inc unit
//! \return [out] uint32_t
//! Conv sampler unit.
virtual uint32_t GetSamplerStateConvIncUnit() = 0;
//!
//! \brief Get the sampler height and width align unit
//! \details NV12 format needs the width and height to be a multiple of some unit
//! \param [in] bool
//! true if AVS sampler, false otherwise
//! \param [in, out] uint32_t
//! weight align unit
//! \param [in, out] uint32_t
//! height align unit
virtual void GetSamplerResolutionAlignUnit(bool isAVSSampler, uint32_t &widthAlignUnit, uint32_t &heightAlignUnit) = 0;
protected:
//!
//! \brief Initializes the Render interface
//! \details Internal MHW function to initialize all function pointers and some parameters
//! Assumes that the caller has checked pointer validity and whether or not an
//! addressing method has been selected in the OS interface (bUsesGfxAddress or
//! bUsesPatchList).
//! \param [in] miInterface
//! MI interface, must be valid
//! \param [in] osInterface
//! OS interface, must be valid
//! \param [in] gtSystemInfo
//! System information, must be valid
//! \param [in] newStateHeapManagerRequested
//! A new state heap manager was implemented for MDF, will be adapted for codec & VP,
//! migrated to C++, rolled into the existing state heap interface and removed.
//! Ultimately this parameter will no longer be necessary as the state heap interface
//! will be unified.
//!
MhwRenderInterface(
MhwMiInterface *miInterface,
PMOS_INTERFACE osInterface,
MEDIA_SYSTEM_INFO *gtSystemInfo,
uint8_t newStateHeapManagerRequested)
{
MHW_FUNCTION_ENTER;
if (miInterface == nullptr ||
osInterface == nullptr ||
gtSystemInfo == nullptr)
{
MHW_ASSERTMESSAGE("Invalid input pointers provided");
return;
}
if (!osInterface->bUsesGfxAddress && !osInterface->bUsesPatchList)
{
MHW_ASSERTMESSAGE("No valid addressing mode indicated");
return;
}
m_osInterface = osInterface;
m_miInterface = miInterface;
m_stateHeapInterface = nullptr;
memset(&m_hwCaps, 0, sizeof(m_hwCaps));
if (m_osInterface->bUsesGfxAddress)
{
AddResourceToCmd = Mhw_AddResourceToCmd_GfxAddress;
}
else // if (m_osInterface->bUsesPatchList)
{
AddResourceToCmd = Mhw_AddResourceToCmd_PatchList;
}
InitPlatformCaps(gtSystemInfo);
InitPreemption();
if (Mhw_StateHeapInterface_InitInterface(
&m_stateHeapInterface,
m_osInterface,
newStateHeapManagerRequested) != MOS_STATUS_SUCCESS)
{
MHW_ASSERTMESSAGE("State heap initialization failed!");
return;
}
}
PMOS_INTERFACE m_osInterface = nullptr;
MEDIA_FEATURE_TABLE *m_skuTable = nullptr;
MhwMiInterface *m_miInterface = nullptr;
MHW_RENDER_ENGINE_L3_CACHE_CONFIG m_l3CacheConfig;
MHW_RENDER_ENGINE_CAPS m_hwCaps;
bool m_preemptionEnabled = false;
uint32_t m_preemptionCntlRegisterOffset = 0;
uint32_t m_preemptionCntlRegisterValue = 0;
uint32_t m_l3CacheCntlRegisterOffset = M_L3_CACHE_CNTL_REG_OFFSET;
uint32_t m_l3CacheCntlRegisterValueDefault = M_L3_CACHE_CNTL_REG_VALUE_DEFAULT;
//!
//! \brief Adds a resource to the command buffer or indirect state (SSH)
//! \details Internal MHW function to add either a graphics address of a resource or
//! add the resource to the patch list for the requested buffer or state
//! \param [in] osInterface
//! OS interface
//! \param [in] cmdBuffer
//! If adding a resource to the command buffer, the buffer to which the resource
//! is added
//! \param [in] params
//! Parameters necessary to add the graphics address
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS(*AddResourceToCmd) (
PMOS_INTERFACE osInterface,
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_RESOURCE_PARAMS params);
//!
//! \brief Initializes platform related capabilities for the render engine
//! \details Assumes the caller checked the pointers for validity.
//! \param gtSystemInfo
//! [in] Information concerning the GPU
//! \return void
//!
void InitPlatformCaps(
MEDIA_SYSTEM_INFO *gtSystemInfo);
//!
//! \brief Initializes preemption related registers/values
//! \details Initializes the MMIO register for preemption so that HW can preempt
//! the submitted workload if required.
//! \return void
//! If invalid SKU\WA tables detected, does not do anything
//!
void InitPreemption();
};
#endif // __MHW_RENDER_H__