/*
* 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_state_heap.h 
//! \brief         This modules implements HW interface layer to be used on all platforms on     all operating systems/DDIs, across MHW components. 
//!
#ifndef __MHW_STATE_HEAP_H__
#define __MHW_STATE_HEAP_H__

#include "mos_os.h"
#include "mhw_utilities.h"
#include "heap_manager.h"

typedef struct _MHW_STATE_HEAP_MEMORY_BLOCK MHW_STATE_HEAP_MEMORY_BLOCK, *PMHW_STATE_HEAP_MEMORY_BLOCK;
typedef struct _MHW_STATE_HEAP_INTERFACE MHW_STATE_HEAP_INTERFACE, *PMHW_STATE_HEAP_INTERFACE;
typedef class XMHW_STATE_HEAP_INTERFACE *PXMHW_STATE_HEAP_INTERFACE;
typedef struct _MHW_STATE_HEAP MHW_STATE_HEAP, *PMHW_STATE_HEAP;
typedef struct MHW_BLOCK_MANAGER *PMHW_BLOCK_MANAGER;

#define MHW_INDIRECT_HEAP_SIZE      MHW_PAGE_SIZE
#define MHW_SURFACE_PITCH_ALIGNMENT 128
#define MHW_MAX_SURFACE_PLANES      3

#define MHW_NUM_HW_POLYPHASE_TABLES             17
#define MHW_NUM_HW_POLYPHASE_EXTRA_TABLES_G9    15

//!
//! \brief  GSH Defaults and limits
//!
#define MHW_MEDIA_STATE_ALIGN          128
#define MHW_SCRATCH_SPACE_ALIGN        1024
#define MHW_SAMPLER_STATE_ALIGN        64
#define MHW_SAMPLER_STATE_VA_ALIGN     32
#define MHW_SAMPLER_STATE_AVS_ALIGN    1024
#define MHW_SAMPLER_STATE_AVS_ALIGN_G9 2048

#define MHW_SAMPLER_STATE_AVS_ALIGN_MEDIA  1024 // per old HWCMD files AVS samplers were aligned to 256. Not sure if this is needed
#define MHW_SURFACE_STATE_ALIGN 64 // (1 << MHW_BINDING_TABLE_OFFSET_SHIFT)

// Each increment in sampler index represents this increment in offset
#define MHW_SAMPLER_STATE_VA_INC            32
#define MHW_SAMPLER_STATE_CONV_1D_INC       128
#define MHW_AVS_SAMPLER_WIDTH_ALIGN_UNIT    2
#define MHW_SAMPLER_STATE_AVS_INC_LEGACY    512
#define MHW_AVS_SAMPLER_HEIGHT_ALIGN_UNIT   2
#define MHW_SAMPLER_STATE_CONV_INC_LEGACY   512

#define MHW_INVALID_BINDING_TABLE_IDX 0xFFFFFFFF

#define MHW_ASSERT_INVALID_BINDING_TABLE_IDX(index)                         \
{                                                                           \
    if ((index) == MHW_INVALID_BINDING_TABLE_IDX)                           \
    {                                                                       \
        MHW_ASSERTMESSAGE("Invalid (nullptr) Pointer.");                    \
        eStatus = MOS_STATUS_UNKNOWN;                                       \
        return eStatus;                                                     \
    }                                                                       \
}

#define MHW_INVALID_SYNC_TAG            0xFFFFFFFF

enum MW_RENDER_ENGINE_ADDRESS_SHIFT
{
    MHW_STATE_HEAP_SURFACE_STATE_SHIFT = 0
};

typedef enum _MHW_STATE_HEAP_PARAM_SHIFTS
{
    MHW_SLM_SHIFT                   = 2,
    MHW_BINDING_TABLE_OFFSET_SHIFT  = 6,
    MHW_BINDING_TABLE_ID_SHIFT      = 5,
    MHW_SAMPLER_SHIFT               = 5,
    MHW_CURBE_SHIFT                 = 5,
    MHW_THRD_CON_DATA_RD_SHIFT      = 5,
    MHW_KERNEL_OFFSET_SHIFT         = 6,
    MHW_SAMPLER_INDIRECT_SHIFT      = 6,
    MHW_SCRATCH_SPACE_SHIFT         = 10,
    MHW_SSH_BASE_SHIFT              = 12,
    MHW_COMPUTE_INDIRECT_SHIFT      = 6
} MHW_STATE_HEAP_PARAM_SHIFTS;

typedef enum _MHW_FRAME_FIELD_TYPE
{
    MHW_FRAME = 0,
    MHW_TOP_FIELD,
    MHW_BOTTOM_FIELD,
    MHW_NUM_FRAME_FIELD_TYPES,
} MHW_FRAME_FIELD_TYPE;

typedef enum _MHW_STATE_HEAP_TYPE
{
    MHW_ISH_TYPE = 0,
    MHW_DSH_TYPE,
    MHW_SSH_TYPE      //!< Note SSH is currently managed by MOS
} MHW_STATE_HEAP_TYPE;

typedef enum _MHW_STATE_HEAP_MODE
{
    MHW_RENDER_HAL_MODE = 0,     //!< 0 - RenderHal handles
    MHW_DSH_MODE,                //!< 1 - MDF dynamic heap management
    MHW_DGSH_MODE                //!< 2 - Ddynamic generic heap management 
}MHW_STATE_HEAP_MODE;

typedef enum _MHW_PLANE
{
    MHW_GENERIC_PLANE = 0,  // 1D Surface: MHW_GENERIC_PLANE, 2D Surface: MHW_Y_PLANE
    MHW_Y_PLANE = 0,
    MHW_U_PLANE,
    MHW_V_PLANE,
} MHW_PLANE;

//!
//! \brief MHW Rotation Mode enum
//!
typedef enum _MHW_ROTATION
{
    MHW_ROTATION_IDENTITY = 0,      //!< Rotation 0 degrees
    MHW_ROTATION_90,                //!< Rotation 90 degrees
    MHW_ROTATION_180,               //!< Rotation 180 degrees
    MHW_ROTATION_270,               //!< Rotation 270 degrees
    MHW_MIRROR_HORIZONTAL,          //!< Horizontal Mirror
    MHW_MIRROR_VERTICAL,            //!< Vertical Mirror
    MHW_ROTATE_90_MIRROR_VERTICAL,  //!< 90 + V Mirror
    MHW_ROTATE_90_MIRROR_HORIZONTAL //!< 90 + H Mirror
} MHW_ROTATION;

//!
//! \brief Render chroma siting vertical value
//!
typedef enum _MHW_CHROMA_SITING_VDIRECTION
{
    MHW_CHROMA_SITING_VDIRECTION_0   = 0x0,
    MHW_CHROMA_SITING_VDIRECTION_1_4 = 0x1,
    MHW_CHROMA_SITING_VDIRECTION_1_2 = 0x2,
    MHW_CHROMA_SITING_VDIRECTION_3_4 = 0x3,
    MHW_CHROMA_SITING_VDIRECTION_1   = 0x4
} MHW_CHROMA_SITING_VDIRECTION;

//!
//! \brief Chroma Siting enum
//!
typedef enum _MHW_CHROMA_SITING
{
    MHW_CHROMA_SITING_NONE          = 0,
    MHW_CHROMA_SITING_HORZ_LEFT     = 1 << 0,
    MHW_CHROMA_SITING_HORZ_CENTER   = 1 << 1,
    MHW_CHROMA_SITING_HORZ_RIGHT    = 1 << 2,
    MHW_CHROMA_SITING_VERT_TOP      = 1 << 4,
    MHW_CHROMA_SITING_VERT_CENTER   = 1 << 5,
    MHW_CHROMA_SITING_VERT_BOTTOM   = 1 << 6,
} MHW_CHROMA_SITING;

//!
//! \brief Scaling mode enum
//!
typedef enum _MHW_SCALING_MODE
{
    MHW_SCALING_NEAREST = 0,
    MHW_SCALING_BILINEAR,
    MHW_SCALING_AVS
} MHW_SCALING_MODE;

//!
//! \brief  AVS Params
//!
typedef struct _MHW_AVS_PARAMS
{
    MOS_FORMAT              Format;
    float                   fScaleX;
    float                   fScaleY;
    int32_t                 *piYCoefsX;
    int32_t                 *piYCoefsY;
    int32_t                 *piUVCoefsX;
    int32_t                 *piUVCoefsY;
    bool                    bForcePolyPhaseCoefs;
    bool                    bUse8x8Filter;
} MHW_AVS_PARAMS, *PMHW_AVS_PARAMS;

// Memory block state
typedef enum _MHW_BLOCK_STATE
{
    MHW_BLOCK_STATE_POOL = 0,       //!< Block belongs to the pool of memory block objects, it doesn't point to a valid memory block, most fields may be invalid.
    MHW_BLOCK_STATE_FREE,           //!< Block points to available memory in State Heap
    MHW_BLOCK_STATE_ALLOCATED,      //!< Block points to allocated area in State Heap (allocated but not in use by GPU)
    MHW_BLOCK_STATE_SUBMITTED,      //!< Block points to area in State Heap that was submitted for execution by GPU; memory cannot be overwritten or deleted before workload is finished.
    MHW_BLOCK_STATE_DELETED,        //!< Block is marked for deletion (State Heap is being deleted).

    MHW_BLOCK_STATE_COUNT = 5
} MHW_BLOCK_STATE;

struct _MHW_STATE_HEAP_MEMORY_BLOCK
{
    //!
    //! \brief The sync tag ID for the memory block may be used to determine
    //!        whether or not the memory block is in use--if the ID is
    //!        invalid (+1 to the defined maximum number of sync tags), the
    //!        memory block is not in use and some or all of it may be used
    //!        for a new kernel state region.
    //!
    FrameTrackerTokenFlat trackerToken;

    uint32_t            dwBlockSize;
    PMHW_STATE_HEAP     pStateHeap;
    uint32_t            dwOffsetInStateHeap;
    bool                bStatic;      //!< The kernel state region in this state heap is static and will not be removed during cleanup step.

    _MHW_STATE_HEAP_MEMORY_BLOCK    *pPrev;
    _MHW_STATE_HEAP_MEMORY_BLOCK    *pNext;

    //!
    //! \brief The following code is for the MHW dynamic state heap implementation by MDF. 
    //!        Code is not yet unified across all media driver components
    //!
    MHW_BLOCK_STATE                 BlockState: 16;   //!< Current block state (void, free, allocated, in use, completed, deleted)
    uint32_t                        bDelete   :  1;   //!< Block is flagged for deletion upon completion
    uint32_t                        Reserved  : 15;   //!< Reserved (uniq block ID used for tracking block utilization by system)

    PMHW_STATE_HEAP_MEMORY_BLOCK    pHeapNext;        //!< Next block in same state heap (adjacent), null if last
    PMHW_STATE_HEAP_MEMORY_BLOCK    pHeapPrev;        //!< Previous block in same state heap (adjacent), null if first

    uint8_t                         *pDataPtr;         //!< Pointer to aligned data
    uint32_t                        dwDataOffset;     //!< Offset of pDataPtr (from State Heap Base - used in state programming)
    uint32_t                        dwDataSize;       //!< Data size (>= requested size due to heap granularity)
    uint32_t                        dwAlignment;      //!< Offset alignment (offset from actual block start)
};

typedef struct _MHW_KERNEL_PARAM
{
    void    *pExtra;                         //!< Kernel parameter
    uint8_t *pBinary;                        //!< Pointer to kernel binary
    int32_t iSize;                          //!< Kernel size
    int32_t iGrfCount;                      //!< Number of registers
    int32_t iBTCount;                       //!< Number of BT entries
    int32_t iThreadCount;                   //!< Number of threads (max)
    int32_t iGrfStartRegister;              //!< Start register
    int32_t iSamplerCount;                  //!< Sampler count
    int32_t iSamplerLength;                 //!< Sampler length
    int32_t iCurbeLength;                   //!< Constant URB length
    int32_t iIdCount;                       //!< Num IDs used by kernel state
    int32_t iInlineDataLength;              //!< MEDIA_OBJECT inline data (aka URB length)
    int32_t iBlockWidth;                    //!< Block width
    int32_t iBlockHeight;                   //!< Block height

    //!
    //! \brief Dynamic kernel parameters may follow below if necessary.
    //!
    int32_t bLoaded;                        //!< Kernel Loaded flag
    int32_t iKID;                           //!< Interface descriptor ID for the kernel
    int32_t iKUID;                          //!< Kernel Unique ID
    int32_t iKCID;                          //!< Kernel Cache ID
    int32_t iAKBaseID;                      //!< Authenticated Kernel Base ID

    bool    bForceReload;                   //!< The flag to indicate if the kernel need to be reloaded forcibly

} MHW_KERNEL_PARAM, *PMHW_KERNEL_PARAM;

typedef struct MHW_KERNEL_STATE
{
    MHW_KERNEL_STATE()
    {
        m_dshRegion = MemoryBlock();
        m_ishRegion = MemoryBlock();
    }

    virtual ~MHW_KERNEL_STATE() { MHW_FUNCTION_ENTER;  }
    //!
    //! \brief Set when the kernel state is created
    //!
    MHW_KERNEL_PARAM    KernelParams = {};   //!< Kernel parameters

    //!
    //! \brief Set when the kernel state region for the kernel state
    //!        is acquired.
    //!        Note: For state heaps other than the SSH it is possible to
    //!              make a kernel state region static, such that it belongs
    //!              to the kernel state and it is not necessary to acquire a
    //!              kernel state region for the DSH/ISH (whichever is
    //!              static).
    //!
    uint32_t dwSshOffset = 0;            //!< Offset within SSH to the kernel state region
    uint32_t dwBindingTableSize = 0;     //!< The size of the binding table for this kernel state
    uint32_t dwSshSize = 0;              //!< Size of the kernel state region in the SSH
    uint32_t dwIdOffset = 0;             //!< Offset within DSH to ID(s) in kernel state region
    uint32_t dwCurbeOffset = 0;          //!< Offset within DSH to CURBE(s) in kernel state region
    uint32_t dwSamplerOffset = 0;        //!< Offset within DSH to Sampler(s) in kernel state region
    uint32_t dwKernelBinaryOffset = 0;   //!< Offset within ISH to the kernel state region

    //!
    //! \brief Descriptors of the DSH/ISH kernel state regions. Since there
    //!        may be multiple DSH/ISH buffers, it is necessary to store
    //!        which one is used. If one of the regions is static, the memory
    //!        block pointer is always expected to be valid.
    //!
    MemoryBlock m_dshRegion;
    MemoryBlock m_ishRegion;

    uint32_t    m_currTrackerId = MemoryBlock::m_invalidTrackerId;  //!< tracker ID for the current execution
} *PMHW_KERNEL_STATE;

typedef struct _MHW_BINDING_TABLE_PARAMS {
    uint8_t     *pBindingTableEntry;             // Pointer to BT entry to setup
    uint32_t    dwSurfaceStateOffset;           // Offset to Surface State (Indirect State)
    bool        bSurfaceStateAvs;               // true if AVS surface
    int32_t     iBindingTableEntry;             // Binding Table entry index
} MHW_BINDING_TABLE_PARAMS, *PMHW_BINDING_TABLE_PARAMS;

typedef struct _MHW_BINDING_TABLE_SEND_PARAMS {
    uint8_t     *pBindingTableSource;            // Pointer to BT source
    uint8_t     *pBindingTableTarget;            // Pointer to BT target
    int32_t     iSurfaceStateBase;              // Offset to first Surface State in SSH
    int32_t     iSurfaceStateOffset;            // [out] Offset to Surface State in SSH
    int32_t     iSurfaceState;                  // [out] Surface State index (-1 if Copy==0)
} MHW_BINDING_TABLE_SEND_PARAMS, *PMHW_BINDING_TABLE_SEND_PARAMS;

typedef struct _MHW_SURFACE_STATE_PARAMS {
    uint8_t     *pSurfaceState;
    uint32_t    dwCacheabilityControl;
    uint32_t    dwFormat;
    uint32_t    dwWidth;
    uint32_t    dwHeight;
    uint32_t    dwDepth;
    uint32_t    dwPitch;
    uint32_t    dwQPitch;
    uint32_t    bUseAdvState              : 1;
    uint32_t    AddressControl            : 1;
    uint32_t    SurfaceType3D             : 3;
    uint32_t    bTiledSurface             : 1;
    uint32_t    bTileWalk                 : 1;
    uint32_t    bVerticalLineStride       : 1;
    uint32_t    bVerticalLineStrideOffset : 1;
    uint32_t    bCompressionEnabled       : 1;
    uint32_t    bCompressionMode          : 1;
    uint32_t    MmcState                  : 3;
    uint32_t    bInterleaveChroma         : 1;
    uint32_t    bHalfPitchChroma          : 1;
    uint32_t    bSeperateUVPlane          : 1;
    uint32_t    UVPixelOffsetUDirection   : 2;
    uint32_t    UVPixelOffsetVDirection   : 2;
    uint32_t    RotationMode              : 3;
    uint32_t    bSurfaceArraySpacing      : 1;
    uint32_t    bBoardColorOGL            : 1;
    int32_t     iXOffset;
    int32_t     iYOffset;
    uint32_t    dwXOffsetForU; // U or UV
    uint32_t    dwYOffsetForU; // U or UV
    uint32_t    dwXOffsetForV;
    uint32_t    dwYOffsetForV;
    uint32_t    dwCompressionFormat;    // Memory Compression Format
    uint32_t    L1CacheConfig;

    uint32_t    *pdwCmd;                // [out] Pointer for patching
    uint32_t    dwLocationInCmd;       // [out] Offset in command for patching
    MOS_TILE_MODE_GMM TileModeGMM;     // Tile Type from GMM Definition
    bool        bGMMTileEnabled;       //!<  GMM defined tile mode flag
} MHW_SURFACE_STATE_PARAMS, *PMHW_SURFACE_STATE_PARAMS;

struct _MHW_STATE_HEAP
{
    MOS_RESOURCE    resHeap;        //!< Graphics resource for state heap
    void            *pvLockedHeap;   //!< System (logical) address for state heap
    bool            bKeepLocked;
    uint32_t        dwSize;         //!< Size of the state heap

    uint32_t        dwUsed;         //!< Used memory in state heap
    uint32_t        dwFree;         //!< Free memory in state heap
    bool            bDeleted;       //!< State heap is in process of being deleted

    // State heap object points to its interface object and block manager
    PMHW_BLOCK_MANAGER pBlockManager;
    PXMHW_STATE_HEAP_INTERFACE pMhwStateHeapInterface;

    //!
    //! \brief The memory blocks will be managed in a linked list, each state
    //!        heap will have one linked list starting with pMemoryHead. The
    //!        memory blocks in this list will describe all available and 
    //!        used space in the state heap.
    //!
    PMHW_STATE_HEAP_MEMORY_BLOCK    pMemoryHead;

    PMHW_STATE_HEAP_MEMORY_BLOCK    pMemoryTail;    //!< Last block in state heap memory (used to traverse pMemNext/pMemPrev)
    PMHW_STATE_HEAP_MEMORY_BLOCK    pDebugKernel;   //!< Block associated to debug (SIP) kernel in the current ISH
    PMHW_STATE_HEAP_MEMORY_BLOCK    pScratchSpace;  //!< Block associated with current active scratch space (older scratch spaces are removed)
    uint32_t                        dwScratchSpace; //!< Active scratch space size

    PMHW_STATE_HEAP  pPrev;         //!< The first state heap is considered primary (pPrev == nullptr)
    PMHW_STATE_HEAP  pNext;

    uint32_t         dwCurrOffset;   //!< For simulated SSH to denote the current amount of space used
};

typedef struct _MHW_SYNC_TAG
{
    uint32_t dwCmdBufId;             //!< Command buffer ID for this sync tag, 0 is available
    uint32_t dwSshSizeUsed;

    //!
    //! \brief Memory blocks used during the clean up step.
    //!
    PMHW_STATE_HEAP_MEMORY_BLOCK pDshRegion; //!< Memory block for DSH
    PMHW_STATE_HEAP_MEMORY_BLOCK pIshRegion; //!< Memory block for ISH
} MHW_SYNC_TAG, *PMHW_SYNC_TAG;

typedef struct _MHW_INTERFACE_DESCRIPTOR_PARAMS
{
    PMHW_KERNEL_STATE   pKernelState;
    uint32_t            dwKernelStartOffset; //!< Offset relative to the kernel state region binary start offset in the ISH
    uint32_t            dwIdIdx;             //!< Index within the ID block of the kernel state region in the DSH of the ID to be added
    uint32_t            dwBtOffset;          //!< Offset relative to SSH base of the BT start
    uint32_t            dwSamplerOffset;     //!< Offset within the Sampler block of the kernel state region for the current sampler state
} MHW_INTERFACE_DESCRIPTOR_PARAMS, *PMHW_INTERFACE_DESCRIPTOR_PARAMS;

// Structure used to program media interface descriptor entry
typedef struct _MHW_ID_ENTRY_PARAMS
{
    uint32_t            dwMediaIdOffset;                //! Offset of the first Media Interface Descriptor (in DSH)
    uint32_t            iMediaId;                       //! Media Interface Descriptor #
    uint32_t            dwKernelOffset;                 //! Kernel offset (in ISH)
    uint32_t            dwSamplerOffset;                //! Sampler offset (in DSH)
    uint32_t            dwSamplerCount;                 //! Sample count
    uint32_t            dwBindingTableOffset;           //! Binding table offset (in DSH)
    uint32_t            iCurbeOffset;                   //! Curbe offset (in DSH)
    uint32_t            iCurbeLength;                   //! Curbe lenght
    bool                bBarrierEnable;                 //! Enable Barrier
    bool                bGlobalBarrierEnable;           //! Enable Global Barrier (SKL+)
    uint32_t            dwNumberofThreadsInGPGPUGroup;  //! Number of threads per group
    uint32_t            dwSharedLocalMemorySize;        //! Size of SharedLocalMemory (SLM)
    int32_t             iCrsThdConDataRdLn;             //!
    PMHW_STATE_HEAP     pGeneralStateHeap;              //! General state heap in use
    MemoryBlock         *memoryBlock;                   //! Memory block associated with the state heap
} MHW_ID_ENTRY_PARAMS, *PMHW_ID_ENTRY_PARAMS;

typedef struct _MHW_PLANE_SETTING
{
    uint8_t ui8PlaneID;                                                            // Plane identifier
    uint8_t ui8ScaleWidth;                                                         // X Scale (divider)
    uint8_t ui8ScaleHeight;                                                        // Y Scale (divider)
    uint8_t ui8AlignWidth;                                                         // X Alignment
    uint8_t ui8AlignHeight;                                                        // Y Alignment
    uint8_t ui8PixelsPerDword;                                                     // Pixels per Dword (for dataport read/write)
    bool    bAdvanced;                                                             // Advanced Surface State
    uint32_t dwFormat;                                                              // Hardware Surface Format
} MHW_PLANE_SETTING, *PMHW_PLANE_SETTING;

typedef struct _MHW_SURFACE_PLANES
{
    uint32_t            dwNumPlanes;                                              // Number of planes
    MHW_PLANE_SETTING   Plane[MHW_MAX_SURFACE_PLANES];                            // Description of each plane
} MHW_SURFACE_PLANES, *PMHW_SURFACE_PLANES;

typedef const _MHW_PLANE_SETTING  *PCMHW_PLANE_SETTING;
typedef const _MHW_SURFACE_PLANES *PCMHW_SURFACE_PLANES;

typedef struct _MHW_RCS_SURFACE_PARAMS
{
    PMOS_SURFACE    psSurface;

    uint32_t        bUseAdvState;                     //!< Indicates that SURFACE_STATE_ADV should be used

    uint32_t        dwNumPlanes;                      //!< Indicates the number of valid binding table offsets included
    uint32_t        dwPlaneType[MHW_MAX_SURFACE_PLANES]; //!< Indicates the plane type
    uint32_t        dwBindingTableOffset[MHW_MAX_SURFACE_PLANES]; //!< Binding table offset for all planes included in surface
    uint32_t        dwCacheabilityControl;
    bool            bRenderTarget;
    bool            bIsWritable;

    uint32_t        dwWidthToUse[MHW_MAX_SURFACE_PLANES];   //!< If non-zero, overrides value in psSurface
    uint32_t        dwHeightToUse[MHW_MAX_SURFACE_PLANES];  //!< If non-zero, overrides value in psSurface
    uint32_t        dwPitchToUse[MHW_MAX_SURFACE_PLANES];   //!< If non-zero, overrides value in psSurface
    uint32_t        dwBaseAddrOffset[MHW_MAX_SURFACE_PLANES];
    uint32_t        dwYOffset[MHW_MAX_SURFACE_PLANES];
    uint32_t        dwXOffset[MHW_MAX_SURFACE_PLANES];
    uint32_t        ForceSurfaceFormat[MHW_MAX_SURFACE_PLANES]; //!< Of type GFX3DSTATE_SURFACEFORMAT
    uint32_t        dwSurfaceType; //!< of type GFX3DSTATE_SURFACETYPE

    uint32_t        bVertLineStride;
    uint32_t        bVertLineStrideOffs;
    uint32_t        bInterleaveChroma;

    uint32_t                     dwAddressControl;
    MHW_CHROMA_SITING_VDIRECTION Direction;
    MHW_ROTATION                 Rotation;                         //!<  0: 0 degree, 1: 90 degree, 2: 180 degree, 3: 270 degree
    uint32_t                        MediaBoundaryPixelMode;     //!< Of type GFX3DSTATE_MEDIA_BOUNDARY_PIXEL_MODE
    uint32_t                     dwOffsetInSSH;
} MHW_RCS_SURFACE_PARAMS, *PMHW_RCS_SURFACE_PARAMS;

typedef struct _MHW_SURFACE_TOKEN_PARAMS
{
    PMOS_SURFACE    pOsSurface;
    uint32_t        dwSurfaceOffset;
    uint32_t        YUVPlane            : 2;
    uint32_t        bRenderTarget       : 1;
    uint32_t                            : 1;
    uint32_t        bSurfaceTypeAvs     : 1;
    uint32_t                            : 26;
} MHW_SURFACE_TOKEN_PARAMS, *PMHW_SURFACE_TOKEN_PARAMS;

//!
//! \brief Sampler Type
//!
typedef enum _MHW_SAMPLER_TYPE
{
    MHW_SAMPLER_TYPE_INVALID  = 0,
    MHW_SAMPLER_NONE          ,
    MHW_SAMPLER_TYPE_3D       ,   // UNORM
    MHW_SAMPLER_TYPE_AVS      ,   // AVS (Avanced Video Sampler = 8x8, STE, IEF)
    MHW_SAMPLER_TYPE_VME      ,   // VME
    MHW_SAMPLER_TYPE_MISC     ,   // MISC
    MHW_SAMPLER_TYPE_MINMAX   ,
    MHW_SAMPLER_TYPE_ERODE    ,
    MHW_SAMPLER_TYPE_DILATE   ,
    MHW_SAMPLER_TYPE_CONV         // CONVOLUTION (Gen8+)
} MHW_SAMPLER_TYPE, *PMHW_SAMPLER_TYPE;

typedef enum _MHW_SAMPLER_ELEMENTS_TYPE : unsigned int
{
    MHW_Sampler1Element = 0,
    MHW_Sampler2Elements,
    MHW_Sampler4Elements,
    MHW_Sampler8Elements,
    MHW_Sampler64Elements,
    MHW_Sampler128Elements,

    MHW_SamplerTotalElements
}MHW_SAMPLER_ELEMENT_TYPE, *PMHW_SAMPLER_ELEMENT_TYPE;

//!
//! \brief Sampler Tap Mode
//!
typedef enum _MHW_SAMPLER_TAP_MODE
{
    MHW_SAMPLER_FILTER_4_TAP  = 0,
    MHW_SAMPLER_FILTER_8_4_TAP,
    MHW_SAMPLER_FILTER_8_TAP,
    MHW_SAMPLER_FILTER_8_TAP_ADATIVE
} MHW_SAMPLER_TAP_MODE, *PMHW_SAMPLER_TAP_MODE;

//!
//! \brief Sampler Filter Mode
//!
typedef enum _MHW_SAMPLER_FILTER_MODE
{
    MHW_SAMPLER_FILTER_CUSTOM = 0,
    MHW_SAMPLER_FILTER_NEAREST,
    MHW_SAMPLER_FILTER_BILINEAR
} MHW_SAMPLER_FILTER_MODE, *PMHW_SAMPLER_FILTER_MODE;

typedef enum _MHW_SAMPLER_TEXTADDR
{
    MHW_SAMPLER_TEXTADDR_WRAP,
    MHW_SAMPLER_TEXTADDR_MIRROR,
    MHW_SAMPLER_TEXTADDR_CLAMP,
    MHW_SAMPLER_TEXTADDR_CUBE,
    MHW_SAMPLER_TEXTADDR_CLAMPBORDER,
    MHW_SAMPLER_TEXTADDR_MIRROR_ONCE
} MHW_SAMPLER_TEXTADDR;

typedef struct _MHW_AVS_COEFFICIENT_PARAM
{
    int8_t ZeroXFilterCoefficient[8];
    int8_t ZeroYFilterCoefficient[8];
    int8_t OneXFilterCoefficient[4]; //!< [0..3] maps to filter coefficients [2..5], in actual tabel [0..1] are reserved
    int8_t OneYFilterCoefficient[4]; //!< [0..3] maps to filter coefficients [2..5], in actual tabel [0..1] are reserved
} MHW_AVS_COEFFICIENT_PARAM, *PMHW_AVS_COEFFICIENT_PARAM;

typedef struct _MHW_SAMPLER_AVS_TABLE_PARAM
{
    MHW_AVS_COEFFICIENT_PARAM paMhwAvsCoeffParam[MHW_NUM_HW_POLYPHASE_TABLES];

    // sampler table control
    uint8_t byteTransitionArea8Pixels; //!< only least 3-bits used
    uint8_t byteTransitionArea4Pixels; //!< only least 3-bits used
    uint8_t byteMaxDerivative8Pixels;
    uint8_t byteMaxDerivative4Pixels;
    uint8_t byteDefaultSharpnessLevel;

    bool bEnableRGBAdaptive;
    bool bAdaptiveFilterAllChannels;
    bool bBypassYAdaptiveFiltering;
    bool bBypassXAdaptiveFiltering;

    bool b8TapAdaptiveEnable;
    bool b4TapGY;
    bool b4TapRBUV;

    bool bIsCoeffExtraEnabled;
    MHW_AVS_COEFFICIENT_PARAM paMhwAvsCoeffParamExtra[MHW_NUM_HW_POLYPHASE_EXTRA_TABLES_G9]; // only for gen9+

} MHW_SAMPLER_AVS_TABLE_PARAM, *PMHW_SAMPLER_AVS_TABLE_PARAM;

//!
//! \brief  Sampler States for 8x8 sampler
//!
typedef struct _MHW_SAMPLER_STATE_AVS_PARAM
{
    int16_t                      stateID;

    // STE params
    bool                         bEnableSTDE;           // a.k.a SkinToneTunedIEF
    bool                         b8TapAdaptiveEnable;
    bool                         bSkinDetailFactor;
    bool                         bHdcDwEnable;          // Gen9+
    bool                         bWritebackStandard;    // set Writeback same as Original Sample_8x8

    // IEF params
    bool                         bEnableIEF;
    uint16_t                     wIEFFactor;            // 0 will disable IEF
    uint16_t                     wR3xCoefficient;
    uint16_t                     wR3cCoefficient;
    uint16_t                     wR5xCoefficient;
    uint16_t                     wR5cxCoefficient;
    uint16_t                     wR5cCoefficient;

    // AVS params
    bool                         bEnableAVS;
    bool                         AvsType;          // 0 - Polyphase; 1 - nearest
    bool                         EightTapAFEnable;
    bool                         BypassIEF;        // ignored for BWL, moved to sampler8x8 payload.
    uint16_t                     GainFactor;
    uint8_t                      GlobalNoiseEstm;
    uint8_t                      StrongEdgeThr;
    uint8_t                      WeakEdgeThr;
    uint8_t                      StrongEdgeWght;
    uint8_t                      RegularWght;
    uint8_t                      NonEdgeWght;
    bool                         b8TapLumaForYUV444;

    // Additional overrides
    uint16_t AdditionalOverridesUsed;
    uint16_t YSlope2;
    uint16_t S0L;
    uint16_t YSlope1;
    uint16_t S2U;
    uint16_t S1U;

    PMHW_SAMPLER_AVS_TABLE_PARAM pMhwSamplerAvsTableParam; // pointer to AVS scaling 8x8 table params

    int32_t                      iTable8x8_Index;   // Table allocation index (not needed on Gen8+)
    void                         *pTable8x8_Ptr;     // Table data ptr in GSH
    uint32_t                     dwTable8x8_Offset; // Table data offset in GSH
} MHW_SAMPLER_STATE_AVS_PARAM, *PMHW_SAMPLER_STATE_AVS_PARAM;

//!
//! \brief  Structure to handle UNORM sampler states
//!
typedef enum _MHW_SAMPLER_SURFACE_PIXEL_TYPE
{
    MHW_SAMPLER_SURFACE_PIXEL_UINT,
    MHW_SAMPLER_SURFACE_PIXEL_SINT,
    MHW_SAMPLER_SURFACE_PIXEL_OTHER
} MHW_SAMPLER_SURFACE_PIXEL_TYPE;

typedef enum _MHW_GFX3DSTATE_MAPFILTER
{
    MHW_GFX3DSTATE_MAPFILTER_NEAREST        = 0x0,
    MHW_GFX3DSTATE_MAPFILTER_LINEAR         = 0x1,
    MHW_GFX3DSTATE_MAPFILTER_ANISOTROPIC    = 0x2,
    MHW_GFX3DSTATE_MAPFILTER_FLEXIBLE       = 0x3,
    MHW_GFX3DSTATE_MAPFILTER_MONO           = 0x6
} MHW_GFX3DSTATE_MAPFILTER;

typedef enum _MHW_GFX3DSTATE_TEXCOORDMODE
{
    MHW_GFX3DSTATE_TEXCOORDMODE_WRAP            = 0,
    MHW_GFX3DSTATE_TEXCOORDMODE_MIRROR          = 1,
    MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP           = 2,
    MHW_GFX3DSTATE_TEXCOORDMODE_CUBE            = 3,
    MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP_BORDER    = 4,
    MHW_GFX3DSTATE_TEXCOORDMODE_MIRROR_ONCE     = 5
} MHW_GFX3DSTATE_TEXCOORDMODE;

typedef enum _MHW_CHROMAKEY_MODE
{
    MHW_CHROMAKEY_MODE_KILL_ON_ANY_MATCH = 0,
    MHW_CHROMAKEY_MODE_REPLACE_BLACK = 1
} MHW_CHROMAKEY_MODE;

typedef struct _MHW_SAMPLER_STATE_UNORM_PARAM
{
    MHW_SAMPLER_FILTER_MODE      SamplerFilterMode;
    MHW_GFX3DSTATE_MAPFILTER     MagFilter;
    MHW_GFX3DSTATE_MAPFILTER     MinFilter;
    MHW_GFX3DSTATE_TEXCOORDMODE  AddressU;
    MHW_GFX3DSTATE_TEXCOORDMODE  AddressV;
    MHW_GFX3DSTATE_TEXCOORDMODE  AddressW;

    MHW_SAMPLER_SURFACE_PIXEL_TYPE SurfaceFormat;
    union {
        uint32_t BorderColorRedU;
        int32_t BorderColorRedS;
        float BorderColorRedF;
    };

    union {
        uint32_t BorderColorGreenU;
        int32_t BorderColorGreenS;
        float BorderColorGreenF;
    };

    union {
        uint32_t BorderColorBlueU;
        int32_t BorderColorBlueS;
        float BorderColorBlueF;
    };

    union {
        uint32_t BorderColorAlphaU;
        int32_t BorderColorAlphaS;
        float BorderColorAlphaF;
    };

    uint32_t IndirectStateOffset;
    void  *pIndirectState;
    bool bBorderColorIsValid;

    bool bChromaKeyEnable;
    uint32_t ChromaKeyIndex;
    MHW_CHROMAKEY_MODE ChromaKeyMode;
} MHW_SAMPLER_STATE_UNORM_PARAM, *PMHW_SAMPLER_STATE_UNORM_PARAM;

//!
//! \brief  Structure to capture sizes of HW engine commands and structures
//!
typedef struct _MHW_RENDER_STATE_SIZES
{
    uint32_t            dwSizeMediaObjectHeaderCmd;                             // Size of Media Object Header Command
    uint32_t            dwMaxSizeSurfaceState;                                  // Max size of a surface state
    uint32_t            dwSizeSurfaceState;                                     // Size of surface state
    uint32_t            dwSizeSurfaceStateAvs;                                  // Size of AVS surface state
    uint32_t            dwSizeBindingTableState;                                // Size of binding table state entry
    uint32_t            dwSizeSamplerState;                                     // Size of sampler state (unorm)
    uint32_t            dwSizeSamplerIndirectState;                             // Size of sampler indirect state (unorm)
    uint32_t            dwSizeSamplerStateAvs;                                  // Size of sampler state (Avs)
    uint32_t            dwSizeSamplerStateVA;                                   // Size of sampler state (va)
    uint32_t            dwSizeSamplerStateVAConvolve;                           // Size of sampler state (va convolve)
    uint32_t            dwSizeSamplerStateTable8x8;                             // Size of sampler state 8x8 table
    uint32_t            dwSizeSampler8x8Table;                                  // Size of sampler 8x8 table
    uint32_t            dwSizeInterfaceDescriptor;                              // Size of interface descriptor
    uint32_t            dwSizeMediaWalkerBlock;                                 // Size of Media Walker block
} MHW_RENDER_STATE_SIZES, *PMHW_RENDER_STATE_SIZES;

//!
//! \brief  Structure to handle VME Sampler State
//!
typedef struct _MHW_SAMPLER_STATE_VME_PARAM
{
    uint32_t                     *pdwLUTSearchPath;
    uint32_t                     *pdwLUTMbMode;
    uint32_t                     *pdwLUTMv;
} MHW_SAMPLER_STATE_VME_PARAM, *PMHW_SAMPLER_STATE_VME_PARAM;

typedef struct _MHW_SAMPLER_CONVOLVE_COEFF_TABLE
{
    uint16_t wFilterCoeff[16];
} MHW_SAMPLER_CONVOLVE_COEFF_TABLE;

typedef struct _MHW_SAMPLER_STATE_CONVOLVE_PARAM
{
    uint8_t                      ui8ConvolveType;       // 1d, 2d
    uint8_t                      ui8Height;
    uint8_t                      ui8Width;
    uint8_t                      ui8ScaledDownValue;
    uint8_t                      ui8SizeOfTheCoefficient;
    uint8_t                      ui8MSBHeight;
    uint8_t                      ui8MSBWidth;
    bool                         skl_mode;
    MHW_SAMPLER_CONVOLVE_COEFF_TABLE CoeffTable[62];
} MHW_SAMPLER_STATE_CONVOLVE_PARAM, *PMHW_SAMPLER_STATE_CONVOLVE_PARAM;

typedef struct _MHW_SAMPLER_8x8_MISC_STATE {
    uint8_t byteHeight;
    uint8_t byteWidth;
    uint16_t wRow[15];
} MHW_SAMPLER_8x8_MISC_STATE, *PMHW_SAMPLER_8x8_MISC_STATE;

//!
//! \brief  Structure to handle Sampler State
//!
typedef struct _MHW_SAMPLER_STATE_PARAM
{
    bool                        bInUse;
    PMHW_KERNEL_STATE           pKernelState;
    MHW_SAMPLER_TYPE            SamplerType;
    MHW_SAMPLER_ELEMENT_TYPE    ElementType;
    union
    {
        MHW_SAMPLER_STATE_UNORM_PARAM     Unorm;
        MHW_SAMPLER_STATE_AVS_PARAM       Avs;
        MHW_SAMPLER_STATE_VME_PARAM       Vme;
        MHW_SAMPLER_STATE_CONVOLVE_PARAM  Convolve;
        MHW_SAMPLER_8x8_MISC_STATE        Misc;
    };
} MHW_SAMPLER_STATE_PARAM, *PMHW_SAMPLER_STATE_PARAM;

typedef struct _MHW_SURFACE_STATE_SEND_PARAMS {
    uint8_t                 *pIndirectStateBase;
    uint8_t                 *pSurfaceStateSource;
    uint8_t                 *pSurfaceToken;
    int32_t                 iIndirectStateBase;
    int32_t                 iSurfaceStateOffset;
    bool                    bNeedNullPatch;
} MHW_SURFACE_STATE_SEND_PARAMS, *PMHW_SURFACE_STATE_SEND_PARAMS;

struct MHW_STATE_HEAP_SETTINGS
{
    MHW_STATE_HEAP_SETTINGS() {}

    virtual ~MHW_STATE_HEAP_SETTINGS() {}

    uint32_t        dwIshSize = 0;          //!< Initial size of ISH
    uint32_t        dwDshSize = 0;          //!< Initial size of DSH
    uint32_t        dwIshIncrement = 0;     //!< ISH increment step
    uint32_t        dwDshIncrement = 0;     //!< DSH increment step
    uint32_t        dwIshMaxSize = 0;       //!< ISH max size
    uint32_t        dwDshMaxSize = 0;       //!< DSH max size

    bool            m_keepIshLocked = false;       //!< Keep ISH locked always
    bool            m_keepDshLocked = false;       //!< Keep DSH locked always

    HeapManager::Behavior m_ishBehavior = HeapManager::Behavior::wait;    //!< ISH behavior
    HeapManager::Behavior m_dshBehavior = HeapManager::Behavior::wait;    //!< DSH behavior

    uint32_t        dwNumSyncTags = 0; //!< to be removed with old interfaces
};

typedef struct _MHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS
{
    int32_t                      *piSizes;               //<! [in] array of block sizes to allocate
    int32_t                      iCount;                //<! [in] number of blocks to allocate
    uint32_t                     dwAlignment;           //<! [in] block alignment
    bool                         bHeapAffinity;         //<! [in] true if all blocks must be allocated in the same heap; false otherwize
    PMHW_STATE_HEAP              pHeapAffinity;         //<! [in] Select a specific heap to allocate (nullptr if don't care)
    uint32_t                     dwScratchSpace;        //<! [in/out] Scratch space requested, scratch space allocated in same heap as the block
    PMHW_STATE_HEAP_MEMORY_BLOCK pScratchSpace;         //<! [out] Pointer to scratch space block used - needed for command buffer setup
    bool                         bZeroAssignedMem;      //<! [in] Zero memory blocks after allocation
    bool                         bStatic;               //<! [in] Block allocations are flaged as static
    bool                         bGrow;                 //<! [in] Allow state heap to grow in order to satisfy the request
} MHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS, *PMHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS;

typedef MOS_STATUS ( *pfnAddResourceToCmd) (PMOS_INTERFACE , PMOS_COMMAND_BUFFER ,PMHW_RESOURCE_PARAMS);

class XMHW_STATE_HEAP_INTERFACE
{
public:
    static const uint32_t m_mhwBindingTableOffsetShift  = 6;
    static const uint32_t m_mhwBindingTableSurfaceShift = 6;
    static const uint32_t m_mhwGenericOffsetShift       = 6;
    static const uint32_t m_mhwBindingTableOffsetAlignment = (1 << m_mhwBindingTableOffsetShift);
    static const uint32_t m_mhwNumBindingTableEntryOffset  = (m_mhwBindingTableOffsetAlignment/4);

protected:
    HeapManager m_ishManager;
    HeapManager m_dshManager;
    std::vector<MemoryBlock> m_blocks;
    std::vector<uint32_t> m_blockSizes;

private:
    MEDIA_WA_TABLE          *m_pWaTable;
    MHW_STATE_HEAP_SETTINGS m_StateHeapSettings;

    // old heap management
    MOS_RESOURCE            m_resCmdBufIdGlobal;
    uint32_t                *m_pdwCmdBufIdGlobal;
    uint32_t                m_dwCurrCmdBufId;
    PMHW_SYNC_TAG           m_pSyncTags;
    uint32_t                m_dwCurrSyncTag;
    uint32_t                m_dwInvalidSyncTagId; //!< Passed in at creation by the client
    bool                    m_bRegisteredBBCompleteNotifyEvent;
    PMHW_STATE_HEAP         m_pInstructionStateHeaps;
    uint32_t                m_dwNumIsh;
    uint32_t                m_dwNumDsh;
    PMHW_STATE_HEAP         m_pDynamicStateHeaps;
    int8_t                  m_bDynamicMode;     //!< To be deprecated, 0 - RenderHal handles, 1 - MDF heap management, 2 - generic hep
    PMHW_BLOCK_MANAGER      m_pIshBlockManager; //!< ISH block management object
    PMHW_BLOCK_MANAGER      m_pDshBlockManager; //!< DSH block management object

public:
    PMOS_INTERFACE          m_pOsInterface;
    uint16_t                m_wIdAlignment;
    uint16_t                m_wBtIdxAlignment;
    uint16_t                m_wCurbeAlignment;
    uint16_t                m_wSizeOfCmdSamplerState;
    uint32_t                m_dwMaxSurfaceStateSize;
    pfnAddResourceToCmd     m_pfnAddResourceToCmd;
    MHW_STATE_HEAP          m_SurfaceStateHeap; //!< Simulated SSH with MHW_STATE_HEAP.
    uint16_t                m_wSizeOfCmdInterfaceDescriptorData;
    MHW_RENDER_STATE_SIZES  m_HwSizes;

public:
    //!
    //! \brief Internal to MHW
    //!

    //!
    //! \brief    Constructor of the MI StateHeap interface
    //! \details  Internal MHW function to initialize all function pointers and some parameters
    //! \param    [in] pCpInterface
    //!           CP interface, must be valid
    //! \param    [in] pOsInterface
    //!           OS interface, must be valid
    //!
    XMHW_STATE_HEAP_INTERFACE(PMOS_INTERFACE pInputOSInterface, int8_t bDynamicMode=0);

    XMHW_STATE_HEAP_INTERFACE(const XMHW_STATE_HEAP_INTERFACE&) = delete;

    XMHW_STATE_HEAP_INTERFACE& operator=(const XMHW_STATE_HEAP_INTERFACE&) = delete;

    virtual ~XMHW_STATE_HEAP_INTERFACE();

    PMHW_STATE_HEAP GetDSHPointer(){ return   m_pDynamicStateHeaps; };

    PMHW_STATE_HEAP GetISHPointer(){ return   m_pInstructionStateHeaps;};

    uint32_t GetNumDsh(){return m_dwNumDsh;};

    uint32_t GetNumIsh(){return m_dwNumIsh;};

    PMOS_RESOURCE  GetResCmdBufIdGlobal(){return &m_resCmdBufIdGlobal;};

    PMHW_SYNC_TAG  GetSycnTags(){return m_pSyncTags;};

    uint16_t GetIdAlignment(){return m_wIdAlignment;};

    uint16_t GetSizeofCmdSampleState(){return m_wSizeOfCmdSamplerState;};

    uint16_t GetSizeofCmdInterfaceDescriptorData(){ return m_wSizeOfCmdInterfaceDescriptorData;};

    uint16_t GetCurbeAlignment(){ return m_wCurbeAlignment;};

    uint16_t GetBtIdxAlignment(){ return m_wBtIdxAlignment;};

    uint32_t GetCurrCmdBufId(){ return m_dwCurrCmdBufId;};

    uint32_t GetCmdBufIdGlobal(){ return *m_pdwCmdBufIdGlobal;};

    uint32_t *GetCmdBufIdGlobalPointer(){ return m_pdwCmdBufIdGlobal; };

    PMHW_RENDER_STATE_SIZES GetHwSizesPointer() { return & m_HwSizes;};

    uint32_t GetSizeofSamplerStateAvs() { return m_HwSizes.dwSizeSamplerStateAvs;};

    //!
    //! \brief    Initializes the MI StateHeap 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] StateHeapSettings
    //!           StateHeap setting passed from caller
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success else fail reason
    MOS_STATUS InitializeInterface(MHW_STATE_HEAP_SETTINGS     StateHeapSettings);

    //!
    //! \brief    Assigns space in a state heap to a kernel state
    //! \details  Client facing function to assign as space in a state heap a kernel state;
    //!           if no space is available, a clean up is attempted 
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] The state heap type requested (ISH/DSH)
    //! \param    PMHW_KERNEL_STATE pKernelState
    //!           [in] Kernel state to which a state heap space will be assigned
    //! \param    uint32_t dwSpaceRequested
    //!           [in] The amount of space requested from the state heap
    //! \param    bool bStatic
    //!           [in] Whether or not the space requested is static
    //! \param    bool bZeroAssignedMem
    //!           [in] Whether or not acquired memory should be zeroed
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, MOS_STATUS_CLIENT_AR_NO_SPACE if no space
    //!           is available but it is possible for the client to wait, else fail reason
    //!
    MOS_STATUS AssignSpaceInStateHeap(
        MHW_STATE_HEAP_TYPE         StateHeapType,
        PMHW_KERNEL_STATE           pKernelState,
        uint32_t                    dwSpaceRequested,
        bool                        bStatic,
        bool                        bZeroAssignedMem);

    //!
    //! \brief    Submits all non-static blocks in kernel state
    //! \param    [in] pKernelState
    //!           Kernel state containing all memory blocks to submit
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    MOS_STATUS SubmitBlocks(PMHW_KERNEL_STATE pKernelState);

    //!
    //! \brief    Locks requested state heap
    //! \details  Client facing function to lock a state heap
    //! \param    PMHW_STATE_HEAP pStateHeap
    //!           [in] The state heap to be locked
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    MOS_STATUS LockStateHeap(
        PMHW_STATE_HEAP             pStateHeap);

    //!
    //! \brief    Unlocks requested state heap
    //! \details  Client facing function to unlock a state heap
    //! \param    PMHW_STATE_HEAP pStateHeap
    //!           [in] The state heap to be locked
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    MOS_STATUS UnLockStateHeap(
        PMHW_STATE_HEAP             pStateHeap);

    //!
    //! \brief    Allocates a state heap of the requested type
    //! \details  Client facing function to extend a state heap of the requested time, which
    //!           involves allocating state heap and added it to the state heap liked list.
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] The state heap type requested (ISH/DSH)
    //! \param    uint32_t dwSizeRequested
    //!           [in] The size of the state heap
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS ExtendStateHeap(
        MHW_STATE_HEAP_TYPE         StateHeapType,
        uint32_t                    dwSizeRequested);

    //!
    //! \brief    Update CmdBufIdGlobal
    //! \details  Client facing function to update CmdBufIdGlobal
    //!           reset current offset to zero
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS UpdateGlobalCmdBufId();

    //!
    //! \brief    Set command buffer status pointer
    //! \details  Client facing function to set command buffer status pointer
    //! \param    void  *pvCmdBufStatus
    //!           [in] command buffer status pointer
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS SetCmdBufStatusPtr(void *pvCmdBufStatus);

    //!
    //! \brief    Calculate the space needed in the SSH
    //! \details  Client facing function to calculate the space needed in the SSH
    //!           given the number of binding table entries
    //! \param    uint32_t dwBtEntriesRequested
    //!           [in] Binding table entries requested in the SSH
    //! \param    uint32_t *pdwSshSize
    //!           [out] The size needed in the SSH
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS CalculateSshAndBtSizesRequested(
        uint32_t                    dwBtEntriesRequested,
        uint32_t                    *pdwSshSize,
        uint32_t                    *pdwBtSize);

    //!
    //! \brief    Request SSH space for a command buffer.
    //! \details  Client facing function to request SSH space for a command buffer, if not enough
    //!           space is available, more will be requested.
    //! \param    uint32_t dwBtEntriesRequested
    //!           [in] Binding table entries requested in the SSH
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS RequestSshSpaceForCmdBuf(
        uint32_t                    dwBtEntriesRequested);

    //!
    //! \brief    Calculates the amount of space needed
    //! \details  Tells if there is enough space available in heap to load an array of blocks
    //            Returns how much is missing (needs to be freed, 0 if none)
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] State heap type (DSH/ISH)
    //! \param    PMHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS pParams
    //!           [in] Dynamic state heap parameters
    //! \return   uint32_t
    //!           Amount of space needed in bytes
    //!
    uint32_t CalculateSpaceNeededDyn(
        MHW_STATE_HEAP_TYPE                  StateHeapType,
        PMHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS pParams);

    //Virtual Interfaces

    //!
    //! \brief    Adds INTERFACE_DESCRIPTOR command(s) to the DSH
    //! \details  Client facing function to add INTERFACE_DESCRIPTOR(s) to the DSH
    //! \param    uint32_t dwNumIdsToSet
    //!           [in] The number of pParams
    //! \param    PMHW_INTERFACE_DESCRIPTOR_PARAMS pParams
    //!           [in] Parameters used to set the INTERFACE_DESCRIPTOR(s)
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetInterfaceDescriptor(
        uint32_t                            dwNumIdsToSet,
        PMHW_INTERFACE_DESCRIPTOR_PARAMS    pParams) = 0;

    //!
    //! \brief    Setup Media Interface Descriptor Entry in DSH
    //! \details  Setup Single Media Interface Descriptor Entry
    //! \param    PMHW_ID_ENTRY_PARAMS pParams
    //!           [in] Interface Descriptor Parameters
    //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
    //!           [in] Pointer to Command Buffer
    //! \return   MOS_STATUS
    //!
    virtual MOS_STATUS SetInterfaceDescriptorEntry(
        PMHW_ID_ENTRY_PARAMS                pParams) = 0;

    //!
    //! \brief    Adds media interface descriptor data to dynamic GSH
    //! \param    PMHW_ID_ENTRY_PARAMS pParams
    //!           [in] Interface descriptor parameters
    //! \return   MOS_STATUS
    //!
    virtual MOS_STATUS AddInterfaceDescriptorData(
        PMHW_ID_ENTRY_PARAMS                pParams) = 0;

    //!
    //! \brief    Adds a binding table to the SSH
    //! \details  Client facing function to add binding table to SSH
    //! \param    PMHW_KERNEL_STATE pKernelState
    //!           [in] Kernel state to construct the binding table for
    //! \param    void  *pvHwInterface
    //!           [in] Temporary input parameter until SSH setup occurs in MHW
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetBindingTable(
        PMHW_KERNEL_STATE                   pKernelState)= 0;

    //!
    //! \brief    Sets binding table entry in SSH
    //! \details  TO BE REMOVED! Client facing function to add binding table to SSH
    //! \param    PMHW_BINDING_TABLE_PARAMS pParams
    //!           [in] Surface binding parameters
    //!
    virtual MOS_STATUS SetBindingTableEntry(
        PMHW_BINDING_TABLE_PARAMS        pParams) = 0;

    //!
    //! \brief    Sends binding table entry to Command Buffer (indirect state)
    //! \details  TO BE REMOVED! Sends binding table entry to indirect state heap in Cmd buffer,
    //!           retrieving associated surface state offset and index
    //! \param    PMHW_BINDING_TABLE_PARAMS pParams
    //!           [in] Surface binding parameters - returns surface state pointer and index
    //!
    virtual MOS_STATUS SendBindingTableEntry(
        PMHW_BINDING_TABLE_SEND_PARAMS   pParams) = 0;

    //!
    //! \brief    set surface state entry 
    //! \details  TO BE REMOVED! set surface state entry
    //! \param    PMHW_BINDING_TABLE_PARAMS pParams
    //!           [in] Surface state parameters
    //!
    virtual MOS_STATUS SetSurfaceStateEntry(
        PMHW_SURFACE_STATE_PARAMS   pParams) = 0;

    //!
    //! \brief    Set surface state in ssh
    //! \details  Set sampler state in ssh
    //! \param    PMOS_COMMAND_BUFFER pCmdBuffer
    //!           [in] command buffer pointer
    //! \param    uint32_t dwNumSurfaceStatesToSet
    //!           [in] number of surface states need to set
    //! \param    PMHW_RCS_SURFACE_PARAMS pParams
    //!           [in] render surface state parameters
    //!
    virtual MOS_STATUS SetSurfaceState(
        PMHW_KERNEL_STATE           pKernelState,
        PMOS_COMMAND_BUFFER         pCmdBuffer,
        uint32_t                    dwNumSurfaceStatesToSet,
        PMHW_RCS_SURFACE_PARAMS     pParams) = 0;

    //!
    //! \brief    Set sampler state
    //! \details  Set sampler state
    //! \param    PMHW_SAMPLER_STATE_PARAM pParams
    //!           [in] Sampler state parameters
    //!
    virtual MOS_STATUS SetSamplerState(
        void                        *pSampler,
        PMHW_SAMPLER_STATE_PARAM    pParam) = 0;

    //!
    //! \brief    Adds sampler state data to dynamic GSH
    //! \param    uint32_t samplerOffset
    //!           [in] sampler offset
    //! \param    MemoryBlock memoryBlock
    //!           [in,out] Pointer to memory block
    //! \param    PMHW_SAMPLER_STATE_PARAM pParam
    //!           [in] sampler state parameters
    //! \return   MOS_STATUS
    //!
    virtual MOS_STATUS AddSamplerStateData(
        uint32_t                    samplerOffset,
        MemoryBlock                 *memoryBlock,
        PMHW_SAMPLER_STATE_PARAM    pParam) = 0;

    //!
    //! \brief    Initialize sampler states
    //! \details  Initialize sampler states
    //! \param    void  *pSamplerStates
    //!           [in] Pointer to sampler states to reset
    //! \param    int32_t iSamplers
    //!           [in] Number of sampler entries to reset
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitSamplerStates(
        void                        *pSamplerStates,
        int32_t                     iSamplers) = 0;

    //!
    //! \brief    Init HwSizes
    //! \details  Init HwSizes 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success else fail reason
    //!
    virtual MOS_STATUS InitHwSizes() = 0;

    //!
    //! \brief    Releases the dynamic state heap
    //! \details  Releases the dynamic state heap. If all blocks
    //!           are completed, free the resource. If there are some blocks still in
    //!           the submitted state, then mark blocks for deletion. This function will be
    //!           called again to free the resource when the last block is released. 
    //! \param    PMHW_STATE_HEAP pStateHeap
    //!           [in] Pointer to the state heap to be released
    //! \return   MOS_STATUS
    //!           SUCCESS    if state heap was either marked for deletion or actually freed
    //!
    MOS_STATUS ReleaseStateHeapDyn(PMHW_STATE_HEAP pStateHeap);

    //!
    //! \brief    Allocates a dynamic block
    //! \details  Allocates either a single dynamic block or multiple blocks in ISH/DSH
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] State heap type (DSH/ISH)
    //! \param    PMHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS pParams
    //!           [in] Dynamic state heap parameters
    //! \return   PMHW_STATE_HEAP_MEMORY_BLOCK
    //!           Pointer to the allocated memory block(s)
    //!
    PMHW_STATE_HEAP_MEMORY_BLOCK AllocateDynamicBlockDyn(
        MHW_STATE_HEAP_TYPE                  StateHeapType,
        PMHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS pParams);

    //!
    //! \brief    Submits a dynamic block
    //! \details  Submits a dynamic block. Detaches the block from current list and adds to to
    //!           submitted list. Updates block with provided sync tag.
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] State heap type (DSH/ISH)
    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK pBlock
    //!           [in] Pointer to memory block to be submitted
    //! \param    uint32_t dwSyncTag
    //!           [in] Sync Tag
    //! \return   MOS_STATUS
    //!           SUCCESS    if submission was successful
    //!
    MOS_STATUS SubmitDynamicBlockDyn(
            MHW_STATE_HEAP_TYPE                  StateHeapType,
            PMHW_STATE_HEAP_MEMORY_BLOCK         pBlock,
            const FrameTrackerTokenFlat          *trackerToken);

    //!
    //! \brief    Frees a dynamic block
    //! \details  Detaches the block from current list if block has completed (based on provided dwSyncTag)
    //!           and adds it to deleted list. Otherwise, marks for deletion upon completion.
    //!           submitted list. Updates block with provided sync tag.
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] State heap type (DSH/ISH)
    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK pBlock
    //!           [in] Pointer to memory block to be freed
    //! \return   MOS_STATUS
    //!           SUCCESS    if operation was successful
    //!
    MOS_STATUS FreeDynamicBlockDyn(
            MHW_STATE_HEAP_TYPE                  StateHeapType,
            PMHW_STATE_HEAP_MEMORY_BLOCK         pBlock);

    //!
    //! \brief    Refresh the dynamic heap
    //! \details  Updates block states based on last executed tag
    //!           submitted unlocked blocks are released;
    //!           move to allocated
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] State heap type (DSH/ISH)
    //! \param    uint32_t dwSyncTag
    //!           [in] Sync Tag
    //! \return   MOS_STATUS
    //!           SUCCESS    if operation was successful
    //!
    MOS_STATUS RefreshDynamicHeapDyn (
        MHW_STATE_HEAP_TYPE         StateHeapType);

private:

    //!
    //! \brief    Insert a node into a memory block linked list
    //! \details  MHW private function which maintains the memory block linked list
    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK pStartNode
    //!           [in] The memory block from which to start the insertion
    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK pNodeToAdd
    //!           [in] The memory block  to insert
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success else fail reason
    //!
    MOS_STATUS InsertLinkedList(
        PMHW_STATE_HEAP_MEMORY_BLOCK    pStartNode,
        PMHW_STATE_HEAP_MEMORY_BLOCK    pNodeToAdd);

    //!
    //! \brief    Allocate and initialize a memory block based on input parameters
    //! \details  MHW private function which creates memory blocks
    //! \param    PMHW_STATE_HEAP pStateHeap
    //!           [in] The state heap which the memory block belongs to
    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK ppMemoryBlock
    //!           [in/out] The node to insert.
    //! \param    uint32_t dwRequestedSize
    //!           [in] The size of the memory that the memory block references.
    //! \param    bool bStatic
    //!           [in] If the memory block is static
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success else fail reason
    //!
    MOS_STATUS InitMemoryBlock(
        PMHW_STATE_HEAP                 pStateHeap,
        PMHW_STATE_HEAP_MEMORY_BLOCK    *ppMemoryBlock,
        uint32_t                        dwRequestedSize,
        bool                            bStatic);

    //!
    //! \brief    Inserts a new memory block into an existing available memory block
    //! \details  MHW private function to insert new memory blocks into available memory blocks
    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK pMemoryBlockFree
    //!           [in] Available memory block
    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK pMemoryBlockToAdd
    //!           [in] New memory block to be inserted
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success else fail reason
    //!
    MOS_STATUS InsertMemoryBlock(
        PMHW_STATE_HEAP_MEMORY_BLOCK    pMemoryBlockFree,
        PMHW_STATE_HEAP_MEMORY_BLOCK    pMemoryBlockToAdd);

    //!
    //! \brief    Returns the space of the memory block to the state heap
    //! \details  MHW private function to return the memory block space to the state heap
    //!           by marking it as available and merging it with adjacent memory blocks

    //! \param    PMHW_STATE_HEAP_MEMORY_BLOCK pMemoryBlock
    //!           [in] Memory block to return to the state heap
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success else fail reason
    //!
    MOS_STATUS ReturnSpaceMemoryBlock(
        PMHW_STATE_HEAP_MEMORY_BLOCK    pMemoryBlock);

    //Interfaces different cross static and dynmaic mode

    //!
    //! \brief    Extends the dynamic state heap
    //! \details  Allocates a dynamic state heap (ISH/DSH) with requested size
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] State heap type (i.e. ISH/DSH)
    //! \param    uint32_t dwSizeRequested
    //!           [in] Size of requested state heap
    //! \return   MOS_STATUS
    //!           SUCCESS    if state heap was successfully allocated
    //!
    MOS_STATUS ExtendStateHeapDyn(
        MHW_STATE_HEAP_TYPE         StateHeapType,
        uint32_t                    dwSizeRequested);

    //!
    //! \brief    Extends the dynamic state heap
    //! \details  Allocates a dynamic state heap (ISH/DSH) with requested size
    //! \param    MHW_STATE_HEAP_TYPE StateHeapType
    //!           [in] State heap type (i.e. ISH/DSH)
    //! \param    uint32_t dwSizeRequested
    //!           [in] Size of requested state heap
    //! \return   MOS_STATUS
    //!           SUCCESS    if state heap was successfully allocated
    //!
    MOS_STATUS ExtendStateHeapSta(
        MHW_STATE_HEAP_TYPE         StateHeapType,
        uint32_t                    dwSizeRequested);

};

struct _MHW_STATE_HEAP_INTERFACE
{

    XMHW_STATE_HEAP_INTERFACE               *pStateHeapInterface;

    //!
    //! \brief Internal to MHW
    //!

    MOS_STATUS (*pfnCreate) (
        PMHW_STATE_HEAP_INTERFACE   *ppStateHeapInterface,
        MHW_STATE_HEAP_SETTINGS     StateHeapSettings);

    MOS_STATUS (*pfnDestroy) (
        PMHW_STATE_HEAP_INTERFACE   pCommonStateHeapInterface);

    //!
    //! \brief Primarily a state heap interface private function to be
    //!        called as a pair in any state heap interface function which
    //!        accesses the graphics resource like AddDataToStateHeap.
    //!
    MOS_STATUS (*pfnLockStateHeap) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        PMHW_STATE_HEAP                    pStateHeap);

    MOS_STATUS (*pfnUnlockStateHeap) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        PMHW_STATE_HEAP                    pStateHeap);

    //!
    //! \brief Client facing functions
    //!
    MOS_STATUS (*pfnAssignSpaceInStateHeap) (
        PMHW_STATE_HEAP_INTERFACE   pCommonStateHeapInterface,
        MHW_STATE_HEAP_TYPE         StateHeapType,
        PMHW_KERNEL_STATE           pKernelState,
        uint32_t                    dwSpaceRequested,
        bool                        bStatic,
        bool                        bZeroAssignedMem);

    MOS_STATUS(*pfnSubmitBlocks) (
        PMHW_STATE_HEAP_INTERFACE   pCommonStateHeapInterface,
        PMHW_KERNEL_STATE           pKernelState);

    MOS_STATUS (*pfnExtendStateHeap) (
        PMHW_STATE_HEAP_INTERFACE   pCommonStateHeapInterface,
        MHW_STATE_HEAP_TYPE         StateHeapType,
        uint32_t                    dwSizeRequested);

    MOS_STATUS (*pfnSetInterfaceDescriptor) (
        PMHW_STATE_HEAP_INTERFACE           pCommonStateHeapInterface,
        uint32_t                            dwNumIdsToSet,
        PMHW_INTERFACE_DESCRIPTOR_PARAMS    pParams);

    MOS_STATUS (*pfnSetInterfaceDescriptorEntry) (
        PMHW_STATE_HEAP_INTERFACE           pCommonStateHeapInterface,
        PMHW_ID_ENTRY_PARAMS                pParams);

    MOS_STATUS(*pfnSetBindingTable) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        PMHW_KERNEL_STATE                  pKernelState);

    MOS_STATUS (*pfnSetSurfaceState) (
        PMHW_STATE_HEAP_INTERFACE           pCommonStateHeapInterface,
        PMHW_KERNEL_STATE                   pKernelState,
        PMOS_COMMAND_BUFFER                 pCmdBuffer,
        uint32_t                            dwNumSurfaceStatesToSet,
        PMHW_RCS_SURFACE_PARAMS             pParams);

    MOS_STATUS (*pfnSetSurfaceStateBuffer) (
        PMHW_STATE_HEAP_INTERFACE           pCommonStateHeapInterface,
        PMHW_RCS_SURFACE_PARAMS             pParams,
        void                                *pSurfaceState);

    MOS_STATUS (*pfnSetBindingTableEntry) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        PMHW_BINDING_TABLE_PARAMS          pParams);

    MOS_STATUS (*pfnSendBindingTableEntry) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        PMHW_BINDING_TABLE_SEND_PARAMS     pParams);

    MOS_STATUS (* pfnSetSurfaceStateToken) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        PMHW_SURFACE_TOKEN_PARAMS          pParams,
        void                               *pSurfaceStateToken);

    MOS_STATUS (*pfnSetSurfaceStateEntry) (
        PMHW_STATE_HEAP_INTERFACE           pCommonStateHeapInterface,
        PMHW_SURFACE_STATE_PARAMS           pParams);

    MOS_STATUS (*pfnSendSurfaceStateEntry) (
        PMHW_STATE_HEAP_INTERFACE           pCommonStateHeapInterface,
        PMOS_COMMAND_BUFFER                 pCmdBuffer,
        PMHW_SURFACE_STATE_SEND_PARAMS      pParams);

    //!
    //! \brief May only operate on the primary state heap.
    //!
    MOS_STATUS (*pfnCompactStateHeap) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        MHW_STATE_HEAP_TYPE                StateHeapType);

    //!
    //! \brief Must be called by the client directly to provide
    //!        pointer for command buffer status for tracking purposes.
    //!
    MOS_STATUS(*pfnSetCmdBufStatusPtr) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        void                               *pvCmdBufStatus);

    //!
    //! \brief Must be called by the client directly after a command
    //!        buffer containing a kernel workload is submitted.
    //!
    MOS_STATUS(*pfnUpdateGlobalCmdBufId) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface);

    //!
    //! \brief Must be called by the client before the client gets a
    //!        command buffer for a kernel workload from MOS. This function
    //!        will resize the SSH the current size is < dwBtEntriesRequested,
    //!        otherwise it does nothing. In the future when SSHes are 
    //!        managed entirely in UMD this function may be deprecated and 
    //!        the SSH may be treated like the
    //!        other state heaps.
    //!
    MOS_STATUS (*pfnRequestSshSpaceForCmdBuf) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        uint32_t                           dwBtEntriesRequested);

    MOS_STATUS (*pfnCalculateSshAndBtSizesRequested) (
        PMHW_STATE_HEAP_INTERFACE   pCommonStateHeapInterface,
        uint32_t                    dwBtEntriesRequested,
        uint32_t                    *pdwSshSize,
        uint32_t                    *pdwBtSize);

    MOS_STATUS(* pfnInitSamplerStates) (
        PMHW_STATE_HEAP_INTERFACE   pCommonStateHeapInterface,
        void                        *pSampler,
        int32_t                     iSamplers);

    MOS_STATUS (* pfnSetSamplerState) (
        PMHW_STATE_HEAP_INTERFACE          pCommonStateHeapInterface,
        void                               *pSampler,
        PMHW_SAMPLER_STATE_PARAM           pParams);

    //Interfaces in dynamic mode
    uint32_t (*pfnCalculateDynamicSpaceNeeded) (
        PMHW_STATE_HEAP_INTERFACE            pStateHeapInterface,
        MHW_STATE_HEAP_TYPE                  StateHeapType,
        PMHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS pParams);

    PMHW_STATE_HEAP_MEMORY_BLOCK (*pfnAllocateDynamicBlock) (
        PMHW_STATE_HEAP_INTERFACE            pStateHeapInterface,
        MHW_STATE_HEAP_TYPE                  StateHeapType,
        PMHW_STATE_HEAP_DYNAMIC_ALLOC_PARAMS pParams);

    MOS_STATUS (*pfnSubmitDynamicBlock) (
        PMHW_STATE_HEAP_INTERFACE            pStateHeapInterface,
        MHW_STATE_HEAP_TYPE                  StateHeapType,
        PMHW_STATE_HEAP_MEMORY_BLOCK         pBlock,
        FrameTrackerTokenFlat                *trackerToken);

    MOS_STATUS (*pfnFreeDynamicBlock) (
        PMHW_STATE_HEAP_INTERFACE            pStateHeapInterface,
        MHW_STATE_HEAP_TYPE                  StateHeapType,
        PMHW_STATE_HEAP_MEMORY_BLOCK         pBlock);

    MOS_STATUS (*pfnRefreshDynamicHeap) (
        PMHW_STATE_HEAP_INTERFACE            pStateHeapInterface,
        MHW_STATE_HEAP_TYPE                  StateHeapType);

    MOS_STATUS (*pfnReleaseStateHeap) (
        PMHW_STATE_HEAP_INTERFACE            pStateHeapInterface,
        PMHW_STATE_HEAP                      pStateHeap);

};

MOS_STATUS Mhw_StateHeapInterface_InitInterface(
    PMHW_STATE_HEAP_INTERFACE   *ppCommonStateHeapInterface,
    PMOS_INTERFACE               pOsInterface,
    uint8_t                      bDynamicMode
);

extern const uint8_t g_cMhw_VDirection[MHW_NUM_FRAME_FIELD_TYPES];

#endif // __MHW_STATE_HEAP_H__
