blob: da54e16b010d4691df6d58c11cba16b48aaa2e78 [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 codechal_kernel_intra_dist.cpp
//! \brief Defines the intra distortion kernel base
//! \details Intra distortion base includes all common functions and definitions for intra distortion
//!
#include "codechal_kernel_intra_dist_mdf_g12.h"
CodechalKernelIntraDistMdfG12::CodechalKernelIntraDistMdfG12(CodechalEncoderState *encoder) :
CodechalKernelBase(encoder)
{
}
CodechalKernelIntraDistMdfG12::~CodechalKernelIntraDistMdfG12()
{
ReleaseResources();
}
MOS_STATUS CodechalKernelIntraDistMdfG12::AllocateResources()
{
// no resource need to allocate
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::ReleaseResources()
{
CODECHAL_ENCODE_CHK_NULL_RETURN(m_encoder->m_cmDev);
if (m_vmeIdx)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_encoder->m_cmDev->DestroyVmeSurfaceG7_5(m_vmeIdx));
m_vmeIdx = nullptr;
}
if (m_src4xSurface)
{
m_src4xSurface->NotifyUmdResourceChanged(nullptr);
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_encoder->m_cmDev->DestroySurface(m_src4xSurface));
m_src4xSurface = nullptr;
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::InitializeKernelIsa(void *kernelIsa, uint32_t kernelIsaSize)
{
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_encoder->m_cmDev);
if (!m_cmProgram)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_encoder->m_cmDev->LoadProgram(kernelIsa,
kernelIsaSize,
m_cmProgram,
"-nojitter"));
}
if (!m_cmKrn)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_encoder->m_cmDev->CreateKernel(m_cmProgram,
"Coarse_Intra",
m_cmKrn));
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::SetCurbe(MHW_KERNEL_STATE *kernelState)
{
// Do nothing in the MDF path
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::SendSurfaces(PMOS_COMMAND_BUFFER cmd, MHW_KERNEL_STATE *kernelState)
{
// Do nothing in the MDF path
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::AddPerfTag()
{
PerfTagSetting perfTag;
perfTag.Value = 0;
perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_INTRA_DIST;
perfTag.PictureCodingType = m_pictureCodingType > 3 ? 0 : m_pictureCodingType;
m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
m_osInterface->pfnResetPerfBufferID(m_osInterface);
return MOS_STATUS_SUCCESS;
}
MHW_KERNEL_STATE *CodechalKernelIntraDistMdfG12::GetActiveKernelState()
{
// Do nothing in the MDF path
return nullptr;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::InitWalkerCodecParams(CODECHAL_WALKER_CODEC_PARAMS &walkerParam)
{
// Do nothing in the MDF path
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::SetIntraDistCurbe(Curbe& curbe)
{
curbe.m_data.DW0.picWidthInLumaSamples = m_curbeParam.downScaledWidthInMb4x << 4;
curbe.m_data.DW0.picHeightInLumaSamples = m_curbeParam.downScaledHeightInMb4x << 4;
return MOS_STATUS_SUCCESS;
}
CODECHAL_MEDIA_STATE_TYPE CodechalKernelIntraDistMdfG12::GetMediaStateType()
{
return CODECHAL_MEDIA_STATE_ENC_I_FRAME_DIST;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::SetupSurfaces()
{
CmDevice* &cmDev = m_encoder->m_cmDev;
bool currFieldPicture = CodecHal_PictureIsField(m_encoder->m_currOriginalPic);
bool currBottomField = CodecHal_PictureIsBottomField(m_encoder->m_currOriginalPic) ? true : false;
if (m_vmeIdx)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(cmDev->DestroyVmeSurfaceG7_5(m_vmeIdx));
m_vmeIdx = nullptr;
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(cmDev->UpdateSurface2D(
&m_surfaceParam.input4xDsSurface->OsResource,
m_src4xSurface));
if (currFieldPicture)
{
m_src4xSurface->SetProperty(currBottomField ? CM_BOTTOM_FIELD : CM_TOP_FIELD);
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(cmDev->CreateVmeSurfaceG7_5(
m_src4xSurface,
nullptr,
nullptr,
0,
0,
m_vmeIdx));
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::SetupKernelArgs()
{
CODECHAL_ENCODE_FUNCTION_ENTER;
int idx = 0;
Curbe curbe;
SurfaceIndex * pSurfIndex = nullptr;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetIntraDistCurbe(curbe));
m_cmKrn->SetKernelArg(idx++, sizeof(curbe), &curbe);
m_src4xSurface->GetIndex(pSurfIndex);
m_cmKrn->SetKernelArg(idx++, sizeof(SurfaceIndex), pSurfIndex);
m_surfaceParam.intraDistSurface->GetIndex(pSurfIndex);
m_cmKrn->SetKernelArg(idx++, sizeof(SurfaceIndex), pSurfIndex);
m_cmKrn->SetKernelArg(idx++, sizeof(SurfaceIndex), m_vmeIdx);
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpMDFCurbe(
CODECHAL_MEDIA_STATE_ENC_I_FRAME_DIST,
(uint8_t *)&curbe,
sizeof(curbe)));)
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalKernelIntraDistMdfG12::Execute( CurbeParam &curbeParam, SurfaceParams &surfaceParam )
{
CODECHAL_ENCODE_FUNCTION_ENTER;
MOS_SecureMemcpy(&m_curbeParam, sizeof(m_curbeParam), &curbeParam, sizeof(m_curbeParam));
MOS_SecureMemcpy(&m_surfaceParam, sizeof(m_surfaceParam), &surfaceParam, sizeof(m_surfaceParam));
CmDevice* &cmDev = m_encoder->m_cmDev;
SetupSurfaces();
AddPerfTag();
CODECHAL_ENCODE_CHK_STATUS_RETURN(cmDev->CreateThreadSpace(
m_curbeParam.downScaledWidthInMb4x,
m_curbeParam.downScaledHeightInMb4x,
m_threadSpace));
uint32_t threadCount = m_curbeParam.downScaledWidthInMb4x * m_curbeParam.downScaledHeightInMb4x;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_cmKrn->SetThreadCount(threadCount));
if (m_groupIdSelectSupported)
{
m_threadSpace->SetMediaWalkerGroupSelect((CM_MW_GROUP_SELECT)m_groupId);
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_cmKrn->AssociateThreadSpace(m_threadSpace));
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupKernelArgs());
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_encoder->m_cmTask->AddKernel(m_cmKrn));
if (!m_singleTaskPhaseSupported || m_lastTaskInPhase)
{
CmEvent * event = CM_NO_EVENT;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_encoder->m_cmQueue->EnqueueFast(m_encoder->m_cmTask, event));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_encoder->m_cmTask->Reset());
m_lastTaskInPhase = false;
}
else
{
m_encoder->m_cmTask->AddSync();
}
return MOS_STATUS_SUCCESS;
}