blob: f9cb45dd3d006f2915e4bdffd8909e0004a118e3 [file] [log] [blame]
/*
* Copyright (c) 2017, 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.
*/
#ifndef CMRTLIB_LINUX_HARDWARE_CM_DEVICE_H_
#define CMRTLIB_LINUX_HARDWARE_CM_DEVICE_H_
#include "cm_device_base.h"
#include "cm_def_hw.h"
#include "cm_kernel_debugger.h"
#include <vector>
class CmQueue_RT;
class CmSurfaceManager;
class CmDevice_RT : public CmDevice
{
public:
static int32_t GetSupportedAdapters(uint32_t& count);
static int32_t CreateCmDeviceFromAdapter(CmDevice_RT*& pCmDev, int32_t adapterIndex, uint32_t createOption = 0);
static int32_t GetPlatformInfo(uint32_t adapterIndex);
static int32_t QueryAdapterInfo(uint32_t adapterIndex, AdapterInfoType infoName, void* info, uint32_t infoSize, uint32_t* outInfoSize);
static int32_t Create( CmDevice_RT* &device, uint32_t createOption );
static int32_t Destroy( CmDevice_RT* &device );
static int32_t Create(VADisplay &vaDisplay, CmDevice_RT* &device,uint32_t createOption );
CM_RT_API int32_t CreateBuffer(uint32_t size, CmBuffer* &buffer);
CM_RT_API int32_t CreateSurface2D(uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, CmSurface2D* &surface );
CM_RT_API int32_t CreateSurface3D(uint32_t width, uint32_t height, uint32_t depth, CM_SURFACE_FORMAT format, CmSurface3D* &surface );
CM_RT_API int32_t CreateSurface2D( VASurfaceID vaSurface, CmSurface2D* &surface );
CM_RT_API int32_t CreateSurface2D( VASurfaceID* vaSurfaceArray, const uint32_t surfaceCount, CmSurface2D **surfaceArray);
CM_RT_API int32_t DestroySurface( CmBuffer* &buffer);
CM_RT_API int32_t DestroySurface( CmSurface2D* &surface2d);
CM_RT_API int32_t DestroySurface( CmSurface3D* &surface3d);
CM_RT_API int32_t CreateQueue( CmQueue* & queue);
CM_RT_API int32_t LoadProgram( void* commonISACode, const uint32_t size, CmProgram*& program, const char* options = nullptr );
CM_RT_API int32_t CreateKernel( CmProgram* program, const char* kernelName, CmKernel* & kernel, const char* options = nullptr);
CM_RT_API int32_t CreateKernel( CmProgram* program, const char* kernelName, const void * fncPnt, CmKernel* & kernel, const char* options = nullptr) {return CM_FAILURE;}
CM_RT_API int32_t CreateSampler( const CM_SAMPLER_STATE & sampleState, CmSampler* &sampler );
CM_RT_API int32_t CreateTask(CmTask *& task);
CM_RT_API int32_t GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* capValue );
CM_RT_API int32_t CreateThreadSpace( uint32_t width, uint32_t height, CmThreadSpace* &threadSpace);
CM_RT_API int32_t DestroyKernel( CmKernel*& kernel);
CM_RT_API int32_t DestroySampler( CmSampler*& sampler );
CM_RT_API int32_t DestroyProgram( CmProgram*& program );
CM_RT_API int32_t DestroySampler8x8( CmSampler8x8 *& sampler );
CM_RT_API int32_t DestroyThreadSpace( CmThreadSpace* &threadSpace);
CM_RT_API int32_t DestroyTask(CmTask *& task);
CM_RT_API int32_t CreateVmeSurfaceG7_5 (CmSurface2D* currentSurface, CmSurface2D** forwardSurfaceArray, CmSurface2D** backwardSurfaceArray, const uint32_t surfaceCountForward, const uint32_t surfaceCountBackward, SurfaceIndex* & vmeSurfaceIndex );
CM_RT_API int32_t DestroyVmeSurfaceG7_5(SurfaceIndex* & vmeSurfaceIndex);
CM_RT_API int32_t SetVmeSurfaceStateParam(SurfaceIndex* vmeSurfaceIndex, CM_VME_SURFACE_STATE_PARAM *newState);
CM_RT_API int32_t CreateBufferUP(uint32_t size, void *sysMem, CmBufferUP* &buffer);
CM_RT_API int32_t DestroyBufferUP( CmBufferUP* &buffer);
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* sysMem, CmSurface2DUP* &surface );
CM_RT_API int32_t DestroySurface2DUP( CmSurface2DUP* &surface) ;
CM_RT_API int32_t CreateSampler8x8(const CM_SAMPLER_8X8_DESCR &samplerDescriptor, CmSampler8x8* &sampler);
CM_RT_API int32_t CreateSampler8x8Surface(CmSurface2D* surface2d, SurfaceIndex* &sampler8x8SurfaceIndex, CM_SAMPLER8x8_SURFACE surfaceType, CM_SURFACE_ADDRESS_CONTROL_MODE addressControl = CM_SURFACE_CLAMP);
CM_RT_API int32_t DestroySampler8x8Surface(SurfaceIndex* &sampler8x8SurfaceIndex);
CM_RT_API int32_t CreateThreadGroupSpace( uint32_t threadSpaceWidth, uint32_t threadSpaceHeight, uint32_t groupSpaceWidth, uint32_t groupSpaceHeight, CmThreadGroupSpace* &threadGroupSpace);
CM_RT_API int32_t DestroyThreadGroupSpace(CmThreadGroupSpace* &threadGroupSpace);
CM_RT_API int32_t SetL3Config(const L3ConfigRegisterValues *registerValues);
CM_RT_API int32_t SetSuggestedL3Config( L3_SUGGEST_CONFIG configIndex);
CM_RT_API int32_t SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* capValue );
CM_RT_API int32_t CreateSamplerSurface2D(CmSurface2D* surface2d, SurfaceIndex* & samplerSurface2dIndex);
CM_RT_API int32_t CreateSamplerSurface3D(CmSurface3D* surface3d, SurfaceIndex* & samplerSurface3dIndex);
CM_RT_API int32_t DestroySamplerSurface(SurfaceIndex* & samplerSurfaceIndex);
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* & vebox );
CM_RT_API int32_t DestroyVebox(CmVebox* & vebox);
CM_RT_API int32_t CreateBufferSVM(uint32_t size, void* & sysMem, uint32_t accessFlag, CmBufferSVM* &buffer );
CM_RT_API int32_t DestroyBufferSVM( CmBufferSVM* & buffer);
CM_RT_API int32_t CloneKernel( CmKernel * &destKernel, CmKernel *srcKernel );
CM_RT_API int32_t GetVaDpy(VADisplay* &vaDisplay);
CM_RT_API int32_t CreateVaSurface2D( uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, VASurfaceID & vaSurface, CmSurface2D* & surface);
CM_RT_API int32_t CreateSamplerSurface2DUP(CmSurface2DUP* surface2dUP, SurfaceIndex* & samplerSurface2dUPIndex);
CM_RT_API int32_t CreateSurface2DAlias(CmSurface2D* originalSurface, SurfaceIndex* &aliasIndex);
CM_RT_API int32_t CreateHevcVmeSurfaceG10(CmSurface2D* currentSurface, CmSurface2D** forwardSurfaceArray, CmSurface2D** backwardSurfaceArray, const uint32_t surfaceCountForward, const uint32_t surfaceCountBackward, SurfaceIndex* & vmeSurfaceIndex);
CM_RT_API int32_t DestroyHevcVmeSurfaceG10(SurfaceIndex* & vmeSurfaceIndex);
CM_RT_API int32_t CreateSamplerEx( const CM_SAMPLER_STATE_EX & samplerState, CmSampler* & sampler ) ;
CM_RT_API int32_t FlushPrintBufferIntoFile(const char *filename);
CM_RT_API int32_t CreateThreadGroupSpaceEx(uint32_t threadSpaceWidth, uint32_t threadSpaceHeight, uint32_t threadSpaceDepth, uint32_t groupSpaceWidth, uint32_t groupSpaceHeight, uint32_t groupSpaceDepth, CmThreadGroupSpace* &threadGroupSpace);
CM_RT_API int32_t CreateSampler8x8SurfaceEx(CmSurface2D* surface2d, SurfaceIndex* &sampler8x8SurfaceIndex, CM_SAMPLER8x8_SURFACE surfaceType, CM_SURFACE_ADDRESS_CONTROL_MODE addressControl = CM_SURFACE_CLAMP, CM_FLAG* flag = nullptr);
CM_RT_API int32_t CreateSamplerSurface2DEx(CmSurface2D* surface2d, SurfaceIndex* & samplerSurface2dIndex, CM_FLAG* flag);
CM_RT_API int32_t CreateBufferAlias(CmBuffer *originalBuffer, SurfaceIndex* &aliasIndex);
CM_RT_API int32_t GetVISAVersion(uint32_t& majorVersion, uint32_t& minorVersion);
CM_RT_API int32_t CreateQueueEx(CmQueue *&queue, CM_QUEUE_CREATE_OPTION queueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION);
CM_RT_API int32_t CreateBufferStateless(size_t size,
uint32_t option,
void *sysMem,
CmBufferStateless *&pBufferStateless);
CM_RT_API int32_t DestroyBufferStateless(CmBufferStateless *&buffer);
CM_RT_API int32_t DispatchTask() { return CM_SUCCESS; }
CM_RT_API int32_t CreateSurface2DStateless(uint32_t width,
uint32_t height,
uint32_t &pitch,
CmSurface2DStateless *&pSurface);
CM_RT_API int32_t DestroySurface2DStateless(CmSurface2DStateless *&pSurface);
int32_t CheckDdiVersionSupported(const uint32_t ddiVersion);
int32_t OSALExtensionExecute(uint32_t functionId,
void *inputData,
uint32_t inputDataLength,
void **resourceList = nullptr,
uint32_t resourceCount = 0);
protected:
CmDevice_RT(
VADisplay vaDisplay,
uint32_t createOption
);
~CmDevice_RT( void );
int32_t SetCapsInternal(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* capValue);
int32_t CreateProgram(void* commonISACode,
const uint32_t size,
CmProgram*& program,
const char* options );
int32_t CreateDeviceInUmd();
int32_t FlushPrintBufferInternal(const char *filename);
CmSurfaceManager * m_surfaceManager;
uint32_t m_cmVersion;
void *m_deviceInUmd; //CmDevice pointer in UMD
bool m_cmCreated;
int32_t Initialize(bool isCmCreated, uint32_t Index = 0);
int32_t FreeResources();
#if USE_EXTENSION_CODE
int32_t EnableGtpin( void );
int32_t RegisterGtpinMarkerFunctions();
#endif
int32_t CreateVmeSurface( CmSurface2D* currentSurface, CmSurface2D** forwardSurfaceArray, CmSurface2D** backwardSurfaceArray, const uint32_t surfaceCountForward, const uint32_t surfaceCountBackward, SurfaceIndex* & vmeSurfaceIndex, CM_FUNCTION_ID functionName);
int32_t DestroyVmeSurface( SurfaceIndex* & vmeSurfaceIndex );
#ifndef ANDROID
int32_t FreeLibvaDrm();
int32_t GetLibvaDisplayDrm(VADisplay & vaDisplay);
#endif
int32_t InitializeLibvaDisplay(uint32_t Index = 0);
VADisplay m_vaDisplay;
uint32_t m_drmIndex;
pvaCmExtSendReqMsg m_fvaCmExtSendReqMsg;
#if !defined(ANDROID)
static uint32_t m_vaReferenceCount;
static CSync m_vaReferenceCountCriticalSection;
int32_t m_driFileDescriptor;
static void *m_vaDrm;
static pfVAGetDisplayDRM m_vaGetDisplayDrm;
#else
Display* m_display;
#endif
L3ConfigRegisterValues m_l3Config;
// Variables used in GTPIN
bool m_gtpinEnabled;
CmBufferUP* m_gtpinBufferUP0;
CmBufferUP* m_gtpinBufferUP1;
CmBufferUP* m_gtpinBufferUP2;
uint32_t m_createOption;
uint32_t m_driverStoreEnabled;
// Kernel debugger
CmKernelDebugger *m_kernelDebugger;
// Queue list and Queue critical section
CSync m_criticalSectionQueue;
std::vector<CmQueue_RT *> m_queue;
private:
CmDevice_RT(const CmDevice_RT &other);
CmDevice_RT &operator=(const CmDevice_RT &other);
};
#endif // #ifndef CMRTLIB_LINUX_HARDWARE_CM_DEVICE_H_