blob: 8555cf057d9a196650cedf05e9af4ac7dffc0b72 [file] [log] [blame]
/*
* Copyright (c) 2009-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 mos_os_specific.h
//! \brief Common interface and structure used in MOS LINUX OS
//!
#ifndef __MOS_OS_SPECIFIC_H__
#define __MOS_OS_SPECIFIC_H__
#include "media_skuwa_specific.h"
#include "GmmLib.h"
#include "mos_resource_defs.h"
#include "mos_defs.h"
#include "mos_os_cp_interface_specific.h"
#ifdef ANDROID
#include <utils/Log.h>
#endif
#include "i915_drm.h"
#include "mos_bufmgr.h"
#if !defined(USE_MAGMA)
#include "xf86drm.h"
#endif
#include <vector>
typedef unsigned int MOS_OS_FORMAT;
class GraphicsResource;
class GraphicsResourceNext;
class AuxTableMgr;
class MosOcaInterface;
class GraphicsResourceNext;
////////////////////////////////////////////////////////////////////
typedef void* HINSTANCE;
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \
((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 ))
#define GMM_LIBVA_LINUX 3
enum DdiSurfaceFormat
{
DDI_FORMAT_UNKNOWN = 0,
DDI_FORMAT_A8B8G8R8 = 32,
DDI_FORMAT_X8B8G8R8 = 33,
DDI_FORMAT_A8R8G8B8 = 21,
DDI_FORMAT_X8R8G8B8 = 22,
DDI_FORMAT_R5G6B5 = 23,
DDI_FORMAT_YUY2 = MAKEFOURCC('Y', 'U', 'Y', '2'),
DDI_FORMAT_P8 = 41,
DDI_FORMAT_A8P8 = 40,
DDI_FORMAT_A8 = 28,
DDI_FORMAT_L8 = 50,
DDI_FORMAT_L16 = 81,
DDI_FORMAT_A4L4 = 52,
DDI_FORMAT_A8L8 = 51,
DDI_FORMAT_R32F = 114,
DDI_FORMAT_V8U8 = 60,
DDI_FORMAT_UYVY = MAKEFOURCC('U', 'Y', 'V', 'Y'),
DDI_FORMAT_NV12 = MAKEFOURCC('N', 'V', '1', '2'),
DDI_FORMAT_A16B16G16R16 = 36,
DDI_FORMAT_R32G32B32A32F = 115,
};
#define INDIRECT_HEAP_SIZE_UNITS (1024)
/* copy from intcver.h */
#ifndef BUILD_NUMBER
#define BUILD_NUMBER 9034
#endif
#define COMMAND_BUFFER_RESERVED_SPACE 0x80
#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
////////////////////////////////////////////////////////////////////
//!
//! \brief Definitions specific to Linux
//!
#define COMMAND_BUFFER_SIZE 32768
#define MAX_CMD_BUF_NUM 30
#define MOS_LOCKFLAG_WRITEONLY OSKM_LOCKFLAG_WRITEONLY
#define MOS_LOCKFLAG_READONLY OSKM_LOCKFLAG_READONLY
#define MOS_LOCKFLAG_NOOVERWRITE OSKM_LOCKFLAG_NOOVERWRITE
#define MOS_LOCKFLAG_NO_SWIZZLE OSKM_LOCKFLAG_NO_SWIZZLE
#define MOS_DIR_SEPERATOR '/'
#define MOS_INVALID_ALLOC_INDEX -1
#define MOS_MAX_REGS 128 //32
#ifdef ANDROID
#define MOS_STATUS_REPORT_DEFAULT 0
#else
#define MOS_STATUS_REPORT_DEFAULT 1
#endif
#define OSKM_LOCKFLAG_WRITEONLY 0x00000001
#define OSKM_LOCKFLAG_READONLY 0x00000002
#define OSKM_LOCKFLAG_NOOVERWRITE 0x00000004
#define OSKM_LOCKFLAG_NO_SWIZZLE 0x00000008
// should be defined in libdrm, this is a temporary solution to pass QuickBuild
#define I915_EXEC_VEBOX (4<<0)
#define I915_EXEC_VCS2 (7<<0)
// I915_EXEC_BSD_* -- Attempt to provide backwards and forwards
// compatibility with versions of include/drm/i915_drm.h that do not
// have these definitions or that have them with the same values but
// different textual representations. This will help avoid compiler
// warnings about macro redefinitions.
#if !defined I915_EXEC_BSD_MASK
#define I915_EXEC_BSD_MASK (3<<13)
#endif
#if !defined I915_EXEC_BSD_DEFAULT
#define I915_EXEC_BSD_DEFAULT (0<<13) /* default ping-pong mode */
#endif
#if !defined I915_EXEC_BSD_RING1
#define I915_EXEC_BSD_RING1 (1<<13)
#endif
#if !defined I915_EXEC_BSD_RING2
#define I915_EXEC_BSD_RING2 (2<<13)
#endif
#define I915_PARAM_HAS_BSD2 31
#define I915_EXEC_ENABLE_WATCHDOG_LINUX (1<<18)
//!
//! \brief Forward declarations
//!
typedef struct _MOS_SPECIFIC_RESOURCE MOS_RESOURCE, *PMOS_RESOURCE;
typedef struct _MOS_INTERFACE *PMOS_INTERFACE;
typedef struct _MOS_COMMAND_BUFFER *PMOS_COMMAND_BUFFER;
typedef struct _MOS_LOCK_PARAMS *PMOS_LOCK_PARAMS;
//!
//! \brief enum to video device operations
//!
typedef enum _MOS_MEDIA_OPERATION
{
MOS_MEDIA_OPERATION_NONE = 0,
MOS_MEDIA_OPERATION_DECODE,
MOS_MEDIA_OPERATION_ENCODE,
MOS_MEDIA_OPERATION_MAX
} MOS_MEDIA_OPERATION, *PMOS_MEDIA_OPERATION;
//!
//! \brief ENum to GPU nodes
//!
typedef enum _MOS_GPU_NODE
{
MOS_GPU_NODE_3D = I915_EXEC_RENDER,
MOS_GPU_NODE_COMPUTE = (5<<0), //To change to compute CS later when linux define the name
MOS_GPU_NODE_VE = I915_EXEC_VEBOX,
MOS_GPU_NODE_VIDEO = I915_EXEC_BSD,
MOS_GPU_NODE_VIDEO2 = I915_EXEC_VCS2,
MOS_GPU_NODE_BLT = I915_EXEC_BLT,
MOS_GPU_NODE_MAX = 7,//GFX_MAX(I915_EXEC_RENDER, I915_EXEC_VEBOX, I915_EXEC_BSD, I915_EXEC_VCS2, I915_EXEC_BLT) + 1
} MOS_GPU_NODE, *PMOS_GPU_NODE;
//!
//! \brief Inline function to get GPU node
//!
static inline MOS_GPU_NODE OSKMGetGpuNode(MOS_GPU_CONTEXT uiGpuContext)
{
switch (uiGpuContext)
{
case MOS_GPU_CONTEXT_RENDER:
case MOS_GPU_CONTEXT_RENDER2:
case MOS_GPU_CONTEXT_RENDER3:
case MOS_GPU_CONTEXT_RENDER4:
case MOS_GPU_CONTEXT_COMPUTE: //change this context mapping to Compute Node instead of 3D node after the node name is defined in linux.
return MOS_GPU_NODE_3D;
break;
case MOS_GPU_CONTEXT_VEBOX:
return MOS_GPU_NODE_VE;
break;
case MOS_GPU_CONTEXT_VIDEO:
case MOS_GPU_CONTEXT_VIDEO2:
case MOS_GPU_CONTEXT_VIDEO3:
case MOS_GPU_CONTEXT_VIDEO4:
case MOS_GPU_CONTEXT_VIDEO5:
case MOS_GPU_CONTEXT_VIDEO6:
case MOS_GPU_CONTEXT_VIDEO7:
return MOS_GPU_NODE_VIDEO;
break;
case MOS_GPU_CONTEXT_VDBOX2_VIDEO:
case MOS_GPU_CONTEXT_VDBOX2_VIDEO2:
case MOS_GPU_CONTEXT_VDBOX2_VIDEO3:
return MOS_GPU_NODE_VIDEO2;
break;
case MOS_GPU_CONTEXT_BLT:
return MOS_GPU_NODE_BLT;
break;
default:
return MOS_GPU_NODE_MAX ;
break;
}
}
//!
//! \brief enum to Intel bo map operations
//!
typedef enum _MOS_MMAP_OPERATION
{
MOS_MMAP_OPERATION_NONE = 0,
MOS_MMAP_OPERATION_MMAP,
MOS_MMAP_OPERATION_MMAP_GTT,
MOS_MMAP_OPERATION_MMAP_WC
} MOS_MMAP_OPERATION, *PMOS_MMAP_OPERATION;
//!
//! \brief Structure to Linux resource
//!
struct _MOS_SPECIFIC_RESOURCE
{
int32_t iWidth;
int32_t iHeight;
int32_t iSize;
int32_t iPitch;
int32_t iDepth; //!< for 3D surface
MOS_FORMAT Format;
int32_t iCount;
int32_t iAllocationIndex[MOS_GPU_CONTEXT_MAX];
uint32_t dwGfxAddress;
uint8_t *pData;
const char *bufname;
uint32_t isTiled;
MOS_TILE_TYPE TileType;
uint32_t bMapped;
MOS_LINUX_BO *bo;
uint32_t name;
GMM_RESOURCE_INFO *pGmmResInfo; //!< GMM resource descriptor
MOS_MMAP_OPERATION MmapOperation;
uint8_t *pSystemShadow;
MOS_PLANE_OFFSET YPlaneOffset; //!< Y surface plane offset
MOS_PLANE_OFFSET UPlaneOffset; //!< U surface plane offset
MOS_PLANE_OFFSET VPlaneOffset; //!< V surface plane offset
//!< to sync render target for multi-threading decoding mode
struct
{
int32_t bSemInitialized;
PMOS_SEMAPHORE *ppCurrentFrameSemaphore; //!< Semaphore queue for hybrid decoding multi-threading case
PMOS_SEMAPHORE *ppReferenceFrameSemaphore; //!< Semaphore queue for hybrid decoding multi-threading case; post when a surface is not used as reference frame
};
#if MOS_MEDIASOLO_SUPPORTED
//!< these fields are only used while MediaSolo is enabled(bSoloInUse of OS_Interface is true).
uint32_t dwOffset;
FILE* pFile;
char *pcFilePath;
int32_t bManualSwizzlingInUse;
// used for AubCapture mode
int32_t bAubGttUpdate;
int32_t bAubMemUpdate;
int32_t bInterestedRes;
int32_t bPermaLocked;
#endif // MOS_MEDIASOLO_SUPPORTED
// This is used by MDF when a wrapper/virtual MOS Resource is used to set surface state for a given VA, not necessary from start, in an actual MOS resource
uint64_t user_provided_va;
// for MODS Wrapper
GraphicsResource* pGfxResource;
GraphicsResourceNext* pGfxResourceNext;
bool bConvertedFromDDIResource;
uint32_t dwResourceOffset;
bool bExternalSurface; //!< indicate the surface not allocated by media
// Tile switch
MOS_TILE_MODE_GMM TileModeGMM;
bool bGMMTileEnabled;
};
//!
//! \brief Structure to MOS_SURFACE
//!
struct MOS_SURFACE
{
MOS_RESOURCE OsResource; //Surface Resource
uint32_t dwArraySlice; //!< [in]
uint32_t dwMipSlice; //!< [in]
MOS_S3D_CHANNEL S3dChannel; //!< [in]
MOS_GFXRES_TYPE Type; //!< [out] Basic resource geometry
int32_t bOverlay;
int32_t bFlipChain;
uint32_t dwWidth; //!< [out] Type == 2D || VOLUME, width in pixels.
uint32_t dwHeight; //!< [out] Type == 2D || VOLUME, height in rows. Type == BUFFER, n/a
uint32_t dwSize; //!< [out] Type == 2D || VOLUME, the size of surface
uint32_t dwDepth; //!< [out] 0: Implies 2D resource. >=1: volume resource
uint32_t dwArraySize; //!< [out] 0,1: 1 element. >1: N elements
uint32_t dwLockPitch; //!< [out] pitch in bytes used for locking
uint32_t dwPitch; //!< [out] < RenderPitch > pitch in bytes used for programming HW
uint32_t dwSlicePitch; //!< [out] Type == VOLUME, byte offset to next slice. Type != VOLUME, n/a
uint32_t dwQPitch; //!< [out] QPitch - distance in rows between R-Planes used for programming HW
MOS_TILE_TYPE TileType; //!< [out] Defines the layout of a physical page. Optimal choice depends on usage model.
MOS_FORMAT Format; //!< [out] Pixel format
int32_t bArraySpacing; //!< [out] Array spacing
int32_t bCompressible; //!< [out] Memory compression
uint32_t dwOffset; // Surface Offset (Y/Base)
MOS_PLANE_OFFSET YPlaneOffset; // Y surface plane offset
MOS_PLANE_OFFSET UPlaneOffset; // U surface plane offset
MOS_PLANE_OFFSET VPlaneOffset; // V surface plane
union
{
struct
{
MOS_RESOURCE_OFFSETS Y;
MOS_RESOURCE_OFFSETS U;
MOS_RESOURCE_OFFSETS V;
} YUV; //!< [out] Valid for YUV & planar RGB formats. Invalid for RGB formats.
MOS_RESOURCE_OFFSETS RGB; //!< [out] Valid non planar RGB formats. Invalid for YUV and planar RGB formats.
} RenderOffset; //!< [out] Offsets request by input parameters. Used to program HW.
union
{
struct
{
uint32_t Y;
uint32_t U;
uint32_t V;
} YUV; //!< [out] Valid for YUV & planar RGB formats. Invalid for RGB formats.
uint32_t RGB; //!< [out] Valid non planar RGB formats. Invalid for YUV and planar RGB formats.
} LockOffset; //!< [out] Offset in bytes used for locking
// Surface compression mode, enable flags
int32_t bIsCompressed; //!< [out] Memory compression flag
MOS_RESOURCE_MMC_MODE CompressionMode; //!< [out] Memory compression mode
uint32_t CompressionFormat; //!< [out] Memory compression format
// deprecated: not to use MmcState
MOS_MEMCOMP_STATE MmcState; // Memory compression state
// Tile Switch
MOS_TILE_MODE_GMM TileModeGMM; //!< [out] Transparent GMM Tiletype specifying in hwcmd finally
bool bGMMTileEnabled; //!< [out] GMM defined tile mode flag
uint32_t YoffsetForUplane; //!< [out] Y offset from U plane to Y plane.
uint32_t YoffsetForVplane; //!< [out] Y offset from V plane to Y plane.
};
typedef MOS_SURFACE *PMOS_SURFACE;
//!
//! \brief Structure to MOS_BUFFER
//!
struct MOS_BUFFER
{
MOS_RESOURCE OsResource; //!< Buffer resource
uint32_t size; //!< Buffer size
const char* name; //!< Buffer name
bool initOnAllocate; //!< Flag to indicate whether initialize when allocate
uint8_t initValue; //!< Initialize value when initOnAllocate is set
bool bPersistent; //!< Persistent flag
};
typedef MOS_BUFFER *PMOS_BUFFER;
//!
//! \brief Structure to patch location list
//!
typedef struct _PATCHLOCATIONLIST
{
uint32_t AllocationIndex;
uint32_t AllocationOffset;
uint32_t PatchOffset;
uint32_t cpCmdProps;
int32_t uiRelocFlag;
uint32_t uiWriteOperation;
MOS_LINUX_BO *cmdBo;
} PATCHLOCATIONLIST, *PPATCHLOCATIONLIST;
//#define PATCHLOCATIONLIST_SIZE 25
#define CODECHAL_MAX_REGS 256
#define PATCHLOCATIONLIST_SIZE CODECHAL_MAX_REGS
//!
//! \brief Structure to Allocation List
//!
typedef struct _ALLOCATION_LIST
{
HANDLE hAllocation;
uint32_t WriteOperation;
} ALLOCATION_LIST, *PALLOCATION_LIST;
//#define ALLOCATIONLIST_SIZE MOS_MAX_REGS
#define ALLOCATIONLIST_SIZE CODECHAL_MAX_REGS //!< use the large value
//!
//! \brief Structure to command buffer
//!
typedef struct _COMMAND_BUFFER
{
// Double linked list
struct _COMMAND_BUFFER *pNext;
struct _COMMAND_BUFFER *pPrev;
int64_t *pSyncTag;
int64_t qSyncTag;
// Status
int32_t bActive; //!< Active / Inactive flag
int32_t bRunning; //!< CB is running in Gfx Device
LARGE_INTEGER TimeStart; //!< Start timestamp
LARGE_INTEGER TimeEnd; //!< End timestamp
// Buffer information
uint8_t *pCmdBase; //!< Pointer to buffer data
uint8_t *pCmdCurrent; //!< Current pointer
int32_t iSize; //!< Buffer Size
int32_t iCurrent; //!< Current offset
int32_t iRemaining; //!< Remaining
} COMMAND_BUFFER, *PCOMMAND_BUFFER;
typedef struct _MOS_GPU_STATUS_DATA
{
uint32_t GPUTag;
uint32_t ReservedForGPUTag; //!< Reserved for gpu tag uint64_t write back by gpu but we only use the low uint32_t above.
uint32_t Reserved[6]; //!< Padding to 32 byte-aligned for future use.
} MOS_GPU_STATUS_DATA;
//!
//! \brief Structure to Gpu context
//!
typedef struct _CODECHAL_OS_GPU_CONTEXT
{
volatile int32_t bCBFlushed; //!< if CB not flushed, re-use
PMOS_COMMAND_BUFFER pCB;
uint32_t uiCommandBufferSize;
// Allcoation List
ALLOCATION_LIST *pAllocationList;
uint32_t uiNumAllocations;
uint32_t uiMaxPatchLocationsize;
// Patch List
PATCHLOCATIONLIST *pPatchLocationList;
uint32_t uiCurrentNumPatchLocations;
uint32_t uiMaxNumAllocations;
// OS command buffer
PCOMMAND_BUFFER pStartCB;
PCOMMAND_BUFFER pCurrentCB;
// Resource registrations
uint32_t uiResCount; //!< # of resources registered
int32_t iResIndex[CODECHAL_MAX_REGS]; //!< Resource indices
PMOS_RESOURCE pResources; //!< Pointer to resources list
int32_t *pbWriteMode; //!< Write mode
// GPU Status
uint32_t uiGPUStatusTag;
} MOS_OS_GPU_CONTEXT, *PMOS_OS_GPU_CONTEXT;
//!
//! \brief Structure to buffer pool
//!
typedef struct _CMD_BUFFER_BO_POOL
{
int32_t iFetch;
MOS_LINUX_BO *pCmd_bo[MAX_CMD_BUF_NUM];
}CMD_BUFFER_BO_POOL;
struct MOS_CONTEXT_OFFSET
{
MOS_LINUX_CONTEXT *intel_context;
MOS_LINUX_BO *target_bo;
uint64_t offset64;
};
// APO related
#define FUTURE_PLATFORM_MOS_APO 1234
bool SetupApoMosSwitch(int32_t fd);
enum OS_SPECIFIC_RESOURCE_TYPE
{
OS_SPECIFIC_RESOURCE_INVALID = 0,
OS_SPECIFIC_RESOURCE_SURFACE = 1,
OS_SPECIFIC_RESOURCE_BUFFER = 2,
OS_SPECIFIC_RESOURCE_MAX
};
class OsContextNext;
typedef OsContextNext OsDeviceContext;
typedef OsDeviceContext *MOS_DEVICE_HANDLE;
typedef struct _MOS_OS_CONTEXT MOS_CONTEXT, *PMOS_CONTEXT, MOS_OS_CONTEXT, *PMOS_OS_CONTEXT, MOS_DRIVER_CONTEXT,*PMOS_DRIVER_CONTEXT;
//!
//! \brief Structure to OS context
//!
struct _MOS_OS_CONTEXT
{
// Context must be freed by os emul layer
int32_t bFreeContext;
uint32_t uIndirectStateSize;
MOS_OS_GPU_CONTEXT OsGpuContext[MOS_GPU_CONTEXT_MAX];
// Buffer rendering
LARGE_INTEGER Frequency; //!< Frequency
LARGE_INTEGER LastCB; //!< End time for last CB
CMD_BUFFER_BO_POOL CmdBufferPool;
// Emulated platform, sku, wa tables
PLATFORM platform;
MEDIA_FEATURE_TABLE SkuTable;
MEDIA_WA_TABLE WaTable;
MEDIA_SYSTEM_INFO gtSystemInfo;
// Controlled OS resources (for analysis)
MOS_BUFMGR *bufmgr;
MOS_LINUX_CONTEXT *intel_context;
int32_t submit_fence;
uint32_t uEnablePerfTag; //!< 0: Do not pass PerfTag to KMD, perf data collection disabled;
//!< 1: Pass PerfTag to MVP driver, perf data collection enabled;
//!< 2: Pass PerfTag to DAPC driver, perf data collection enabled;
int32_t bDisableKmdWatchdog; //!< 0: Do not disable kmd watchdog, that is to say, pass I915_EXEC_ENABLE_WATCHDOG flag to KMD;
//!< 1: Disable kmd watchdog, that is to say, DO NOT pass I915_EXEC_ENABLE_WATCHDOG flag to KMD;
PERF_DATA *pPerfData; //!< Add Perf Data for KMD to capture perf tag
int32_t bHybridDecoderRunningFlag; //!< Flag to indicate if hybrid decoder is running
int iDeviceId;
int wRevision;
int32_t bIsAtomSOC;
int fd; //!< handle for /dev/dri/card0
int32_t bUse64BitRelocs;
bool bUseSwSwizzling;
bool bTileYFlag;
void **ppMediaMemDecompState; //!<Media memory decompression data structure
void **ppMediaCopyState; //!<Media memory copy data structure
// For modulized GPU context
void* m_gpuContextMgr;
void* m_cmdBufMgr;
MOS_DEVICE_HANDLE m_osDeviceContext = nullptr;
//For 2VD box
int32_t bKMDHasVCS2;
bool bPerCmdBufferBalancing;
int32_t semid;
int32_t shmid;
void *pShm;
uint32_t *pTranscryptedKernels; //!< The cached version for current set of transcrypted and authenticated kernels
uint32_t uiTranscryptedKernelsSize; //!< Size in bytes of the cached version of transcrypted and authenticated kernels
void *pLibdrmHandle;
GMM_CLIENT_CONTEXT *pGmmClientContext; //UMD specific ClientContext object in GMM
GmmExportEntries GmmFuncs;
AuxTableMgr *m_auxTableMgr;
// GPU Status Buffer
PMOS_RESOURCE pGPUStatusBuffer;
std::vector< struct MOS_CONTEXT_OFFSET> contextOffsetList;
bool bSimIsActive; //!< To indicate if simulation environment
bool m_apoMosEnabled; //!< apo mos or not
// Media memory decompression function
void (* pfnMemoryDecompress)(
PMOS_CONTEXT pOsContext,
PMOS_RESOURCE pOsResource);
//!
//! \brief the function ptr for surface copy function
//!
void (* pfnMediaMemoryCopy )(
PMOS_CONTEXT pOsContext,
PMOS_RESOURCE pInputResource,
PMOS_RESOURCE pOutputResource,
bool bOutputCompressed);
//!
//! \brief the function ptr for Media Memory 2D copy function
//!
void (* pfnMediaMemoryCopy2D)(
PMOS_CONTEXT pOsContext,
PMOS_RESOURCE pInputResource,
PMOS_RESOURCE pOutputResource,
uint32_t copyWidth,
uint32_t copyHeight,
uint32_t copyInputOffset,
uint32_t copyOutputOffset,
uint32_t bpp,
bool bOutputCompressed);
//!
//! \brief the function ptr for Media copy function
//!
// Os Context interface functions
void (* pfnDestroy)(
struct _MOS_OS_CONTEXT *pOsContext,
int32_t MODSEnabled,
int32_t MODSForGpuContext);
int32_t (* pfnRefresh)(
struct _MOS_OS_CONTEXT *pOsContext);
int32_t (* pfnGetCommandBuffer)(
struct _MOS_OS_CONTEXT *pOsContext,
PMOS_COMMAND_BUFFER pCmdBuffer,
int32_t iSize);
void (* pfnReturnCommandBuffer)(
struct _MOS_OS_CONTEXT *pOsContext,
MOS_GPU_CONTEXT GpuContext,
PMOS_COMMAND_BUFFER pCmdBuffer);
int32_t (* pfnFlushCommandBuffer)(
struct _MOS_OS_CONTEXT *pOsContext,
MOS_GPU_CONTEXT GpuContext);
MOS_STATUS (* pfnInsertCmdBufferToPool)(
struct _MOS_OS_CONTEXT *pOsContext,
PMOS_COMMAND_BUFFER pCmdBuffer);
MOS_STATUS (* pfnWaitAndReleaseCmdBuffer)(
struct _MOS_OS_CONTEXT *pOsContext,
int32_t index);
uint32_t (* GetDmaBufID ) (
struct _MOS_OS_CONTEXT *pOsContext);
void (* SetDmaBufID ) (
struct _MOS_OS_CONTEXT *pOsContext,
uint32_t dwDmaBufID);
void (* SetPerfHybridKernelID ) (
struct _MOS_OS_CONTEXT *pOsContext,
uint32_t KernelID);
uint32_t (* pfnGetGpuCtxBufferTag)(
PMOS_CONTEXT pOsContext,
MOS_GPU_CONTEXT GpuContext);
void (* pfnIncGpuCtxBufferTag)(
PMOS_CONTEXT pOsContext,
MOS_GPU_CONTEXT GpuContext);
uint32_t (* GetGPUTag)(
PMOS_INTERFACE pOsInterface,
MOS_GPU_CONTEXT GpuContext);
GMM_CLIENT_CONTEXT* (* GetGmmClientContext)(
PMOS_CONTEXT pOsContext);
MosOcaInterface* (*GetOcaInterface)();
};
//!
//! \brief Structure to VDBOX Workload Type
//!
typedef struct _VDBOX_WORKLOAD
{
uint32_t uiVDBoxCount[2]; // VDBox workloads
uint32_t uiRingIndex; // ping-pong when vdbox1 count equals vdbox2 count
}VDBOX_WORKLOAD, *PVDBOX_WORKLOAD;
//!
//! \brief Structure to Android Resource Type
//!
//!
//! \brief Structure to Android Resource structure
//!
typedef struct _MOS_OS_ALLOCATION
{
PMOS_RESOURCE pOsResource; //!< Resource Info
int32_t bWriteMode; //!< Read/Write Mode
} MOS_OS_ALLOCATION, *PMOS_OS_ALLOCATION;
//!
//! \brief Structure to Buffer structure
//!
typedef struct _MOS_SPECIFIC_BUFFER
{
uint32_t dwHandle; //!< Buffer Handle
int32_t iAllocationIndex; //!< Allocation Index
} MOS_SPECIFIC_BUFFER_ANDROID, *PMOS_SPECIFIC_BUFFER;
#ifdef __cplusplus
extern "C" {
#endif
//!
//! \brief Check if OS resource is nullptr
//! \details Check if OS resource is nullptr
//! \param PMOS_RESOURCE pOsResource
//! [in] Pointer to OS Resource
//! \return int32_t
//! Return true if nullptr, otherwise false
//!
int32_t Mos_ResourceIsNull(
PMOS_RESOURCE pOsResource);
//!
//! \brief Get Buffer Type
//! \details Returns the type of buffer, 1D, 2D or volume
//! \param PMOS_RESOURCE pOsResource
//! [in] Pointer to OS Resource
//! \return GFX resource Type
//!
MOS_GFXRES_TYPE GetResType(
PMOS_RESOURCE pOsResource);
//!
//! \brief OS reset resource
//! \details Resets the OS resource
//! \param PMOS_RESOURCE pOsResource
//! [in] Pointer to OS Resource
//! \return void
//! Return NONE
//!
void Mos_ResetResource(
PMOS_RESOURCE pOsResource);
//!
//! \brief Convert to MOS tile type
//! \details Convert from Linux to MOS tile type
//! \param uint32_t type
//! [in] tile type
//! \return MOS_TILE_TYPE
//! Return MOS tile type
//!
MOS_TILE_TYPE LinuxToMosTileType(
uint32_t type);
//!
//! \brief Linux OS initilization
//! \details Linux OS initilization
//! \param PMOS_INTERFACE pOsInterface
//! [in] Pointer to OS Interface
//! \param PMOS_CONTEXT pOsDriverContext
//! [in] Pointer to OS Driver context
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS Mos_Specific_InitInterface(
PMOS_INTERFACE pOsInterface,
PMOS_CONTEXT pOsDriverContext);
//!
//! \brief Lock resource
//! \details Lock allocated resource
//! \param PMOS_INTERFACE pOsInterface
//! [in] Pointer to OS interface structure
//! \param PMOS_RESOURCE pOsResource
//! [in] Pointer to input OS resource
//! \param PMOS_LOCK_PARAMS pLockFlags
//! [in] Lock Flags - MOS_LOCKFLAG_* flags
//! \return void *
//!
void *Mos_Specific_LockResource(
PMOS_INTERFACE pOsInterface,
PMOS_RESOURCE pOsResource,
PMOS_LOCK_PARAMS pLockFlags);
//!
//! \brief Destroys OS specific allocations
//! \details Destroys OS specific allocations including destroying OS context
//! \param PMOS_INTERFACE pOsInterface
//! [in] Pointer to OS Interface
//! \param int32_t bDestroyVscVppDeviceTag
//! [in] Destroy VscVppDeviceTagId Flag, no use in Linux
//! \return void
//!
void Mos_Specific_Destroy(
PMOS_INTERFACE pOsInterface,
int32_t bDestroyVscVppDeviceTag);
//!
//! \brief Resets OS States
//! \details Resets OS States for linux
//! \param PMOS_INTERFACE pOsInterface
//! [in] Pointer to OS Interface
//! \return void
//!
void Mos_Specific_ResetOsStates(
PMOS_INTERFACE pOsInterface);
//!
//! \brief Resizes the buffer to be used for rendering GPU commands
//! \details Resizes the buffer to be used for rendering GPU commands
//! \param PMOS_INTERFACE pOsInterface
//! [in] OS Interface
//! \param uint32_t dwRequestedCommandBufferSize
//! [in] Requested command buffer size
//! \param uint32_t dwRequestedPatchListSize
//! [in] Requested patch list size
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if succeeded, otherwise error code
//!
MOS_STATUS Mos_Specific_ResizeCommandBufferAndPatchList(
PMOS_INTERFACE pOsInterface,
uint32_t dwRequestedCommandBufferSize,
uint32_t dwRequestedPatchListSize,
uint32_t dwFlags);
//!
//! \brief Unlock resource
//! \details Unlock the locked resource
//! \param PMOS_INTERFACE pOsInterface
//! [in] Pointer to OS interface structure
//! \param PMOS_RESOURCE pOsResource
//! [in] Pointer to input OS resource
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS Mos_Specific_UnlockResource(
PMOS_INTERFACE pOsInterface,
PMOS_RESOURCE pOsResource);
//!
//! \brief Get Resource Information
//! \details Linux get resource info
//! \param PMOS_INTERFACE pOsInterface
//! [in] Pointer to OS interface structure
//! \param PMOS_RESOURCE pOsResource
//! [in] Pointer to input OS resource
//! \param PMOS_SURFACE pResDetails
//! [out] Pointer to output resource information details
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS Mos_Specific_GetResourceInfo(
PMOS_INTERFACE pOsInterface,
PMOS_RESOURCE pOsResource,
PMOS_SURFACE pResDetails);
//!
//! \brief Get resource index
//! \details Get resource index of MOS_RESOURCE
//! \param PMOS_RESOURCE osResource
//! [in] Pointer to OS resource
//! \return uint32_t
//! Resource index
//!
uint32_t Mos_Specific_GetResourceIndex(
PMOS_RESOURCE osResource);
uint32_t Mos_Specific_GetResourcePitch(
PMOS_RESOURCE pOsResource);
void Mos_Specific_SetResourceWidth(
PMOS_RESOURCE pOsResource,
uint32_t dwWidth);
void Mos_Specific_SetResourceFormat(
PMOS_RESOURCE pOsResource,
MOS_FORMAT mosFormat);
//!
//! \brief Get SetMarker enabled flag
//! \details Get SetMarker enabled flag from OsInterface
//! \param PMOS_INTERFACE pOsInterface
//! [in] OS Interface
//! \return bool
//! SetMarker enabled flag
//!
bool Mos_Specific_IsSetMarkerEnabled(
PMOS_INTERFACE pOsInterface);
//!
//! \brief Get SetMarker resource address
//! \details Get SetMarker resource address from OsInterface
//! \param PMOS_INTERFACE pOsInterface
//! [in] OS Interface
//! \return PMOS_RESOURCE
//! SetMarker resource address
//!
PMOS_RESOURCE Mos_Specific_GetMarkerResource(
PMOS_INTERFACE pOsInterface);
//!
//! \brief Get TimeStamp frequency base
//! \details Get TimeStamp frequency base from OsInterface
//! \param PMOS_INTERFACE pOsInterface
//! [in] OS Interface
//! \return uint32_t
//! time stamp frequency base
//!
uint32_t Mos_Specific_GetTsFrequency(
PMOS_INTERFACE pOsInterface);
//!
//! \brief Checks whether the requested resource is releasable
//! \param PMOS_INTERFACE pOsInterface
//! [in] OS Interface
//! \param PMOS_RESOURCE pOsResource
//! [in] Pointer to OS Resource
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if requested can be released, otherwise MOS_STATUS_UNKNOWN
//!
MOS_STATUS Mos_Specific_IsResourceReleasable(
PMOS_INTERFACE pOsInterface,
PMOS_RESOURCE pOsResource);
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_LINUX_BO * Mos_GetNopCommandBuffer_Linux(
PMOS_INTERFACE pOsInterface);
MOS_LINUX_BO * Mos_GetBadCommandBuffer_Linux(
PMOS_INTERFACE pOsInterface);
#endif
#ifdef __cplusplus
}
#endif
#endif // __MOS_OS_SPECIFIC_H__