blob: 3b20091dd4e7f82532500bd8ac832d27b96d06d1 [file] [log] [blame]
/*
* Copyright (c) 2011-2021, 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 vphal_debug.c
//! \brief
//!
//!
//! \file vphal_debug.c
//! \brief Implementation of functions for debugging VPHAL
//! \details This file contains the Implementation of functions for
//! surface dumper, hw state dumper, perf counter dumper, and render
//! parameter dumper
//!
#if (_DEBUG || _RELEASE_INTERNAL)
#include <stdio.h>
#include "vphal.h"
#include "mhw_vebox.h"
#include "mos_os.h"
#include "vphal_debug.h"
#include "vphal_render_vebox_base.h"
#include "renderhal_platform_interface.h"
#include "ctype.h" // isupper, tolower, toupper
#define ALLOC_GRANULARITY 5000000
//==<Dump Surface>==============================================================
#define VPHAL_DBG_SURF_DUMP_OUTFILE_KEY_NAME "outfileLocation"
#define VPHAL_DBG_SURF_DUMP_LOCATION_KEY_NAME "dumpLocations"
#define VPHAL_DBG_SURF_DUMP_START_FRAME_KEY_NAME "startFrame"
#define VPHAL_DBG_SURF_DUMP_END_FRAME_KEY_NAME "endFrame"
#define VPHAL_DBG_SURF_DUMP_MAX_DATA_LEN 200
#define VPHAL_DBG_SURF_DUMP_TYPE_BACKGROUND "background"
#define VPHAL_DBG_SURF_DUMP_TYPE_PRIMARY "primary"
#define VPHAL_DBG_SURF_DUMP_TYPE_SUBSTREAM "substream"
#define VPHAL_DBG_SURF_DUMP_TYPE_REFERENCE "reference"
#define VPHAL_DBG_SURF_DUMP_TYPE_RENDERTARGET "rendertarget"
#define VPHAL_DBG_SURF_DUMP_LOC_PREALL "preall"
#define VPHAL_DBG_SURF_DUMP_LOC_PREDNDI "predndi"
#define VPHAL_DBG_SURF_DUMP_LOC_POSTDNDI "postdndi"
#define VPHAL_DBG_SURF_DUMP_LOC_PRECOMP "precomp"
#define VPHAL_DBG_SURF_DUMP_LOC_POSTCOMP "postcomp"
#define VPHAL_DBG_SURF_DUMP_LOC_PREMEMDECOMP "prememdecomp"
#define VPHAL_DBG_SURF_DUMP_LOC_POSTMEMDECOMP "postmemdecomp"
#define VPHAL_DBG_SURF_DUMP_LOC_POSTALL "postall"
#define VPHAL_DBG_STATE_DUMP_OUTFILE_KEY_NAME "outfileLocation"
#define VPHAL_DBG_STATE_DUMP_LOCATION_KEY_NAME "dumpLocations"
#define VPHAL_DBG_STATE_DUMP_START_FRAME_KEY_NAME "startFrame"
#define VPHAL_DBG_STATE_DUMP_END_FRAME_KEY_NAME "endFrame"
#define VPHAL_DBG_STATE_DUMP_LOC_DNDI "dndi"
#define VPHAL_DBG_STATE_DUMP_LOC_VEBOX "vebox"
#define VPHAL_DBG_STATE_DUMP_LOC_COMP "comp"
#define VPHAL_DBG_GSH_DUMP_TYPE "GSH"
#define VPHAL_DBG_SSH_DUMP_TYPE "SSH"
#define VPHAL_DBG_BB_DUMP_TYPE "BB"
#define VPHAL_DBG_CB_DUMP_TYPE "CB"
#define VPHAL_DBG_VEBOXSTATE_DUMP_TYPE "VeboxState"
#define VPHAL_DBG_STATISTICS_DUMP_TYPE "Statistics"
#define ALLOCLIST_SIZE 15
#define VPHAL_VEBOX_STATISTICS_SIZE_MAX (288 * 4) //!< Max Statistics size
#define MAX_DW_STRLEN 7
#define KERNEL_FIELD_NAME "Kernel"
#define VPDEBUG_VERSION "1.0"
#define XMLHEADER "<?xml version=\"1.0\"?>\r\n"
//==<Dump Render Parameters>====================================================
#define VPHAL_DBG_PARAMS_DUMP_OUTFILE_KEY_NAME "outxmlLocation"
#define VPHAL_DBG_PARAMS_DUMP_START_FRAME_KEY_NAME "startxmlFrame"
#define VPHAL_DBG_PARAMS_DUMP_END_FRAME_KEY_NAME "endxmlFrame"
void VphalDumperTool::GetOsFilePath(
const char* pcFilePath,
char* pOsFilePath)
{
MOS_SecureMemcpy(pOsFilePath, MAX_PATH, (void*)pcFilePath, strlen(pcFilePath));
}
MOS_STATUS VphalSurfaceDumper::GetPlaneDefs(
PVPHAL_SURFACE pSurface,
VPHAL_DBG_SURF_DUMP_SURFACE_DEF *pPlanes,
uint32_t *pdwNumPlanes,
uint32_t *pdwSize,
bool auxEnable,
bool isDeswizzled)
{
MOS_STATUS eStatus;
uint32_t i;
bool PaddingEnable = false;
eStatus = MOS_STATUS_SUCCESS;
// Caller should supply this much!
MOS_ZeroMemory(pPlanes, sizeof(VPHAL_DBG_SURF_DUMP_SURFACE_DEF) * 3);
switch (pSurface->Format)
{
case Format_AI44:
case Format_IA44:
case Format_A4L4:
case Format_P8:
case Format_L8:
case Format_A8:
case Format_Buffer:
case Format_STMM:
case Format_IRW4:
case Format_IRW5:
case Format_IRW6:
case Format_IRW7:
case Format_RAW:
case Format_Y8:
*pdwNumPlanes = 1;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
break;
case Format_R5G6B5:
case Format_A8P8:
case Format_A8L8:
case Format_YUY2:
case Format_YUYV:
case Format_YVYU:
case Format_UYVY:
case Format_VYUY:
case Format_IRW0:
case Format_IRW1:
case Format_IRW2:
case Format_IRW3:
case Format_V8U8:
case Format_R16F:
case Format_Y16S:
case Format_Y16U:
*pdwNumPlanes = 1;
pPlanes[0].dwWidth = pSurface->dwWidth * 2;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
break;
case Format_R32U:
case Format_R32F:
case Format_A8R8G8B8:
case Format_X8R8G8B8:
case Format_A8B8G8R8:
case Format_X8B8G8R8:
case Format_R8G8B8:
case Format_AYUV:
case Format_AUYV:
case Format_R10G10B10A2:
case Format_B10G10R10A2:
case Format_Y410:
*pdwNumPlanes = 1;
pPlanes[0].dwWidth = pSurface->dwWidth * 4;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
break;
case Format_Y416:
case Format_A16B16G16R16:
case Format_A16R16G16B16:
case Format_A16B16G16R16F:
case Format_A16R16G16B16F:
*pdwNumPlanes = 1;
pPlanes[0].dwWidth = pSurface->dwWidth * 8;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
break;
case Format_NV12:
*pdwNumPlanes = 2;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[1].dwPitch = pSurface->dwPitch;
break;
case Format_P010:
case Format_P016:
*pdwNumPlanes = 2;
pPlanes[0].dwWidth = pSurface->dwWidth * 2;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[1].dwPitch = pSurface->dwPitch;
break;
case Format_IMC2:
case Format_IMC4:
*pdwNumPlanes = 2;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
break;
case Format_YVU9:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth / 4;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 4;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
pPlanes[2].dwWidth = pPlanes[0].dwWidth / 4;
pPlanes[2].dwHeight = pPlanes[0].dwHeight / 4;
pPlanes[2].dwPitch = pPlanes[0].dwPitch;
break;
case Format_IMC1:
case Format_IMC3:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth / 2;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
pPlanes[2].dwWidth = pPlanes[0].dwWidth / 2;
pPlanes[2].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[2].dwPitch = pPlanes[0].dwPitch;
break;
case Format_I420:
case Format_IYUV:
case Format_YV12:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth / 2;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[1].dwPitch = pPlanes[0].dwPitch / 2;
pPlanes[2].dwWidth = pPlanes[0].dwWidth / 2;
pPlanes[2].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[2].dwPitch = pPlanes[0].dwPitch / 2;
break;
case Format_400P:
*pdwNumPlanes = 1;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
break;
case Format_411P:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth / 4;
pPlanes[1].dwHeight = pPlanes[0].dwHeight;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
pPlanes[2].dwWidth = pPlanes[0].dwWidth / 4;
pPlanes[2].dwHeight = pPlanes[0].dwHeight;
pPlanes[2].dwPitch = pPlanes[0].dwPitch;
break;
case Format_411R:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 4;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
pPlanes[2].dwWidth = pPlanes[0].dwWidth;
pPlanes[2].dwHeight = pPlanes[0].dwHeight / 4;
pPlanes[2].dwPitch = pPlanes[0].dwPitch;
break;
case Format_422H:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth / 2;
pPlanes[1].dwHeight = pPlanes[0].dwHeight;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
pPlanes[2].dwWidth = pPlanes[0].dwWidth / 2;
pPlanes[2].dwHeight = pPlanes[0].dwHeight;
pPlanes[2].dwPitch = pPlanes[0].dwPitch;
break;
case Format_422V:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth;
pPlanes[1].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
pPlanes[2].dwWidth = pPlanes[0].dwWidth;
pPlanes[2].dwHeight = pPlanes[0].dwHeight / 2;
pPlanes[2].dwPitch = pPlanes[0].dwPitch;
break;
case Format_444P:
case Format_RGBP:
case Format_BGRP:
*pdwNumPlanes = 3;
pPlanes[0].dwWidth = pSurface->dwWidth;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pPlanes[0].dwWidth;
pPlanes[1].dwHeight = pPlanes[0].dwHeight;
pPlanes[1].dwPitch = pPlanes[0].dwPitch;
pPlanes[2].dwWidth = pPlanes[0].dwWidth;
pPlanes[2].dwHeight = pPlanes[0].dwHeight;
pPlanes[2].dwPitch = pPlanes[0].dwPitch;
break;
case Format_Y210:
case Format_Y216:
*pdwNumPlanes = 1;
pPlanes[0].dwWidth = pSurface->dwWidth * 4;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
break;
case Format_P210:
case Format_P216:
*pdwNumPlanes = 2;
pPlanes[0].dwWidth = pSurface->dwWidth * 2;
pPlanes[0].dwHeight = pSurface->dwHeight;
pPlanes[0].dwPitch = pSurface->dwPitch;
pPlanes[1].dwWidth = pSurface->dwWidth * 2;
pPlanes[1].dwHeight = pSurface->dwHeight;
pPlanes[1].dwPitch = pSurface->dwPitch;
break;
default:
VPHAL_DEBUG_ASSERTMESSAGE("Format '%d' not supported.", pSurface->Format);
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
}
// For Deswizzled surfaces, Mos_Specific_LockResource() already do the de-padding between Y and UV surf.
// so, don't use the info of U/V PlaneOffset, as the padding is already removed.
for (i = 0; i < *pdwNumPlanes; i++)
{
switch (i)
{
case 0:
pPlanes[i].dwOffset = pSurface->YPlaneOffset.iSurfaceOffset +
(pSurface->YPlaneOffset.iYOffset * pSurface->dwPitch) +
pSurface->YPlaneOffset.iXOffset;
break;
case 1:
if (pSurface->Format == Format_YV12)
{
pPlanes[i].dwOffset = (isDeswizzled ? pPlanes[0].dwPitch * pPlanes[0].dwHeight + pPlanes[0].dwOffset : pSurface->VPlaneOffset.iSurfaceOffset) +
(pSurface->VPlaneOffset.iYOffset * pSurface->dwPitch) +
pSurface->VPlaneOffset.iXOffset;
}
else
{
pPlanes[i].dwOffset = (isDeswizzled ? pPlanes[0].dwPitch * pPlanes[0].dwHeight + pPlanes[0].dwOffset : pSurface->UPlaneOffset.iSurfaceOffset) +
(pSurface->UPlaneOffset.iYOffset * pSurface->dwPitch) +
pSurface->UPlaneOffset.iXOffset;
}
break;
case 2:
if (pSurface->Format == Format_YV12)
{
pPlanes[i].dwOffset = (isDeswizzled ? pPlanes[1].dwOffset + pPlanes[1].dwPitch * pPlanes[1].dwHeight : pSurface->UPlaneOffset.iSurfaceOffset) +
(pSurface->UPlaneOffset.iYOffset * pSurface->dwPitch) +
pSurface->UPlaneOffset.iXOffset;
}
else
{
pPlanes[i].dwOffset = (isDeswizzled ? pPlanes[1].dwOffset + pPlanes[1].dwPitch * pPlanes[1].dwHeight : pSurface->VPlaneOffset.iSurfaceOffset) +
(pSurface->VPlaneOffset.iYOffset * pSurface->dwPitch) +
pSurface->VPlaneOffset.iXOffset;
}
break;
default:
VPHAL_DEBUG_ASSERTMESSAGE("More than 3 planes not supported.");
}
}
//compressed surface need 32 align on height
if (auxEnable && !isDeswizzled)
{
for (i = 0; i < *pdwNumPlanes; i++)
{
pPlanes[i].dwHeight = MOS_ALIGN_CEIL(pPlanes[i].dwHeight, 32);
}
}
// For uncompressed surface, padding data is not needed. For compressed surface, padding data is needed for offline check
if (auxEnable)
{
*pdwSize = (pPlanes[0].dwPitch * pPlanes[0].dwHeight) +
(pPlanes[1].dwPitch * pPlanes[1].dwHeight) +
(pPlanes[2].dwPitch * pPlanes[2].dwHeight);
}
else
{
*pdwSize = (pPlanes[0].dwWidth * pPlanes[0].dwHeight) +
(pPlanes[1].dwWidth * pPlanes[1].dwHeight) +
(pPlanes[2].dwWidth * pPlanes[2].dwHeight);
}
finish:
return eStatus;
}
bool VphalSurfaceDumper::HasAuxSurf(
PMOS_RESOURCE osResource)
{
bool hasAuxSurf = false;
#if !EMUL
GMM_RESOURCE_FLAG gmmFlags;
MOS_ZeroMemory(&gmmFlags, sizeof(gmmFlags));
gmmFlags = osResource->pGmmResInfo->GetResFlags();
hasAuxSurf = (gmmFlags.Gpu.MMC && gmmFlags.Gpu.UnifiedAuxSurface) ||
(gmmFlags.Gpu.CCS && gmmFlags.Gpu.UnifiedAuxSurface && gmmFlags.Info.MediaCompressed);
#endif
return hasAuxSurf;
}
MOS_STATUS VphalSurfaceDumper::DumpSurfaceToFile(
PMOS_INTERFACE pOsInterface,
PVPHAL_SURFACE pSurface,
const char *psPathPrefix,
uint64_t iCounter,
bool bLockSurface,
bool bNoDecompWhenLock,
uint8_t* pData)
{
MOS_STATUS eStatus;
bool isSurfaceLocked;
char sPath[MAX_PATH], sOsPath[MAX_PATH];
uint8_t *pDst, *pTmpSrc, *pTmpDst;
uint32_t dwNumPlanes, dwSize, j, i;
VPHAL_DBG_SURF_DUMP_SURFACE_DEF planes[3];
uint32_t dstPlaneOffset[3] = {0};
MOS_LOCK_PARAMS LockFlags;
MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData;
bool hasAuxSurf;
bool enableAuxDump;
bool enablePlaneDump = false;
PMOS_RESOURCE pLockedResource = nullptr;
VPHAL_DEBUG_ASSERT(pSurface);
VPHAL_DEBUG_ASSERT(pOsInterface);
VPHAL_DEBUG_ASSERT(psPathPrefix);
eStatus = MOS_STATUS_SUCCESS;
isSurfaceLocked = false;
hasAuxSurf = false;
pDst = nullptr;
enableAuxDump = m_dumpSpec.enableAuxDump;
MOS_ZeroMemory(sPath, MAX_PATH);
MOS_ZeroMemory(sOsPath, MAX_PATH);
dwNumPlanes = 0;
enablePlaneDump = m_dumpSpec.enablePlaneDump;
if (pSurface->dwDepth == 0)
{
pSurface->dwDepth = 1;
}
hasAuxSurf = HasAuxSurf(&pSurface->OsResource);
// get plane definitions
VPHAL_DEBUG_CHK_STATUS(GetPlaneDefs(
pSurface,
planes,
&dwNumPlanes,
&dwSize,
hasAuxSurf, //(hasAuxSurf && enableAuxDump),
!enableAuxDump));// !(hasAuxSurf && enableAuxDump)));
if (bLockSurface)
{
// Caller should not give pData when it expect the function to lock surf
VPHAL_DEBUG_ASSERT(pData = nullptr);
LockFlags.Value = 0;
LockFlags.ReadOnly = 1;
// If aux data exist and enable aux dump, no swizzle and no decompress
if (hasAuxSurf && enableAuxDump)
{
LockFlags.TiledAsTiled = 1;
LockFlags.NoDecompress = 1;
}
if (bNoDecompWhenLock)
{
LockFlags.NoDecompress = 1;
}
bool isPlanar = false;
isPlanar = (pSurface->Format == Format_NV12) || (pSurface->Format == Format_P010) || (pSurface->Format == Format_P016);
if (isPlanar && pSurface->TileType != MOS_TILE_LINEAR)
{
bool bAllocated;
PVPHAL_SURFACE m_temp2DSurfForCopy = (PVPHAL_SURFACE)MOS_AllocAndZeroMemory(sizeof(VPHAL_SURFACE));
VPHAL_RENDER_CHK_STATUS(VpHal_ReAllocateSurface(
pOsInterface,
m_temp2DSurfForCopy,
"Temp2DSurfForSurfDumper",
pSurface->Format,
MOS_GFXRES_2D,
MOS_TILE_LINEAR,
pSurface->dwWidth,
pSurface->dwHeight,
false,
MOS_MMC_DISABLED,
&bAllocated));
m_osInterface->pfnDoubleBufferCopyResource(
m_osInterface,
&pSurface->OsResource,
&m_temp2DSurfForCopy->OsResource,
false);
pData = (uint8_t *)pOsInterface->pfnLockResource(
pOsInterface,
&m_temp2DSurfForCopy->OsResource,
&LockFlags);
pLockedResource = &m_temp2DSurfForCopy->OsResource;
// get plane definitions
VPHAL_DEBUG_CHK_STATUS(GetPlaneDefs(
m_temp2DSurfForCopy,
planes,
&dwNumPlanes,
&dwSize,
hasAuxSurf, //(hasAuxSurf && enableAuxDump),
!enableAuxDump)); // !(hasAuxSurf && enableAuxDump)));
}
else
{
pData = (uint8_t *)pOsInterface->pfnLockResource(
pOsInterface,
&pSurface->OsResource,
&LockFlags);
pLockedResource = &pSurface->OsResource;
}
VPHAL_DEBUG_CHK_NULL(pData);
// Write error to user feauture key
MOS_ZeroMemory(&UserFeatureWriteData, sizeof(UserFeatureWriteData));
UserFeatureWriteData.Value.u32Data = 1;
UserFeatureWriteData.ValueID = __VPHAL_DBG_SURF_DUMPER_RESOURCE_LOCK_ID;
eStatus = MOS_UserFeature_WriteValues_ID(
nullptr,
&UserFeatureWriteData,
1,
pOsInterface->pOsContext);
VPHAL_DEBUG_ASSERT(eStatus == MOS_STATUS_SUCCESS);
isSurfaceLocked = true;
}
MOS_SecureStringPrint(
sPath,
MAX_PATH,
sizeof(sPath),
"%s_f[%03lld]_w[%d]_h[%d]_p[%d].%s",
psPathPrefix,
iCounter,
pSurface->dwWidth,
pSurface->dwHeight,
pSurface->dwPitch,
VphalDumperTool::GetFormatStr(pSurface->Format));
VphalDumperTool::GetOsFilePath(sPath, sOsPath);
pDst = (uint8_t*)MOS_AllocAndZeroMemory(dwSize);
VPHAL_DEBUG_CHK_NULL(pDst);
VPHAL_DEBUG_CHK_NULL(pData);
pTmpSrc = pData;
pTmpDst = pDst;
for (j = 0; j < dwNumPlanes; j++)
{
pTmpSrc = pData + planes[j].dwOffset;
for (i = 0; i < planes[j].dwHeight; i++)
{
if (hasAuxSurf && enableAuxDump)
{
MOS_SecureMemcpy(
pTmpDst,
planes[j].dwPitch,
pTmpSrc,
planes[j].dwPitch);
pTmpSrc += planes[j].dwPitch;
pTmpDst += planes[j].dwPitch;
dstPlaneOffset[j+1] += planes[j].dwPitch;
}
else
{
MOS_SecureMemcpy(
pTmpDst,
planes[j].dwWidth,
pTmpSrc,
planes[j].dwWidth);
pTmpSrc += planes[j].dwPitch;
pTmpDst += planes[j].dwWidth;
dstPlaneOffset[j+1] += planes[j].dwWidth;
}
}
//if more than 1 plane, dump each plane's surface for offline analysis
if (enablePlaneDump)
{
if ((dwNumPlanes > 1) && (dwNumPlanes <= 3))
{
char sPlanePath[MAX_PATH], sPlaneOsPath[MAX_PATH];
MOS_ZeroMemory(sPlanePath, MAX_PATH);
MOS_ZeroMemory(sPlaneOsPath, MAX_PATH);
MOS_SecureStringPrint(
sPlanePath,
MAX_PATH,
sizeof(sPlanePath),
"%s_f[%03lld]_w[%d]_h[%d]_p[%d].%s",
psPathPrefix,
iCounter,
planes[j].dwWidth,
planes[j].dwHeight,
planes[j].dwPitch,
(j == 0 ? "Y" : ((dwNumPlanes == 2) ? "UV" : ((j == 1) ? "U" : "V"))));
VphalDumperTool::GetOsFilePath(sPlanePath, sPlaneOsPath);
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(sPlaneOsPath, pDst + dstPlaneOffset[j], dstPlaneOffset[j + 1]));
}
else
{
VPHAL_DEBUG_ASSERTMESSAGE("More than 3 planes not supported during plane dump.");
}
}
}
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(sOsPath, pDst, dwSize));
#if !EMUL
// Dump Aux surface data
if (hasAuxSurf && enableAuxDump)
{
uint32_t resourceIndex;
bool isPlanar;
uint8_t *auxDataY;
uint8_t *auxDataUV;
uint32_t auxSizeY;
uint32_t auxSizeUV;
uint8_t *pSurfaceBase;
resourceIndex = 0;
pSurfaceBase = pData;
isPlanar = (pOsInterface->pfnGetGmmClientContext(pOsInterface)->IsPlanar(pSurface->OsResource.pGmmResInfo->GetResourceFormat()) != 0);
auxDataY = (uint8_t*)pSurfaceBase + pSurface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_Y_CCS);
auxDataUV = (uint8_t*)pSurfaceBase + pSurface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_UV_CCS);
if (isPlanar)
{
auxSizeY = (uint32_t)(pSurface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_UV_CCS) -
pSurface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_Y_CCS));
}else
{
auxSizeY = (uint32_t)(pSurface->OsResource.pGmmResInfo->GetSizeAuxSurface(GMM_AUX_CCS));
}
auxSizeUV = (uint32_t)(pSurface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_COMP_STATE) -
pSurface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_UV_CCS));
if (auxSizeUV == 0)
{
auxSizeUV = (uint32_t)(pSurface->OsResource.pGmmResInfo->GetSizeAuxSurface(GMM_AUX_SURF)) /
(pSurface->OsResource.pGmmResInfo)->GetArraySize() - auxSizeY;
}
// Dump Y Aux data
MOS_SecureStringPrint(
sPath,
MAX_PATH,
sizeof(sPath),
"%s_f[%03lld]_w[%d]_h[%d]_p[%d].Yaux",
psPathPrefix,
iCounter,
pSurface->dwWidth,
pSurface->dwHeight,
pSurface->dwPitch);
VphalDumperTool::GetOsFilePath(sPath, sOsPath);
uint8_t *pDstAux = (uint8_t*)MOS_AllocAndZeroMemory(auxSizeY);
VPHAL_DEBUG_CHK_NULL(pDstAux);
MOS_SecureMemcpy(
pDstAux,
auxSizeY,
auxDataY,
auxSizeY);
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(sOsPath, pDstAux, auxSizeY));
MOS_SafeFreeMemory(pDstAux);
if (auxSizeUV && isPlanar)
{
// Dump UV Aux data
MOS_SecureStringPrint(
sPath,
MAX_PATH,
sizeof(sPath),
"%s_f[%03lld]_w[%d]_h[%d]_p[%d].UVaux",
psPathPrefix,
iCounter,
pSurface->dwWidth,
pSurface->dwHeight,
pSurface->dwPitch);
VphalDumperTool::GetOsFilePath(sPath, sOsPath);
uint8_t *pDstUVAux = (uint8_t*)MOS_AllocAndZeroMemory(auxSizeUV);
VPHAL_DEBUG_CHK_NULL(pDstUVAux);
MOS_SecureMemcpy(
pDstUVAux,
auxSizeUV,
auxDataUV,
auxSizeUV);
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(sOsPath, pDstUVAux, auxSizeUV));
MOS_SafeFreeMemory(pDstUVAux);
}
}
#endif
finish:
MOS_SafeFreeMemory(pDst);
if (isSurfaceLocked && pLockedResource != nullptr)
{
eStatus = (MOS_STATUS)pOsInterface->pfnUnlockResource(pOsInterface, pLockedResource);
VPHAL_DEBUG_ASSERT(eStatus == MOS_STATUS_SUCCESS);
}
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DefGsh(
VPHAL_DBG_FIELD_LAYOUT* *ppGshLayout,
uint32_t* puiNumGSHFields)
{
MOS_STATUS eStatus;
PRENDERHAL_STATE_HEAP pStateHeap;
PRENDERHAL_STATE_HEAP_SETTINGS pStateHeapSettings;
uint32_t i;
uint32_t j;
// MEDIA STATE LAYOUT
VPHAL_DBG_FIELD_LAYOUT* pmediaStateLayout;
uint32_t uiNumMediaStateFields;
// GSH SAMPLER STATE LAYOUT
VPHAL_DBG_FIELD_LAYOUT* psamplerStateLayout;
uint32_t uiNumSamplerStateFields;
eStatus = MOS_STATUS_SUCCESS;
pStateHeap = m_stateHeap;
pStateHeapSettings = m_stateHeapSettings;
// GSH LAYOUT
*puiNumGSHFields = 4;
(*ppGshLayout) = (VPHAL_DBG_FIELD_LAYOUT*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_FIELD_LAYOUT) *
(*puiNumGSHFields));
VPHAL_DEBUG_CHK_NULL((*ppGshLayout));
i = 0;
MOS_SecureStringPrint((*ppGshLayout)[i].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Sync/Perf Tags (SY)");
(*ppGshLayout)[i].dwOffset = pStateHeap->dwOffsetSync;
(*ppGshLayout)[i].dwSize = pStateHeap->dwSizeSync;
(*ppGshLayout)[i].uiNumber = 1;
(*ppGshLayout)[i].pChildLayout = nullptr;
(*ppGshLayout)[i].uiNumChildren = 0;
MOS_SecureStringPrint((*ppGshLayout)[i++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "");
MOS_SecureStringPrint((*ppGshLayout)[i].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Media State");
(*ppGshLayout)[i].dwOffset = pStateHeap->pMediaStates->dwOffset;
(*ppGshLayout)[i].dwSize = pStateHeap->dwOffsetMediaID +
pStateHeapSettings->iMediaIDs *
pStateHeap->dwSizeMediaID;
(*ppGshLayout)[i].uiNumber = pStateHeapSettings->iMediaStateHeaps;
// MEDIA STATE LAYOUT -- Indented to make hierarchy clear
{
uiNumMediaStateFields = 6;
pmediaStateLayout = (VPHAL_DBG_FIELD_LAYOUT*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_FIELD_LAYOUT) *
uiNumMediaStateFields);
VPHAL_DEBUG_CHK_NULL(pmediaStateLayout);
j = 0;
MOS_SecureStringPrint(pmediaStateLayout[j].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "CURBE Data");
pmediaStateLayout[j].dwOffset = pStateHeap->dwOffsetCurbe;
pmediaStateLayout[j].dwSize = pStateHeap->dwSizeCurbe;
pmediaStateLayout[j].uiNumber = 1;
pmediaStateLayout[j].pChildLayout = nullptr;
pmediaStateLayout[j].uiNumChildren = 0;
MOS_SecureStringPrint(pmediaStateLayout[j++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "");
MOS_SecureStringPrint(pmediaStateLayout[j].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Sampler States for MID");
pmediaStateLayout[j].dwOffset = pStateHeap->dwOffsetSampler;
pmediaStateLayout[j].dwSize = m_hwSizes->dwSizeSamplerState *
pStateHeapSettings->iSamplers;
pmediaStateLayout[j].uiNumber = pStateHeapSettings->iMediaIDs;
// GSH SAMPLER STATE LAYOUT -- Indented to make hierarchy clear
{
uiNumSamplerStateFields = 1;
psamplerStateLayout = (VPHAL_DBG_FIELD_LAYOUT*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_FIELD_LAYOUT) * uiNumSamplerStateFields);
VPHAL_DEBUG_CHK_NULL(psamplerStateLayout);
MOS_SecureStringPrint(psamplerStateLayout[0].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Sampler State");
psamplerStateLayout[0].dwOffset = 0;
psamplerStateLayout[0].dwSize = m_hwSizes->dwSizeSamplerState;
psamplerStateLayout[0].uiNumber = pStateHeapSettings->iSamplers;
psamplerStateLayout[0].pChildLayout = nullptr;
psamplerStateLayout[0].uiNumChildren = 0;
MOS_SecureStringPrint(psamplerStateLayout[0].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SAMPLER_STATE_");
}
pmediaStateLayout[j].pChildLayout = psamplerStateLayout;
pmediaStateLayout[j].uiNumChildren = uiNumSamplerStateFields;
MOS_SecureStringPrint(pmediaStateLayout[j++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "");
MOS_SecureStringPrint(pmediaStateLayout[j].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Sampler 8x8 Table");
pmediaStateLayout[j].dwOffset = pStateHeap->dwOffsetSamplerAVS;
pmediaStateLayout[j].dwSize = pStateHeap->dwSizeSamplerAVS;
pmediaStateLayout[j].uiNumber = pStateHeapSettings->iSamplersAVS;
pmediaStateLayout[j].pChildLayout = nullptr;
pmediaStateLayout[j].uiNumChildren = 0;
MOS_SecureStringPrint(pmediaStateLayout[j++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SAMPLER_8x8_STATE_TABLE_");
MOS_SecureStringPrint(pmediaStateLayout[j].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Media ID");
pmediaStateLayout[j].dwOffset = pStateHeap->dwOffsetMediaID;
pmediaStateLayout[j].dwSize = pStateHeap->dwSizeMediaID;
pmediaStateLayout[j].uiNumber = pStateHeapSettings->iMediaIDs;
pmediaStateLayout[j].pChildLayout = nullptr;
pmediaStateLayout[j].uiNumChildren = 0;
MOS_SecureStringPrint(pmediaStateLayout[j++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_INTERFACE_DESCRIPTOR_DATA_");
}
(*ppGshLayout)[i].pChildLayout = pmediaStateLayout;
(*ppGshLayout)[i].uiNumChildren = uiNumMediaStateFields;
MOS_SecureStringPrint((*ppGshLayout)[i++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "");
MOS_SecureStringPrint((*ppGshLayout)[i].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Kernel");
(*ppGshLayout)[i].dwOffset = pStateHeap->dwKernelBase;
(*ppGshLayout)[i].dwSize = pStateHeap->iKernelSize / pStateHeapSettings->iKernelCount;
(*ppGshLayout)[i].uiNumber = pStateHeapSettings->iKernelCount;
(*ppGshLayout)[i].pChildLayout = nullptr;
(*ppGshLayout)[i].uiNumChildren = 0;
MOS_SecureStringPrint((*ppGshLayout)[i++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "");
finish:
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DefSsh(
VPHAL_DBG_FIELD_LAYOUT* *ppSshLayout,
uint32_t* puiNumSSHFields)
{
MOS_STATUS eStatus;
PRENDERHAL_STATE_HEAP pStateHeap;
PRENDERHAL_STATE_HEAP_SETTINGS pStateHeapSettings;
uint32_t i;
int32_t k;
// BINDING TABLE LAYOUT
VPHAL_DBG_FIELD_LAYOUT* pbtLayout;
uint32_t uiNumBTFields;
eStatus = MOS_STATUS_SUCCESS;
pStateHeap = m_stateHeap;
pStateHeapSettings = m_stateHeapSettings;
// SSH LAYOUT
(*puiNumSSHFields) = 1 + pStateHeapSettings->iSurfaceStates;
(*ppSshLayout) = (VPHAL_DBG_FIELD_LAYOUT*)MOS_AllocAndZeroMemory(sizeof(VPHAL_DBG_FIELD_LAYOUT) *
(*puiNumSSHFields));
VPHAL_DEBUG_CHK_NULL((*ppSshLayout));
i = 0;
MOS_SecureStringPrint((*ppSshLayout)[i].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Binding Table");
(*ppSshLayout)[i].dwOffset = pStateHeap->iBindingTableOffset;
(*ppSshLayout)[i].dwSize = pStateHeap->iBindingTableSize;
(*ppSshLayout)[i].uiNumber = pStateHeapSettings->iBindingTables;
// BINDING TABLE LAYOUT -- Indented to make hierarchy clear
{
pbtLayout = (VPHAL_DBG_FIELD_LAYOUT*)MOS_AllocAndZeroMemory(sizeof(VPHAL_DBG_FIELD_LAYOUT) * 1);
VPHAL_DEBUG_CHK_NULL(pbtLayout);
uiNumBTFields = 1;
MOS_SecureStringPrint(pbtLayout[0].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Binding Index");
pbtLayout[0].dwOffset = pStateHeap->iBindingTableOffset;
pbtLayout[0].dwSize = pStateHeap->iBindingTableSize / pStateHeapSettings->iSurfacesPerBT;
pbtLayout[0].uiNumber = pStateHeapSettings->iSurfacesPerBT;
pbtLayout[0].pChildLayout = nullptr;
pbtLayout[0].uiNumChildren = 0;
MOS_SecureStringPrint(pbtLayout[0].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_BINDING_TABLE_STATE_");
}
(*ppSshLayout)[i].pChildLayout = pbtLayout;
(*ppSshLayout)[i].uiNumChildren = 1;
MOS_SecureStringPrint((*ppSshLayout)[i++].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "");
for (k = 0; k < pStateHeapSettings->iSurfaceStates; k++)
{// Not indented to make hierarchy levels clear
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcName, MAX_NAME_LEN, MAX_NAME_LEN, "Surface State %d", k);
(*ppSshLayout)[i+k].dwOffset = pStateHeap->iSurfaceStateOffset +
m_renderHal->pRenderHalPltInterface->GetSurfaceStateCmdSize() * k;
(*ppSshLayout)[i+k].dwSize = m_renderHal->pRenderHalPltInterface->GetSurfaceStateCmdSize();
(*ppSshLayout)[i+k].uiNumber = 1;
(*ppSshLayout)[i+k].pChildLayout = nullptr;
(*ppSshLayout)[i+k].uiNumChildren = 0;
switch(pStateHeap->pSurfaceEntry[k].Type)
{
case RENDERHAL_SURFACE_TYPE_G8:
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SURFACE_STATE_G8");
break;
case RENDERHAL_SURFACE_TYPE_G9:
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SURFACE_STATE_G9");
break;
case RENDERHAL_SURFACE_TYPE_G10:
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SURFACE_STATE_G10");
break;
case RENDERHAL_SURFACE_TYPE_ADV_G8:
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SURFACE_STATE_ADV_G8");
break;
case RENDERHAL_SURFACE_TYPE_ADV_G9:
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SURFACE_STATE_ADV_G9");
break;
case RENDERHAL_SURFACE_TYPE_ADV_G10:
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "_SURFACE_STATE_ADV_G10");
break;
case RENDERHAL_SURFACE_TYPE_INVALID:
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "No surface");
break;
default:
// When type is zero, its un-initialized, so just show string of DW
VPHAL_DEBUG_ASSERT(0);
MOS_SecureStringPrint((*ppSshLayout)[i+k].pcStructName, MAX_NAME_LEN, MAX_NAME_LEN, "");
break;
} // Not indented to make hierarchy clear
}
finish:
return eStatus;
}
void VphalHwStateDumper::FreeLayout(
VPHAL_DBG_FIELD_LAYOUT *pLayout,
uint32_t uiNumFields)
{
uint32_t i;
for (i = 0; i < uiNumFields; i++)
{
if (pLayout[i].pChildLayout != nullptr)
{
FreeLayout(pLayout[i].pChildLayout, pLayout[i].uiNumChildren);
}
}
MOS_SafeFreeMemory(pLayout);
}
MOS_STATUS VphalHwStateDumper::DumpXmlFieldHeader(
char **ppcOutContents,
char *pcName,
uint32_t ulLoc,
uint32_t ulSize,
bool bIsByte,
bool bHasCont,
bool bStruct)
{
MOS_STATUS eStatus;
MOS_UNUSED(bHasCont);
eStatus = MOS_STATUS_SUCCESS;
if (!ppcOutContents)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, ppcOutContents,
"<FIELD%s><NAME>%s</NAME><LOC>0x%x</LOC><SIZE unit=\"%s\">0x%x</SIZE>\r\n",
bStruct ? " struct=\"TRUE\"" : "", pcName, ulLoc,
bIsByte ? "byte" : "bit", ulSize));
finish:
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpXmlFieldFooter(
char **ppcOutContents,
bool bHasCont)
{
MOS_STATUS eStatus;
MOS_UNUSED(bHasCont);
eStatus = MOS_STATUS_SUCCESS;
if (!ppcOutContents)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, ppcOutContents, "</FIELD>\r\n"));
finish:
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpDwords(
char **ppcOutContents,
uint32_t dwSizeField)
{
MOS_STATUS eStatus;
char* pcName;
int32_t iNumFields;
int32_t iDWSize;
int32_t iOffset;
int32_t i;
eStatus = MOS_STATUS_SUCCESS;
pcName = nullptr;
iNumFields = 0;
iDWSize = 0;
iOffset = 0;
i = 0;
if (!ppcOutContents)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
VPHAL_DEBUG_ASSERT(dwSizeField % sizeof(uint32_t) == 0);
pcName = (char*)MOS_AllocAndZeroMemory(MAX_DW_STRLEN);
VPHAL_DEBUG_CHK_NULL(pcName);
iNumFields = MOS_BYTES_TO_DWORDS(dwSizeField);//Change macro to >> 2 if optimizer doesn't
iDWSize = sizeof(uint32_t);
for (i = 0; i < iNumFields; i++)
{
MOS_SecureStringPrint(pcName, MAX_DW_STRLEN, MAX_DW_STRLEN, "DW%d", i);
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldHeader(ppcOutContents, pcName, iOffset,
iDWSize, true, false, false));
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldFooter(ppcOutContents, false));;
iOffset += iDWSize;
}
finish:
MOS_SafeFreeMemory(pcName);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpFieldHeap(
char **ppcOutContents,
VPHAL_DBG_FIELD_LAYOUT *parLayout)
{
MOS_STATUS eStatus;
char* pcName;
int32_t iOffset;
uint32_t i;
eStatus = MOS_STATUS_SUCCESS;
pcName = nullptr;
iOffset = 0;
i = 0;
if (!ppcOutContents || !parLayout)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
pcName = (char*)MOS_AllocAndZeroMemory(MAX_NAME_LEN);
VPHAL_DEBUG_CHK_NULL(pcName);
// For each instance of this field type
for (i = 0; i < parLayout->uiNumber; i++)
{
MOS_SecureStringPrint(pcName, MAX_NAME_LEN, MAX_NAME_LEN, "%s %d", parLayout->pcName, i);
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldHeader(ppcOutContents, pcName, iOffset,
parLayout->dwSize, true, true,
false));
VPHAL_DEBUG_CHK_STATUS(DumpSubfields(ppcOutContents, parLayout, parLayout->pChildLayout,
parLayout->uiNumChildren));
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldFooter(ppcOutContents, true));
iOffset += parLayout->dwSize;
}
finish:
MOS_SafeFreeMemory(pcName);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpSubfields(
char **ppcOutContents,
VPHAL_DBG_FIELD_LAYOUT* pParLayout,
VPHAL_DBG_FIELD_LAYOUT* pChildLayout,
uint32_t uiNumChild)
{
MOS_STATUS eStatus;
uint32_t i;
eStatus = MOS_STATUS_SUCCESS;
i = 0;
if (!ppcOutContents || (!pParLayout && uiNumChild == 0) ||
(!pChildLayout && uiNumChild > 0))
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
if (uiNumChild > 0)
{
for (i = 0; i < uiNumChild; i++)
{
if (pChildLayout[i].uiNumber > 0)
{
VPHAL_DEBUG_CHK_STATUS(DumpField(ppcOutContents, &(pChildLayout[i])));
}// end if exists
}// end for each field
}// if has fields
else if (pParLayout->pcStructName[0] != '\0')
{
// second last param is not zero in such cases as 8x8 table
// (arrays, multi structs) -- this is now handled by indirect recursion
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldHeader(ppcOutContents, pParLayout->pcStructName,
0, pParLayout->dwSize, true,
false, true));
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldFooter(ppcOutContents, false));
}
else
{
// Skip uint32_t dumping for kernel section
if (strcmp(pParLayout->pcName, KERNEL_FIELD_NAME) != 0)
{
VPHAL_DEBUG_CHK_STATUS(DumpDwords(ppcOutContents, pParLayout->dwSize));
}
}
finish:
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpField(
char **ppcOutContents,
VPHAL_DBG_FIELD_LAYOUT* pLayout)
{
MOS_STATUS eStatus;
char* pcName;
eStatus = MOS_STATUS_SUCCESS;
pcName = nullptr;
if (!ppcOutContents || !pLayout)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
// Header
pcName = (char*)MOS_AllocAndZeroMemory(MAX_NAME_LEN);
VPHAL_DEBUG_CHK_NULL(pcName);
if (pLayout->uiNumber > 1)
{
MOS_SecureStringPrint(pcName, MAX_NAME_LEN, MAX_NAME_LEN, "%s Heap", pLayout->pcName);
}
else
{
MOS_SecureStringPrint(pcName, MAX_NAME_LEN, MAX_NAME_LEN, "%s", pLayout->pcName);
}
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldHeader(ppcOutContents, pcName, pLayout->dwOffset,
pLayout->dwSize * pLayout->uiNumber,
true, true, false));
// Contents
if (pLayout->uiNumber > 1)
{
VPHAL_DEBUG_CHK_STATUS(DumpFieldHeap(ppcOutContents, pLayout));
}
else
{
VPHAL_DEBUG_CHK_STATUS(DumpSubfields(ppcOutContents, pLayout, pLayout->pChildLayout,
pLayout->uiNumChildren));
}
// footer
VPHAL_DEBUG_CHK_STATUS(DumpXmlFieldFooter(ppcOutContents, true));
finish:
return eStatus;
}
void VphalHwStateDumper::GetLastFieldIndex(
VPHAL_DBG_FIELD_LAYOUT fl[],
uint32_t uiNumFields,
uint32_t *puiLastIndex)
{
uint32_t i;
i = 0;
if (uiNumFields < 1)
{
puiLastIndex = nullptr;
}
else
{
*puiLastIndex = 0;
for (i = 1; i < uiNumFields; i++)
{
if (fl[i].dwOffset > fl[*puiLastIndex].dwOffset)
{
*puiLastIndex = i;
}
}
}
}
MOS_STATUS VphalHwStateDumper::CheckPath(
char* *ppcPath)
{
MOS_STATUS eStatus;
size_t iStrLen;
char* pcTmpPtr;
eStatus = MOS_STATUS_SUCCESS;
iStrLen = 0;
pcTmpPtr = nullptr;
if (!ppcPath || !*ppcPath)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
iStrLen = strlen(*ppcPath);
if (iStrLen > 1)
{
if (((*ppcPath)[iStrLen - 1] == '\\') || ((*ppcPath)[iStrLen - 1] == '/'))
{
(*ppcPath)[iStrLen - 1] = '\0';
}
}
finish:
return eStatus;
}
char* VphalSurfaceDumper::WhitespaceTrim(
char* ptr)
{
char* pcTemp; // pointer to temp string to remove spces
VPHAL_DEBUG_ASSERT(ptr);
if(strlen(ptr) == 0)
{
goto finish;
}
//remove left spaces
while (*ptr == ' ' || *ptr == '\t')
{
ptr++;
}
//remove right spaces
pcTemp = ptr + strlen(ptr)-1;
while(*pcTemp == ' '|| *pcTemp == '\t')
{
pcTemp--;
}
*(++pcTemp) = '\0';
finish:
return ptr;
}
//------------------------------------------------------------------------------
//
// TOP LEVEL FUNCTIONS
// These are for dumping structures and binary data.
// Many of these will be called directly from the driver.
//
//------------------------------------------------------------------------------
MOS_STATUS VphalHwStateDumper::DumpBinaryStruct(
VPHAL_DBG_FIELD_LAYOUT* fields,
uint32_t uiNumFields,
void *pvStructToDump,
char* pcPath,
PCCHAR pcName,
int32_t iID)
{
MOS_STATUS eStatus;
uint32_t lLastFieldOffset;
uint32_t lLastFieldSize;
uint32_t lSize;
uint32_t uiLastIndex;
int32_t iStrLenPath;
int32_t iStrLenName;
char* pcOutFileName;
char* pcOutContents;
char pcTargetFileName[MAX_PATH];
eStatus = MOS_STATUS_SUCCESS;
lLastFieldOffset = 0;
lLastFieldSize = 0;
lSize = 0;
uiLastIndex = 0;
iStrLenPath = 0;
iStrLenName = 0;
pcOutFileName = nullptr;
pcOutContents = nullptr;
memset(pcTargetFileName, '\0', MAX_PATH);
VPHAL_DEBUG_CHK_STATUS(VphalHwStateDumper::CheckPath(&pcPath));
pcOutFileName = (char*)MOS_AllocAndZeroMemory(sizeof(char) * MAX_PATH);
VPHAL_DEBUG_CHK_NULL(pcOutFileName);
MOS_SecureStringPrint(pcOutFileName, MAX_PATH, MAX_PATH, "%s%s_%d.bin", pcPath, pcName, iID);
GetLastFieldIndex(fields, uiNumFields, &uiLastIndex);
lLastFieldOffset = fields[uiLastIndex].dwOffset;
lLastFieldSize = fields[uiLastIndex].dwSize;
lSize = lLastFieldOffset + lLastFieldSize;
VphalDumperTool::GetOsFilePath(pcOutFileName, pcTargetFileName);
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(pcTargetFileName, pvStructToDump, lSize));
finish:
MOS_SafeFreeMemory(pcOutFileName);
MOS_SafeFreeMemory(pcOutContents);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpBatchBufferBinary(
PMHW_BATCH_BUFFER pBatchBuffer,
const char* pcFileLoc,
int32_t iID)
{
MOS_STATUS eStatus;
VPHAL_DBG_FIELD_LAYOUT field;
char* pcPath;
size_t iStrLen;
bool bLockNeeded;
eStatus = MOS_STATUS_SUCCESS;
pcPath = nullptr;
iStrLen = 0;
bLockNeeded = false;
if (!pBatchBuffer->pData)
{
bLockNeeded = true;
VPHAL_DEBUG_CHK_STATUS(m_renderHal->pfnLockBB(m_renderHal, pBatchBuffer));
}
iStrLen = strlen(pcFileLoc) + 1;
field.dwOffset = 0;
field.uiNumChildren = 0;
field.uiNumber = 1;
pcPath = (char*)MOS_AllocAndZeroMemory(sizeof(char) * iStrLen);
VPHAL_DEBUG_CHK_NULL(pcPath);
MOS_SecureStringPrint(pcPath, iStrLen, iStrLen, "%s", pcFileLoc);
VPHAL_DEBUG_CHK_STATUS(VphalHwStateDumper::CheckPath(&pcPath));
field.dwSize = pBatchBuffer->iSize;
VPHAL_DEBUG_CHK_STATUS(DumpBinaryStruct(&field, 1,
pBatchBuffer->pData,
pcPath, "BB", iID));
if (bLockNeeded)
{
VPHAL_DEBUG_CHK_STATUS(m_renderHal->pfnUnlockBB(m_renderHal, pBatchBuffer));
}
finish:
MOS_SafeFreeMemory(pcPath);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpCommandBufferBinary(
PMOS_COMMAND_BUFFER pCmd_buff,
const char* pcFileLoc,
int32_t iID)
{
/*
MOS_COMMAND_BUFFER
DW0,DW1,DW2,DW3,DW4,DW5,DW6, ...
/-------------------------------------------------------------------------\
| | | | | | | |
| | | | | | | .... |
| | | | | | | |
| | | | | | | |
\-------------------------------------------------------------------------/
|\_________________/|\___________________________________________________/
| | | |
pCmdBase iOffset pCmdPtr iRemaining
pCmdBase : First command in the buffer
pCmdPtr : End of current command (place to put next command)
iOffset : Space being used by commands (pCmdPtr - pCmdBase)
iRemaining: Space left for comments till end of buffer
*/
MOS_STATUS eStatus;
VPHAL_DBG_FIELD_LAYOUT field;
char* pcPath;
size_t iStrLen;
eStatus = MOS_STATUS_SUCCESS;
pcPath = nullptr;
iStrLen = strlen(pcFileLoc) + 1;
field.dwOffset = 0;
field.uiNumber = 1;
field.uiNumChildren = 0;
field.dwSize = pCmd_buff->iOffset;
pcPath = (char*)MOS_AllocAndZeroMemory(sizeof(char) * iStrLen);
VPHAL_DEBUG_CHK_NULL(pcPath);
MOS_SecureStringPrint(pcPath, iStrLen, iStrLen, "%s", pcFileLoc);
VPHAL_DEBUG_CHK_STATUS(VphalHwStateDumper::CheckPath(&pcPath));
VPHAL_DEBUG_CHK_STATUS(DumpBinaryStruct(&field, 1,
pCmd_buff->pCmdBase,
pcPath, "CMB", iID));
finish:
MOS_SafeFreeMemory(pcPath);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpGshBinary(
const char* pcFileLoc,
int32_t iID)
{
MOS_STATUS eStatus;
uint32_t dwSizeMS;
size_t iStrLen;
char* pcPath;
char* pcOutFileName;
char* pcOutContents;
char* pcTargetFileName;
PRENDERHAL_STATE_HEAP pStateHeap;
PRENDERHAL_STATE_HEAP_SETTINGS pStateHeapSettings;
// GSH LAYOUT
VPHAL_DBG_FIELD_LAYOUT* pGshLayout = nullptr;
uint32_t uiNumGSHFields = 0;
eStatus = MOS_STATUS_SUCCESS;
dwSizeMS = 0;
iStrLen = 0;
pcPath = nullptr;
pcOutFileName = nullptr;
pcOutContents = nullptr;
pcTargetFileName = nullptr;
pStateHeap = nullptr;
pStateHeapSettings = nullptr;
pcTargetFileName = (char*)MOS_AllocAndZeroMemory(MAX_PATH);
VPHAL_DEBUG_CHK_NULL(pcTargetFileName);
memset(pcTargetFileName, '\0', MAX_PATH);
pStateHeap = m_stateHeap;
pStateHeapSettings = m_stateHeapSettings;
iStrLen = strlen(pcFileLoc) + 1;
pcPath = (char*)MOS_AllocAndZeroMemory(sizeof(char) * iStrLen);
VPHAL_DEBUG_CHK_NULL(pcPath);
MOS_SecureStringPrint(pcPath, iStrLen, iStrLen, "%s", pcFileLoc);
VPHAL_DEBUG_CHK_STATUS(VphalHwStateDumper::CheckPath(&pcPath));
pcOutFileName = (char*)MOS_AllocAndZeroMemory(sizeof(char) * MAX_PATH);
VPHAL_DEBUG_CHK_NULL(pcOutFileName);
MOS_SecureStringPrint(pcOutFileName, MAX_PATH, MAX_PATH, "%sGSH_%d.xml", pcPath, iID);
VPHAL_DEBUG_CHK_STATUS(DefGsh(&pGshLayout, &uiNumGSHFields));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(true, &pcOutContents, XMLHEADER));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents,
"<GSH><NAME>GSH</NAME><LOC>0x%x</LOC><VERSION>%s</VERSION>\r\n",
(uintptr_t)pStateHeap->pGshBuffer, VPDEBUG_VERSION));
VPHAL_DEBUG_CHK_STATUS(DumpSubfields(&pcOutContents, nullptr, pGshLayout, uiNumGSHFields));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "</GSH>\r\n"));
VphalDumperTool::GetOsFilePath(pcOutFileName, pcTargetFileName);
iStrLen = strlen(pcOutContents);
if(iStrLen > ULONG_MAX)
{
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
}
dwSizeMS = (uint32_t)iStrLen;
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(pcTargetFileName,
pcOutContents,
dwSizeMS));
VPHAL_DEBUG_CHK_STATUS(DumpBinaryStruct(pGshLayout,
uiNumGSHFields, pStateHeap->pGshBuffer,
pcPath, "GSH", iID));
finish:
MOS_SafeFreeMemory(pcPath);
MOS_SafeFreeMemory(pcTargetFileName);
MOS_SafeFreeMemory(pcOutFileName);
MOS_SafeFreeMemory(pcOutContents);
FreeLayout(pGshLayout, uiNumGSHFields);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpSshBinary(
const char* pcFileLoc,
int32_t iID)
{
MOS_STATUS eStatus;
size_t iStrLen;
int32_t i;
char* pcPath;
char* pcOutFileName;
char* pcOutContents;
char* pcTargetFileName;
uint32_t dwSizeMS;
PRENDERHAL_STATE_HEAP pStateHeap;
PRENDERHAL_STATE_HEAP_SETTINGS pStateHeapSettings;
// SSH LAYOUT
uint32_t uiNumSSHFields = 0;
VPHAL_DBG_FIELD_LAYOUT* pSshLayout = nullptr;
eStatus = MOS_STATUS_SUCCESS;
iStrLen = 0;
i = 0;
pcPath = nullptr;
pcOutFileName = nullptr;
pcOutContents = nullptr;
pcTargetFileName = nullptr;
dwSizeMS = 0;
pcTargetFileName = (char*)MOS_AllocAndZeroMemory(MAX_PATH);
VPHAL_DEBUG_CHK_NULL(pcTargetFileName);
memset(pcTargetFileName, '\0', MAX_PATH);
pStateHeap = m_stateHeap;
pStateHeapSettings = m_stateHeapSettings;
iStrLen = strlen(pcFileLoc) + 1;
pcPath = (char*)MOS_AllocAndZeroMemory(sizeof(char) * iStrLen);
VPHAL_DEBUG_CHK_NULL(pcPath);
MOS_SecureStringPrint(pcPath, iStrLen, iStrLen, "%s", pcFileLoc);
VPHAL_DEBUG_CHK_STATUS(VphalHwStateDumper::CheckPath(&pcPath));
pcOutFileName = (char*)MOS_AllocAndZeroMemory(sizeof(char) * (iStrLen + 20));
VPHAL_DEBUG_CHK_NULL(pcOutFileName);
MOS_SecureStringPrint(pcOutFileName, iStrLen + 20, iStrLen + 20, "%sSSH_%d.xml", pcPath, iID);
VPHAL_DEBUG_CHK_STATUS(DefSsh(&pSshLayout, &uiNumSSHFields));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(true, &pcOutContents, XMLHEADER));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents,
"<SSH><NAME>SSH</NAME><LOC>0x%x</LOC><VERSION>%s</VERSION>\r\n",
(uintptr_t)pStateHeap->pSshBuffer, VPDEBUG_VERSION));
VPHAL_DEBUG_CHK_STATUS(DumpSubfields(&pcOutContents, nullptr, pSshLayout,
uiNumSSHFields));
VphalDumperTool::AppendString(false, &pcOutContents, "</SSH>\r\n");
VphalDumperTool::GetOsFilePath(pcOutFileName, pcTargetFileName);
iStrLen = strlen(pcOutContents);
if(iStrLen > ULONG_MAX)
{
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
}
dwSizeMS = (uint32_t)iStrLen;
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(pcTargetFileName,
pcOutContents,
dwSizeMS));
VPHAL_DEBUG_CHK_STATUS(DumpBinaryStruct(pSshLayout,
uiNumSSHFields, pStateHeap->pSshBuffer,
pcPath, "SSH", iID));
finish:
MOS_SafeFreeMemory(pcPath);
MOS_SafeFreeMemory(pcOutFileName);
MOS_SafeFreeMemory(pcOutContents);
FreeLayout(pSshLayout, uiNumSSHFields);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpVeboxStateBinary(
PMHW_VEBOX_INTERFACE pVeboxInterface,
const char* pcFileLoc,
int32_t iID)
{
MOS_STATUS eStatus;
VPHAL_DBG_FIELD_LAYOUT field;
char* pcPath;
size_t iStrLen;
const MHW_VEBOX_HEAP *pVeboxHeap = nullptr;
eStatus = MOS_STATUS_SUCCESS;
pcPath = nullptr;
iStrLen = strlen(pcFileLoc) + 1;
VPHAL_DEBUG_CHK_STATUS(pVeboxInterface->GetVeboxHeapInfo(
&pVeboxHeap));
VPHAL_DEBUG_CHK_NULL(pVeboxHeap);
field.dwOffset = 0;
field.uiNumChildren = 0;
field.uiNumber = 1;
pcPath = (char*)MOS_AllocAndZeroMemory(sizeof(char) * iStrLen);
VPHAL_DEBUG_CHK_NULL(pcPath);
MOS_SecureStringPrint(pcPath, iStrLen, iStrLen, "%s", pcFileLoc);
field.dwSize = pVeboxHeap->uiInstanceSize;
VPHAL_DEBUG_CHK_STATUS(DumpBinaryStruct(&field, 1,
(pVeboxHeap->pLockedDriverResourceMem +pVeboxHeap->uiCurState * pVeboxHeap->uiInstanceSize) ,
pcPath, nullptr, iID));
finish:
MOS_SafeFreeMemory(pcPath);
return eStatus;
}
MOS_STATUS VphalHwStateDumper::DumpStatisticsBinary(
PVPHAL_VEBOX_STATE pVeboxState,
uint8_t* pStat0Base,
uint8_t* pStat1Base,
const char* pcFileLoc,
int32_t iID)
{
MOS_STATUS eStatus;
VPHAL_DBG_FIELD_LAYOUT field;
size_t iStrLen;
char* pcOutFileName0;
char* pcOutFileName1;
int32_t dwWidth,dwHeight;
void *pState0, *pState1;
eStatus = MOS_STATUS_SUCCESS;
iStrLen = 0;
pcOutFileName0 = nullptr;
pcOutFileName1 = nullptr;
iStrLen = strlen(pcFileLoc) + 4;
pState0 = (void*)(pStat0Base);
pState1 = (void*)(pStat1Base);
pcOutFileName0 = (char*)MOS_AllocAndZeroMemory(sizeof(char) * iStrLen);
VPHAL_DEBUG_CHK_NULL(pcOutFileName0);
MOS_SecureStringPrint(pcOutFileName0, iStrLen, iStrLen, "%s[slice0]", pcFileLoc);
pcOutFileName1 = (char*)MOS_AllocAndZeroMemory(sizeof(char) * iStrLen);
VPHAL_DEBUG_CHK_NULL(pcOutFileName1);
MOS_SecureStringPrint(pcOutFileName1, iStrLen, iStrLen, "%s[slice1]", pcFileLoc);
field.dwOffset = 0;
field.uiNumChildren = 0;
field.uiNumber = 1;
dwWidth = MOS_ALIGN_CEIL(pVeboxState->m_currentSurface->dwWidth, 64);
dwHeight = MOS_ROUNDUP_DIVIDE(pVeboxState->m_currentSurface->dwHeight, 4) +
MOS_ROUNDUP_DIVIDE(VPHAL_VEBOX_STATISTICS_SIZE_MAX * sizeof(uint32_t), dwWidth);
field.dwSize = dwWidth * dwHeight;
VPHAL_DEBUG_CHK_STATUS(DumpBinaryStruct(&field, 1,
pState0 , pcOutFileName0, nullptr, iID));
VPHAL_DEBUG_CHK_STATUS(DumpBinaryStruct(&field, 1,
pState1 , pcOutFileName1, nullptr, iID));
finish:
MOS_SafeFreeMemory(pcOutFileName0);
MOS_SafeFreeMemory(pcOutFileName1);
return eStatus;
}
void VphalDumperTool::StringToLower(
char* pcString)
{
size_t stStrLen; // length of string
size_t i; // loop iterator
stStrLen = strlen(pcString);
for (i = 0; i < stStrLen; i++)
{
if (isupper(pcString[i]))
{
pcString[i] = (char)tolower(pcString[i]);
}
}
}
MOS_STATUS VphalSurfaceDumper::LocStringToEnum(
char* pcLocString,
uint32_t *pLocation)
{
MOS_STATUS eStatus;
eStatus = MOS_STATUS_SUCCESS;
VphalDumperTool::StringToLower(pcLocString);
if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_PREALL) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_PRE_ALL;
}
else if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_PREDNDI) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_PRE_DNDI;
}
else if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_POSTDNDI) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_POST_DNDI;
}
else if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_PRECOMP) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_PRE_COMP;
}
else if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_POSTCOMP) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_POST_COMP;
}
else if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_PREMEMDECOMP) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_PRE_MEMDECOMP;
}
else if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_POSTMEMDECOMP) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_POST_MEMDECOMP;
}
else if (strcmp(pcLocString, VPHAL_DBG_SURF_DUMP_LOC_POSTALL) == 0)
{
*pLocation = VPHAL_DBG_DUMP_TYPE_POST_ALL;
}
else
{
VPHAL_DEBUG_NORMALMESSAGE("Unknown dump location \"%s\".", pcLocString);
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
}
finish:
return eStatus;
}
MOS_STATUS VphalSurfaceDumper::EnumToLocString(
uint32_t Location,
char* pcLocString)
{
MOS_STATUS eStatus;
uint32_t i;
size_t stStrLen;
eStatus = MOS_STATUS_SUCCESS;
if (pcLocString == nullptr)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
switch (Location)
{
case VPHAL_DBG_DUMP_TYPE_PRE_ALL:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_PREALL);
break;
case VPHAL_DBG_DUMP_TYPE_PRE_DNDI:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_PREDNDI);
break;
case VPHAL_DBG_DUMP_TYPE_POST_DNDI:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_POSTDNDI);
break;
case VPHAL_DBG_DUMP_TYPE_PRE_COMP:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_PRECOMP);
break;
case VPHAL_DBG_DUMP_TYPE_POST_COMP:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_POSTCOMP);
break;
case VPHAL_DBG_DUMP_TYPE_PRE_MEMDECOMP:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_PREMEMDECOMP);
break;
case VPHAL_DBG_DUMP_TYPE_POST_MEMDECOMP:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_POSTMEMDECOMP);
break;
case VPHAL_DBG_DUMP_TYPE_POST_ALL:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_SURF_DUMP_LOC_POSTALL);
break;
default:
VPHAL_DEBUG_ASSERTMESSAGE("Unknown dump location \"%d\".", Location);
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
} // end switch
stStrLen = strlen(pcLocString);
VPHAL_DEBUG_ASSERT(stStrLen > 1); // assert b/c invalid access if <= 1
i = pcLocString[1] == 'r' ? 3 : 4; // If pre, start i at 3, else 4
// Maybe should add error case in case macros get changed later?
for (; i < stStrLen; i++)
{
pcLocString[i] = (char)toupper(pcLocString[i]);
}
finish:
return eStatus;
}
MOS_STATUS VphalHwStateDumper::EnumToLocString(
VPHAL_DEBUG_STAGE Location,
char* pcLocString)
{
MOS_STATUS eStatus;
uint32_t i;
size_t stStrLen;
eStatus = MOS_STATUS_SUCCESS;
if (pcLocString == nullptr)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
switch (Location)
{
case VPHAL_DBG_STAGE_DNDI:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_STATE_DUMP_LOC_DNDI);
break;
case VPHAL_DBG_STAGE_VEBOX:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_STATE_DUMP_LOC_VEBOX);
break;
case VPHAL_DBG_STAGE_COMP:
MOS_SecureStringPrint(pcLocString, MAX_PATH, MAX_PATH, VPHAL_DBG_STATE_DUMP_LOC_COMP);
break;
default:
VPHAL_DEBUG_NORMALMESSAGE("Unknown dump location \"%d\".", Location);
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
} // end switch
stStrLen = strlen(pcLocString);
for (i=0; i < stStrLen; i++)
{
pcLocString[i] = (char)toupper(pcLocString[i]);
}
finish:
return eStatus;
}
MOS_STATUS VphalSurfaceDumper::SurfTypeStringToEnum(
char* pcSurfType,
VPHAL_SURFACE_TYPE *pSurfType)
{
MOS_STATUS eStatus;
eStatus = MOS_STATUS_SUCCESS;
VphalDumperTool::StringToLower(pcSurfType);
if (strcmp(pcSurfType, VPHAL_DBG_SURF_DUMP_TYPE_BACKGROUND) == 0)
{
*pSurfType = SURF_IN_BACKGROUND;
}
else if (strcmp(pcSurfType, VPHAL_DBG_SURF_DUMP_TYPE_PRIMARY) == 0)
{
*pSurfType = SURF_IN_PRIMARY;
}
else if (strcmp(pcSurfType, VPHAL_DBG_SURF_DUMP_TYPE_SUBSTREAM) == 0)
{
*pSurfType = SURF_IN_SUBSTREAM;
}
else if (strcmp(pcSurfType, VPHAL_DBG_SURF_DUMP_TYPE_REFERENCE) == 0)
{
*pSurfType = SURF_IN_REFERENCE;
}
else if (strcmp(pcSurfType, VPHAL_DBG_SURF_DUMP_TYPE_RENDERTARGET) == 0)
{
*pSurfType = SURF_OUT_RENDERTARGET;
}
else
{
VPHAL_DEBUG_ASSERTMESSAGE("Unknown surface type \"%s\".", pcSurfType);
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
}
finish:
return eStatus;
}
MOS_STATUS VphalHwStateDumper::StateTypeStringToEnum(
char* pcStateType,
uint32_t *pStateType)
{
MOS_STATUS eStatus;
eStatus = MOS_STATUS_SUCCESS;
VphalDumperTool::StringToLower(pcStateType);
if (strcmp(pcStateType, VPHAL_DBG_STATE_DUMP_LOC_DNDI) == 0)
{
*pStateType = VPHAL_DBG_STAGE_DNDI;
}
else if (strcmp(pcStateType, VPHAL_DBG_STATE_DUMP_LOC_VEBOX) == 0)
{
*pStateType = VPHAL_DBG_STAGE_VEBOX;
}
else if (strcmp(pcStateType, VPHAL_DBG_STATE_DUMP_LOC_COMP) == 0)
{
*pStateType = VPHAL_DBG_STAGE_COMP;
}
else
{
VPHAL_DEBUG_NORMALMESSAGE("Unknown surface type \"%s\".", pcStateType);
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
}
finish:
return eStatus;
}
MOS_STATUS VphalSurfaceDumper::ProcessDumpLocations(
char* pcDumpLocData)
{
MOS_STATUS eStatus;
char* pcCommaLoc; // pointer to next comma in dump location string
char* pcCurrToken; // pointer to current token in a string
char* pcColonLoc; // pointer to next colon in location string
int32_t iNumStrings; // number of dump locations
int32_t i; // loop iteration counter
VPHAL_DBG_SURF_DUMP_SPEC *pDumpSpec = &m_dumpSpec;
eStatus = MOS_STATUS_SUCCESS;
iNumStrings = 0;
if (strlen(pcDumpLocData) > 0)
{
// Count number of strings in key data
// If non empty string, there is at least one value
iNumStrings++;
// Count the rest
pcCommaLoc = pcDumpLocData;
while ((pcCommaLoc = strchr(pcCommaLoc + 1, ',')) != nullptr)
{
iNumStrings++;
}
// Set number of strings and allocate space for them
pDumpSpec->iNumDumpLocs = iNumStrings;
pDumpSpec->pDumpLocations = (VPHAL_DBG_SURF_DUMP_LOC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_SURF_DUMP_LOC) * pDumpSpec->iNumDumpLocs);
pcCurrToken = pcDumpLocData;
// Determine each part of the string
for (i = 0; i < pDumpSpec->iNumDumpLocs; i++)
{
pcCommaLoc = strchr(pcCurrToken, ',');
if (pcCommaLoc != nullptr)
{
*pcCommaLoc = '\0';
}
// Handle surface type
pcColonLoc = strchr(pcCurrToken, ':');
if (pcColonLoc == nullptr)
{
// Dump all
pDumpSpec->pDumpLocations[i].SurfType = SURF_NONE;
}
else
{
// Remove surface type from dump location
*pcColonLoc = '\0';
// Set surface type
pcColonLoc++;
pcColonLoc = WhitespaceTrim(pcColonLoc);
VPHAL_DEBUG_CHK_STATUS(SurfTypeStringToEnum(pcColonLoc,
&(pDumpSpec->pDumpLocations[i].SurfType)));
}
//trim the whitespaces from dump location
pcCurrToken = WhitespaceTrim(pcCurrToken);
VPHAL_DEBUG_CHK_STATUS(LocStringToEnum(pcCurrToken,
&(pDumpSpec->pDumpLocations[i].DumpLocation)));
if (pcCommaLoc != nullptr)
{
pcCurrToken = pcCommaLoc + 1;
}
} // end for each part of the string
} // if data length > 0
finish:
return eStatus;
}
void VphalSurfaceDumper::GetSurfaceDumpSpec()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
bool bDumpEnabled;
char cStringData[MOS_USER_CONTROL_MAX_DATA_SIZE];
char pcDumpLocData[VPHAL_DBG_SURF_DUMP_MAX_DATA_LEN];
VPHAL_DBG_SURF_DUMP_SPEC *pDumpSpec = &m_dumpSpec;
pDumpSpec->uiStartFrame = 0xFFFFFFFF;
pDumpSpec->uiEndFrame = 0;
pDumpSpec->pcOutputPath[0] = '\0';
pcDumpLocData[0] = '\0';
bDumpEnabled = false;
// Get start frame
// if start frame is not got assign a default value of 0
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_SURF_DUMP_START_FRAME_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->uiStartFrame = UserFeatureData.u32Data;
// Get end frame
// if end frame is not got assign a default value of max
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_SURF_DUMP_END_FRAME_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->uiEndFrame = UserFeatureData.u32Data;
// Get out file path
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
UserFeatureData.StringData.pStringData = cStringData;
UserFeatureData.StringData.uMaxSize = MOS_USER_CONTROL_MAX_DATA_SIZE;
UserFeatureData.StringData.uSize = 0; //set the default value. 0 is empty buffer.
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_SURF_DUMP_OUTFILE_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
if (UserFeatureData.StringData.uSize > 0)
{
// Copy the Output path
MOS_SecureMemcpy(
pDumpSpec->pcOutputPath,
MAX_PATH,
UserFeatureData.StringData.pStringData,
UserFeatureData.StringData.uSize);
}
#if !defined(LINUX) && !defined(ANDROID)
else
{
std::string vphalDumpFilePath;
// Use state separation APIs to obtain appropriate storage location
if (SUCCEEDED(GetDriverPersistentStorageLocation(vphalDumpFilePath)))
{
std::string m_outputFilePath;
MOS_USER_FEATURE_VALUE_WRITE_DATA userFeatureWriteData;
m_outputFilePath = vphalDumpFilePath.c_str();
m_outputFilePath.append(VPHAL_DBG_DUMP_OUTPUT_FOLDER);
// Copy the Output path
MOS_SecureMemcpy(
pDumpSpec->pcOutputPath,
MAX_PATH,
m_outputFilePath.c_str(),
m_outputFilePath.size());
MOS_ZeroMemory(&userFeatureWriteData, sizeof(userFeatureWriteData));
userFeatureWriteData.Value.StringData.pStringData = cStringData;
userFeatureWriteData.Value.StringData.pStringData = const_cast<char *>(m_outputFilePath.c_str());
userFeatureWriteData.Value.StringData.uSize = m_outputFilePath.size();
userFeatureWriteData.ValueID = __VPHAL_DBG_DUMP_OUTPUT_DIRECTORY_ID;
MOS_UserFeature_WriteValues_ID(NULL, &userFeatureWriteData, 1, m_osInterface->pOsContext);
}
}
#endif
// Get dump locations
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
UserFeatureData.StringData.pStringData = cStringData;
UserFeatureData.StringData.uMaxSize = MOS_USER_CONTROL_MAX_DATA_SIZE;
UserFeatureData.StringData.uSize = 0; //set the default value. 0 is empty buffer.
MOS_CHK_STATUS_SAFE(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_SURF_DUMP_LOCATION_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
if (UserFeatureData.StringData.uSize > 0)
{
bDumpEnabled = ((pDumpSpec->pcOutputPath[0] != '\0') &&
(UserFeatureData.StringData.pStringData[0] != '\0'));
}
if (bDumpEnabled)
{
VPHAL_DEBUG_CHK_STATUS(ProcessDumpLocations(
UserFeatureData.StringData.pStringData));
}
// Get enableAuxDump
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_SURF_DUMP_ENABLE_AUX_DUMP_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->enableAuxDump = UserFeatureData.u32Data;
// Get plane dump enabled flag
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_SURF_DUMPER_ENABLE_PLANE_DUMP,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->enablePlaneDump = UserFeatureData.u32Data;
finish:
if ((eStatus != MOS_STATUS_SUCCESS) || (!bDumpEnabled))
{
pDumpSpec->uiStartFrame = 1;
pDumpSpec->uiEndFrame = 0;
}
}
MOS_STATUS VphalHwStateDumper::ProcessDumpStateLocations(
char* pcDumpLocData)
{
MOS_STATUS eStatus;
char* pcCommaLoc; // pointer to next comma in dump location string
char* pcCurrToken; // pointer to current token in a string
char* pcRender; //pointer to video process type string
int32_t iNumStrings; // number of dump locations
int32_t iNumDumpLocs;
int32_t i = 0;
VPHAL_DBG_DUMP_SPEC *pDumpSpec = &m_dumpSpec;
eStatus = MOS_STATUS_SUCCESS;
iNumStrings = 0;
if (strlen(pcDumpLocData) > 0)
{
// Count number of strings in key data
// If non empty string, there is at least one value
iNumStrings++;
// Count the rest
pcCommaLoc = pcDumpLocData;
while ((pcCommaLoc = strchr(pcCommaLoc + 1, ';')) != nullptr)
{
iNumStrings++;
}
//calucate the number of GSH,SSH,CB,SB,VeboxState.
pcCurrToken = pcDumpLocData;
while(iNumStrings !=0)
{
pcCommaLoc = strchr(pcCurrToken, ';');
if (pcCommaLoc != nullptr)
{
*pcCommaLoc = '\0';
}
pcRender = strchr(pcCurrToken, ':');
if (pcRender != nullptr)
{
iNumDumpLocs = 1;
pcRender = pcRender + 1;
while ((pcRender = strchr(pcRender + 1, ',')) != nullptr)
{
iNumDumpLocs++;
}
}
else
{
iNumDumpLocs = 1;
}
if (!strncmp(pcCurrToken, "GSH", 3))
{
pDumpSpec->pGSHDumpSpec = (VPHAL_DBG_GSH_DUMP_SPEC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_GSH_DUMP_SPEC));
pDumpSpec->pGSHDumpSpec->iNumDumpLocs=iNumDumpLocs;
pDumpSpec->pGSHDumpSpec->pDumpLocations = (VPHAL_DBG_GSH_DUMP_LOC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_GSH_DUMP_LOC)*iNumDumpLocs);
pcCurrToken = pcCurrToken+4;
i = 0;
while(iNumDumpLocs!=0)
{
pcRender = strchr(pcCurrToken, ',');
if (pcRender != nullptr)
{
*pcRender = '\0';
}
if(i<pDumpSpec->pGSHDumpSpec->iNumDumpLocs)
{
VPHAL_DEBUG_CHK_STATUS(StateTypeStringToEnum(pcCurrToken,
&(pDumpSpec->pGSHDumpSpec->pDumpLocations[i].DumpStage)));
i++;
}
if (pcRender != nullptr)
{
pcCurrToken = pcRender + 1;
}
iNumDumpLocs--;
}
}
else if (!strncmp(pcCurrToken, "SSH", 3))
{
pDumpSpec->pSSHDumpSpec = (VPHAL_DBG_SSH_DUMP_SPEC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_SSH_DUMP_SPEC));
pDumpSpec->pSSHDumpSpec->iNumDumpLocs=iNumDumpLocs;
pDumpSpec->pSSHDumpSpec->pDumpLocations = (VPHAL_DBG_SSH_DUMP_LOC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_SSH_DUMP_LOC)*iNumDumpLocs);
pcCurrToken = pcCurrToken+4;
i = 0;
while(iNumDumpLocs!=0)
{
pcRender = strchr(pcCurrToken, ',');
if (pcRender != nullptr)
{
*pcRender = '\0';
}
if(i<pDumpSpec->pSSHDumpSpec->iNumDumpLocs)
{
VPHAL_DEBUG_CHK_STATUS(StateTypeStringToEnum(pcCurrToken,
&(pDumpSpec->pSSHDumpSpec->pDumpLocations[i].DumpStage)));
i++;
}
if(pcRender != nullptr)
{
pcCurrToken = pcRender + 1;
}
iNumDumpLocs--;
}
}
else if (!strncmp(pcCurrToken, "BB", 2))
{
pDumpSpec->pBBDumpSpec = (VPHAL_DBG_BB_DUMP_SPEC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_BB_DUMP_SPEC));
pDumpSpec->pBBDumpSpec->iNumDumpLocs=iNumDumpLocs;
pDumpSpec->pBBDumpSpec->pDumpLocations = (VPHAL_DBG_BB_DUMP_LOC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_BB_DUMP_LOC)*iNumDumpLocs);
pcCurrToken = pcCurrToken+3;
i = 0;
while(iNumDumpLocs!=0)
{
pcRender = strchr(pcCurrToken, ',');
if (pcRender != nullptr)
{
*pcRender = '\0';
}
if(i<pDumpSpec->pBBDumpSpec->iNumDumpLocs)
{
VPHAL_DEBUG_CHK_STATUS(StateTypeStringToEnum(pcCurrToken,
&(pDumpSpec->pBBDumpSpec->pDumpLocations[i].DumpStage)));
i++;
}
if(pcRender != nullptr)
{
pcCurrToken = pcRender + 1;
}
iNumDumpLocs--;
}
}
else if (!strncmp(pcCurrToken, "CB", 2))
{
pDumpSpec->pCBDumpSpec = (VPHAL_DBG_CB_DUMP_SPEC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_CB_DUMP_SPEC));
pDumpSpec->pCBDumpSpec->iNumDumpLocs=iNumDumpLocs;
pDumpSpec->pCBDumpSpec->pDumpLocations = (VPHAL_DBG_CB_DUMP_LOC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_CB_DUMP_LOC)*iNumDumpLocs);
pcCurrToken = pcCurrToken+3;
i = 0;
while(iNumDumpLocs!=0)
{
pcRender = strchr(pcCurrToken, ',');
if (pcRender != nullptr)
{
*pcRender = '\0';
}
if(i<pDumpSpec->pCBDumpSpec->iNumDumpLocs)
{
VPHAL_DEBUG_CHK_STATUS(StateTypeStringToEnum(pcCurrToken,
&(pDumpSpec->pCBDumpSpec->pDumpLocations[i].DumpStage)));
i++;
}
if (pcRender != nullptr)
{
pcCurrToken = pcRender + 1;
}
iNumDumpLocs--;
}
}
else if (!strncmp(pcCurrToken, "VeboxState", 10))
{
pDumpSpec->pVeboxStateDumpSpec = (VPHAL_DBG_VEBOXSTATE_DUMP_SPEC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_VEBOXSTATE_DUMP_SPEC));
pDumpSpec->pVeboxStateDumpSpec->iNumDumpLocs=iNumDumpLocs;
pDumpSpec->pVeboxStateDumpSpec->pDumpLocations = (VPHAL_DBG_VEBOXSTATE_DUMP_LOC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_VEBOXSTATE_DUMP_LOC)*iNumDumpLocs);
pDumpSpec->pVeboxStateDumpSpec->pDumpLocations->DumpStage=VPHAL_DBG_STAGE_VEBOX;
pcCurrToken = pcCurrToken+11;
}
else if (!strncmp(pcCurrToken, "Statistics", 10))
{
pDumpSpec->pStatisticsDumpSpec = (VPHAL_DBG_STATISTICS_DUMP_SPEC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_STATISTICS_DUMP_SPEC));
pDumpSpec->pStatisticsDumpSpec->iNumDumpLocs=iNumDumpLocs;
pDumpSpec->pStatisticsDumpSpec->pDumpLocations = (VPHAL_DBG_STATISTICS_DUMP_LOC*)MOS_AllocAndZeroMemory(
sizeof(VPHAL_DBG_STATISTICS_DUMP_LOC)*iNumDumpLocs);
pDumpSpec->pVeboxStateDumpSpec->pDumpLocations->DumpStage=VPHAL_DBG_STAGE_VEBOX;
pcCurrToken = pcCurrToken+11;
}
if (pcCommaLoc != nullptr)
{
pcCurrToken = pcCommaLoc + 1;
}
iNumStrings--;
}
} // if data length > 0
finish:
return eStatus;
}
void VphalHwStateDumper::GetStateDumpSpec()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
PMOS_USER_FEATURE_VALUE_DATA pUserFeatureData = &UserFeatureData;
bool bDumpEnabled;
char pcDumpLocData[VPHAL_DBG_SURF_DUMP_MAX_DATA_LEN];
char cStringData[MOS_USER_CONTROL_MAX_DATA_SIZE];
VPHAL_DBG_DUMP_SPEC *pDumpSpec = &m_dumpSpec;
pDumpSpec->uiStartFrame = 0xFFFFFFFF;
pDumpSpec->uiEndFrame = 0;
pDumpSpec->pcOutputPath[0] = '\0';
pcDumpLocData[0] = '\0';
bDumpEnabled = false;
// Get start frame
// if start frame is not got assign a default value of 0
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_STATE_DUMP_START_FRAME_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->uiStartFrame = UserFeatureData.u32Data;
// Get end frame
// if end frame is not got assign a default value of max
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_STATE_DUMP_END_FRAME_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->uiEndFrame = UserFeatureData.u32Data;
// Get out file path
UserFeatureData.StringData.pStringData = cStringData;
UserFeatureData.StringData.uMaxSize = MOS_USER_CONTROL_MAX_DATA_SIZE;
UserFeatureData.StringData.uSize = 0; // set the default value. 0 is empty buffer.
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_STATE_DUMP_OUTFILE_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
if (pUserFeatureData->StringData.uSize > 0)
{
// Copy the Output path
MOS_SecureMemcpy(
pDumpSpec->pcOutputPath,
MAX_PATH,
pUserFeatureData->StringData.pStringData,
pUserFeatureData->StringData.uSize);
}
#if !defined(LINUX) && !defined(ANDROID)
else
{
std::string vphalDumpFilePath;
// Use state separation APIs to obtain appropriate storage location
if (SUCCEEDED(GetDriverPersistentStorageLocation(vphalDumpFilePath)))
{
std::string m_outputFilePath;
MOS_USER_FEATURE_VALUE_WRITE_DATA userFeatureWriteData;
m_outputFilePath = vphalDumpFilePath.c_str();
m_outputFilePath.append(VPHAL_DBG_DUMP_OUTPUT_FOLDER);
// Copy the Output path
MOS_SecureMemcpy(
pDumpSpec->pcOutputPath,
MAX_PATH,
m_outputFilePath.c_str(),
m_outputFilePath.size());
MOS_ZeroMemory(&userFeatureWriteData, sizeof(userFeatureWriteData));
userFeatureWriteData.Value.StringData.pStringData = cStringData;
userFeatureWriteData.Value.StringData.pStringData = const_cast<char *>(m_outputFilePath.c_str());
userFeatureWriteData.Value.StringData.uSize = m_outputFilePath.size();
userFeatureWriteData.ValueID = __VPHAL_DBG_DUMP_OUTPUT_DIRECTORY_ID;
MOS_UserFeature_WriteValues_ID(NULL, &userFeatureWriteData, 1, m_osInterface->pOsContext);
}
}
#endif
// Get dump locations
UserFeatureData.StringData.pStringData = cStringData;
UserFeatureData.StringData.uMaxSize = MOS_USER_CONTROL_MAX_DATA_SIZE;
UserFeatureData.StringData.uSize = 0; // set the default value. 0 is empty buffer.
MOS_CHK_STATUS_SAFE(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_STATE_DUMP_LOCATION_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
if (pUserFeatureData->StringData.uSize > 0)
{
bDumpEnabled = ((pDumpSpec->pcOutputPath[0] != '\0') &&
(pUserFeatureData->StringData.pStringData[0] != '\0'));
}
if (bDumpEnabled)
{
VPHAL_DEBUG_CHK_STATUS(ProcessDumpStateLocations(
pUserFeatureData->StringData.pStringData));
}
finish:
if ((eStatus != MOS_STATUS_SUCCESS) || (!bDumpEnabled))
{
pDumpSpec->uiStartFrame = 1;
pDumpSpec->uiEndFrame = 0;
}
}
VphalSurfaceDumper::~VphalSurfaceDumper()
{
MOS_SafeFreeMemory(m_dumpSpec.pDumpLocations);
}
VphalHwStateDumper::~VphalHwStateDumper()
{
VPHAL_DBG_DUMP_SPEC *pDumpSpec = &m_dumpSpec;
if (pDumpSpec != nullptr)
{
if(pDumpSpec->pGSHDumpSpec != nullptr)
MOS_SafeFreeMemory(pDumpSpec->pGSHDumpSpec->pDumpLocations);
if(pDumpSpec->pSSHDumpSpec != nullptr)
MOS_SafeFreeMemory(pDumpSpec->pSSHDumpSpec->pDumpLocations);
if(pDumpSpec->pBBDumpSpec != nullptr)
MOS_SafeFreeMemory(pDumpSpec->pBBDumpSpec->pDumpLocations);
if(pDumpSpec->pCBDumpSpec != nullptr)
MOS_SafeFreeMemory(pDumpSpec->pCBDumpSpec->pDumpLocations);
if(pDumpSpec->pVeboxStateDumpSpec != nullptr)
MOS_SafeFreeMemory(pDumpSpec->pVeboxStateDumpSpec->pDumpLocations);
if(pDumpSpec->pStatisticsDumpSpec != nullptr)
MOS_SafeFreeMemory(pDumpSpec->pStatisticsDumpSpec->pDumpLocations);
MOS_SafeFreeMemory(pDumpSpec->pGSHDumpSpec);
MOS_SafeFreeMemory(pDumpSpec->pSSHDumpSpec);
MOS_SafeFreeMemory(pDumpSpec->pBBDumpSpec);
MOS_SafeFreeMemory(pDumpSpec->pCBDumpSpec);
MOS_SafeFreeMemory(pDumpSpec->pVeboxStateDumpSpec);
MOS_SafeFreeMemory(pDumpSpec->pStatisticsDumpSpec);
}
}
uint32_t VphalSurfaceDumper::m_frameNumInVp = 0xffffffff;
char VphalSurfaceDumper::m_dumpLocInVp[MAX_PATH];
MOS_STATUS VphalSurfaceDumper::DumpSurface(
PVPHAL_SURFACE pSurf,
uint32_t uiFrameNumber,
uint32_t uiCounter,
uint32_t Location)
{
MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
int32_t VphalSurfDumpManualTrigger = VPHAL_DBG_SURF_DUMP_MANUAL_TRIGGER_DEFAULT_NOT_SET;
MOS_STATUS eStatus;
int32_t i;
VPHAL_DBG_SURF_DUMP_SPEC* pDumpSpec = &m_dumpSpec;
bool isDumpFromDecomp;
bool orgDumpAuxEnable;
eStatus = MOS_STATUS_SUCCESS;
i = 0;
isDumpFromDecomp = (Location == VPHAL_DBG_DUMP_TYPE_PRE_MEMDECOMP || Location == VPHAL_DBG_DUMP_TYPE_POST_MEMDECOMP);
orgDumpAuxEnable = m_dumpSpec.enableAuxDump;
if ((Location == VPHAL_DBG_DUMP_TYPE_PRE_MEMDECOMP) ||
(Location == VPHAL_DBG_DUMP_TYPE_POST_MEMDECOMP && m_frameNumInVp != 0xffffffff))
{
// For PreMemDecomp, dump without aux is meaningless
// and, if we don't turn on aux dump, the surface will be deswizzled,
// while Mos_Specific_LockResource() will perform deswilling to temp buffer and then copy to locked buffer
// This will break the compressed surface.
// So, we cannot dump compressed surf with deswizzling under current implementation.
// And, for PostMemDecomp, although aux surf should be zero, we can dump it out for comparison.
// Besides, we don't need to deswizzle as the original dump from VP (preAll etc) will do the deswizzling
// For pre/post mem decomp from Codec/3D, doing deswizzling might help to check the result visually
m_dumpSpec.enableAuxDump = true;
}
if (m_frameNumInVp != 0xffffffff && isDumpFromDecomp)
{
// override the uiFrameNumer as it is during Vphal dumping its surface and already in lock and decomp phase
uiFrameNumber = m_frameNumInVp;
}
if (!isDumpFromDecomp)
{
m_frameNumInVp = uiFrameNumber;
}
// Get if manual triggered build
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_SURF_DUMP_MANUAL_TRIGGER_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext);
VphalSurfDumpManualTrigger = UserFeatureData.u32Data;
if (VphalSurfDumpManualTrigger != VPHAL_DBG_SURF_DUMP_MANUAL_TRIGGER_DEFAULT_NOT_SET)
{
if (VphalSurfDumpManualTrigger == VPHAL_DBG_SURF_DUMP_MANUAL_TRIGGER_STARTED)
{
VPHAL_DEBUG_NORMALMESSAGE("Dump manaul trigger enabled, dump started: %d \n", VphalSurfDumpManualTrigger);
for (i = 0; i < pDumpSpec->iNumDumpLocs; i++)
{
if (pDumpSpec->pDumpLocations[i].DumpLocation == Location && // should dump at this pipeline location AND
(pDumpSpec->pDumpLocations[i].SurfType == pSurf->SurfType || // should dump for this surface type OR
pDumpSpec->pDumpLocations[i].SurfType == SURF_NONE)) // should dump for any surface type
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, m_dumpLoc));
if (!isDumpFromDecomp && pSurf->bIsCompressed)
{
EnumToLocString(Location, m_dumpLocInVp);
}
if (!isDumpFromDecomp || m_dumpLocInVp[0] == 0)
{
MOS_SecureStringPrint(m_dumpPrefix, MAX_PATH, MAX_PATH, "%s/surfdump_loc[%s]_lyr[%d]", pDumpSpec->pcOutputPath, m_dumpLoc, uiCounter);
}
else
{
MOS_SecureStringPrint(m_dumpPrefix, MAX_PATH, MAX_PATH, "%s/surfdump_loc[%s_%s]_lyr[%d]", pDumpSpec->pcOutputPath, m_dumpLocInVp, m_dumpLoc, uiCounter);
}
DumpSurfaceToFile(
m_osInterface,
pSurf,
m_dumpPrefix,
uiFrameNumber,
true,
isDumpFromDecomp,
nullptr);
break;
}
}
}
else if (VphalSurfDumpManualTrigger == VPHAL_DBG_SURF_DUMP_MANUAL_TRIGGER_STOPPED)
{
VPHAL_DEBUG_NORMALMESSAGE("Dump manaul trigger enabled, dump stopped: %d \n", VphalSurfDumpManualTrigger);
}
else
{
VPHAL_DEBUG_NORMALMESSAGE("Dump manaul trigger flag: %d \n", VphalSurfDumpManualTrigger);
}
}
else if (pDumpSpec->uiStartFrame <= uiFrameNumber &&
uiFrameNumber <= pDumpSpec->uiEndFrame)
{
for (i = 0; i < pDumpSpec->iNumDumpLocs; i++)
{
if (pDumpSpec->pDumpLocations[i].DumpLocation == Location && // should dump at this pipeline location AND
(pDumpSpec->pDumpLocations[i].SurfType == pSurf->SurfType || // should dump for this surface type OR
pDumpSpec->pDumpLocations[i].SurfType == SURF_NONE)) // should dump for any surface type
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, m_dumpLoc));
if (!isDumpFromDecomp && pSurf->bIsCompressed)
{
EnumToLocString(Location, m_dumpLocInVp);
}
if (!isDumpFromDecomp || m_dumpLocInVp[0] == 0)
{
MOS_SecureStringPrint(m_dumpPrefix, MAX_PATH, MAX_PATH, "%s/surfdump_loc[%s]_lyr[%d]",
pDumpSpec->pcOutputPath, m_dumpLoc, uiCounter);
}
else
{
MOS_SecureStringPrint(m_dumpPrefix, MAX_PATH, MAX_PATH, "%s/surfdump_loc[%s_%s]_lyr[%d]",
pDumpSpec->pcOutputPath, m_dumpLocInVp, m_dumpLoc, uiCounter);
}
DumpSurfaceToFile(
m_osInterface,
pSurf,
m_dumpPrefix,
uiFrameNumber,
true,
isDumpFromDecomp,
nullptr);
break;
}
}
}
else
{
VPHAL_DEBUG_VERBOSEMESSAGE("No surface dumpped, VphalSurfDumpManualTrigger: %d, uiStartFrame: %d, uiEndFrame: %d\n", VphalSurfDumpManualTrigger, pDumpSpec->uiStartFrame, pDumpSpec->uiEndFrame);
}
finish:
if (!isDumpFromDecomp)
{
m_frameNumInVp = 0xffffffff;
m_dumpLocInVp[0] = 0;
}
m_dumpSpec.enableAuxDump = orgDumpAuxEnable;
return eStatus;
}
MOS_STATUS VphalSurfaceDumper::DumpSurfaceArray(
PVPHAL_SURFACE *ppSurfaces,
uint32_t uiMaxSurfaces,
uint32_t uiNumSurfaces,
uint32_t uiFrameNumber,
uint32_t Location)
{
MOS_STATUS eStatus;
uint32_t uiIndex;
uint32_t uiLayer;
//---------------------------------------------------
VPHAL_DEBUG_ASSERT(ppSurfaces);
//---------------------------------------------------
eStatus = MOS_STATUS_SUCCESS;
for (uiIndex = 0, uiLayer = 0;
uiLayer < uiNumSurfaces && uiIndex < uiMaxSurfaces; uiIndex++)
{
if (ppSurfaces[uiIndex])
{
VPHAL_DEBUG_ASSERT(!Mos_ResourceIsNull(&ppSurfaces[uiIndex]->OsResource));
VPHAL_DEBUG_CHK_STATUS(DumpSurface(
ppSurfaces[uiIndex],
uiFrameNumber,
uiLayer,
Location));
uiLayer++;
}
}
finish:
return eStatus;
}
void VphalHwStateDumper::DumpGSH()
{
MOS_STATUS eStatus;
int32_t iIndex;
uint64_t uiPhase;
VPHAL_DBG_DUMP_SPEC* pDumpSpec;
VPHAL_DEBUG_STAGE Location;
char pcDumpPrefix[MAX_PATH];
char pcDumpLoc[MAX_PATH];
Location = (VPHAL_DEBUG_STAGE)iDebugStage;
uiPhase = iPhase;
pDumpSpec = &m_dumpSpec;
if ((pDumpSpec->pGSHDumpSpec == nullptr) ||
(pDumpSpec->pGSHDumpSpec->pDumpLocations == nullptr) ||
(pDumpSpec->pGSHDumpSpec->pDumpLocations->DumpStage == 0))
{
goto finish;
}
MOS_ZeroMemory(pcDumpPrefix, MAX_PATH);
MOS_ZeroMemory(pcDumpLoc, MAX_PATH);
if(pDumpSpec->uiStartFrame <= pDumpSpec->uiCurrentFrame &&
pDumpSpec->uiCurrentFrame <= pDumpSpec->uiEndFrame)
{
for (iIndex= 0; iIndex< pDumpSpec->pGSHDumpSpec->iNumDumpLocs; iIndex++)
{
if (pDumpSpec->pGSHDumpSpec->pDumpLocations[iIndex].DumpStage == Location)
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, pcDumpLoc));
MOS_SecureStringPrint(pcDumpPrefix, MAX_PATH, MAX_PATH, "%s/GSH_dump_loc[%s]_[%lld]",
pDumpSpec->pcOutputPath, pcDumpLoc, uiPhase);
DumpGshBinary(
pcDumpPrefix,
pDumpSpec->uiCurrentFrame);
break;
}
}
}
finish:
return;
}
void VphalHwStateDumper::DumpSSH()
{
MOS_STATUS eStatus;
int32_t iIndex;
uint64_t uiPhase;
VPHAL_DBG_DUMP_SPEC* pDumpSpec;
VPHAL_DEBUG_STAGE Location;
char pcDumpPrefix[MAX_PATH];
char pcDumpLoc[MAX_PATH];
Location = (VPHAL_DEBUG_STAGE)iDebugStage;
uiPhase = iPhase;
pDumpSpec = &m_dumpSpec;
if ((pDumpSpec->pSSHDumpSpec == nullptr) ||
(pDumpSpec->pSSHDumpSpec->pDumpLocations == nullptr) ||
(pDumpSpec->pSSHDumpSpec->pDumpLocations->DumpStage == 0))
{
goto finish;
}
MOS_ZeroMemory(pcDumpPrefix, MAX_PATH);
MOS_ZeroMemory(pcDumpLoc, MAX_PATH);
if(pDumpSpec->uiStartFrame <= pDumpSpec->uiCurrentFrame &&
pDumpSpec->uiCurrentFrame <= pDumpSpec->uiEndFrame)
{
for (iIndex= 0; iIndex< pDumpSpec->pSSHDumpSpec->iNumDumpLocs; iIndex++)
{
if (pDumpSpec->pSSHDumpSpec->pDumpLocations[iIndex].DumpStage == Location)
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, pcDumpLoc));
MOS_SecureStringPrint(pcDumpPrefix, MAX_PATH, MAX_PATH, "%s/SSH_dump_loc[%s]_[%lld]",
pDumpSpec->pcOutputPath, pcDumpLoc, uiPhase);
DumpSshBinary(
pcDumpPrefix,
pDumpSpec->uiCurrentFrame);
break;
}
}
}
finish:
return;
}
void VphalHwStateDumper::DumpBatchBuffer(
PMHW_BATCH_BUFFER pBatchBuffer)
{
MOS_STATUS eStatus;
int32_t iIndex;
uint64_t uiPhase;
VPHAL_DBG_DUMP_SPEC* pDumpSpec;
VPHAL_DEBUG_STAGE Location;
char pcDumpPrefix[MAX_PATH];
char pcDumpLoc[MAX_PATH];
Location = (VPHAL_DEBUG_STAGE)iDebugStage;
uiPhase = iPhase;
pDumpSpec = &m_dumpSpec;
if ((pDumpSpec->pBBDumpSpec == nullptr) ||
(pDumpSpec->pBBDumpSpec->pDumpLocations == nullptr) ||
(pDumpSpec->pBBDumpSpec->pDumpLocations->DumpStage == 0))
{
goto finish;
}
MOS_ZeroMemory(pcDumpPrefix, MAX_PATH);
MOS_ZeroMemory(pcDumpLoc, MAX_PATH);
if(pDumpSpec->uiStartFrame <= pDumpSpec->uiCurrentFrame &&
pDumpSpec->uiCurrentFrame <= pDumpSpec->uiEndFrame)
{
for (iIndex= 0; iIndex< pDumpSpec->pBBDumpSpec->iNumDumpLocs; iIndex++)
{
if (pDumpSpec->pBBDumpSpec->pDumpLocations[iIndex].DumpStage == Location)
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, pcDumpLoc));
MOS_SecureStringPrint(pcDumpPrefix, MAX_PATH, MAX_PATH, "%s/BB_dump_loc[%s]_[%lld]",
pDumpSpec->pcOutputPath, pcDumpLoc, uiPhase);
DumpBatchBufferBinary(
pBatchBuffer,
pcDumpPrefix,
pDumpSpec->uiCurrentFrame);
break;
}
}
}
finish:
return;
}
void VphalHwStateDumper::DumpCommandBuffer(
PMOS_COMMAND_BUFFER pCommandBuffer)
{
MOS_STATUS eStatus;
int32_t iIndex;
uint64_t uiPhase;
VPHAL_DBG_DUMP_SPEC* pDumpSpec;
VPHAL_DEBUG_STAGE Location;
char pcDumpPrefix[MAX_PATH];
char pcDumpLoc[MAX_PATH];
Location = (VPHAL_DEBUG_STAGE)iDebugStage;
uiPhase = iPhase;
pDumpSpec = &m_dumpSpec;
if ((pDumpSpec->pCBDumpSpec == nullptr) ||
(pDumpSpec->pCBDumpSpec->pDumpLocations == nullptr) ||
(pDumpSpec->pCBDumpSpec->pDumpLocations->DumpStage == 0))
{
goto finish;
}
MOS_ZeroMemory(pcDumpPrefix, MAX_PATH);
MOS_ZeroMemory(pcDumpLoc, MAX_PATH);
if(pDumpSpec->uiStartFrame <= pDumpSpec->uiCurrentFrame &&
pDumpSpec->uiCurrentFrame <= pDumpSpec->uiEndFrame)
{
for (iIndex= 0; iIndex< pDumpSpec->pCBDumpSpec->iNumDumpLocs; iIndex++)
{
if (pDumpSpec->pCBDumpSpec->pDumpLocations[iIndex].DumpStage == Location)
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, pcDumpLoc));
MOS_SecureStringPrint(pcDumpPrefix, MAX_PATH, MAX_PATH, "%s/CB_dump_loc[%s]_[%lld]",
pDumpSpec->pcOutputPath, pcDumpLoc, uiPhase);
DumpCommandBufferBinary(
pCommandBuffer,
pcDumpPrefix,
pDumpSpec->uiCurrentFrame);
break;
}
}
}
finish:
return;
}
void VphalHwStateDumper::DumpVeboxState(PVPHAL_VEBOX_STATE pVeboxState)
{
MOS_STATUS eStatus;
int32_t iIndex;
uint64_t uiPhase;
VPHAL_DBG_DUMP_SPEC* pDumpSpec;
VPHAL_DEBUG_STAGE Location;
PVPHAL_VEBOX_STATE pVeboxRndrState = (PVPHAL_VEBOX_STATE)pVeboxState;
char pcDumpPrefix[MAX_PATH];
char pcDumpLoc[MAX_PATH];
Location = (VPHAL_DEBUG_STAGE)iDebugStage;
uiPhase = iPhase;
pDumpSpec = &m_dumpSpec;
if ((pDumpSpec->pVeboxStateDumpSpec == nullptr) ||
(pDumpSpec->pVeboxStateDumpSpec->pDumpLocations == nullptr) ||
(pDumpSpec->pVeboxStateDumpSpec->pDumpLocations->DumpStage == 0))
{
goto finish;
}
MOS_ZeroMemory(pcDumpPrefix, MAX_PATH);
MOS_ZeroMemory(pcDumpLoc, MAX_PATH);
if(pDumpSpec->uiStartFrame <= pDumpSpec->uiCurrentFrame &&
pDumpSpec->uiCurrentFrame <= pDumpSpec->uiEndFrame)
{
for (iIndex= 0; iIndex< pDumpSpec->pVeboxStateDumpSpec->iNumDumpLocs; iIndex++)
{
if (pDumpSpec->pVeboxStateDumpSpec->pDumpLocations[iIndex].DumpStage == Location)
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, pcDumpLoc));
MOS_SecureStringPrint(pcDumpPrefix, MAX_PATH, MAX_PATH, "%s/VeboxState_dump_loc[%s]_",
pDumpSpec->pcOutputPath,pcDumpLoc);
DumpVeboxStateBinary(
pVeboxRndrState->m_pVeboxInterface,
pcDumpPrefix,
pDumpSpec->uiCurrentFrame);
break;
}
}
}
finish:
return;
}
void VphalHwStateDumper::DumpStatistics(
void* pVeboxState,
uint8_t* pStat0Base,
uint8_t* pStat1Base)
{
MOS_STATUS eStatus;
int32_t iIndex;
uint64_t uiPhase;
VPHAL_DBG_DUMP_SPEC* pDumpSpec;
VPHAL_DEBUG_STAGE Location;
char pcDumpPrefix[MAX_PATH];
char pcDumpLoc[MAX_PATH];
Location = (VPHAL_DEBUG_STAGE)iDebugStage;
uiPhase = iPhase;
pDumpSpec = &m_dumpSpec;
if ((pDumpSpec->pStatisticsDumpSpec == nullptr) ||
(pDumpSpec->pStatisticsDumpSpec->pDumpLocations == nullptr) ||
(pDumpSpec->pStatisticsDumpSpec->pDumpLocations->DumpStage == 0))
{
goto finish;
}
MOS_ZeroMemory(pcDumpPrefix, MAX_PATH);
MOS_ZeroMemory(pcDumpLoc, MAX_PATH);
if(pDumpSpec->uiStartFrame <= pDumpSpec->uiCurrentFrame &&
pDumpSpec->uiCurrentFrame <= pDumpSpec->uiEndFrame)
{
for (iIndex= 0; iIndex< pDumpSpec->pStatisticsDumpSpec->iNumDumpLocs; iIndex++)
{
if (pDumpSpec->pStatisticsDumpSpec->pDumpLocations[iIndex].DumpStage == Location)
{
VPHAL_DEBUG_CHK_STATUS(EnumToLocString(Location, pcDumpLoc));
MOS_SecureStringPrint(pcDumpPrefix, MAX_PATH, MAX_PATH, "%s/Statistics_dump_loc[%s]_",
pDumpSpec->pcOutputPath,pcDumpLoc);
DumpStatisticsBinary(
(PVPHAL_VEBOX_STATE)pVeboxState,
pStat0Base,
pStat1Base,
pcDumpPrefix,
pDumpSpec->uiCurrentFrame);
break;
}
}
}
finish:
return;
}
void VphalParameterDumper::GetParametersDumpSpec()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
bool bDumpEnabled;
char cStringData[MOS_USER_CONTROL_MAX_DATA_SIZE];
VPHAL_DBG_PARAMS_DUMP_SPEC *pDumpSpec = &m_dumpSpec;
pDumpSpec->uiStartFrame = 0xFFFFFFFF;
pDumpSpec->uiEndFrame = 0;
pDumpSpec->outFileLocation[0] = '\0';
cStringData[0] = '\0';
bDumpEnabled = false;
// Get start frame
// if start frame is not got assign a default value of 0
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_PARAM_DUMP_START_FRAME_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->uiStartFrame = UserFeatureData.u32Data;
// Get end frame
// if end frame is not got assign a default value of max
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_PARAM_DUMP_END_FRAME_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->uiEndFrame = UserFeatureData.u32Data;
// Get out file path
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
UserFeatureData.StringData.pStringData = cStringData;
UserFeatureData.StringData.uMaxSize = MOS_USER_CONTROL_MAX_DATA_SIZE;
UserFeatureData.StringData.uSize = 0; //set the default value. 0 is empty buffer.
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_PARAM_DUMP_OUTFILE_KEY_NAME_ID,
&UserFeatureData,
m_osInterface->pOsContext));
if (UserFeatureData.StringData.uSize > 0)
{
// Copy the Output path
MOS_SecureMemcpy(
pDumpSpec->outFileLocation,
MAX_PATH,
UserFeatureData.StringData.pStringData,
UserFeatureData.StringData.uSize);
bDumpEnabled = true;
}
#if !defined(LINUX) && !defined(ANDROID)
else
{
std::string vphalDumpFilePath;
// Use state separation APIs to obtain appropriate storage location
if (SUCCEEDED(GetDriverPersistentStorageLocation(vphalDumpFilePath)))
{
std::string m_outputFilePath;
MOS_USER_FEATURE_VALUE_WRITE_DATA userFeatureWriteData;
m_outputFilePath = vphalDumpFilePath.c_str();
m_outputFilePath.append(VPHAL_DBG_DUMP_OUTPUT_FOLDER);
// Copy the Output path
MOS_SecureMemcpy(
pDumpSpec->outFileLocation,
MAX_PATH,
m_outputFilePath.c_str(),
m_outputFilePath.size());
MOS_ZeroMemory(&userFeatureWriteData, sizeof(userFeatureWriteData));
userFeatureWriteData.Value.StringData.pStringData = cStringData;
userFeatureWriteData.Value.StringData.pStringData = const_cast<char *>(m_outputFilePath.c_str());
userFeatureWriteData.Value.StringData.uSize = m_outputFilePath.size();
userFeatureWriteData.ValueID = __VPHAL_DBG_DUMP_OUTPUT_DIRECTORY_ID;
MOS_UserFeature_WriteValues_ID(NULL, &userFeatureWriteData, 1, m_osInterface->pOsContext);
bDumpEnabled = true;
}
}
#endif
// Get enableSkuWaDump
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_USER_FEATURE_INVALID_KEY_ASSERT(MOS_UserFeature_ReadValue_ID(
nullptr,
__VPHAL_DBG_PARA_DUMP_ENABLE_SKUWA_DUMP_ID,
&UserFeatureData,
m_osInterface->pOsContext));
pDumpSpec->enableSkuWaDump = UserFeatureData.u32Data;
if ((eStatus != MOS_STATUS_SUCCESS) || (!bDumpEnabled))
{
pDumpSpec->uiStartFrame = 1;
pDumpSpec->uiEndFrame = 0;
}
}
MOS_STATUS VphalParameterDumper::DumpSourceSurface(
uint32_t uiFrameCounter,
char *pcOutputPath,
PVPHAL_SURFACE pSrc,
uint32_t index,
char* &pcOutContents)
{
MOS_STATUS eStatus;
char sSurfaceFilePath[MAX_PATH] = { 0 }, sOsSurfaceFilePath[MAX_PATH] = { 0 };
eStatus = MOS_STATUS_SUCCESS;
//Color Information
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<!-- Color Information -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_CSPACE>%s</VPHAL_CSPACE>\n", GetColorSpaceStr(pSrc->ColorSpace)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<EXTENDED_GAMUT></EXTENDED_GAMUT>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<PALETTE_ALLOCATION>%d</PALETTE_ALLOCATION>\n", (pSrc->iPalette)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<PALETTE_DATA>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<PALETTE_DATA_TYPE>%s</PALETTE_DATA_TYPE>\n", GetPaletteTypeStr(pSrc->Palette.PaletteType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_CSPACE>%s</VPHAL_CSPACE>\n", GetColorSpaceStr(pSrc->Palette.ColorSpace)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<HAS_ALPHA>%d</HAS_ALPHA>\n", pSrc->Palette.bHasAlpha ? 1 : 0));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<TOTAL_ENTRIES>%d</TOTAL_ENTRIES>\n", pSrc->Palette.iTotalEntries));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<NUM_ENTRIES>%d</NUM_ENTRIES>\n", pSrc->Palette.iNumEntries));
for (int nIndex = 0; nIndex < pSrc->Palette.iTotalEntries; nIndex++)
{
if (pSrc->Palette.pPalette8)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<PVPHAL_COLOR_SAMPLE>%08x</PVPHAL_COLOR_SAMPLE>\n", pSrc->Palette.pPalette8[nIndex].dwValue));
}
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</PALETTE_DATA>\n"));
//Rendering parameters
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<!-- Rendering parameters -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_BLENDING_PARAMS>\n"));
if (pSrc->pBlendingParams)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_BLEND_TYPE>%s</VPHAL_BLEND_TYPE>\n", GetBlendTypeStr(pSrc->pBlendingParams->BlendType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ALPHA type=\"real\">%.3f</ALPHA>\n", pSrc->pBlendingParams->fAlpha));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ALPHA type=\"real\"></ALPHA>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_BLENDING_PARAMS>\n"));
//Luma key params
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_LUMAKEY_PARAMS>\n"));
if (pSrc->pLumaKeyParams)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<LUMA_LOW>%d</LUMA_LOW>\n", pSrc->pLumaKeyParams->LumaLow));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<LUMA_HIGH>%d</LUMA_HIGH>\n", pSrc->pLumaKeyParams->LumaHigh));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<LUMA_LOW></LUMA_LOW>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<LUMA_HIGH></LUMA_HIGH>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_LUMAKEY_PARAMS>\n"));
//Propcamp params
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_PROCAMP_PARAMS>\n"));
if (pSrc->pProcampParams)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLED>%d</ENABLED>\n", (pSrc->pProcampParams->bEnabled ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<BRIGHTNESS type=\"real\">%.3f</BRIGHTNESS>\n", pSrc->pProcampParams->fBrightness));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<CONTRAST type=\"real\">%.3f</CONTRAST>\n", pSrc->pProcampParams->fContrast));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<HUE type=\"real\">%.3f</HUE>\n", pSrc->pProcampParams->fHue));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<SATURATION type=\"real\">%.3f</SATURATION>\n", pSrc->pProcampParams->fSaturation));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLED></ENABLED>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<BRIGHTNESS type=\"real\"></BRIGHTNESS>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<CONTRAST type=\"real\"></CONTRAST>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<HUE type=\"real\"></HUE>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<SATURATION type=\"real\"></SATURATION>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_PROCAMP_PARAMS>\n"));
//IEF parameter
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_IEF_PARAMS>\n"));
if (pSrc->pIEFParams)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<IEFFACTOR type = \"real\">%.3f</IEFFACTOR>\n", pSrc->pIEFParams->fIEFFactor));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<IEFFACTOR type = \"real\"></IEFFACTOR>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_IEF_PARAMS>\n"));
//Advanced processing
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<!-- Advanced processing -->\n"));
//DI
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_DI_PARAMS>\n"));
if (pSrc->pDeinterlaceParams)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<DIMODE>%s</DIMODE>\n", GetDIModeStr(pSrc->pDeinterlaceParams->DIMode)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<ENABLE_FMD>%d</ENABLE_FMD>\n", (pSrc->pDeinterlaceParams->bEnableFMD ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<SINGLE_FIELD>%d</SINGLE_FIELD>\n", (pSrc->pDeinterlaceParams->bSingleField ? 1 : 0)));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<DIMODE></DIMODE>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<ENABLE_FMD></ENABLE_FMD>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<SINGLE_FIELD></SINGLE_FIELD>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_DI_PARAMS>\n"));
//Denoise
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_DENOISE_PARAMS>\n"));
if (pSrc->pDenoiseParams)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_LUMA>%d</ENABLE_LUMA>\n", (pSrc->pDenoiseParams->bEnableLuma ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_CHROMA>%d</ENABLE_CHROMA>\n", (pSrc->pDenoiseParams->bEnableChroma ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<AUTO_DETECT>%d</AUTO_DETECT>\n", (pSrc->pDenoiseParams->bAutoDetect ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<DENOISE_FACTOR>%.3f</DENOISE_FACTOR>\n", (pSrc->pDenoiseParams->fDenoiseFactor)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<NOISE_LEVEL>%s</NOISE_LEVEL>\n", GetDenoiseModeStr(pSrc->pDenoiseParams->NoiseLevel)));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_LUMA></ENABLE_LUMA>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_CHROMA></ENABLE_CHROMA>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<AUTO_DETECT></AUTO_DETECT>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<DENOISE_FACTOR></DENOISE_FACTOR>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_DENOISE_PARAMS>\n"));
//ColorPipe
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_COLORPIPE_PARAMS>\n"));
if (pSrc->pColorPipeParams)
{
VPHAL_TCC_PARAMS TccParams = pSrc->pColorPipeParams->TccParams;
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_ACE>%d</ENABLE_ACE>\n", (pSrc->pColorPipeParams->bEnableACE ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_STE>%d</ENABLE_STE>\n", (pSrc->pColorPipeParams->bEnableSTE ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_TCC>%d</ENABLE_TCC>\n", (pSrc->pColorPipeParams->bEnableTCC ? 1 : 0)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ACE_LEVEL>%d</ACE_LEVEL>\n", (pSrc->pColorPipeParams->dwAceLevel)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ACE_STRENGHTH>%d</ACE_STRENGHTH>\n", (pSrc->pColorPipeParams->dwAceStrength)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<STE_PARAMS>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t\t<STE_FACTOR>%d</STE_FACTOR>\n", (pSrc->pColorPipeParams->SteParams.dwSTEFactor)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t</STE_PARAMS>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<TCC_PARAMS>%d,%d,%d,%d,%d,%d</TCC_PARAMS>\n", TccParams.Blue, TccParams.Cyan, TccParams.Green, TccParams.Magenta, TccParams.Red, TccParams.Yellow));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_ACE></ENABLE_ACE>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_STE></ENABLE_STE>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ENABLE_TCC></ENABLE_TCC>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<ACE_LEVEL></ACE_LEVEL>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<STE_PARAMS></STE_PARAMS>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<TCC_PARAMS></TCC_PARAMS>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_COLORPIPE_PARAMS>\n"));
//Gamut
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_GAMUT_PARAMS>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<GCOMP_MODE></GCOMP_MODE>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_GAMUT_PARAMS>\n"));
//Sample information
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<!-- Sample information -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_FORMAT>%s</VPHAL_FORMAT>\n", GetWholeFormatStr(pSrc->Format)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_SURFACE_TYPE>%s</VPHAL_SURFACE_TYPE>\n", GetSurfaceTypeStr(pSrc->SurfType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_SAMPLE_TYPE>%s</VPHAL_SAMPLE_TYPE>\n", GetSampleTypeStr(pSrc->SampleType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_SCALING_MODE>%s</VPHAL_SCALING_MODE>\n", GetScalingModeStr(pSrc->ScalingMode)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_ROTATION_MODE>%s</VPHAL_ROTATION_MODE>\n", GetRotationModeStr(pSrc->Rotation)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<RCSRC>%d,%d,%d,%d</RCSRC>\n", pSrc->rcSrc.left, pSrc->rcSrc.top, pSrc->rcSrc.right, pSrc->rcSrc.bottom));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<RCDST>%d,%d,%d,%d</RCDST>\n", pSrc->rcDst.left, pSrc->rcDst.top, pSrc->rcDst.right, pSrc->rcDst.bottom));
//Basic information
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<!-- Basic information -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_TILE_TYPE>%s</VPHAL_TILE_TYPE>\n", GetTileTypeStr(pSrc->TileType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<WIDTH>%d</WIDTH>\n", pSrc->dwWidth));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<HEIGHT>%d</HEIGHT>\n", pSrc->dwHeight));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<PITCH>%d</PITCH>\n", pSrc->dwPitch));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<SIZE>%d</SIZE>\n", pSrc->dwPitch * pSrc->dwHeight));
//Surface content initialization
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<!-- Surface content initialization -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<DATA>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<DEFAULT_COLOR type=\"integer\">0x000000FF</DEFAULT_COLOR>\n"));
if (pcOutputPath)
{
memset(sSurfaceFilePath, 0, MAX_PATH);
memset(sOsSurfaceFilePath, 0, MAX_PATH);
MOS_SecureStringPrint(sSurfaceFilePath, MAX_PATH, MAX_PATH, "%s%csurfdump_loc[preALL]_lyr[%d]_f[%03d]_w[%d]_h[%d]_p[%d].%s",
pcOutputPath, MOS_DIR_SEPERATOR, index, uiFrameCounter, pSrc->dwWidth, pSrc->dwHeight, pSrc->dwPitch, VphalDumperTool::GetFormatStr(pSrc->Format));
VphalDumperTool::GetOsFilePath(sSurfaceFilePath, sOsSurfaceFilePath);
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<FILE>%s</FILE>\n", sOsSurfaceFilePath));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</DATA>\n"));
// get backward reference
if (pSrc->pBwdRef)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<BACKREFDATA>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<DEFAULT_COLOR type=\"integer\">0x000000FF</DEFAULT_COLOR>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<Num>%d</Num>\n", pSrc->uBwdRefCount));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<FILE></FILE>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</BACKREFDATA>\n"));
}
// get forward reference
if (pSrc->pFwdRef)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<FWDREFDATA>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<Num>%d</Num>\n", pSrc->uFwdRefCount));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</FWDREFDATA>\n"));
}
}
finish:
return eStatus;
}
MOS_STATUS VphalParameterDumper::DumpTargetSurface(
uint32_t uiFrameCounter,
char *pcOutputPath,
PVPHAL_SURFACE pTarget,
uint32_t index,
char* &pcOutContents)
{
MOS_STATUS eStatus;
eStatus = MOS_STATUS_SUCCESS;
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_FORMAT>%s</VPHAL_FORMAT>\n", VphalParameterDumper::GetWholeFormatStr(pTarget->Format)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_SURFACE_TYPE>%s</VPHAL_SURFACE_TYPE>\n", VphalParameterDumper::GetSurfaceTypeStr(pTarget->SurfType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_SAMPLE_TYPE>%s</VPHAL_SAMPLE_TYPE>\n", GetSampleTypeStr(pTarget->SampleType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_CSPACE>%s</VPHAL_CSPACE>\n", GetColorSpaceStr(pTarget->ColorSpace)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_SCALING_MODE>%s</VPHAL_SCALING_MODE>\n", GetScalingModeStr(pTarget->ScalingMode)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<VPHAL_TILE_TYPE>%s</VPHAL_TILE_TYPE>\n", GetTileTypeStr(pTarget->TileType)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<WIDTH>%d</WIDTH>\n", pTarget->dwWidth));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<HEIGHT>%d</HEIGHT>\n", pTarget->dwHeight));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<PITCH>%d</PITCH>\n", pTarget->dwPitch));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<SIZE>%d</SIZE>\n", pTarget->dwPitch*pTarget->dwHeight));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<RCSRC>%d,%d,%d,%d</RCSRC>\n", pTarget->rcSrc.left, pTarget->rcSrc.top, pTarget->rcSrc.right, pTarget->rcSrc.bottom));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<RCDST>%d,%d,%d,%d</RCDST>\n", pTarget->rcDst.left, pTarget->rcDst.top, pTarget->rcDst.right, pTarget->rcDst.bottom));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<DATA>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t\t<DEFAULT_COLOR type=\"integer\">0x000000FF</DEFAULT_COLOR>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t\t<FILE></FILE>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t</DATA>\n"));
finish:
return eStatus;
}
MOS_STATUS VphalParameterDumper::DumpRenderParameter(
uint32_t uiFrameCounter,
char *pcOutputPath,
PVPHAL_RENDER_PARAMS pRenderParams,
char* &pcOutContents)
{
MOS_STATUS eStatus;
eStatus = MOS_STATUS_SUCCESS;
if (pRenderParams->pTarget[0])
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_SURFACE_TARGET>\n"));
VPHAL_DEBUG_CHK_STATUS(DumpTargetSurface(
uiFrameCounter,
pcOutputPath,
pRenderParams->pTarget[0],
0,
pcOutContents));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_SURFACE_TARGET>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<SRC_COUNT>%d</SRC_COUNT>\n", pRenderParams->uSrcCount));
//Color fill
if (pRenderParams->pColorFillParams)
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_COLORFILL_PARAMS>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<bYCbCr>%d</bYCbCr>\n", pRenderParams->pColorFillParams->bYCbCr));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<COLOR type=\"integer\">%08x</COLOR>\n", pRenderParams->pColorFillParams->Color));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t\t<CSPACE>%s</CSPACE>\n", GetColorSpaceStr(pRenderParams->pColorFillParams->CSpace)));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_COLORFILL_PARAMS>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_COMPONENT>%s</VPHAL_COMPONENT>\n", GetComponentStr(pRenderParams->Component)));
finish:
return eStatus;
}
MOS_STATUS VphalParameterDumper::DumpToXML(
uint32_t uiFrameCounter,
char *pcOutputPath,
PVPHAL_RENDER_PARAMS pRenderParams)
{
char sPath[MAX_PATH] = { 0 }, sOsPath[MAX_PATH] = { 0 };
MOS_STATUS eStatus;
char* pcOutContents;
uint32_t dwStrLen = 0;
FILE *fpOutXML;
char* pCurFrameFileName;
char* pBwdFrameFileName;
VPHAL_DBG_PARAMS_DUMP_SPEC *pParamsDumpSpec = &m_dumpSpec;
eStatus = MOS_STATUS_SUCCESS;
dwStrLen = 0;
pcOutContents = nullptr;
fpOutXML = nullptr;
pCurFrameFileName = nullptr;
pBwdFrameFileName = nullptr;
VPHAL_DEBUG_CHK_NULL(pRenderParams);
VPHAL_DEBUG_CHK_NULL(pParamsDumpSpec);
if ((pParamsDumpSpec->uiEndFrame < pParamsDumpSpec->uiStartFrame) || strlen(pParamsDumpSpec->outFileLocation) == 0)
goto finish;
// Create a processing instruction element.
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(true, &pcOutContents, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\n"));
// Create the root element.
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "<VPHAL_SCENARIO>\n"));
// General infomation
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<ID>%d</ID>\n", MOS_GetPid()));
VPHAL_DEBUG_CHK_NULL(pRenderParams->pSrc[0]);
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<DESCRIPTION>%d</DESCRIPTION>\n", pRenderParams->pSrc[0]->FrameID));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<!-- Number of frames to render -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<FRAME_COUNT type = \"integer\">1</FRAME_COUNT>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<!-- 60i or 30p BLT -->\n"));
if ((pRenderParams->uSrcCount > 0) &&
(pRenderParams->pSrc[0]->SampleType != SAMPLE_PROGRESSIVE))
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<BLT_TYPE>60i</BLT_TYPE>\n"));
}
else
{
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<BLT_TYPE>30p</BLT_TYPE>\n"));
}
// Surface
for (uint32_t i = 0; i < pRenderParams->uSrcCount; i++)
{
if (pRenderParams->pSrc[i] == nullptr)
continue;
//surface infomation
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<!-- Input surface definitions -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<VPHAL_SURFACE>\n"));
VPHAL_DEBUG_CHK_STATUS(DumpSourceSurface(
uiFrameCounter,
pcOutputPath,
pRenderParams->pSrc[i],
i,
pcOutContents));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t</VPHAL_SURFACE>\n"));
}
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<!-- Rendering parameters -->\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t<VPHAL_RENDER_PARAMS>\n"));
VPHAL_DEBUG_CHK_STATUS(DumpRenderParameter(
uiFrameCounter,
pcOutputPath,
pRenderParams,
pcOutContents));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "\t</VPHAL_RENDER_PARAMS>\n"));
VPHAL_DEBUG_CHK_STATUS(VphalDumperTool::AppendString(false, &pcOutContents, "</VPHAL_SCENARIO>\n"));
MOS_SecureStringPrint(sPath, MAX_PATH, MAX_PATH, "%s%cparam_dump[%d].xml", pParamsDumpSpec->outFileLocation, MOS_DIR_SEPERATOR, uiFrameCounter);
VphalDumperTool::GetOsFilePath(sPath, sOsPath);
VPHAL_DEBUG_CHK_STATUS(MOS_WriteFileFromPtr(sOsPath, pcOutContents, strlen(pcOutContents)));
finish:
if (pcOutContents)
{
MOS_FreeMemory(pcOutContents);
pcOutContents = nullptr;
}
return eStatus;
}
VphalParameterDumper::~VphalParameterDumper()
{
}
const char * VphalDumperTool::GetFormatStr(MOS_FORMAT format)
{
switch (format)
{
case Format_A8R8G8B8 : return _T("argb");
case Format_X8R8G8B8 : return _T("xrgb");
case Format_A8B8G8R8 : return _T("abgr");
case Format_X8B8G8R8 : return _T("xbgr");
case Format_A16R16G16B16: return _T("argb16");
case Format_A16B16G16R16: return _T("abgr16");
case Format_R5G6B5 : return _T("rgb16");
case Format_R8G8B8 : return _T("rgb24");
case Format_R32U : return _T("r32u");
case Format_RGBP : return _T("rgbp");
case Format_BGRP : return _T("bgrp");
case Format_R32F : return _T("r32f");
case Format_YUY2 : return _T("yuy2");
case Format_YUYV : return _T("yuyv");
case Format_YVYU : return _T("yvyu");
case Format_UYVY : return _T("uyvy");
case Format_VYUY : return _T("vyuy");
case Format_Y416 : return _T("y416");
case Format_AYUV : return _T("ayuv");
case Format_AUYV : return _T("auyv");
case Format_NV12 : return _T("nv12");
case Format_NV11 : return _T("nv11");
case Format_P208 : return _T("p208");
case Format_IMC1 : return _T("imc1");
case Format_IMC2 : return _T("imc2");
case Format_IMC3 : return _T("imc3");
case Format_IMC4 : return _T("imc4");
case Format_422H : return _T("422h");
case Format_422V : return _T("422v");
case Format_444P : return _T("444p");
case Format_411P : return _T("411p");
case Format_411R : return _T("411r");
case Format_400P : return _T("400p");
case Format_I420 : return _T("i420");
case Format_IYUV : return _T("iyuv");
case Format_YV12 : return _T("yv12");
case Format_YVU9 : return _T("yvu9");
case Format_AI44 : return _T("ai44");
case Format_IA44 : return _T("ia44");
case Format_P8 : return _T("P8");
case Format_STMM : return _T("stmm");
case Format_Buffer : return _T("buff");
case Format_RAW : return _T("buff");
case Format_PAL : return _T("pal");
case Format_A8P8 : return _T("a8p8");
case Format_A8 : return _T("a8");
case Format_L8 : return _T("l8");
case Format_A4L4 : return _T("a4l4");
case Format_A8L8 : return _T("a8l8");
case Format_V8U8 : return _T("v8u8");
case Format_IRW0 : return _T("irw0");
case Format_IRW1 : return _T("irw1");
case Format_IRW2 : return _T("irw2");
case Format_IRW3 : return _T("irw3");
case Format_R10G10B10A2 : return _T("r10g10b10a2");
case Format_B10G10R10A2 : return _T("b10g10r10a2");
case Format_P010 : return _T("p010");
case Format_P016 : return _T("p016");
case Format_R16F : return _T("r16f");
case Format_Y210 : return _T("y210");
case Format_Y216 : return _T("y216");
case Format_Y410 : return _T("y410");
case Format_P210 : return _T("p210");
case Format_P216 : return _T("p216");
default : return _T("Err");
}
return nullptr;
}
MOS_STATUS VphalDumperTool::GetSurfaceSize(
PVPHAL_SURFACE pSurface,
uint32_t iBpp,
uint32_t* piWidthInBytes,
uint32_t* piHeightInRows)
{
MOS_STATUS eStatus;
uint32_t iWidthInBytes;
uint32_t iHeightInRows;
//-------------------------------------------
VPHAL_DEBUG_ASSERT(pSurface->dwWidth >= 1);
VPHAL_DEBUG_ASSERT(pSurface->dwHeight >= 1);
VPHAL_DEBUG_ASSERT(pSurface->dwPitch >= 1);
//-------------------------------------------
eStatus = MOS_STATUS_SUCCESS;
switch (pSurface->Format)
{
// Packed Formats
case Format_A8R8G8B8:
case Format_X8R8G8B8:
case Format_A8B8G8R8:
case Format_X8B8G8R8:
case Format_R5G6B5:
case Format_R8G8B8:
case Format_R32U:
case Format_R32F:
case Format_AYUV:
case Format_YUY2:
case Format_YUYV:
case Format_YVYU:
case Format_UYVY:
case Format_VYUY:
case Format_AI44:
case Format_IA44:
case Format_P8:
case Format_A8P8:
case Format_A8:
case Format_L8:
case Format_A4L4:
case Format_A8L8:
case Format_V8U8:
case Format_R10G10B10A2:
case Format_B10G10R10A2:
case Format_Y210:
case Format_Y216:
case Format_Y410:
case Format_Y416:
iWidthInBytes = pSurface->dwWidth * iBpp / 8;
iHeightInRows = pSurface->dwHeight;
break;
// 4:2:0 (12-bits per pixel)
// IMC1 // IMC3
// -----------------> // ----------------->
// ________________________ // ________________________
//|Y0|Y1| | //|Y0|Y1| |
//|__|__| | //|__|__| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//|________________________| //|________________________|
//|V0|V1| | | //|U0|U1| | |
//|__|__| | | //|__|__| | |
//| | | //| | |
//|____________| PAD | //|____________| PAD |
//|U0|U1| | | //|V0|V1| | |
//|__|__| | | //|__|__| | |
//| | | //| | |
//|____________|___________| //|____________|___________|
case Format_IMC1:
case Format_IMC3:
iWidthInBytes = pSurface->dwWidth;
iHeightInRows = pSurface->dwHeight * 2;
break;
// 4:0:0 (8-bits per pixel)
// 400P
// ----------------->
// ________________________
//|Y0|Y1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
case Format_400P:
case Format_Buffer:
case Format_RAW:
iWidthInBytes = pSurface->dwWidth;
iHeightInRows = pSurface->dwHeight;
break;
// 4:1:1 (12-bits per pixel) // 4:2:2 (16-bits per pixel)
// 411P // 422H
// -----------------> // ----------------->
// ________________________ // ________________________
//|Y0|Y1| | //|Y0|Y1| |
//|__|__| | //|__|__| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//|________________________| //|________________________|
//|U0|U1|| | //|U0|U1| | |
//|__|__|| | //|__|__| | |
//| | | //| | |
//| | PAD | //| | PAD |
//| | | //| | |
//| | | //| | |
//| | | //| | |
//|______|_________________| //|____________|___________|
//|V0|V1|| | //|V0|V1| | |
//|__|__|| | //|__|__| | |
//| | | //| | |
//| | PAD | //| | PAD |
//| | | //| | |
//| | | //| | |
//| | | //| | |
//|______|_________________| //|____________|___________|
// 4:4:4 (24-bits per pixel)
// 444P
// ----------------->
// ________________________
//|Y0|Y1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|U0|U1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|V0|V1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
// 4:4:4 (24-bits per pixel)
// RGBP
// ----------------->
// ________________________
//|R0|R1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|G0|G1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|B0|B1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
case Format_RGBP:
// 4:4:4 (24-bits per pixel)
// BGRP
// ----------------->
// ________________________
//|B0|B1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|G0|G1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|R0|R1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
case Format_BGRP:
case Format_411P:
case Format_422H:
case Format_444P:
iWidthInBytes = pSurface->dwWidth;
iHeightInRows = pSurface->dwHeight * 3;
break;
// 4:1:1 (12-bits per pixel)
// 411R
// ----------------->
// ________________________
//|Y0|Y1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|U0|U1| |
//|__|__| |
//|________________________|
//|V0|V1| |
//|__|__| |
//|________________________|
case Format_411R:
iWidthInBytes = pSurface->dwWidth;
iHeightInRows = (pSurface->dwHeight * 3) / 2;
break;
// 4:2:2V (16-bits per pixel)
// 422V
// ----------------->
// ________________________
//|Y0|Y1| |
//|__|__| |
//| |
//| |
//| |
//| |
//| |
//|________________________|
//|U0|U1| |
//|__|__| |
//| |
//|________________________|
//|V0|V1| |
//|__|__| |
//| |
//|________________________|
case Format_422V:
iWidthInBytes = pSurface->dwWidth;
iHeightInRows = pSurface->dwHeight * 2;
break;
// 4:2:0 (12-bits per pixel)
// IMC2 // IMC4
// -----------------> // ----------------->
// ________________________ // ________________________
//|Y0|Y1| | //|Y0|Y1| |
//|__|__| | //|__|__| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//|________________________| //|________________________|
//|V0|V1| |U0|U1| | //|U0|U1| |V0|V1| |
//|__|__| |__|__| | //|__|__| |__|__| |
//| | | //| | |
//|____________|___________| //|____________|___________|
// NV12 // YV12
// -----------------> // ----------------->
// ________________________ // ________________________
//|Y0|Y1| | //|Y0|Y1| |
//|__|__| | //|__|__| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//| | //| |
//|________________________| //|________________________|
//|U0|V0|U1|V1| | //|V0|V1| |
//|__|__|__|__| | //|__|__|__________________|
//| | //|U0|U1| |
//|________________________| //|__|__|__________________|
case Format_IMC2:
case Format_IMC4:
case Format_NV12:
case Format_YV12:
case Format_I420:
case Format_IYUV:
case Format_YVU9:
iWidthInBytes = pSurface->dwWidth;
iHeightInRows = pSurface->dwHeight * iBpp / 8;
break;
case Format_P010:
case Format_P016:
iWidthInBytes = pSurface->dwWidth * 2;
iHeightInRows = pSurface->dwHeight * 3 / 2;
break;
case Format_A16R16G16B16:
case Format_A16B16G16R16:
iWidthInBytes = pSurface->dwWidth * 8;
iHeightInRows = pSurface->dwHeight;
break;
case Format_P210:
case Format_P216:
iWidthInBytes = pSurface->dwWidth * 2;
iHeightInRows = pSurface->dwHeight * 2;
default:
VPHAL_DEBUG_ASSERTMESSAGE("Format %d not supported.", pSurface->Format);
eStatus = MOS_STATUS_UNKNOWN;
goto finish;
}
*piWidthInBytes = iWidthInBytes;
*piHeightInRows = iHeightInRows;
finish:
return eStatus;
}
MOS_STATUS VphalDumperTool::AppendString(
bool bFirst,
char* *ppcBigString,
PCCHAR pcToAppendFmt,
...)
{
static size_t stTotalStrLen = 0;
static size_t stTotalAlloc = 0;
MOS_STATUS eStatus;
size_t stStrLenOld;
size_t stStrLenToAppend;
char* pcToAppend;
char* pcTmpPtr;
va_list argList;
eStatus = MOS_STATUS_SUCCESS;
stStrLenToAppend = 0;
stStrLenOld = 0;
pcTmpPtr = nullptr;
pcToAppend = (char*)MOS_AllocAndZeroMemory(sizeof(char) * ALLOC_GRANULARITY);
if (bFirst)
{
stTotalStrLen = 0;
stTotalAlloc = 0;
}
stStrLenOld = stTotalStrLen;
if (ppcBigString == nullptr || pcToAppendFmt == nullptr || (int)strlen(pcToAppendFmt) < 0)
{
eStatus = MOS_STATUS_INVALID_PARAMETER;
goto finish;
}
va_start(argList, pcToAppendFmt);
MOS_SecureVStringPrint(pcToAppend, ALLOC_GRANULARITY, ALLOC_GRANULARITY, pcToAppendFmt, argList);
va_end(argList);
stStrLenToAppend = strlen(pcToAppend);
if (*ppcBigString == nullptr)
{
stTotalStrLen = stStrLenToAppend + 1;
stTotalAlloc = MOS_ALIGN_CEIL(stStrLenToAppend, ALLOC_GRANULARITY);
*ppcBigString = (char*)MOS_AllocAndZeroMemory(stTotalAlloc);
VPHAL_DEBUG_CHK_NULL(*ppcBigString);
*ppcBigString[0] = '\0';
stStrLenOld++;
}
else
{
stTotalStrLen += stStrLenToAppend;
if (stTotalStrLen >= stTotalAlloc)
{
stTotalAlloc = MOS_ALIGN_CEIL(stTotalStrLen, ALLOC_GRANULARITY);
// Below should be equivalent to *ppcBigString = (char*)realloc(*ppcBigString, stTotalAlloc);
pcTmpPtr = *ppcBigString;
*ppcBigString = (char*)MOS_AllocAndZeroMemory(stTotalAlloc);
VPHAL_DEBUG_CHK_NULL(*ppcBigString);
MOS_SecureStringPrint(*ppcBigString, stTotalAlloc, stTotalAlloc, "%s", pcTmpPtr);
MOS_FreeMemory(pcTmpPtr);
}
}
MOS_SecureMemcpy(
(char*)(((uintptr_t)(*ppcBigString)) + stStrLenOld - 1),
stStrLenToAppend + 1,
pcToAppend,
stStrLenToAppend + 1);
finish:
MOS_FreeMemory(pcToAppend);
return eStatus;
}
void VphalDumperTool::WriteFrame(
PMOS_INTERFACE pOsInterface,
PVPHAL_SURFACE pSurface,
PCCHAR fileName,
uint64_t iCounter)
{
uint8_t* pData;
char sPath[MAX_PATH];
char sOsPath[MAX_PATH];
uint8_t* pDst;
uint8_t* pTmpDst;
uint8_t* pTmpSrc;
uint32_t iWidthInBytes;
uint32_t iHeightInRows;
uint32_t iBpp;
uint32_t iSize;
uint32_t iY;
MOS_LOCK_PARAMS LockFlags;
pDst = nullptr;
MOS_ZeroMemory(sPath, MAX_PATH);
MOS_ZeroMemory(sOsPath, MAX_PATH);
// get bits per pixel for the format
pOsInterface->pfnGetBitsPerPixel(pOsInterface, pSurface->Format, &iBpp);
VphalDumperTool::GetSurfaceSize(
pSurface,
iBpp,
&iWidthInBytes,
&iHeightInRows);
iSize = iWidthInBytes * iHeightInRows;
// Write original image to file
MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS));
LockFlags.ReadOnly = 1;
pData = (uint8_t*)pOsInterface->pfnLockResource(
pOsInterface,
&pSurface->OsResource,
&LockFlags);
MOS_SecureStringPrint(
sPath,
MAX_PATH,
sizeof(sPath),
"c:\\dump\\f[%08I64x]_%s_w[%d]_h[%d]_p[%d].%s",
iCounter,
fileName,
pSurface->dwWidth,
pSurface->dwHeight,
pSurface->dwPitch,
VphalDumperTool::GetFormatStr(pSurface->Format));
MOS_SecureMemcpy(sOsPath, MAX_PATH, sPath, strlen(sPath));
// Write the data to file
if (pSurface->dwPitch == iWidthInBytes)
{
MOS_WriteFileFromPtr((const char *)sOsPath, pData, iSize);
}
else
{
pDst = (uint8_t*)MOS_AllocAndZeroMemory(iSize);
pTmpSrc = pData;
pTmpDst = pDst;
for (iY = 0; iY < iHeightInRows; iY++)
{
MOS_SecureMemcpy(pTmpDst, iSize, pTmpSrc, iWidthInBytes);
pTmpSrc += pSurface->dwPitch;
pTmpDst += iWidthInBytes;
}
MOS_WriteFileFromPtr((const char *)sOsPath, pDst, iSize);
}
if (pDst)
{
MOS_FreeMemory(pDst);
}
pOsInterface->pfnUnlockResource(
pOsInterface,
&pSurface->OsResource);
}
const char * VphalParameterDumper::GetComponentStr(MOS_COMPONENT component)
{
switch (component)
{
case COMPONENT_UNKNOWN: return _T("COMPONENT_UNKNOWN");
case COMPONENT_LibVA: return _T("COMPONENT_LibVA");
case COMPONENT_VPreP: return _T("COMPONENT_VPreP");
case COMPONENT_EMULATION: return _T("COMPONENT_EMULATION");
case COMPONENT_CM: return _T("COMPONENT_CM");
case COMPONENT_Encode: return _T("COMPONENT_Encode");
case COMPONENT_Decode: return _T("COMPONENT_Decode");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetWholeFormatStr(MOS_FORMAT format)
{
switch (format)
{
case Format_Invalid: return _T("Format_Invalid");
case Format_Source: return _T("Format_Source");
case Format_420O: return _T("Format_420O");
case Format_RGB_Swap: return _T("Format_RGB_Swap");
case Format_RGB_No_Swap: return _T("Format_RGB_No_Swap");
case Format_RGB: return _T("Format_RGB");
case Format_RGB32: return _T("Format_RGB32");
case Format_PA: return _T("Format_PA");
case Format_PL2: return _T("Format_PL2");
case Format_PL2_UnAligned: return _T("Format_PL2_UnAligned");
case Format_PL3: return _T("Format_PL3");
case Format_PL3_RGB: return _T("Format_PL3_RGB");
case Format_PAL: return _T("Format_PA_T(");
case Format_None: return _T("Format_None");
case Format_Any: return _T("Format_Any");
case Format_A8R8G8B8: return _T("Format_A8R8G8B8");
case Format_X8R8G8B8: return _T("Format_X8R8G8B8");
case Format_A8B8G8R8: return _T("Format_A8B8G8R8");
case Format_X8B8G8R8: return _T("Format_X8B8G8R8");
case Format_A16B16G16R16: return _T("Format_A16B16G16R16");
case Format_A16R16G16B16: return _T("Format_A16R16G16B16");
case Format_R5G6B5: return _T("Format_R5G6B5");
case Format_R8G8B8: return _T("Format_R8G8B8");
case Format_R32U: return _T("Format_R32U");
case Format_R32F: return _T("Format_R32F");
case Format_RGBP: return _T("Format_RGBP");
case Format_BGRP: return _T("Format_BGRP");
case Format_YUY2: return _T("Format_YUY2");
case Format_YUYV: return _T("Format_YUYV");
case Format_YVYU: return _T("Format_YVYU");
case Format_UYVY: return _T("Format_UYVY");
case Format_VYUY: return _T("Format_VYUY");
case Format_Y416: return _T("Format_Y416");
case Format_AYUV: return _T("Format_AYUV");
case Format_AUYV: return _T("Format_AUYV");
case Format_400P: return _T("Format_400P");
case Format_NV12: return _T("Format_NV12");
case Format_NV12_UnAligned: return _T("Format_NV12_UnAligned");
case Format_NV21: return _T("Format_NV21");
case Format_NV11: return _T("Format_NV11");
case Format_NV11_UnAligned: return _T("Format_NV11_UnAligned");
case Format_P208: return _T("Format_P208");
case Format_P208_UnAligned: return _T("Format_P208_UnAligned");
case Format_IMC1: return _T("Format_IMC1");
case Format_IMC2: return _T("Format_IMC2");
case Format_IMC3: return _T("Format_IMC3");
case Format_IMC4: return _T("Format_IMC4");
case Format_422H: return _T("Format_422H");
case Format_422V: return _T("Format_422V");
case Format_444P: return _T("Format_444P");
case Format_411P: return _T("Format_411P");
case Format_411R: return _T("Format_411R");
case Format_I420: return _T("Format_I420");
case Format_IYUV: return _T("Format_IYUV");
case Format_YV12: return _T("Format_YV12");
case Format_YVU9: return _T("Format_YVU9");
case Format_AI44: return _T("Format_AI44");
case Format_IA44: return _T("Format_IA44");
case Format_P8: return _T("Format_P8");
case Format_A8P8: return _T("Format_A8P8");
case Format_A8: return _T("Format_A8");
case Format_L8: return _T("Format_L8");
case Format_A4L4: return _T("Format_A4L4");
case Format_A8L8: return _T("Format_A8L8");
case Format_IRW0: return _T("Format_IRW0");
case Format_IRW1: return _T("Format_IRW1");
case Format_IRW2: return _T("Format_IRW2");
case Format_IRW3: return _T("Format_IRW3");
case Format_IRW4: return _T("Format_IRW4");
case Format_IRW5: return _T("Format_IRW5");
case Format_IRW6: return _T("Format_IRW6");
case Format_IRW7: return _T("Format_IRW7");
case Format_STMM: return _T("Format_STMM");
case Format_Buffer: return _T("Format_Buffer");
case Format_Buffer_2D: return _T("Format_Buffer_2D");
case Format_V8U8: return _T("Format_V8U8");
case Format_R32S: return _T("Format_R32S");
case Format_R8U: return _T("Format_R8U");
case Format_R8G8UN: return _T("Format_R8G8UN");
case Format_R8G8SN: return _T("Format_R8G8SN");
case Format_G8R8_G8B8: return _T("Format_G8R8_G8B8");
case Format_R16U: return _T("Format_R16U");
case Format_R16S: return _T("Format_R16S");
case Format_R16UN: return _T("Format_R16UN");
case Format_RAW: return _T("Format_RAW");
case Format_Y8: return _T("Format_Y8");
case Format_Y1: return _T("Format_Y1");
case Format_Y16U: return _T("Format_Y16U");
case Format_Y16S: return _T("Format_Y16S");
case Format_L16: return _T("Format_L16");
case Format_D16: return _T("Format_D16");
case Format_R10G10B10A2: return _T("Format_R10G10B10A2");
case Format_B10G10R10A2: return _T("Format_B10G10R10A2");
case Format_P016: return _T("Format_P016");
case Format_P010: return _T("Format_P010");
case Format_Y210: return _T("Format_Y210");
case Format_Y216: return _T("Fomrat_Y216");
case Format_Y410: return _T("Format_Y410");
case Format_YV12_Planar: return _T("Format_YV12_Planar");
case Format_P210: return _T("Format_P210");
case Format_P216: return _T("Format_P216");
case Format_Count: return _T("Format_Count");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetTileTypeStr(MOS_TILE_TYPE tile_type)
{
switch (tile_type)
{
case MOS_TILE_X: return _T("MOS_TILE_X");
case MOS_TILE_Y: return _T("MOS_TILE_Y");
case MOS_TILE_LINEAR: return _T("MOS_TILE_LINEAR");
case MOS_TILE_INVALID: return _T("MOS_TILE_INVALID");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetSurfaceTypeStr(VPHAL_SURFACE_TYPE surface_type)
{
switch (surface_type)
{
case SURF_NONE: return _T("SURF_NONE");
case SURF_IN_BACKGROUND: return _T("SURF_IN_BACKGROUND");
case SURF_IN_PRIMARY: return _T("SURF_IN_PRIMARY");
case SURF_IN_SUBSTREAM: return _T("SURF_IN_SUBSTREAM");
case SURF_IN_REFERENCE: return _T("SURF_IN_REFERENCE");
case SURF_OUT_RENDERTARGET: return _T("SURF_OUT_RENDERTARGET");
case SURF_TYPE_COUNT: return _T("SURF_TYPE_COUNT");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetSampleTypeStr(VPHAL_SAMPLE_TYPE sample_type)
{
switch (sample_type)
{
case SAMPLE_PROGRESSIVE: return _T("SAMPLE_PROGRESSIVE");
case SAMPLE_SINGLE_TOP_FIELD: return _T("SAMPLE_SINGLE_TOP_FIELD");
case SAMPLE_SINGLE_BOTTOM_FIELD: return _T("SAMPLE_SINGLE_BOTTOM_FIELD");
case SAMPLE_INTERLEAVED_EVEN_FIRST_TOP_FIELD: return _T("SAMPLE_INTERLEAVED_EVEN_FIRST_TOP_FIELD");
case SAMPLE_INTERLEAVED_EVEN_FIRST_BOTTOM_FIELD: return _T("SAMPLE_INTERLEAVED_EVEN_FIRST_BOTTOM_FIELD");
case SAMPLE_INTERLEAVED_ODD_FIRST_TOP_FIELD: return _T("SAMPLE_INTERLEAVED_ODD_FIRST_TOP_FIELD");
case SAMPLE_INTERLEAVED_ODD_FIRST_BOTTOM_FIELD: return _T("SAMPLE_INTERLEAVED_ODD_FIRST_BOTTOM_FIELD");
case SAMPLE_INVALID: return _T("SAMPLE_INVALID");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetColorSpaceStr(VPHAL_CSPACE color_space)
{
switch (color_space)
{
case CSpace_None: return _T("CSpace_None");
case CSpace_Source: return _T("CSpace_Source");
case CSpace_RGB: return _T("CSpace_RGB");
case CSpace_YUV: return _T("CSpace_YUV");
case CSpace_Gray: return _T("CSpace_Gray");
case CSpace_Any: return _T("CSpace_Any");
case CSpace_sRGB: return _T("CSpace_sRGB");
case CSpace_stRGB: return _T("CSpace_stRGB");
case CSpace_BT601: return _T("CSpace_BT601");
case CSpace_BT601_FullRange: return _T("CSpace_BT601_FullRange");
case CSpace_BT709: return _T("CSpace_BT709");
case CSpace_BT709_FullRange: return _T("CSpace_BT709_FullRange");
case CSpace_xvYCC601: return _T("CSpace_xvYCC601");
case CSpace_xvYCC709: return _T("CSpace_xvYCC709");
case CSpace_BT601Gray: return _T("CSpace_BT601Gray");
case CSpace_BT601Gray_FullRange: return _T("CSpace_BT601Gray_FullRange");
case CSpace_BT2020: return _T("CSpace_BT2020");
case CSpace_BT2020_FullRange: return _T("CSpace_BT2020_FullRange");
case CSpace_BT2020_RGB: return _T("CSpace_BT2020_RGB");
case CSpace_BT2020_stRGB: return _T("CSpace_BT2020_stRGB");
case CSpace_Count: return _T("CSpace_Count");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetBlendTypeStr(VPHAL_BLEND_TYPE blend_type)
{
switch (blend_type)
{
case BLEND_NONE: return _T("BLEND_NONE");
case BLEND_SOURCE: return _T("BLEND_SOURCE");
case BLEND_PARTIAL: return _T("BLEND_PARTIAL");
case BLEND_CONSTANT: return _T("BLEND_CONSTANT");
case BLEND_CONSTANT_SOURCE: return _T("BLEND_CONSTANT_SOURCE");
case BLEND_CONSTANT_PARTIAL: return _T("BLEND_CONSTANT_PARTIAL");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetPaletteTypeStr(VPHAL_PALETTE_TYPE palette_type)
{
switch (palette_type)
{
case VPHAL_PALETTE_NONE: return _T("VPHAL_PALETTE_NONE");
case VPHAL_PALETTE_YCbCr_8: return _T("VPHAL_PALETTE_YCbCr_8");
case VPHAL_PALETTE_ARGB_8: return _T("VPHAL_PALETTE_ARGB_8");
case VPHAL_PALETTE_AVYU_8: return _T("VPHAL_PALETTE_AVYU_8");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetScalingModeStr(VPHAL_SCALING_MODE scaling_mode)
{
switch (scaling_mode)
{
case VPHAL_SCALING_NEAREST: return _T("VPHAL_SCALING_NEAREST");
case VPHAL_SCALING_BILINEAR: return _T("VPHAL_SCALING_BILINEAR");
case VPHAL_SCALING_AVS: return _T("VPHAL_SCALING_AVS");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetRotationModeStr(VPHAL_ROTATION rotation_mode)
{
switch (rotation_mode)
{
case VPHAL_ROTATION_IDENTITY: return _T("VPHAL_ROTATION_IDENTITY");
case VPHAL_ROTATION_90: return _T("VPHAL_ROTATION_90");
case VPHAL_ROTATION_180: return _T("VPHAL_ROTATION_180");
case VPHAL_ROTATION_270: return _T("VPHAL_ROTATION_270");
case VPHAL_MIRROR_HORIZONTAL: return _T("VPHAL_MIRROR_HORIZONTAL");
case VPHAL_MIRROR_VERTICAL: return _T("VPHAL_MIRROR_VERTICAL");
case VPHAL_ROTATE_90_MIRROR_VERTICAL: return _T("VPHAL_ROTATE_90_MIRROR_VERTICAL");
case VPHAL_ROTATE_90_MIRROR_HORIZONTAL: return _T("VPHAL_ROTATE_90_MIRROR_HORIZONTAL");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetDIModeStr(VPHAL_DI_MODE di_mode)
{
switch (di_mode)
{
case DI_MODE_BOB: return _T("DI_MODE_BOB");
case DI_MODE_ADI: return _T("DI_MODE_ADI");
default: return _T("Err");
}
return nullptr;
}
const char * VphalParameterDumper::GetDenoiseModeStr(VPHAL_NOISELEVEL noise_level)
{
switch (noise_level)
{
case NOISELEVEL_DEFAULT: return _T("NOISELEVEL_DEFAULT");
case NOISELEVEL_VC1_HD: return _T("NOISELEVEL_VC1_HD");
default: return _T("Err");
}
return nullptr;
}
char *VphalParameterDumper::GetDumpSpecLocation()
{
return m_dumpSpec.outFileLocation;
}
bool VphalParameterDumper::GetDumpSpecSkuWaDumpEnable()
{
return m_dumpSpec.enableSkuWaDump;
}
#endif // (_DEBUG || _RELEASE_INTERNAL)