blob: ab1432a27fbe6ba7c18b4f10900ced48092a7535 [file] [log] [blame]
/*
* Copyright (c) 2020, 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_debug_config_manager.cpp
//! \brief Defines the dump configuration manager.
//! \details The debug interface dumps configuration manager file which parse attributes.
//!
#include "codechal_debug.h"
#include "vp_debug_interface.h"
#if USE_MEDIA_DEBUG_TOOL
#include "media_debug_config_manager.h"
#include <fstream>
#include <sstream>
MediaDebugConfigMgr::MediaDebugConfigMgr(
std::string outputFolderPath)
: m_outputFolderPath(outputFolderPath)
{
}
MediaDebugConfigMgr::~MediaDebugConfigMgr()
{
}
MOS_STATUS MediaDebugConfigMgr::ParseConfig(MOS_CONTEXT_HANDLE mosCtx)
{
std::string configFileName;
MOS_USER_FEATURE_VALUE_ID configGenerateKey = __MOS_USER_FEATURE_KEY_INVALID_ID;
configFileName = InitFileName(m_mediaFunction);
configGenerateKey = __MEDIA_USER_FEATURE_VALUE_MEDIA_DEBUG_CFG_GENERATION_ID;
configFileName = m_outputFolderPath + configFileName;
std::ifstream configStream(configFileName);
if (!configStream.good())
{
MOS_USER_FEATURE_VALUE_DATA userFeatureData;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
configGenerateKey,
&userFeatureData,
mosCtx);
if (userFeatureData.i32Data)
{
GenerateDefaultConfig(configFileName);
}
return MOS_STATUS_SUCCESS;
}
std::string line;
bool parseEnable = false;
int32_t minFrameNum = -1;
int32_t maxFrameNum = -1;
while (std::getline(configStream, line))
{
if (line.empty())
{
continue;
}
auto pos = line.find_first_not_of("\t ");
std::string newline = line.substr(pos);
if (newline[0] == '\n' || newline[0] == '#')
{
continue;
}
else if (newline[0] == '@') // parse keyword
{
if (!strncmp(newline.substr(1, 4).c_str(), "mode", 4))
{
auto pos1 = newline.find_first_not_of("\t ", 5);
if (pos1 == std::string::npos)
{
continue;
}
if ((!strncmp(newline.substr(pos1, 3).c_str(), "ALL", 3)) ||
(!strncmp(newline.substr(pos1, 6).c_str(), "encode", 6) &&
m_mediaFunction == MEDIA_FUNCTION_ENCODE) ||
(!strncmp(newline.substr(pos1, 6).c_str(), "decode", 6) &&
(m_mediaFunction == MEDIA_FUNCTION_DECODE ||
m_mediaFunction == MEDIA_FUNCTION_CENC_DECODE)) ||
(!strncmp(newline.substr(pos1, 2).c_str(), "vp", 2) &&
(m_mediaFunction == MEDIA_FUNCTION_VP)))
{
parseEnable = true;
}
else
{
parseEnable = false;
}
continue;
}
if (!parseEnable)
{
continue;
}
if (!strncmp(newline.substr(1, 5).c_str(), "Frame", 5))
{
// start with new frame config
auto pos1 = newline.find_first_not_of("\t ", 6);
if (pos1 == std::string::npos)
continue;
minFrameNum = maxFrameNum = -1;
if (!strncmp(newline.substr(pos1, 3).c_str(), "ALL", 3))
{
// coonfig applid to all frames
if (nullptr == m_debugAllConfigs)
{
m_debugAllConfigs = MOS_New(MediaDbgCfg);
}
}
else
{
auto pos2 = newline.find_first_of("-", 6);
if (pos2 != std::string::npos) // handle frame range
{
minFrameNum = std::stoi(newline.substr(pos1, pos2 - pos1));
maxFrameNum = std::stoi(newline.substr(pos2 + 1));
}
else
{
minFrameNum = maxFrameNum = std::stoi(newline.substr(pos1));
}
}
}
else if (!strncmp(newline.substr(1, 5).c_str(), "Force", 5))
{
}
else if (!strncmp(newline.substr(1, 14).c_str(), "OverwriteCurbe", 14))
{
}
else
{
if (minFrameNum < 0)
{
ParseKernelAttribs(newline, nullptr);
}
else
{
for (int32_t i = minFrameNum; i <= maxFrameNum; i++)
{
ParseKernelAttribs(newline, &m_debugFrameConfigs.at(GetFrameConfig(i)));
}
}
}
}
else if (parseEnable)
{
if (minFrameNum < 0)
{
StoreDebugAttribs(newline, nullptr);
}
else
{
for (int32_t i = minFrameNum; i <= maxFrameNum; i++)
{
StoreDebugAttribs(newline, &m_debugFrameConfigs.at(GetFrameConfig(i)));
}
}
}
}
return MOS_STATUS_SUCCESS;
}
uint32_t MediaDebugConfigMgr::GetFrameConfig(uint32_t frameIdx)
{
uint32_t pos;
for (pos = 0; pos < m_debugFrameConfigs.size(); pos++)
{
if (m_debugFrameConfigs[pos].frameIndex == frameIdx)
{
return pos;
}
}
MediaDbgCfg frameConfig;
frameConfig.frameIndex = frameIdx;
m_debugFrameConfigs.push_back(frameConfig);
return pos;
}
void MediaDebugConfigMgr::StoreDebugAttribs(std::string line, MediaDbgCfg *dbgCfg)
{
MediaDbgCfg *config = dbgCfg != nullptr ? dbgCfg : m_debugAllConfigs;
if (config == nullptr)
{
return;
}
auto delimeterPos = line.find(':');
if (delimeterPos == std::string::npos)
{
return;
}
auto attrEndPos = line.substr(0, delimeterPos).find_last_not_of("\t ");
std::string attrName = line.substr(0, attrEndPos + 1);
int32_t attrValue = std::stoi(line.substr(delimeterPos + 1));
auto it = config->cmdAttribs.find(attrName);
if (it != config->cmdAttribs.end())
{
config->cmdAttribs.erase(it);
}
config->cmdAttribs[attrName] = attrValue;
}
void MediaDebugConfigMgr::ParseKernelAttribs(std::string line, MediaDbgCfg *dbgCfg)
{
MediaDbgCfg *config = dbgCfg != nullptr ? dbgCfg : m_debugAllConfigs;
if (config == nullptr)
{
return;
}
auto kernelNameEndPos = line.find_first_of("\t ", 1);
std::string kernelName = line.substr(1, kernelNameEndPos - 1);
std::istringstream iss(line.substr(kernelNameEndPos));
do
{
std::string attrName;
iss >> attrName;
if (attrName.empty())
{
continue;
}
if (!strncmp(attrName.c_str(), "ALL", 3))
{
config->kernelAttribs[kernelName].dumpDsh = true;
config->kernelAttribs[kernelName].dumpSsh = true;
config->kernelAttribs[kernelName].dumpIsh = true;
config->kernelAttribs[kernelName].dumpCurbe = true;
config->kernelAttribs[kernelName].dumpCmdBuffer = true;
config->kernelAttribs[kernelName].dump2ndLvlBatch = true;
config->kernelAttribs[kernelName].dumpInput = true;
config->kernelAttribs[kernelName].dumpOutput = true;
break;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrDsh, sizeof(MediaDbgAttr::attrDsh) - 1))
{
config->kernelAttribs[kernelName].dumpDsh = true;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrSsh, sizeof(MediaDbgAttr::attrSsh) - 1))
{
config->kernelAttribs[kernelName].dumpSsh = true;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrIsh, sizeof(MediaDbgAttr::attrIsh) - 1))
{
config->kernelAttribs[kernelName].dumpIsh = true;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrCurbe, sizeof(MediaDbgAttr::attrCurbe) - 1))
{
config->kernelAttribs[kernelName].dumpCurbe = true;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrCmdBuffer, sizeof(MediaDbgAttr::attrCmdBuffer) - 1))
{
config->kernelAttribs[kernelName].dumpCmdBuffer = true;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attr2ndLvlBatch, sizeof(MediaDbgAttr::attr2ndLvlBatch) - 1))
{
config->kernelAttribs[kernelName].dump2ndLvlBatch = true;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrInput, sizeof(MediaDbgAttr::attrInput) - 1))
{
config->kernelAttribs[kernelName].dumpInput = true;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrOutput, sizeof(MediaDbgAttr::attrOutput) - 1))
{
config->kernelAttribs[kernelName].dumpOutput = true;
}
} while (iss);
}
MOS_STATUS MediaDebugConfigMgr::DeleteCfgNode(uint32_t frameIdx)
{
for (auto it = m_debugFrameConfigs.begin(); it != m_debugFrameConfigs.end(); it++)
{
if (it->frameIndex == frameIdx)
{
m_debugFrameConfigs.erase(it);
break;
}
}
return MOS_STATUS_SUCCESS;
}
std::string MediaDebugConfigMgr::GetMediaStateStr(MEDIA_DEBUG_STATE_TYPE mediaState)
{
MediaDbgKernel::KernelStateMap::kernelMapType &kernelMap = MediaDbgKernel::KernelStateMap::GetKernelStateMap();
auto it = kernelMap.find(mediaState);
if (it != kernelMap.end())
{
return it->second;
}
return "";
}
bool MediaDebugConfigMgr::AttrIsEnabled(std::string attrName)
{
if (nullptr != m_debugAllConfigs)
{
int attrValue = m_debugAllConfigs->cmdAttribs[attrName];
if (attrValue > 0)
{
return true;
}
}
for (auto it : m_debugFrameConfigs)
{
if (it.frameIndex == GetDumpFrameNum())
{
int attrValue = it.cmdAttribs[attrName];
return attrValue > 0;
}
}
return false;
}
bool MediaDebugConfigMgr::AttrIsEnabled(
MEDIA_DEBUG_STATE_TYPE mediaState,
std::string attrName)
{
std::string kernelName = GetMediaStateStr(mediaState);
if (kernelName.empty())
{
return false;
}
if (nullptr != m_debugAllConfigs)
{
MediaKernelDumpConfig attrs = m_debugAllConfigs->kernelAttribs[kernelName];
bool enabled = KernelAttrEnabled(attrs, attrName);
if (enabled)
{
return enabled;
}
}
for (auto it : m_debugFrameConfigs)
{
if (it.frameIndex == GetDumpFrameNum())
{
MediaKernelDumpConfig attrs = it.kernelAttribs[kernelName];
return KernelAttrEnabled(attrs, attrName);
}
}
return false;
}
bool MediaDebugConfigMgr::KernelAttrEnabled(MediaKernelDumpConfig kernelConfig, std::string attrName)
{
if (!strncmp(attrName.c_str(), MediaDbgAttr::attrDsh, sizeof(MediaDbgAttr::attrDsh) - 1))
{
return kernelConfig.dumpDsh;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrSsh, sizeof(MediaDbgAttr::attrSsh) - 1))
{
return kernelConfig.dumpSsh;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrIsh, sizeof(MediaDbgAttr::attrIsh) - 1))
{
return kernelConfig.dumpIsh;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrCurbe, sizeof(MediaDbgAttr::attrCurbe) - 1))
{
return kernelConfig.dumpCurbe;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrCmdBuffer, sizeof(MediaDbgAttr::attrCmdBuffer) - 1))
{
return kernelConfig.dumpCmdBuffer;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attr2ndLvlBatch, sizeof(MediaDbgAttr::attr2ndLvlBatch) - 1))
{
return kernelConfig.dump2ndLvlBatch;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrInput, sizeof(MediaDbgAttr::attrInput) - 1))
{
return kernelConfig.dumpInput;
}
else if (!strncmp(attrName.c_str(), MediaDbgAttr::attrOutput, sizeof(MediaDbgAttr::attrOutput) - 1))
{
return kernelConfig.dumpOutput;
}
else
return false;
}
void MediaDebugConfigMgr::GenerateDefaultConfig(std::string configFileName)
{
std::ofstream ofs(configFileName);
ofs << "###################################################################" << std::endl;
ofs << "## - White space should be agnostic." << std::endl;
ofs << "## - '#' as first non-white space char denotes line as comment" << std::endl;
ofs << "## - '@frame ALL' MUST be present as the first directive, even if " << std::endl;
ofs << "## nothing is dumped for every frame." << std::endl;
ofs << "###################################################################" << std::endl;
ofs << std::endl;
ofs << "###################################################################" << std::endl;
ofs << "## key words defined under @mode ALL works for encode decode vp" << std::endl;
ofs << "###################################################################" << std::endl;
ofs << std::endl;
ofs << "@mode ALL" << std::endl;
ofs << "@Frame ALL" << std::endl;
ofs << std::endl;
ofs << "#" << MediaDbgAttr::attrPicParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrSlcParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrSubsetsParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrIqParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrBitstream << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrHucRegions << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrHuCDmem << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrCmdBufferMfx << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attr2ndLvlBatchMfx << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrHuffmanTbl << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrScanParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDriverUltDump << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDumpBufferInBinary << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDumpToThreadFolder << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDumpCmdBufInBinary << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrStatusReport << ":0" << std::endl;
ofs << std::endl;
ofs << "##" << MediaDbgAttr::attrStreamOut << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrStreamIn << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrResidualDifference << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrDeblocking << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrMvData << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrForceYUVDumpWithMemcpy << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrDisableSwizzleForDumps << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrSfcOutputSurface << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrReferenceSurfaces << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrEncodeRawInputSurface << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrReconstructedSurface << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrPakInput << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrPakOutput << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrUpsamlingInput << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrResidualSurface << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrStCoeff << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrCoeffPredCs << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrMbRecord << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrPakObjStreamout << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrTileBasedStats << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrOverwriteCommands << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrForceCmdDumpLvl << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrForceCurbeDumpLvl << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrFrameState << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrBrcPakStats << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrCUStreamout << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrImageState << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrSliceSizeStreamout << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrCoeffProb << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrROISurface << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrHuCStitchDataBuf << ":0" << std::endl;
// MD5 attributes
ofs << "##" << MediaDbgAttr::attrMD5HashEnable << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrMD5FlushInterval << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrMD5PicWidth << ":0" << std::endl;
ofs << "##" << MediaDbgAttr::attrMD5PicHeight << ":0" << std::endl;
ofs << std::endl;
ofs << "###################################################################" << std::endl;
ofs << "## key words defined under @mode decode works for decode only" << std::endl;
ofs << "###################################################################" << std::endl;
ofs << std::endl;
ofs << "#@mode decode" << std::endl;
ofs << "#@Frame ALL" << std::endl;
ofs << std::endl;
ofs << "#" << MediaDbgAttr::attrSegmentParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrMbParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrVc1Bitplane << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrCoefProb << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrSegId << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDecodeOutputSurface << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDecodeAuxSurface << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDecodeBltOutput << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDecodeProcParams << ":0" << std::endl;
ofs << std::endl;
ofs << "###############################################################" << std::endl;
ofs << "## key words defined under @mode encode works for encode only" << std::endl;
ofs << "###############################################################" << std::endl;
ofs << std::endl;
ofs << "#@mode encode" << std::endl;
ofs << "#@Frame ALL" << std::endl;
ofs << std::endl;
ofs << "#" << MediaDbgAttr::attrFeiPicParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrSeqParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrVuiParams << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrDumpEncodePar << ":0" << std::endl;
ofs << "#" << MediaDbgAttr::attrVdencOutput << ":0" << std::endl;
ofs << std::endl;
ofs << "###############################################################" << std::endl;
ofs << "## key words defined for kernel" << std::endl;
ofs << "###############################################################" << std::endl;
// generate kernel related config
MediaDbgKernel::KernelStateMap::kernelMapType &kernelMap = MediaDbgKernel::KernelStateMap::GetKernelStateMap();
for (auto &it : kernelMap)
{
ofs << "#@" << it.second << " ALL" << std::endl;
}
ofs << std::endl;
ofs << "### Encode plug-in ###" << std::endl;
ofs << "#@force" << std::endl;
ofs << "#ForceCmpDumpLvl:3" << std::endl;
ofs << "#@OverwriteCurbe" << std::endl;
ofs << "#ForceCurbeDumpLvl:3" << std::endl;
ofs.close();
}
#endif // USE_MEDIA_DEBUG_TOOL