blob: 179ed80b0cd1968b433613e820cc66b6bd8e989a [file] [log] [blame]
/*
* Copyright (c) 2018, 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 __DRIVER_LOADER_H__
#define __DRIVER_LOADER_H__
#include <vector>
#include "devconfig.h"
#include "mos_defs_specific.h"
#include "mos_os.h"
#include "va/va_drmcommon.h"
#include "va/va_backend.h"
#include "va/va_backend_vpp.h"
#if VA_CHECK_VERSION(1,11,0)
#include <va/va_backend_prot.h>
#endif
struct FeatureID
{
VAProfile profile;
VAEntrypoint entrypoint;
bool operator==(const FeatureID &g2) const
{
return (profile == g2.profile) && (entrypoint == g2.entrypoint);
}
bool operator<(const FeatureID &g2) const
{
if (profile != g2.profile)
{
return profile < g2.profile;
}
else
{
return entrypoint < g2.entrypoint;
}
}
};
struct CompBufConif
{
VABufferType bufType;
uint32_t bufSize;
void* pData;
VABufferID bufID;
};
typedef VAStatus (*CmExtSendReqMsgFunc)(
VADisplay dpy,
void *moduleType,
uint32_t *inputFunId,
void *inputData,
uint32_t *inputDataLen,
uint32_t *outputFunId,
void *outputData,
uint32_t *outputDataLen);
typedef void (*MOS_SetUltFlagFunc)(uint8_t ultFlag);
typedef int32_t (*MOS_GetMemNinjaCounterFunc)();
typedef void (*UltGetCmdBufFunc)(PMOS_COMMAND_BUFFER pCmdBuffer);
struct DriverSymbols
{
bool Initialized() const
{
if (!__vaDriverInit_ ||
!vaCmExtSendReqMsg ||
!MOS_SetUltFlag ||
!MOS_GetMemNinjaCounter ||
!MOS_GetMemNinjaCounterGfx ||
!ppfnUltGetCmdBuf)
{
return false;
}
return true;
}
// Functions
VADriverInit __vaDriverInit_;
CmExtSendReqMsgFunc vaCmExtSendReqMsg;
MOS_SetUltFlagFunc MOS_SetUltFlag;
MOS_GetMemNinjaCounterFunc MOS_GetMemNinjaCounter;
MOS_GetMemNinjaCounterFunc MOS_GetMemNinjaCounterGfx;
// Data
UltGetCmdBufFunc *ppfnUltGetCmdBuf;
};
class DriverDllLoader
{
public:
DriverDllLoader();
DriverDllLoader(char *path);
const std::vector<Platform_t> &GetPlatforms() const { return m_platformArray; }
int GetPlatformNum() const { return m_platformArray.size(); }
const DriverSymbols &GetDriverSymbols() const { return m_drvSyms; }
VAStatus InitDriver(Platform_t platform_id);
VAStatus CloseDriver(bool detectMemLeak = true);
public:
VADriverContext m_ctx = {};
VADriverVTable m_vtable = {};
VADriverVTableVPP m_vtable_vpp = {};
#if VA_CHECK_VERSION(1,11,0)
VADriverVTableProt m_vtable_prot = {};
#endif
private:
VAStatus LoadDriverSymbols();
private:
const char *m_driver_path = nullptr;
void *m_umdhandle = nullptr;
DriverSymbols m_drvSyms = {};
drm_state m_drmstate = {};
Platform_t m_currentPlatform = igfxSKLAKE;
std::vector<Platform_t> m_platformArray;
};
#endif // __DRIVER_LOADER_H__