blob: 9f388122db96178dcc20eb3003a7cc6baf4cd658 [file] [log] [blame]
/*
* Copyright (c) 2017-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 media_interfaces_g9_glk.cpp
//! \brief Helps with gen-specific factory creation.
//!
#include "media_interfaces_g9_kbl.h"
#include "media_interfaces_g9_glk.h"
#if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
#include "igcodeckrn_g9.h"
#endif
extern template class MediaInterfacesFactory<MhwInterfaces>;
extern template class MediaInterfacesFactory<MmdDevice>;
extern template class MediaInterfacesFactory<CodechalDevice>;
extern template class MediaInterfacesFactory<CMHalDevice>;
extern template class MediaInterfacesFactory<MosUtilDevice>;
extern template class MediaInterfacesFactory<VphalDevice>;
extern template class MediaInterfacesFactory<RenderHalDevice>;
extern template class MediaInterfacesFactory<Nv12ToP010Device>;
extern template class MediaInterfacesFactory<DecodeHistogramDevice>;
#define PLATFORM_INTEL_GLK 16
#define GENX_SKL 5
#define GENX_BXT 6
static bool glkRegisteredVphal =
MediaInterfacesFactory<VphalDevice>::
RegisterHal<VphalInterfacesG9Glk>((uint32_t)IGFX_GEMINILAKE);
MOS_STATUS VphalInterfacesG9Glk::Initialize(
PMOS_INTERFACE osInterface,
PMOS_CONTEXT osDriverContext,
bool bInitVphalState,
MOS_STATUS *eStatus)
{
m_vphalState = MOS_New(
VphalState,
osInterface,
osDriverContext,
eStatus);
return *eStatus;
}
static bool glkRegisteredMhw =
MediaInterfacesFactory<MhwInterfaces>::
RegisterHal<MhwInterfacesG9Kbl>((uint32_t)IGFX_GEMINILAKE);
#ifdef _MMC_SUPPORTED
static bool glkRegisteredMmd =
MediaInterfacesFactory<MmdDevice>::
RegisterHal<MmdDeviceG9Kbl>((uint32_t)IGFX_GEMINILAKE);
#endif
static bool glkRegisteredNv12ToP010 =
MediaInterfacesFactory<Nv12ToP010Device>::
RegisterHal<Nv12ToP010DeviceG9Glk>((uint32_t)IGFX_GEMINILAKE);
MOS_STATUS Nv12ToP010DeviceG9Glk::Initialize(
PMOS_INTERFACE osInterface)
{
m_nv12ToP010device = MOS_New(Nv12ToP010, osInterface);
if (m_nv12ToP010device == nullptr)
{
MHW_ASSERTMESSAGE("Create Nv12 to P010 interfaces failed.")
return MOS_STATUS_NO_SPACE;
}
return MOS_STATUS_SUCCESS;
}
static bool glkRegisteredCodecHal =
MediaInterfacesFactory<CodechalDevice>::
RegisterHal<CodechalInterfacesG9Glk>((uint32_t)IGFX_GEMINILAKE);
MOS_STATUS CodechalInterfacesG9Glk::Initialize(
void *standardInfo,
void *settings,
MhwInterfaces *mhwInterfaces,
PMOS_INTERFACE osInterface)
{
if (standardInfo == nullptr ||
mhwInterfaces == nullptr ||
osInterface == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("CodecHal device is not valid!");
return MOS_STATUS_INVALID_PARAMETER;
}
PCODECHAL_STANDARD_INFO info = ((PCODECHAL_STANDARD_INFO)standardInfo);
CODECHAL_FUNCTION CodecFunction = info->CodecFunction;
CodechalHwInterface *hwInterface = MOS_New(Hw, osInterface, CodecFunction, mhwInterfaces);
if (hwInterface == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("hwInterface is not valid!");
return MOS_STATUS_NO_SPACE;
}
#if USE_CODECHAL_DEBUG_TOOL
CodechalDebugInterface *debugInterface = MOS_New(CodechalDebugInterface);
if (debugInterface == nullptr)
{
MOS_Delete(hwInterface);
mhwInterfaces->SetDestroyState(true);
CODECHAL_PUBLIC_ASSERTMESSAGE("debugInterface is not valid!");
return MOS_STATUS_NO_SPACE;
}
if (debugInterface->Initialize(hwInterface, CodecFunction) != MOS_STATUS_SUCCESS)
{
MOS_Delete(hwInterface);
mhwInterfaces->SetDestroyState(true);
MOS_Delete(debugInterface);
CODECHAL_PUBLIC_ASSERTMESSAGE("Debug interface creation failed!");
return MOS_STATUS_INVALID_PARAMETER;
}
#else
CodechalDebugInterface *debugInterface = nullptr;
#endif // USE_CODECHAL_DEBUG_TOOL
if (CodecHalIsDecode(CodecFunction))
{
#ifdef _MPEG2_DECODE_SUPPORTED
if (info->Mode == CODECHAL_DECODE_MODE_MPEG2IDCT ||
info->Mode == CODECHAL_DECODE_MODE_MPEG2VLD)
{
m_codechalDevice = MOS_New(Decode::Mpeg2, hwInterface, debugInterface, info);
}
else
#endif
#ifdef _VC1_DECODE_SUPPORTED
if (info->Mode == CODECHAL_DECODE_MODE_VC1IT ||
info->Mode == CODECHAL_DECODE_MODE_VC1VLD)
{
m_codechalDevice = MOS_New(Decode::Vc1, hwInterface, debugInterface, info);
}
else
#endif
#ifdef _AVC_DECODE_SUPPORTED
if (info->Mode == CODECHAL_DECODE_MODE_AVCVLD)
{
m_codechalDevice = MOS_New(Decode::Avc, hwInterface, debugInterface, info);
if (m_codechalDevice == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Failed to create decode device!");
return MOS_STATUS_NO_SPACE;
}
#ifdef _DECODE_PROCESSING_SUPPORTED
if (settings != nullptr && ((CodechalSetting *)settings)->downsamplingHinted)
{
CodechalDecode *decoder = dynamic_cast<CodechalDecode *>(m_codechalDevice);
if (decoder == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Failed to create decode device!");
return MOS_STATUS_NO_SPACE;
}
FieldScalingInterface *fieldScalingInterface =
MOS_New(Decode::FieldScaling, hwInterface);
if (fieldScalingInterface == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Failed to create field scaling interface!");
return MOS_STATUS_NO_SPACE;
}
decoder->m_fieldScalingInterface = fieldScalingInterface;
}
#endif
}
else
#endif
#ifdef _JPEG_DECODE_SUPPORTED
if (info->Mode == CODECHAL_DECODE_MODE_JPEG)
{
m_codechalDevice = MOS_New(Decode::Jpeg, hwInterface, debugInterface, info);
}
else
#endif
#ifdef _VP8_DECODE_SUPPORTED
if (info->Mode == CODECHAL_DECODE_MODE_VP8VLD)
{
m_codechalDevice = MOS_New(Decode::Vp8, hwInterface, debugInterface, info);
}
else
#endif
#ifdef _HEVC_DECODE_SUPPORTED
if (info->Mode == CODECHAL_DECODE_MODE_HEVCVLD)
{
m_codechalDevice = MOS_New(Decode::Hevc, hwInterface, debugInterface, info);
}
else
#endif
#ifdef _VP9_DECODE_SUPPORTED
if (info->Mode == CODECHAL_DECODE_MODE_VP9VLD)
{
m_codechalDevice = MOS_New(Decode::Vp9, hwInterface, debugInterface, info);
}
else
#endif
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Decode mode requested invalid!");
return MOS_STATUS_INVALID_PARAMETER;
}
if (m_codechalDevice == nullptr)
{
MOS_Delete(hwInterface);
mhwInterfaces->SetDestroyState(true);
#if USE_CODECHAL_DEBUG_TOOL
MOS_Delete(debugInterface);
#endif
CODECHAL_PUBLIC_ASSERTMESSAGE("Decoder device creation failed!");
return MOS_STATUS_NO_SPACE;
}
}
else if (CodecHalIsEncode(CodecFunction))
{
CodechalEncoderState *encoder = nullptr;
#ifdef _MPEG2_ENCODE_VME_SUPPORTED
if (info->Mode == CODECHAL_ENCODE_MODE_MPEG2)
{
// Setup encode interface functions
encoder = MOS_New(Encode::Mpeg2, hwInterface, debugInterface, info);
if (encoder == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Encode allocation failed!");
return MOS_STATUS_INVALID_PARAMETER;
}
else
{
m_codechalDevice = encoder;
}
encoder->m_kernelBase = (uint8_t*)IGCODECKRN_G9;
}
else
#endif
#ifdef _JPEG_ENCODE_SUPPORTED
if (info->Mode == CODECHAL_ENCODE_MODE_JPEG)
{
encoder = MOS_New(Encode::Jpeg, hwInterface, debugInterface, info);
if (encoder == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Encode state creation failed!");
return MOS_STATUS_INVALID_PARAMETER;
}
else
{
m_codechalDevice = encoder;
}
encoder->m_needCheckCpEnabled = true;
}
else
#endif
#ifdef _HEVC_ENCODE_VME_SUPPORTED
if (info->Mode == CODECHAL_ENCODE_MODE_HEVC)
{
encoder = MOS_New(Encode::HevcEnc, hwInterface, debugInterface, info);
if (encoder == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Encode state creation failed!");
return MOS_STATUS_INVALID_PARAMETER;
}
else
{
m_codechalDevice = encoder;
}
encoder->m_kernelBase = (uint8_t*)IGCODECKRN_G9;
}
else
#endif
#if defined (_AVC_ENCODE_VME_SUPPORTED) || defined (_AVC_ENCODE_VDENC_SUPPORTED)
if (info->Mode == CODECHAL_ENCODE_MODE_AVC)
{
if (CodecHalUsesVdencEngine(info->CodecFunction))
{
#ifdef _AVC_ENCODE_VDENC_SUPPORTED
encoder = MOS_New(Encode::AvcVdenc, hwInterface, debugInterface, info);
#endif
}
else
{
#ifdef _AVC_ENCODE_VME_SUPPORTED
encoder = MOS_New(Encode::AvcEnc, hwInterface, debugInterface, info);
#endif
}
if (encoder == nullptr)
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Encode state creation failed!");
return MOS_STATUS_INVALID_PARAMETER;
}
else
{
m_codechalDevice = encoder;
}
}
else
#endif
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Unsupported encode function requested.");
return MOS_STATUS_INVALID_PARAMETER;
}
#if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
if (info->Mode != CODECHAL_ENCODE_MODE_JPEG)
{
// Create CSC and Downscaling interface
if ((encoder->m_cscDsState = MOS_New(Encode::CscDs, encoder)) == nullptr)
{
return MOS_STATUS_INVALID_PARAMETER;
}
}
#endif
}
else
{
CODECHAL_PUBLIC_ASSERTMESSAGE("Unsupported codec function requested.");
return MOS_STATUS_INVALID_PARAMETER;
}
return MOS_STATUS_SUCCESS;
}
static bool glkRegisteredCMHal =
MediaInterfacesFactory<CMHalDevice>::
RegisterHal<CMHalInterfacesG9Glk>((uint32_t)IGFX_GEMINILAKE);
MOS_STATUS CMHalInterfacesG9Glk::Initialize(CM_HAL_STATE *pCmState)
{
if (pCmState == nullptr)
{
MHW_ASSERTMESSAGE("pCmState is nullptr.")
return MOS_STATUS_INVALID_PARAMETER;
}
m_cmhalDevice = MOS_New(CMHal, pCmState);
if (m_cmhalDevice == nullptr)
{
MHW_ASSERTMESSAGE("Create CM Hal interfaces failed.")
return MOS_STATUS_NO_SPACE;
}
int gengt = PLATFORM_INTEL_GT2;
if( MEDIA_IS_SKU(pCmState->skuTable, FtrGT1 ))
{
gengt = PLATFORM_INTEL_GT1;
}
else if (MEDIA_IS_SKU(pCmState->skuTable, FtrGT1_5))
{
gengt = PLATFORM_INTEL_GT1_5;
}
else if( MEDIA_IS_SKU(pCmState->skuTable, FtrGT2 ))
{
gengt = PLATFORM_INTEL_GT2;
}
else if( MEDIA_IS_SKU(pCmState->skuTable, FtrGT3 ))
{
gengt = PLATFORM_INTEL_GT3;
}
else if( MEDIA_IS_SKU(pCmState->skuTable, FtrGT4 ))
{
gengt = PLATFORM_INTEL_GT4;
}
m_cmhalDevice->SetGenPlatformInfo(PLATFORM_INTEL_GLK, gengt, "BXT");
uint32_t cisaIDs[] = {GENX_BXT, GENX_SKL};
m_cmhalDevice->AddSupportedCisaIDs(cisaIDs, 2);
CM_HAL_G9_X *pGen9Device = static_cast<CM_HAL_G9_X *>(m_cmhalDevice);
const char *CmSteppingInfo_GLK[] = { "A0", "A1", "n/a", "B0" };
pGen9Device->OverwriteSteppingTable(CmSteppingInfo_GLK, sizeof(CmSteppingInfo_GLK)/sizeof(const char *));
return MOS_STATUS_SUCCESS;
}
static bool glkRegisteredMosUtil =
MediaInterfacesFactory<MosUtilDevice>::
RegisterHal<MosUtilDeviceG9Kbl>((uint32_t)IGFX_GEMINILAKE);
static bool glkRegisteredRenderHal =
MediaInterfacesFactory<RenderHalDevice>::
RegisterHal<RenderHalInterfacesG9Kbl>((uint32_t)IGFX_GEMINILAKE);
static bool glkRegisteredDecodeHistogram =
MediaInterfacesFactory<DecodeHistogramDevice>::
RegisterHal<DecodeHistogramDeviceG9Glk>((uint32_t)IGFX_GEMINILAKE);
MOS_STATUS DecodeHistogramDeviceG9Glk::Initialize(
CodechalHwInterface *hwInterface,
PMOS_INTERFACE osInterface)
{
m_decodeHistogramDevice = MOS_New(DecodeHistogramVebox, hwInterface, osInterface);
if (m_decodeHistogramDevice == nullptr)
{
MHW_ASSERTMESSAGE("Create vebox decode histogram interfaces failed.")
return MOS_STATUS_NO_SPACE;
}
return MOS_STATUS_SUCCESS;
}