blob: bf2e45de869a6e8dc3e584f30a4e2af01f3bc3b0 [file] [log] [blame]
/*
* Copyright (c) 2009-2017, 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_common_specific.c
//! \brief Definition common utilities for vphal
//! \details Definition common utilities for vphal including:
//! some macro, enum, union, structure, function
//!
#include "vphal.h"
#include "mos_os.h"
//!
//! \brief Get Surface Info from OsResource
//! \details Update surface info in PVPHAL_SURFACE based on allocated OsResource
//! \param [in] pOsInterface
//! Pointer to MOS_INTERFACE
//! \param [in] pInfo
//! Pointer to VPHAL_GET_SURFACE_INFO
//! \param [in,out] pSurface
//! Pointer to VPHAL_SURFACE
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
MOS_STATUS VpHal_GetSurfaceInfo(
PMOS_INTERFACE pOsInterface,
PVPHAL_GET_SURFACE_INFO pInfo,
PVPHAL_SURFACE pSurface)
{
MOS_STATUS eStatus = MOS_STATUS_UNKNOWN;
VPHAL_PUBLIC_ASSERT(pOsInterface);
VPHAL_PUBLIC_ASSERT(pInfo);
VPHAL_PUBLIC_ASSERT(pSurface);
PMOS_RESOURCE pResource = &pSurface->OsResource;
MOS_SURFACE ResDetails;
MOS_MEMCOMP_STATE mmcMode;
VPHAL_PUBLIC_ASSERT(!Mos_ResourceIsNull(&pSurface->OsResource));
MOS_ZeroMemory(&ResDetails, sizeof(MOS_SURFACE));
ResDetails.dwArraySlice = pInfo->ArraySlice;
ResDetails.dwMipSlice = pInfo->MipSlice;
ResDetails.S3dChannel = pInfo->S3dChannel;
ResDetails.Format = pSurface->Format;
VPHAL_PUBLIC_CHK_STATUS(pOsInterface->pfnGetResourceInfo(pOsInterface, &pSurface->OsResource, &ResDetails));
if (ResDetails.Format == Format_420O)
{
ResDetails.Format = Format_NV12;
}
// Get resource information
pSurface->dwWidth = ResDetails.dwWidth;
pSurface->dwHeight = ResDetails.dwHeight;
pSurface->dwPitch = ResDetails.dwPitch;
pSurface->dwSlicePitch = ResDetails.dwSlicePitch;
pSurface->dwDepth = ResDetails.dwDepth;
pSurface->TileType = ResDetails.TileType;
pSurface->TileModeGMM = ResDetails.TileModeGMM;
pSurface->bGMMTileEnabled = ResDetails.bGMMTileEnabled;
pSurface->bOverlay = ResDetails.bOverlay;
pSurface->bFlipChain = ResDetails.bFlipChain;
pSurface->Format = ResDetails.Format;
pSurface->bCompressible = ResDetails.bCompressible;
pSurface->bIsCompressed = ResDetails.bIsCompressed;
MOS_ZeroMemory(&mmcMode, sizeof(mmcMode));
pOsInterface->pfnGetMemoryCompressionMode(pOsInterface, &pSurface->OsResource, &mmcMode);
if (mmcMode &&
(pSurface->TileType == MOS_TILE_Y ||
pSurface->TileType == MOS_TILE_YS))
{
pSurface->bCompressible = true;
pSurface->bIsCompressed = true;
pSurface->CompressionMode = (MOS_RESOURCE_MMC_MODE)mmcMode;
pOsInterface->pfnGetMemoryCompressionFormat(pOsInterface, &pSurface->OsResource, &pSurface->CompressionFormat);
}
else
{
// Do not modify the bCompressible flag even MmcMode is disable, since the surface size/pitch may be different
// between Compressible and Uncompressible, which will affect the DN surface allocation.
pSurface->bIsCompressed = false;
pSurface->CompressionMode = MOS_MMC_DISABLED;
pSurface->CompressionFormat = 0;
}
if (IS_RGB32_FORMAT(pSurface->Format) ||
IS_RGB16_FORMAT(pSurface->Format) ||
pSurface->Format == Format_RGB ||
pSurface->Format == Format_Y410)
{
pSurface->dwOffset = ResDetails.RenderOffset.RGB.BaseOffset;
pSurface->YPlaneOffset.iSurfaceOffset = ResDetails.RenderOffset.RGB.BaseOffset;
pSurface->YPlaneOffset.iXOffset = ResDetails.RenderOffset.RGB.XOffset;
pSurface->YPlaneOffset.iYOffset = ResDetails.RenderOffset.RGB.YOffset;
}
else // YUV or PL3_RGB
{
// Get Y plane information (plane offset, X/Y offset)
pSurface->dwOffset = ResDetails.RenderOffset.YUV.Y.BaseOffset;
pSurface->YPlaneOffset.iSurfaceOffset = ResDetails.RenderOffset.YUV.Y.BaseOffset;
pSurface->YPlaneOffset.iXOffset = ResDetails.RenderOffset.YUV.Y.XOffset;
pSurface->YPlaneOffset.iYOffset = ResDetails.RenderOffset.YUV.Y.YOffset;
pSurface->YPlaneOffset.iLockSurfaceOffset = ResDetails.LockOffset.YUV.Y;
// Get U/UV plane information (plane offset, X/Y offset)
pSurface->UPlaneOffset.iSurfaceOffset = ResDetails.RenderOffset.YUV.U.BaseOffset;
pSurface->UPlaneOffset.iXOffset = ResDetails.RenderOffset.YUV.U.XOffset;
pSurface->UPlaneOffset.iYOffset = ResDetails.RenderOffset.YUV.U.YOffset;
pSurface->UPlaneOffset.iLockSurfaceOffset = ResDetails.LockOffset.YUV.U;
// Get V plane information (plane offset, X/Y offset)
pSurface->VPlaneOffset.iSurfaceOffset = ResDetails.RenderOffset.YUV.V.BaseOffset;
pSurface->VPlaneOffset.iXOffset = ResDetails.RenderOffset.YUV.V.XOffset;
pSurface->VPlaneOffset.iYOffset = ResDetails.RenderOffset.YUV.V.YOffset;
pSurface->VPlaneOffset.iLockSurfaceOffset = ResDetails.LockOffset.YUV.V;
}
eStatus = MOS_STATUS_SUCCESS;
goto finish;
finish:
return eStatus;
}
//!
//! \brief Initial the Type/TileType fields in Alloc Params structure
//! \details Initial the Type/TileType fields in Alloc Params structure
//! - Use the last type from GMM resource
//! \param [in, out] pAllocParams
//! Pointer to MOS_ALLOC_GFXRES_PARAMS
//! \param [in] pSurface
//! Pointer to VPHAL_SURFACE
//! \param [in] DefaultResType
//! Expected Resource Type
//! \param [in] DefaultTileType
//! Expected Surface Tile Type
//!
void VpHal_AllocParamsInitType(
PMOS_ALLOC_GFXRES_PARAMS pAllocParams,
PVPHAL_SURFACE pSurface,
MOS_GFXRES_TYPE DefaultResType,
MOS_TILE_TYPE DefaultTileType)
{
VPHAL_PUBLIC_ASSERT(pAllocParams);
VPHAL_PUBLIC_ASSERT(pSurface);
// First time allocation. Caller must specify default params
pAllocParams->Type = DefaultResType;
pAllocParams->TileType = DefaultTileType;
}