blob: 64cf5b43a470b132a0496e425d4d0f59c5c87c8f [file] [log] [blame]
/*===================== begin_copyright_notice ==================================
/*
* Copyright (c) 2019, 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 cm_device_rt_base.h
//! \brief Contains CmDeviceRTBase declarations.
//!
#ifndef MEDIADRIVER_COMMON_CM_CMDEVICERT_BASE_H_
#define MEDIADRIVER_COMMON_CM_CMDEVICERT_BASE_H_
#include "cm_device.h"
#include "cm_array.h"
#include "cm_csync.h"
#include "cm_hal.h"
#include "cm_log.h"
#include "cm_program.h"
#include "cm_notifier.h"
#if USE_EXTENSION_CODE
#include "cm_gtpin.h"
#endif
namespace CMRT_UMD
{
class CmSurfaceManager;
class CmQueue;
class CmQueueRT;
class CmKernel;
class CmThreadSpace;
class CmThreadGroupSpace;
class CmVebox;
class CmSampler;
class CmEvent;
class CmTask;
class CmQueueBase;
class CmProgram;
class CmBuffer;
class CmBufferUP;
class CmBufferSVM;
class CmBufferStateless;
class CmSurface2D;
class CmSurface2DUP;
class CmSurface2DUPRT;
class CmSurface3D;
class CmSampler8x8;
class CmSampler8x8State_RT;
//! \brief CmDevice memory object count
struct CM_OBJECT_COUNT
{
int32_t kernelCount;
int32_t programCount;
int32_t taskCount;
int32_t threadSpaceCount;
int32_t threadGroupSpaceCount;
int32_t veboxCount;
int32_t eventCount;
};
//! \brief Class CmDeviceRTBase definitions
class CmDeviceRTBase: public CmDevice
{
public:
CM_RT_API int32_t CreateBuffer(uint32_t size,
CmBuffer* & pSurface);
CM_RT_API int32_t CreateBuffer(PMOS_RESOURCE pMosResource,
CmBuffer* & pSurface);
CM_RT_API virtual int32_t CreateSurface2D(uint32_t width,
uint32_t height,
CM_SURFACE_FORMAT format,
CmSurface2D* & pSurface) = 0;
CM_RT_API virtual int32_t CreateSurface2D(PMOS_RESOURCE pMosResource,
CmSurface2D* & pSurface) = 0;
CM_RT_API int32_t CreateSurface3D(uint32_t width,
uint32_t height,
uint32_t depth,
CM_SURFACE_FORMAT format,
CmSurface3D* & pSurface);
CM_RT_API int32_t DestroySurface(CmBuffer* & pSurface);
CM_RT_API int32_t DestroySurface(CmSurface2D* & pSurface);
CM_RT_API int32_t DestroySurface(CmSurface3D* & pSurface);
CM_RT_API int32_t CreateQueue(CmQueue* & pQueue);
CM_RT_API int32_t LoadProgram(void* pCommonISACode,
const uint32_t size,
CmProgram*& pProgram,
const char* options = nullptr);
CM_RT_API int32_t CreateKernel(CmProgram* pProgram,
const char* kernelName,
CmKernel* & pKernel,
const char* options = nullptr);
CM_RT_API virtual int32_t CreateKernel(CmProgram* pProgram,
const char* kernelName,
const void * fncPnt,
CmKernel* & pKernel,
const char* options = nullptr)
{ return CM_NOT_IMPLEMENTED; }
CM_RT_API int32_t
CreateSampler(const CM_SAMPLER_STATE & sampleState,
CmSampler* & pSampler);
CM_RT_API int32_t DestroyKernel(CmKernel*& pKernel);
CM_RT_API int32_t DestroySampler(CmSampler*& pSampler);
CM_RT_API int32_t DestroyProgram(CmProgram* & pProgram);
CM_RT_API int32_t DestroyThreadSpace(CmThreadSpace* & pTS);
CM_RT_API int32_t CreateTask(CmTask *& pTask);
CM_RT_API int32_t DestroyTask(CmTask*& pTask);
CM_RT_API int32_t GetCaps(CM_DEVICE_CAP_NAME capName,
uint32_t & capValueSize,
void* pCapValue);
CM_RT_API int32_t CreateThreadSpace(uint32_t width,
uint32_t height,
CmThreadSpace* & pTS);
CM_RT_API int32_t CreateBufferUP(uint32_t size,
void* pSystMem,
CmBufferUP* & pSurface);
CM_RT_API int32_t DestroyBufferUP(CmBufferUP* & pSurface);
CM_RT_API int32_t ForceDestroyBufferUP(CmBufferUP* & pSurface);
CM_RT_API int32_t GetSurface2DInfo(uint32_t width,
uint32_t height,
CM_SURFACE_FORMAT format,
uint32_t & pitch,
uint32_t & physicalSize);
CM_RT_API int32_t CreateSurface2DUP(uint32_t width,
uint32_t height,
CM_SURFACE_FORMAT format,
void* pSysMem,
CmSurface2DUP* & pSurface);
CM_RT_API int32_t DestroySurface2DUP(CmSurface2DUP* & pSurface);
CM_RT_API int32_t CreateVmeSurfaceG7_5(CmSurface2D* pCurSurface,
CmSurface2D** pForwardSurface,
CmSurface2D** pBackwardSurface,
const uint32_t surfaceCountForward,
const uint32_t surfaceCountBackward,
SurfaceIndex* & pVmeIndex);
CM_RT_API int32_t DestroyVmeSurfaceG7_5(SurfaceIndex* & pVmeIndex);
CM_RT_API int32_t CreateSampler8x8(const CM_SAMPLER_8X8_DESCR & smplDescr,
CmSampler8x8 *& psmplrState);
CM_RT_API int32_t DestroySampler8x8(CmSampler8x8*& ps8x8State);
CM_RT_API int32_t
CreateSampler8x8Surface(CmSurface2D* p2DSurface,
SurfaceIndex* & pDIIndex,
CM_SAMPLER8x8_SURFACE surf_type,
CM_SURFACE_ADDRESS_CONTROL_MODE mode);
CM_RT_API int32_t DestroySampler8x8Surface(SurfaceIndex* & pDIIndex);
CM_RT_API int32_t CreateThreadGroupSpace(uint32_t thrdSpaceWidth,
uint32_t thrdSpaceHeight,
uint32_t grpSpaceWidth,
uint32_t grpSpaceHeight,
CmThreadGroupSpace*& pTGS);
CM_RT_API int32_t DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS);
CM_RT_API int32_t SetL3Config(const L3ConfigRegisterValues *l3_c);
CM_RT_API int32_t SetSuggestedL3Config(L3_SUGGEST_CONFIG l3_s_c);
CM_RT_API int32_t SetCaps(CM_DEVICE_CAP_NAME capName,
size_t capValueSize,
void* pCapValue);
CM_RT_API int32_t
CreateSamplerSurface2D(CmSurface2D* p2DSurface,
SurfaceIndex* & pSamplerSurfaceIndex);
CM_RT_API int32_t
CreateSamplerSurface3D(CmSurface3D* p3DSurface,
SurfaceIndex* & pSamplerSurfaceIndex);
CM_RT_API int32_t
DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex);
CM_RT_API int32_t
InitPrintBuffer(size_t size = CM_DEFAULT_PRINT_BUFFER_SIZE);
CM_RT_API int32_t FlushPrintBuffer();
CM_RT_API int32_t CreateVebox(CmVebox* & pVebox);
CM_RT_API int32_t DestroyVebox(CmVebox* & pVebox);
CM_RT_API int32_t CreateBufferSVM(uint32_t size,
void* & pSystMem,
uint32_t access_flag,
CmBufferSVM* & pBufferSVM);
CM_RT_API int32_t DestroyBufferSVM(CmBufferSVM* & pBufferSVM);
CM_RT_API int32_t
CreateSamplerSurface2DUP(CmSurface2DUP* p2DUPSurface,
SurfaceIndex* & pSamplerSurfaceIndex);
CM_RT_API int32_t CloneKernel(CmKernel* &pKernelDest, CmKernel*pKernelSrc);
CM_RT_API int32_t CreateSurface2DAlias(CmSurface2D* p2DSurface,
SurfaceIndex* &aliasSurfaceIndex);
CM_RT_API int32_t
CreateHevcVmeSurfaceG10(CmSurface2D* pCurSurface,
CmSurface2D** pForwardSurface,
CmSurface2D** pBackwardSurface,
const uint32_t surfaceCountForward,
const uint32_t surfaceCountBackward,
SurfaceIndex* & pVmeIndex);
CM_RT_API int32_t
DestroyHevcVmeSurfaceG10(SurfaceIndex* & pVmeIndex);
CM_RT_API int32_t CreateSamplerEx(const CM_SAMPLER_STATE_EX & sampleState,
CmSampler* & pSampler);
CM_RT_API int32_t FlushPrintBufferIntoFile(const char *filename);
CM_RT_API int32_t CreateThreadGroupSpaceEx(uint32_t thrdSpaceWidth,
uint32_t thrdSpaceHeight,
uint32_t thrdSpaceDepth,
uint32_t grpSpaceWidth,
uint32_t grpSpaceHeight,
uint32_t grpSpaceDepth,
CmThreadGroupSpace*& pTGS);
CM_RT_API int32_t
CreateSampler8x8SurfaceEx(
CmSurface2D* p2DSurface,
SurfaceIndex* & pDIIndex,
CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE,
CM_SURFACE_ADDRESS_CONTROL_MODE address_control = CM_SURFACE_CLAMP,
CM_FLAG* pFlag = nullptr);
CM_RT_API int32_t
CreateSamplerSurface2DEx(CmSurface2D* p2DSurface,
SurfaceIndex* & pSamplerSurfaceIndex,
CM_FLAG* pFlag = nullptr);
CM_RT_API int32_t CreateBufferAlias(CmBuffer *pBuffer,
SurfaceIndex* &pAliasIndex);
CM_RT_API int32_t
SetVmeSurfaceStateParam(SurfaceIndex* pVmeIndex,
CM_VME_SURFACE_STATE_PARAM *pSSParam);
CM_RT_API int32_t GetVISAVersion(uint32_t& majorVersion,
uint32_t& minorVersion);
CM_RT_API int32_t
CreateQueueEx(CmQueue *&pQueue,
CM_QUEUE_CREATE_OPTION QueueCreateOption
= CM_DEFAULT_QUEUE_CREATE_OPTION);
CM_RT_API int32_t UpdateBuffer(PMOS_RESOURCE mosResource, CmBuffer* &surface,
MOS_HW_RESOURCE_DEF mosUsage = MOS_CM_RESOURCE_USAGE_SurfaceState);
CM_RT_API int32_t UpdateSurface2D(PMOS_RESOURCE mosResource, CmSurface2D* &surface,
MOS_HW_RESOURCE_DEF mosUsage = MOS_CM_RESOURCE_USAGE_SurfaceState);
CM_RT_API int32_t
CreateSampler8x8SurfaceFromAlias(
CmSurface2D *originalSurface,
SurfaceIndex *aliasIndex,
CM_SURFACE_ADDRESS_CONTROL_MODE addressControl,
SurfaceIndex* &sampler8x8SurfaceIndex);
CM_RT_API int32_t CreateBufferStateless(size_t size,
uint32_t option,
void *sysMem,
CmBufferStateless *&bufferStateless);
CM_RT_API int32_t DestroyBufferStateless(CmBufferStateless* & bufferStateless);
void* GetAccelData(){ return m_accelData; }
MOS_CONTEXT* GetUMDCtx(){ return m_mosContext; }
uint32_t GetAccelsize(){ return m_accelSize; }
int32_t GetHalMaxValues(CM_HAL_MAX_VALUES* & pHalMaxValues,
CM_HAL_MAX_VALUES_EX* & pHalMaxValuesEx);
int32_t GetGenPlatform(uint32_t &platform);
void Sampler8x8CoefficientFormatTransform(
CM_AVS_INTERNEL_NONPIPLINED_STATE* dst_avs_state,
CM_AVS_NONPIPLINED_STATE* src_avs_state);
int32_t GetSurfaceManager(CmSurfaceManager* &pSurfaceMgr);
std::vector<CmQueueRT *> &GetQueue();
CSync* GetSurfaceLock();
CSync* GetSurfaceCreationLock();
CSync* GetProgramKernelLock();
CSync* GetQueueLock();
int32_t LoadPredefinedCopyKernel(CmProgram*& pProgram);
int32_t LoadPredefinedInitKernel(CmProgram*& pProgram);
int32_t GetKernelSlot()
{
return m_kernelArray.GetFirstFreeIndex();
}
int32_t PrepareGPUinitSurface();
int32_t GPUinitSurface(CmSurface2D* surf2D, const uint32_t initValue, CmEvent*& event);
bool CheckGTPinEnabled();
#if USE_EXTENSION_CODE
int32_t EnableGTPin(CmBufferUP* pBufferUP0,
CmBufferUP* pBufferUP1,
CmBufferUP* pBufferUP2,
char * pGTPinCom,
GTPIN_INVOKE_STRUCT* pInvokeStruct,
bool reserveRegisters);
CmGTPin *GetGTPin();
#endif
int32_t GetGenStepInfo(char*& stepinfostr);
int32_t GetCapsInternal(void *pCaps, uint32_t *puSize);
int32_t Acquire();
int32_t Release();
int32_t GetPrintBufferIndex(SurfaceIndex *& pIndex) const;
bool IsPrintEnable() const;
bool IsVtuneLogOn() const;
int32_t GetPrintBufferMem(unsigned char *& pPrintBufferMem) const;
int32_t GetSurf2DLookUpEntry(uint32_t index,
PCMLOOKUP_ENTRY &pLookupEntry);
int32_t DestroySurfaceInPool(uint32_t &freeSurfNum);
virtual int32_t CreateSurface2D(PMOS_RESOURCE pMosResource,
bool bIsCmCreated,
CmSurface2D* & pSurface) = 0;
int32_t GetSampler8x8(uint32_t index, CmSampler8x8State_RT *&pSampler8x8);
bool IsScratchSpaceDisabled();
int32_t SetSurfaceArraySizeForAlias();
uint32_t GetDriverStoreFlag() { return m_isDriverStoreEnabled; }
void SetDriverStoreFlag(uint32_t dsEnabled)
{
m_isDriverStoreEnabled = dsEnabled;
}
CmDynamicArray* GetKernelArray();
uint32_t *GetKernelCount();
#if CM_LOG_ON
std::string Log();
#endif
CM_HAL_STATE* GetHalState();
int32_t DestroyVmeSurface(SurfaceIndex *& pVmeIndex);
int32_t CreatePrintBuffer();
CmNotifierGroup* GetNotifiers() {return m_notifierGroup;}
CM_HAL_CREATE_PARAM &GetCmHalCreateOption() {return m_cmHalCreateOption;}
inline bool HasGpuCopyKernel() {return m_hasGpuCopyKernel; }
inline bool HasGpuInitKernel() {return m_hasGpuInitKernel; }
// Num of kernels included in CmProgram Loaded by this device
inline uint32_t& KernelsLoaded() {return m_kernelsLoaded; }
virtual int32_t GetJITCompileFnt(pJITCompile &fJITCompile) = 0;
virtual int32_t GetJITCompileFntV2(pJITCompile_v2 &fJITCompile_v2) = 0;
virtual int32_t GetFreeBlockFnt(pFreeBlock &fFreeBlock) = 0;
virtual int32_t GetJITVersionFnt(pJITVersion &fJITVersion) = 0;
virtual int32_t LoadJITDll() = 0;
virtual HANDLE QueryRegHandleInternal(PCM_HAL_STATE pCmHalState) = 0;
CM_OBJECT_COUNT m_memObjectCount;
int32_t CheckObjectCount();
protected:
int32_t Initialize(MOS_CONTEXT *pUmdContext);
int32_t DestroyQueue(CmQueueRT* & pQueue);
int32_t RegisterSamplerState(const CM_SAMPLER_STATE& sampleState,
uint32_t& index);
int32_t RegisterSamplerStateEx(const CM_SAMPLER_STATE_EX& sampleState,
uint32_t& index);
int32_t UnregisterSamplerState(uint32_t index);
int32_t RegisterSampler8x8State(const CM_SAMPLER_8X8_DESCR & sampler8x8State,
uint32_t& index);
int32_t UnregisterSampler8x8State(uint32_t index);
int32_t GetMaxValueFromCaps(CM_HAL_MAX_VALUES &MaxValues,
CM_HAL_MAX_VALUES_EX &MaxValuesEx);
int32_t InitDevCreateOption(CM_HAL_CREATE_PARAM & DevCreateParam,
uint32_t DevCreateOption);
CmDeviceRTBase(uint32_t DevCreateOption);
~CmDeviceRTBase() {};
void DestructCommon();
inline bool IsMediaResetNeeded(uint32_t options)
{
return (options & CM_DEVICE_CONFIG_MEDIA_RESET_ENABLE) ? true : false;
}
virtual int32_t ReadVtuneProfilingFlag() = 0;
virtual void ConstructOSSpecific(uint32_t devCreateOption) = 0;
virtual int32_t QuerySurface2DFormats(void *pCapValue,
uint32_t & capValueSize) = 0;
virtual int32_t InitializeOSSpecific(MOS_CONTEXT *pUmdContext) = 0;
virtual CM_RETURN_CODE QueryGPUInfoInternal(PCM_QUERY_CAPS pQueryCaps) = 0;
virtual CM_RETURN_CODE QuerySurface2DFormatsInternal(PCM_QUERY_CAPS pQueryCaps) = 0;
int32_t FlushPrintBufferInternal(const char *filename);
MOS_CONTEXT *m_mosContext;
void* m_accelData; // Pointer to the private data used by the acceleration service
uint32_t m_accelSize; // Size of the private data
CM_HAL_MAX_VALUES m_halMaxValues;
CM_HAL_MAX_VALUES_EX m_halMaxValuesEx;
CmSurfaceManager* m_surfaceMgr;
std::vector<CmQueueRT *> m_queue;
CmDynamicArray m_programArray;
uint32_t m_programCount;
CmDynamicArray m_kernelArray;
uint32_t m_kernelCount;
CmDynamicArray m_sampler8x8Array;
CmDynamicArray m_samplerArray;
CmDynamicArray m_threadSpaceArray;
uint32_t m_threadSpaceCount;
CmDynamicArray m_veboxArray;
uint32_t m_veboxCount;
HMODULE m_hJITDll;
pJITCompile m_fJITCompile;
pJITCompile_v2 m_fJITCompile_v2;
pFreeBlock m_fFreeBlock;
pJITVersion m_fJITVersion;
uint32_t m_ddiVersion;
uint32_t m_platform;
uint32_t m_cmDeviceRefCount;
CmProgram* m_gpuCopyKernelProgram;
CmProgram* m_surfInitKernelProgram;
CmQueue* m_InitCmQueue;
CmKernel* m_kernel0;
CmKernel* m_kernel1;
CmTask* m_gpuInitTask0;
CmTask* m_gpuInitTask1;
#if USE_EXTENSION_CODE
CmGTPin *m_gtpin;
#endif
// synchronization objects
CSync m_criticalSectionProgramKernel;
CSync m_criticalSectionSurface;
CSync m_criticalSectionReadWriteSurface2D;
CSync m_criticalSectionSampler;
CSync m_criticalSectionSampler8x8;
CSync m_criticalSectionVmeState;
CSync m_criticalSectionThreadSpace;
CSync m_criticalSectionDeviceRefCount;
CSync m_criticalSectionThreadGroupSpace;
CSync m_criticalSectionTask;
CSync m_criticalSectionVebox;
CSync m_criticalSectionQueue;
std::list<uint8_t *> m_printBufferMems;
std::list<CmBufferUP *> m_printBufferUPs;
bool m_isPrintEnabled;
size_t m_printBufferSize;
CmDynamicArray m_threadGroupSpaceArray;
uint32_t m_threadGroupSpaceCount;
CmDynamicArray m_taskArray;
uint32_t m_taskCount;
CM_HAL_CREATE_PARAM m_cmHalCreateOption;
uint32_t m_nGPUFreqOriginal;
uint32_t m_nGPUFreqMin;
uint32_t m_nGPUFreqMax;
bool m_vtuneOn;
uint32_t m_isDriverStoreEnabled;
CmNotifierGroup *m_notifierGroup;
bool m_hasGpuCopyKernel;
bool m_hasGpuInitKernel;
uint32_t m_kernelsLoaded;
bool m_preloadKernelEnabled;
static const uint32_t m_maxPrintBuffer;
private:
CmDeviceRTBase(const CmDeviceRTBase& other);
CmDeviceRTBase& operator= (const CmDeviceRTBase& other);
};
}; //namespace
#endif // #ifndef MEDIADRIVER_COMMON_CM_CMDEVICERT_BASE_H_