blob: 5c034d5e30c5ce15ce01dca18c966343b91a4233 [file] [log] [blame]
/*
* Copyright (c) 2014-2018, 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 mhw_state_heap_g11.c
//! \brief This modules implements HW interface layer to be used on all platforms on all operating systems/DDIs, across MHW components.
//!
#include "mhw_state_heap_g11.h"
#include "mhw_cp_interface.h"
#include "mhw_render_hwcmd_g11_X.h"
MHW_STATE_HEAP_INTERFACE_G11_X::MHW_STATE_HEAP_INTERFACE_G11_X(
PMOS_INTERFACE pInputOSInterface, int8_t bDynamicMode):
MHW_STATE_HEAP_INTERFACE_GENERIC(pInputOSInterface, bDynamicMode)
{
m_wBtIdxAlignment = m_mhwNumBindingTableEntryOffset;
m_wIdAlignment = (1 << m_mhwGenericOffsetShift);
m_wCurbeAlignment = (1 << m_mhwGenericOffsetShift);
m_dwSizeSurfaceState = MOS_ALIGN_CEIL(mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::byteSize, MHW_SURFACE_STATE_ALIGN);
m_dwSizeSurfaceStateAdv = MOS_ALIGN_CEIL(mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD::byteSize, MHW_SURFACE_STATE_ALIGN);
m_dwMaxSurfaceStateSize = MOS_MAX(m_dwSizeSurfaceState, m_dwSizeSurfaceStateAdv);
m_wSizeOfInterfaceDescriptor = mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD::byteSize;
m_wSizeOfCmdInterfaceDescriptorData = MOS_ALIGN_CEIL(m_wSizeOfInterfaceDescriptor, m_wIdAlignment);
m_wSizeOfCmdSamplerState = mhw_state_heap_g11_X::SAMPLER_STATE_CMD::byteSize;
InitHwSizes();
}
MHW_STATE_HEAP_INTERFACE_G11_X::~MHW_STATE_HEAP_INTERFACE_G11_X()
{
MHW_FUNCTION_ENTER;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::InitHwSizes()
{
m_HwSizes.dwSizeMediaObjectHeaderCmd = mhw_render_g11_X::MEDIA_OBJECT_CMD::byteSize;
m_HwSizes.dwSizeSurfaceState = MOS_ALIGN_CEIL(mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::byteSize, MHW_SURFACE_STATE_ALIGN);
m_HwSizes.dwSizeSurfaceStateAvs = MOS_ALIGN_CEIL(mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD::byteSize, MHW_SURFACE_STATE_ALIGN);
m_HwSizes.dwMaxSizeSurfaceState = MOS_MAX(m_HwSizes.dwSizeSurfaceState, m_HwSizes.dwSizeSurfaceStateAvs);
m_HwSizes.dwSizeBindingTableState = mhw_state_heap_g11_X::BINDING_TABLE_STATE_CMD::byteSize;
m_HwSizes.dwSizeSamplerState = mhw_state_heap_g11_X::SAMPLER_STATE_CMD::byteSize;
m_HwSizes.dwSizeSamplerIndirectState = mhw_state_heap_g11_X::SAMPLER_INDIRECT_STATE_CMD::byteSize;
m_HwSizes.dwSizeSamplerStateVA = mhw_state_heap_g11_X::SAMPLER_STATE_8x8_ERODE_DILATE_MINMAXFILTER_CMD::byteSize; // MinMaxFilter, Erode, Dilate functions
m_HwSizes.dwSizeSamplerStateVAConvolve = mhw_state_heap_g11_X::SAMPLER_STATE_8x8_CONVOLVE_CMD::byteSize;
m_HwSizes.dwSizeSamplerStateTable8x8 = mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD::byteSize - 16 * sizeof(uint32_t); // match old definitions to table size
m_HwSizes.dwSizeSampler8x8Table =
MOS_ALIGN_CEIL(m_HwSizes.dwSizeSamplerStateTable8x8, MHW_SAMPLER_STATE_ALIGN);
m_HwSizes.dwSizeSamplerStateAvs =
MOS_ALIGN_CEIL(mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD::byteSize, MHW_SAMPLER_STATE_AVS_ALIGN_MEDIA);
m_HwSizes.dwSizeInterfaceDescriptor = mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD::byteSize;
m_HwSizes.dwSizeMediaWalkerBlock = 16;
return MOS_STATUS_SUCCESS;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::SetInterfaceDescriptorEntry(
PMHW_ID_ENTRY_PARAMS pParams)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
//------------------------------------
MHW_MI_CHK_NULL(pParams);
//------------------------------------
// Ensures that the Media ID base is correct
MHW_ASSERT(MOS_IS_ALIGNED(pParams->dwMediaIdOffset, m_wIdAlignment));
uint8_t *pStateHeapBase;
if (pParams->pGeneralStateHeap)
{
pStateHeapBase = (uint8_t*)pParams->pGeneralStateHeap->pvLockedHeap;
}
else
{
pStateHeapBase = (uint8_t*)(GetDSHPointer()->pvLockedHeap);
}
mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD *pInterfaceDescriptor;
pInterfaceDescriptor = (mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD *)
(pStateHeapBase + // State Heap Base
pParams->dwMediaIdOffset + // Offset to first Media ID
pParams->iMediaId * m_wSizeOfInterfaceDescriptor); // Offset to current ID
MHW_MI_CHK_NULL(pInterfaceDescriptor);
*pInterfaceDescriptor = mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD();
pInterfaceDescriptor->DW0.KernelStartPointer = pParams->dwKernelOffset >> MHW_KERNEL_OFFSET_SHIFT;
pInterfaceDescriptor->DW3.SamplerStatePointer = pParams->dwSamplerOffset >> MHW_SAMPLER_SHIFT;
pInterfaceDescriptor->DW3.SamplerCount = pParams->dwSamplerCount;
pInterfaceDescriptor->DW4.BindingTablePointer = MOS_ROUNDUP_SHIFT(pParams->dwBindingTableOffset, MHW_BINDING_TABLE_ID_SHIFT);
pInterfaceDescriptor->DW5.ConstantUrbEntryReadOffset = pParams->iCurbeOffset >> MHW_CURBE_SHIFT;
pInterfaceDescriptor->DW5.ConstantIndirectUrbEntryReadLength = MOS_ROUNDUP_SHIFT(pParams->iCurbeLength, MHW_CURBE_SHIFT);
pInterfaceDescriptor->DW6.BarrierEnable = pParams->bBarrierEnable;
pInterfaceDescriptor->DW6.NumberOfThreadsInGpgpuThreadGroup = pParams->dwNumberofThreadsInGPGPUGroup;
pInterfaceDescriptor->DW6.SharedLocalMemorySize = pParams->dwSharedLocalMemorySize;
pInterfaceDescriptor->DW7.CrossThreadConstantDataReadLength = pParams->iCrsThdConDataRdLn >> MHW_THRD_CON_DATA_RD_SHIFT;
return eStatus;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::AddInterfaceDescriptorData(
PMHW_ID_ENTRY_PARAMS pParams)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
//------------------------------------
MHW_MI_CHK_NULL(pParams);
//------------------------------------
// Ensures that the Media ID base is correct
MHW_ASSERT(MOS_IS_ALIGNED(pParams->dwMediaIdOffset, m_wIdAlignment));
uint32_t offset = pParams->dwMediaIdOffset + pParams->iMediaId * m_wSizeOfInterfaceDescriptor;
mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD *pInterfaceDescriptor;
pInterfaceDescriptor = (mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD *)MOS_AllocMemory(sizeof(mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD));
MHW_MI_CHK_NULL(pInterfaceDescriptor);
*pInterfaceDescriptor = mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD();
pInterfaceDescriptor->DW0.KernelStartPointer = pParams->dwKernelOffset >> MHW_KERNEL_OFFSET_SHIFT;
pInterfaceDescriptor->DW3.SamplerStatePointer = pParams->dwSamplerOffset >> MHW_SAMPLER_SHIFT;
pInterfaceDescriptor->DW3.SamplerCount = pParams->dwSamplerCount;
pInterfaceDescriptor->DW4.BindingTablePointer = MOS_ROUNDUP_SHIFT(pParams->dwBindingTableOffset, MHW_BINDING_TABLE_ID_SHIFT);
pInterfaceDescriptor->DW5.ConstantUrbEntryReadOffset = pParams->iCurbeOffset >> MHW_CURBE_SHIFT;
pInterfaceDescriptor->DW5.ConstantIndirectUrbEntryReadLength = MOS_ROUNDUP_SHIFT(pParams->iCurbeLength, MHW_CURBE_SHIFT);
pInterfaceDescriptor->DW6.BarrierEnable = pParams->bBarrierEnable;
pInterfaceDescriptor->DW6.NumberOfThreadsInGpgpuThreadGroup = pParams->dwNumberofThreadsInGPGPUGroup;
pInterfaceDescriptor->DW6.SharedLocalMemorySize = pParams->dwSharedLocalMemorySize;
pInterfaceDescriptor->DW7.CrossThreadConstantDataReadLength = pParams->iCrsThdConDataRdLn >> MHW_THRD_CON_DATA_RD_SHIFT;
// need to subtract memory block's offset in current state heap for AddData API
offset -= pParams->memoryBlock->GetOffset();
pParams->memoryBlock->AddData(pInterfaceDescriptor, offset,
sizeof(mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD));
MOS_SafeFreeMemory(pInterfaceDescriptor);
return eStatus;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::SetSurfaceStateEntry(
PMHW_SURFACE_STATE_PARAMS pParams)
{
if (!pParams || !m_pOsInterface)
{
MHW_ASSERTMESSAGE("Invalid parameter\n");
return MOS_STATUS_INVALID_PARAMETER;
}
uint32_t TileMode = (pParams->bTiledSurface) ? ((pParams->bTileWalk == 0) ? 2 /*x-tile*/: 3 /*y-tile*/) : 0; /*linear*/
// for Gen11 Adv surface state
if (pParams->bUseAdvState)
{
// Obtain the Pointer to the Surface state from SSH Buffer
mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD* pSurfaceStateAdv =
(mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD*) pParams->pSurfaceState;
MHW_MI_CHK_NULL(pSurfaceStateAdv);
// Initialize Surface State
*pSurfaceStateAdv = mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD();
pSurfaceStateAdv->DW0.Rotation = pParams->RotationMode;
pSurfaceStateAdv->DW0.XOffset = pParams->iXOffset >> 2;
pSurfaceStateAdv->DW0.YOffset = pParams->iYOffset >> 2;
pSurfaceStateAdv->DW1.Width = pParams->dwWidth - 1;
pSurfaceStateAdv->DW1.Height = pParams->dwHeight - 1;
pSurfaceStateAdv->DW1.CrVCbUPixelOffsetVDirection = pParams->UVPixelOffsetVDirection & 3;
pSurfaceStateAdv->DW2.CrVCbUPixelOffsetVDirectionMsb = pParams->UVPixelOffsetVDirection >> 2;
pSurfaceStateAdv->DW2.CrVCbUPixelOffsetUDirection = pParams->UVPixelOffsetUDirection;
pSurfaceStateAdv->DW2.SurfaceFormat = pParams->dwFormat;
pSurfaceStateAdv->DW2.InterleaveChroma = pParams->bInterleaveChroma;
pSurfaceStateAdv->DW2.SurfacePitch = pParams->dwPitch - 1;
pSurfaceStateAdv->DW2.HalfPitchForChroma = pParams->bHalfPitchChroma;
pSurfaceStateAdv->DW2.TileMode = TileMode;
pSurfaceStateAdv->DW2.MemoryCompressionEnable = pParams->bCompressionEnabled;
pSurfaceStateAdv->DW2.MemoryCompressionMode = pParams->bCompressionMode;
pSurfaceStateAdv->DW3.XOffsetForUCb = pParams->dwXOffsetForU;
pSurfaceStateAdv->DW3.YOffsetForUCb = pParams->dwYOffsetForU;
pSurfaceStateAdv->DW4.XOffsetForVCr = pParams->dwXOffsetForV;
pSurfaceStateAdv->DW4.YOffsetForVCr = pParams->dwYOffsetForV;
pSurfaceStateAdv->DW5.VerticalLineStride = pParams->bVerticalLineStride;
pSurfaceStateAdv->DW5.VerticalLineStrideOffset = pParams->bVerticalLineStrideOffset;
pSurfaceStateAdv->DW5.SurfaceMemoryObjectControlState = pParams->dwCacheabilityControl;
// Return offset and pointer for patching
pParams->pdwCmd = (uint32_t *)&(pSurfaceStateAdv->DW6.Value);
pParams->dwLocationInCmd = 6;
if (m_pOsInterface->bPitchAndUVPatchingNeeded)
{
pSurfaceStateAdv->DW2.SurfacePitch = 0;
pSurfaceStateAdv->DW3.YOffsetForUCb = 0;
}
}
else // not AVS
{
// Obtain the Pointer to the Surface state from SSH Buffer
mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD* pSurfaceState =
(mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD*) pParams->pSurfaceState;
MHW_MI_CHK_NULL(pSurfaceState);
// Initialize Surface State
*pSurfaceState = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD();
pSurfaceState->DW0.SurfaceType = pParams->SurfaceType3D;
pSurfaceState->DW0.SurfaceFormat = pParams->dwFormat;
pSurfaceState->DW0.TileMode = TileMode;
pSurfaceState->DW0.VerticalLineStride = pParams->bVerticalLineStride;
pSurfaceState->DW0.VerticalLineStrideOffset = pParams->bVerticalLineStrideOffset;
pSurfaceState->DW0.SurfaceHorizontalAlignment = 1;
pSurfaceState->DW0.SurfaceVerticalAlignment = 1;
pSurfaceState->DW1.MemoryObjectControlState = pParams->dwCacheabilityControl;
if (pParams->SurfaceType3D == GFX3DSTATE_SURFACETYPE_BUFFER)
{ // Buffer resources - use original width/height/pitch/depth
pSurfaceState->DW2.Width = pParams->dwWidth;
pSurfaceState->DW2.Height = pParams->dwHeight;
pSurfaceState->DW3.SurfacePitch = pParams->dwPitch;
pSurfaceState->DW3.Depth = pParams->dwDepth;
}
else
{
pSurfaceState->DW1.SurfaceQpitch = pParams->dwQPitch >> 2;
pSurfaceState->DW2.Width = pParams->dwWidth - 1;
pSurfaceState->DW2.Height = pParams->dwHeight - 1;
pSurfaceState->DW3.SurfacePitch = pParams->dwPitch - 1;
pSurfaceState->DW3.Depth = pParams->dwDepth - 1;
}
pSurfaceState->DW4.RenderTargetAndSampleUnormRotation = pParams->RotationMode;
pSurfaceState->DW5.XOffset = pParams->iXOffset >> 2;
pSurfaceState->DW5.YOffset = pParams->iYOffset >> 2;
pSurfaceState->DW6.Obj0.SeparateUvPlaneEnable = pParams->bSeperateUVPlane;
pSurfaceState->DW6.Obj0.HalfPitchForChroma = pParams->bHalfPitchChroma;
pSurfaceState->DW6.Obj0.XOffsetForUOrUvPlane = pParams->dwXOffsetForU;
pSurfaceState->DW6.Obj0.YOffsetForUOrUvPlane = pParams->dwYOffsetForU;
// R8B8G8A8 is designed to represent media AYUV format.
// But from Gen10+ 3D sampler doesn't support R8B8G8A8 format any more.
// Use R8G8B8A8 + Channel Select to fake it.
if (pParams->dwFormat == MHW_GFX3DSTATE_SURFACEFORMAT_R8B8G8A8_UNORM)
{
pSurfaceState->DW0.SurfaceFormat = MHW_GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM;
pSurfaceState->DW7.ShaderChannelSelectAlpha = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_ALPHA_ALPHA;
pSurfaceState->DW7.ShaderChannelSelectBlue = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_GREEN_GREEN;
pSurfaceState->DW7.ShaderChannelSelectGreen = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_BLUE_BLUE;
pSurfaceState->DW7.ShaderChannelSelectRed = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_RED_RED;
}
else
{
pSurfaceState->DW7.ShaderChannelSelectAlpha = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_ALPHA_ALPHA;
pSurfaceState->DW7.ShaderChannelSelectBlue = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_BLUE_BLUE;
pSurfaceState->DW7.ShaderChannelSelectGreen = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_GREEN_GREEN;
pSurfaceState->DW7.ShaderChannelSelectRed = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::SHADER_CHANNEL_SELECT_RED_RED;
}
pSurfaceState->DW7.MemoryCompressionEnable = pParams->bCompressionEnabled;
pSurfaceState->DW7.MemoryCompressionMode = pParams->bCompressionMode;
pSurfaceState->DW8_9.SurfaceBaseAddress = 0;
pSurfaceState->DW10_11.Obj3.XOffsetForVPlane = pParams->dwXOffsetForV;
pSurfaceState->DW10_11.Obj3.YOffsetForVPlane = pParams->dwYOffsetForV;
// Return offset and pointer for patching
pParams->pdwCmd = (uint32_t *)&(pSurfaceState->DW8_9.SurfaceBaseAddress);
pParams->dwLocationInCmd = 8;
if (m_pOsInterface->bPitchAndUVPatchingNeeded)
{
if (pParams->SurfaceType3D != GFX3DSTATE_SURFACETYPE_BUFFER)
{
pSurfaceState->DW3.SurfacePitch = 0;
}
pSurfaceState->DW6.Obj0.YOffsetForUOrUvPlane = 0;
}
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::SetSurfaceState(
PMHW_KERNEL_STATE pKernelState,
PMOS_COMMAND_BUFFER pCmdBuffer,
uint32_t dwNumSurfaceStatesToSet,
PMHW_RCS_SURFACE_PARAMS pParams)
{
PMOS_INTERFACE pOsInterface;
uint8_t *pIndirectState = nullptr;
MHW_RESOURCE_PARAMS ResourceParams;
uint32_t uiIndirectStateOffset = 0, uiIndirectStateSize = 0;
PMHW_STATE_HEAP pStateHeap;
uint32_t dwSurfaceType = GFX3DSTATE_SURFACETYPE_NULL; // GFX3DSTATE_SURFACETYPE
uint32_t i; // Plane Index
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(pParams);
MHW_MI_CHK_NULL(pParams->psSurface);
MOS_UNUSED(dwNumSurfaceStatesToSet);
if (pParams->dwNumPlanes >= MHW_MAX_SURFACE_PLANES)
{
MHW_ASSERTMESSAGE("Invalid plane number provided");
eStatus = MOS_STATUS_INVALID_PARAMETER;
return eStatus;
}
pOsInterface = m_pOsInterface;
pStateHeap = &m_SurfaceStateHeap;
MHW_MI_CHK_NULL(pOsInterface);
MHW_MI_CHK_STATUS(pOsInterface->pfnGetIndirectStatePointer(pOsInterface, &pIndirectState));
MHW_MI_CHK_STATUS(pOsInterface->pfnGetIndirectState(pOsInterface, &uiIndirectStateOffset, &uiIndirectStateSize));
MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
ResourceParams.dwLsbNum = 0; // MHW_STATE_HEAP_SURFACE_STATE_SHIFT
for ( i = 0; i < pParams->dwNumPlanes; i++)
{
MHW_ASSERT_INVALID_BINDING_TABLE_IDX(pParams->dwBindingTableOffset[i]);
MHW_MI_CHK_NULL(pKernelState);
uint32_t u32SurfaceOffsetInSsh =
pKernelState->dwSshOffset + pKernelState->dwBindingTableSize + // offset within SSH to start of surfaces for this kernel
(m_HwSizes.dwMaxSizeSurfaceState * pParams->dwBindingTableOffset[i]); // offset to the current surface
if (u32SurfaceOffsetInSsh + m_HwSizes.dwMaxSizeSurfaceState > uiIndirectStateOffset)
{
MHW_ASSERTMESSAGE("Location requested for surface state is outside the bounds of SSH");
return MOS_STATUS_INVALID_PARAMETER;
}
uint8_t *pLocationOfSurfaceInSsh = (uint8_t*)
(pIndirectState + u32SurfaceOffsetInSsh);
if (pParams->bUseAdvState)
{
mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD *pCmd =
(mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD*)pLocationOfSurfaceInSsh;
MHW_MI_CHK_NULL(pCmd);
*pCmd = mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD();
pCmd->DW1.Width = (pParams->dwWidthToUse[i] == 0) ?
pParams->psSurface->dwWidth - 1 : pParams->dwWidthToUse[i] - 1;
pCmd->DW1.Height = (pParams->dwHeightToUse[i] == 0) ?
pParams->psSurface->dwHeight - 1: pParams->dwHeightToUse[i] - 1;
pCmd->DW1.CrVCbUPixelOffsetVDirection = pParams->Direction;
if(!(pOsInterface->bPitchAndUVPatchingNeeded))
pCmd->DW2.SurfacePitch = pParams->psSurface->dwPitch - 1;
pCmd->DW2.SurfaceFormat = pParams->ForceSurfaceFormat[i];
pCmd->DW2.InterleaveChroma = pParams->bInterleaveChroma;
if (IS_Y_MAJOR_TILE_FORMAT(pParams->psSurface->TileType))
{
pCmd->DW2.TileMode = mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD::TILE_MODE_TILEMODEYMAJOR;
}
else if (pParams->psSurface->TileType == MOS_TILE_LINEAR)
{
pCmd->DW2.TileMode = mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD::TILE_MODE_TILEMODELINEAR;
}
else if (pParams->psSurface->TileType == MOS_TILE_X)
{
pCmd->DW2.TileMode = mhw_state_heap_g11_X::MEDIA_SURFACE_STATE_CMD::TILE_MODE_TILEMODEXMAJOR;
}
if(pParams->psSurface->bCompressible)
{
MHW_MI_CHK_STATUS(pOsInterface->pfnGetMemoryCompressionMode(pOsInterface, &pParams->psSurface->OsResource, (PMOS_MEMCOMP_STATE) &pParams->psSurface->CompressionMode));
pCmd->DW2.MemoryCompressionEnable =
(pParams->psSurface->CompressionMode == MOS_MMC_DISABLED) ? 0 : 1;
pCmd->DW2.MemoryCompressionMode =
(pParams->psSurface->CompressionMode == MOS_MMC_VERTICAL) ? 1 : 0;
}
if(pOsInterface->bPitchAndUVPatchingNeeded)
{
MHW_RESOURCE_PARAMS ResourceParams;
MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
ResourceParams.presResource = &pParams->psSurface->OsResource;
ResourceParams.HwCommandType = MOS_SURFACE_STATE_ADV;
ResourceParams.patchType = MOS_PATCH_TYPE_PITCH;
ResourceParams.bIsWritable = pParams->bIsWritable;
ResourceParams.shiftDirection = 0;
ResourceParams.shiftAmount = 3;
ResourceParams.pdwCmd = &(pCmd->DW2.Value);
ResourceParams.dwLocationInCmd = 2; //DW2
ResourceParams.dwOffsetInSSH =
uiIndirectStateOffset +
pKernelState->dwSshOffset +
pKernelState->dwBindingTableSize +
(pParams->dwBindingTableOffset[i] * m_dwMaxSurfaceStateSize);
MHW_MI_CHK_STATUS(m_pfnAddResourceToCmd(pOsInterface,
pCmdBuffer,
&ResourceParams));
}
pCmd->DW5.SurfaceMemoryObjectControlState = pParams->dwCacheabilityControl;
pCmd->DW5.TiledResourceMode = Mhw_ConvertToTRMode(pParams->psSurface->TileType);
if (i == MHW_U_PLANE) // AVS U plane
{
// Lockoffset is the offset from base address of Y plane to the origin of U/V plane.
// So, We can get XOffsetforU by Lockoffset % pSurface->dwPitch, and get YOffsetForU by Lockoffset / pSurface->dwPitch
/*pCmd->DW0.XOffset = pParams->psSurface->UPlaneOffset.iXOffset >> 2;
pCmd->DW0.YOffset = pParams->psSurface->UPlaneOffset.iYOffset >> 2;
pCmd->DW3.XOffsetforU = ((uint32_t)pParams->psSurface->UPlaneOffset.iLockSurfaceOffset % pSurface->dwPitch);
pCmd->DW3.YOffsetforU = ((uint32_t)pParams->psSurface->UPlaneOffset.iLockSurfaceOffset / pSurface->dwPitch);*/
if((pOsInterface->bPitchAndUVPatchingNeeded))
{
// Send UV offset token
MHW_RESOURCE_PARAMS ResourceParams;
MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
ResourceParams.presResource = &pParams->psSurface->OsResource;
ResourceParams.HwCommandType = MOS_SURFACE_STATE_ADV;
ResourceParams.patchType = MOS_PATCH_TYPE_UV_Y_OFFSET;
ResourceParams.bIsWritable = pParams->bIsWritable;
ResourceParams.shiftDirection = 0;
ResourceParams.shiftAmount = 0;
ResourceParams.pdwCmd = &(pCmd->DW3.Value);
ResourceParams.dwLocationInCmd = 3; //DW3
ResourceParams.dwOffsetInSSH =
uiIndirectStateOffset +
pKernelState->dwSshOffset +
pKernelState->dwBindingTableSize +
(pParams->dwBindingTableOffset[i] * m_dwMaxSurfaceStateSize);
MHW_MI_CHK_STATUS(m_pfnAddResourceToCmd(pOsInterface,
pCmdBuffer,
&ResourceParams));
}
else
pCmd->DW3.YOffsetForUCb = pParams->psSurface->UPlaneOffset.iYOffset;
}
else if (i == MHW_V_PLANE) // AVS V plane
{
pCmd->DW0.XOffset = pParams->psSurface->VPlaneOffset.iXOffset >> 2;
pCmd->DW0.YOffset = pParams->psSurface->VPlaneOffset.iYOffset >> 2;
//pCmd->DW4.XOffsetforV = ((uint32_t)pParams->psSurface->UPlaneOffset.iLockSurfaceOffset % pSurface->dwPitch);
//pCmd->DW4.YOffsetforV = ((uint32_t)pParams->psSurface->VPlaneOffset.iLockSurfaceOffset / pSurface->dwPitch);
}
else // AVS/DNDI Y plane
{
pCmd->DW3.XOffsetForUCb = pParams->dwXOffset[MHW_U_PLANE];
pCmd->DW3.YOffsetForUCb = pParams->dwYOffset[MHW_U_PLANE];
pCmd->DW4.XOffsetForVCr = pParams->dwXOffset[MHW_V_PLANE];
pCmd->DW4.YOffsetForVCr = pParams->dwYOffset[MHW_V_PLANE];
}
if (!pOsInterface->bPitchAndUVPatchingNeeded )
pCmd->DW3.YOffsetForUCb = pParams->psSurface->UPlaneOffset.iYOffset;
ResourceParams.presResource = &pParams->psSurface->OsResource;
ResourceParams.dwOffset =
pParams->psSurface->dwOffset + pParams->dwBaseAddrOffset[i];
ResourceParams.pdwCmd = &(pCmd->DW6.Value);
ResourceParams.dwLocationInCmd = 6;
ResourceParams.bIsWritable = pParams->bIsWritable;
ResourceParams.dwOffsetInSSH =
uiIndirectStateOffset +
pKernelState->dwSshOffset +
pKernelState->dwBindingTableSize +
(pParams->dwBindingTableOffset[i] * m_dwMaxSurfaceStateSize);
ResourceParams.HwCommandType = MOS_SURFACE_STATE_ADV;
MHW_MI_CHK_STATUS(m_pfnAddResourceToCmd(
pOsInterface,
pCmdBuffer,
&ResourceParams));
}
else // 1D, 2D Surface
{
mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD *pCmd =
(mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD*)pLocationOfSurfaceInSsh;
mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD CmdInit;
// Add additional defaults specific to media
CmdInit.DW0.SurfaceHorizontalAlignment = 1;
CmdInit.DW0.SurfaceVerticalAlignment = 1;
CmdInit.DW1.EnableUnormPathInColorPipe = CmdInit.ENABLE_UNORM_PATH_IN_COLOR_PIPE_UNNAMED0;
CmdInit.DW7.ShaderChannelSelectAlpha = CmdInit.SHADER_CHANNEL_SELECT_ALPHA_ALPHA;
CmdInit.DW7.ShaderChannelSelectBlue = CmdInit.SHADER_CHANNEL_SELECT_BLUE_BLUE;
CmdInit.DW7.ShaderChannelSelectGreen = CmdInit.SHADER_CHANNEL_SELECT_GREEN_GREEN;
CmdInit.DW7.ShaderChannelSelectRed = CmdInit.SHADER_CHANNEL_SELECT_RED_RED;
*pCmd = CmdInit;
MHW_MI_CHK_STATUS(Mhw_SurfaceFormatToType(
pParams->ForceSurfaceFormat[i],
pParams->psSurface,
&dwSurfaceType));
// Force surface type to be 2D for this case since its a requirement for the Gen11 HEVC Kernel
if (i == MHW_Y_PLANE && pParams->ForceSurfaceFormat[i] == MHW_GFX3DSTATE_SURFACEFORMAT_R32_UINT && pParams->dwSurfaceType == GFX3DSTATE_SURFACETYPE_2D)
dwSurfaceType = GFX3DSTATE_SURFACETYPE_2D;
pCmd->DW0.SurfaceType = dwSurfaceType;
pCmd->DW0.VerticalLineStride = pParams->bVertLineStride;
pCmd->DW0.VerticalLineStrideOffset = pParams->bVertLineStrideOffs;
pCmd->DW0.MediaBoundaryPixelMode = pParams->MediaBoundaryPixelMode;
pCmd->DW0.SurfaceFormat = pParams->ForceSurfaceFormat[i];
if (IS_Y_MAJOR_TILE_FORMAT(pParams->psSurface->TileType))
{
pCmd->DW0.TileMode = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::TILE_MODE_YMAJOR;
}
else if (pParams->psSurface->TileType == MOS_TILE_LINEAR)
{
pCmd->DW0.TileMode = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::TILE_MODE_LINEAR;
}
else if (pParams->psSurface->TileType == MOS_TILE_X)
{
pCmd->DW0.TileMode = mhw_state_heap_g11_X::RENDER_SURFACE_STATE_CMD::TILE_MODE_XMAJOR;
}
pCmd->DW1.MemoryObjectControlState = pParams->dwCacheabilityControl;
pCmd->DW2.Width = (pParams->dwWidthToUse[i] == 0) ?
pParams->psSurface->dwWidth : pParams->dwWidthToUse[i];
pCmd->DW2.Height = (pParams->dwHeightToUse[i] == 0) ?
pParams->psSurface->dwHeight : pParams->dwHeightToUse[i];
pCmd->DW3.SurfacePitch = (pParams->dwPitchToUse[i] == 0) ?
pParams->psSurface->dwPitch : pParams->dwPitchToUse[i];
if(pParams->psSurface->bCompressible)
{
MHW_MI_CHK_STATUS(pOsInterface->pfnGetMemoryCompressionMode(pOsInterface, &pParams->psSurface->OsResource, (PMOS_MEMCOMP_STATE) &pParams->psSurface->CompressionMode));
pCmd->DW7.MemoryCompressionEnable =
(pParams->psSurface->CompressionMode == MOS_MMC_DISABLED) ? 0 : 1;
pCmd->DW7.MemoryCompressionMode =
(pParams->psSurface->CompressionMode == MOS_MMC_VERTICAL) ? 1 : 0;
}
pCmd->DW3.SurfacePitch--; // both for 1D & 2D surface
pCmd->DW3.Depth = pParams->psSurface->dwDepth;
if (dwSurfaceType == GFX3DSTATE_SURFACETYPE_BUFFER)
{
if (pCmd->DW0.TileMode)
{
MHW_ASSERTMESSAGE("1D surfaces should not be tiled!");
eStatus = MOS_STATUS_INVALID_PARAMETER;
return eStatus;
}
}
else // 2D Surface
{
pCmd->DW2.Width--;
pCmd->DW2.Height--;
pCmd->DW3.Depth--;
pCmd->DW5.XOffset = pParams->dwXOffset[i] >> 2;
pCmd->DW5.YOffset = pParams->dwYOffset[i] >> 2;
pCmd->DW5.TiledResourceMode = Mhw_ConvertToTRMode(pParams->psSurface->TileType);
if(pOsInterface->bPitchAndUVPatchingNeeded)
{
pCmd->DW3.SurfacePitch = 0;
if(dwSurfaceType != GFX3DSTATE_SURFACETYPE_BUFFER)
{
MHW_RESOURCE_PARAMS ResourceParams;
MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
ResourceParams.presResource = &pParams->psSurface->OsResource;
ResourceParams.HwCommandType = MOS_SURFACE_STATE;
ResourceParams.patchType = MOS_PATCH_TYPE_PITCH;
ResourceParams.bIsWritable = pParams->bIsWritable;
ResourceParams.shiftDirection = 0;
ResourceParams.shiftAmount = 0;
ResourceParams.pdwCmd = &(pCmd->DW3.Value);
ResourceParams.dwOffsetInSSH = uiIndirectStateOffset +
pKernelState->dwSshOffset +
pKernelState->dwBindingTableSize +
(pParams->dwBindingTableOffset[i] * m_dwMaxSurfaceStateSize);
ResourceParams.dwLocationInCmd = 3 ; //DW3
MHW_MI_CHK_STATUS(m_pfnAddResourceToCmd(pOsInterface,
pCmdBuffer,
&ResourceParams));
}
}
}
ResourceParams.presResource = &pParams->psSurface->OsResource;
ResourceParams.dwOffset =
pParams->psSurface->dwOffset + pParams->dwBaseAddrOffset[i];
if(pOsInterface->bPitchAndUVPatchingNeeded)
{
if(i == MHW_Y_PLANE)
{
ResourceParams.patchType = MOS_PATCH_TYPE_BASE_ADDRESS; //Patch Y address
}
else
{
ResourceParams.patchType = MOS_PATCH_TYPE_UV_BASE_ADDRESS; //Patch UV Base address
ResourceParams.dwOffset = 0;
}
}
ResourceParams.pdwCmd = (pCmd->DW8_9.Value);
ResourceParams.dwLocationInCmd = 8;
ResourceParams.bIsWritable = pParams->bIsWritable;
ResourceParams.dwOffsetInSSH =
uiIndirectStateOffset +
pKernelState->dwSshOffset +
pKernelState->dwBindingTableSize +
(pParams->dwBindingTableOffset[i] * m_dwMaxSurfaceStateSize);
ResourceParams.HwCommandType = MOS_SURFACE_STATE;
MHW_MI_CHK_STATUS(m_pfnAddResourceToCmd(
pOsInterface,
pCmdBuffer,
&ResourceParams));
}
}
return eStatus;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::SetSamplerState(
void *pSampler,
PMHW_SAMPLER_STATE_PARAM pParam)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(pParam);
if (pParam->pKernelState)
{
PMHW_KERNEL_STATE pKernelState;
uint32_t dwCurrSampler;
uint32_t dwNumSampler;
mhw_state_heap_g11_X::SAMPLER_STATE_CMD Cmd;
Cmd.DW0.MinModeFilter = Cmd.MIN_MODE_FILTER_LINEAR;
Cmd.DW0.MagModeFilter = Cmd.MAG_MODE_FILTER_LINEAR;
Cmd.DW0.TextureBorderColorMode = Cmd.TEXTURE_BORDER_COLOR_MODE_8BIT;
Cmd.DW1.ShadowFunction = Cmd.SHADOW_FUNCTION_PREFILTEROPNEVER;
Cmd.DW3.TczAddressControlMode = Cmd.TCZ_ADDRESS_CONTROL_MODE_CLAMP;
Cmd.DW3.TcyAddressControlMode = Cmd.TCY_ADDRESS_CONTROL_MODE_CLAMP;
Cmd.DW3.TcxAddressControlMode = Cmd.TCX_ADDRESS_CONTROL_MODE_CLAMP;
Cmd.DW3.RAddressMinFilterRoundingEnable = true;
Cmd.DW3.RAddressMagFilterRoundingEnable = true;
Cmd.DW3.VAddressMinFilterRoundingEnable = true;
Cmd.DW3.VAddressMagFilterRoundingEnable = true;
Cmd.DW3.UAddressMinFilterRoundingEnable = true;
Cmd.DW3.UAddressMagFilterRoundingEnable = true;
Cmd.DW0.SamplerDisable = false;
dwNumSampler = pParam->pKernelState->KernelParams.iSamplerCount;
for (dwCurrSampler = 0; dwCurrSampler < dwNumSampler; dwCurrSampler++)
{
if (pParam[dwCurrSampler].bInUse)
{
pKernelState = pParam[dwCurrSampler].pKernelState;
MHW_MI_CHK_NULL(pKernelState);
MHW_MI_CHK_STATUS(pKernelState->m_dshRegion.AddData(
&Cmd,
pKernelState->dwSamplerOffset + dwCurrSampler * Cmd.byteSize,
sizeof(Cmd)));
}
}
}
else if (pParam->bInUse)
{
MHW_MI_CHK_NULL(pSampler);
if (pParam->SamplerType == MHW_SAMPLER_TYPE_3D)
{
mhw_state_heap_g11_X::SAMPLER_STATE_CMD *pUnormSampler =
(mhw_state_heap_g11_X::SAMPLER_STATE_CMD*)pSampler;
mhw_state_heap_g11_X::SAMPLER_STATE_CMD UnormSamplerInit;
// Add additional defaults specific to media
UnormSamplerInit.DW0.MinModeFilter = UnormSamplerInit.MIN_MODE_FILTER_LINEAR;
UnormSamplerInit.DW0.MagModeFilter = UnormSamplerInit.MAG_MODE_FILTER_LINEAR;
UnormSamplerInit.DW0.TextureBorderColorMode = UnormSamplerInit.TEXTURE_BORDER_COLOR_MODE_8BIT;
UnormSamplerInit.DW0.SamplerDisable = false;
UnormSamplerInit.DW1.ShadowFunction = UnormSamplerInit.SHADOW_FUNCTION_PREFILTEROPNEVER;
UnormSamplerInit.DW3.TczAddressControlMode = UnormSamplerInit.TCZ_ADDRESS_CONTROL_MODE_CLAMP;
UnormSamplerInit.DW3.TcyAddressControlMode = UnormSamplerInit.TCY_ADDRESS_CONTROL_MODE_CLAMP;
UnormSamplerInit.DW3.TcxAddressControlMode = UnormSamplerInit.TCX_ADDRESS_CONTROL_MODE_CLAMP;
UnormSamplerInit.DW3.RAddressMinFilterRoundingEnable = true;
UnormSamplerInit.DW3.RAddressMagFilterRoundingEnable = true;
UnormSamplerInit.DW3.VAddressMinFilterRoundingEnable = true;
UnormSamplerInit.DW3.VAddressMagFilterRoundingEnable = true;
UnormSamplerInit.DW3.UAddressMinFilterRoundingEnable = true;
UnormSamplerInit.DW3.UAddressMagFilterRoundingEnable = true;
*pUnormSampler = UnormSamplerInit;
if (pParam->Unorm.SamplerFilterMode == MHW_SAMPLER_FILTER_NEAREST)
{
pUnormSampler->DW0.MinModeFilter = pUnormSampler->MIN_MODE_FILTER_NEAREST;
pUnormSampler->DW0.MagModeFilter = pUnormSampler->MAG_MODE_FILTER_NEAREST;
}
else if (pParam->Unorm.SamplerFilterMode == MHW_SAMPLER_FILTER_BILINEAR)
{
pUnormSampler->DW0.MinModeFilter = pUnormSampler->MIN_MODE_FILTER_LINEAR;
pUnormSampler->DW0.MagModeFilter = pUnormSampler->MAG_MODE_FILTER_LINEAR;
}
else
{
pUnormSampler->DW0.MinModeFilter = pParam->Unorm.MinFilter;
pUnormSampler->DW0.MagModeFilter = pParam->Unorm.MagFilter;
}
pUnormSampler->DW3.TcxAddressControlMode = pParam->Unorm.AddressU;
pUnormSampler->DW3.TcyAddressControlMode = pParam->Unorm.AddressV;
pUnormSampler->DW3.TczAddressControlMode = pParam->Unorm.AddressW;
if (pParam->Unorm.bBorderColorIsValid)
{
mhw_state_heap_g11_X::SAMPLER_INDIRECT_STATE_CMD *pUnormSamplerBorderColor =
(mhw_state_heap_g11_X::SAMPLER_INDIRECT_STATE_CMD*)pParam->Unorm.pIndirectState;
mhw_state_heap_g11_X::SAMPLER_INDIRECT_STATE_CMD UnormSamplerBorderColorInit;
*pUnormSamplerBorderColor = UnormSamplerBorderColorInit;
// Since the structure is a union between float, uint, and int, can use any to set the state DW
pUnormSamplerBorderColor->DW0.Obj0.BorderColorRed = pParam->Unorm.BorderColorRedU;
pUnormSamplerBorderColor->DW1.BorderColorGreen = pParam->Unorm.BorderColorGreenU;
pUnormSamplerBorderColor->DW2.BorderColorBlue = pParam->Unorm.BorderColorBlueU;
pUnormSamplerBorderColor->DW3.BorderColorAlpha = pParam->Unorm.BorderColorAlphaU;
pUnormSampler->DW2.IndirectStatePointer = pParam->Unorm.IndirectStateOffset >> MHW_SAMPLER_INDIRECT_SHIFT;
}
if (pParam->Unorm.bChromaKeyEnable)
{
pUnormSampler->DW1.ChromakeyEnable = true;
pUnormSampler->DW1.ChromakeyIndex = pParam->Unorm.ChromaKeyIndex;
pUnormSampler->DW1.ChromakeyMode = pParam->Unorm.ChromaKeyMode;
}
}
else if (pParam->SamplerType == MHW_SAMPLER_TYPE_AVS)
{
mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD *pSamplerState8x8 =
(mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD*)pSampler;
mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD SamplerState8x8Init;
// Add additional defaults specific to media
SamplerState8x8Init.DW0.GainFactor = 0;
SamplerState8x8Init.DW0.R3XCoefficient = 0;
SamplerState8x8Init.DW0.R3CCoefficient = 0;
SamplerState8x8Init.DW2.GlobalNoiseEstimation = 0;
SamplerState8x8Init.DW2.R5XCoefficient = 0;
SamplerState8x8Init.DW2.R5CxCoefficient = 0;
SamplerState8x8Init.DW2.R5XCoefficient = 0;
SamplerState8x8Init.DW3.SinAlpha = 101;
SamplerState8x8Init.DW3.CosAlpha = 79;
SamplerState8x8Init.DW4.ShuffleOutputwritebackForSample8X8 = 1;
SamplerState8x8Init.DW5.DiamondAlpha = 100;
SamplerState8x8Init.DW5.DiamondDu = 0;
SamplerState8x8Init.DW7.InvMarginVyl = 3300;
SamplerState8x8Init.DW8.InvMarginVyu = 1600;
SamplerState8x8Init.DW10.S0L = MOS_BITFIELD_VALUE((uint32_t)-5, 11);
SamplerState8x8Init.DW10.YSlope2 = 31;
SamplerState8x8Init.DW12.YSlope1 = 31;
SamplerState8x8Init.DW14.S0U = 256;
SamplerState8x8Init.DW15.S1U = 113;
SamplerState8x8Init.DW15.S2U = MOS_BITFIELD_VALUE((uint32_t)-179, 11);
*pSamplerState8x8 = SamplerState8x8Init;
// Set STE Params
pSamplerState8x8->DW3.SkinToneTunedIefEnable = pParam->Avs.bEnableSTDE;
if (pParam->Avs.bEnableSTDE)
{
pSamplerState8x8->DW5.Skindetailfactor = pParam->Avs.bSkinDetailFactor;
pSamplerState8x8->DW4.VyStdEnable = true;
}
if (pParam->Avs.bEnableIEF && pParam->Avs.wIEFFactor > 0)
{
pSamplerState8x8->DW0.GainFactor = pParam->Avs.wIEFFactor;
pSamplerState8x8->DW0.R3XCoefficient = pParam->Avs.wR3xCoefficient;
pSamplerState8x8->DW0.R3CCoefficient = pParam->Avs.wR3cCoefficient;
pSamplerState8x8->DW2.R5XCoefficient = pParam->Avs.wR5xCoefficient;
pSamplerState8x8->DW2.R5CxCoefficient = pParam->Avs.wR5cxCoefficient;
pSamplerState8x8->DW2.R5CCoefficient = pParam->Avs.wR5cCoefficient;
}
if (pParam->Avs.bEnableAVS)
{
pSamplerState8x8->DW0.GainFactor = pParam->Avs.GainFactor;
pSamplerState8x8->DW0.StrongEdgeThreshold = pParam->Avs.StrongEdgeThr;
pSamplerState8x8->DW0.WeakEdgeThreshold = pParam->Avs.WeakEdgeThr;
pSamplerState8x8->DW2.GlobalNoiseEstimation = pParam->Avs.GlobalNoiseEstm;
pSamplerState8x8->DW2.StrongEdgeWeight = pParam->Avs.StrongEdgeWght;
pSamplerState8x8->DW2.RegularWeight = pParam->Avs.RegularWght;
pSamplerState8x8->DW2.NonEdgeWeight = pParam->Avs.NonEdgeWght;
pSamplerState8x8->DW3.Enable8TapFilter = pParam->Avs.EightTapAFEnable;
// Set 8-Tap Adaptive Filter
if (pParam->Avs.b8TapAdaptiveEnable)
{
pSamplerState8x8->DW3.Enable8TapFilter = MHW_SAMPLER_FILTER_8_TAP_ADATIVE;
}
else if (pParam->Avs.b8TapLumaForYUV444)
{
pSamplerState8x8->DW3.Enable8TapFilter = MHW_SAMPLER_FILTER_8_4_TAP;
}
//pSamplerState8x8->DW3.IEFBypass = pParam->pAVSParam.BypassIEF; This should be done through Kernel Gen8+
pSamplerState8x8->DW0.R3XCoefficient = pParam->Avs.wR3xCoefficient;
pSamplerState8x8->DW0.R3CCoefficient = pParam->Avs.wR3cCoefficient;
pSamplerState8x8->DW2.R5XCoefficient = pParam->Avs.wR5xCoefficient;
pSamplerState8x8->DW2.R5CxCoefficient = pParam->Avs.wR5cxCoefficient;
pSamplerState8x8->DW2.R5CCoefficient = pParam->Avs.wR5cCoefficient;
if (pParam->Avs.AdditionalOverridesUsed)
{
pSamplerState8x8->DW10.YSlope2 = pParam->Avs.YSlope2;
pSamplerState8x8->DW10.S0L = pParam->Avs.S0L;
pSamplerState8x8->DW12.YSlope1 = pParam->Avs.YSlope1;
pSamplerState8x8->DW15.S2U = pParam->Avs.S2U;
pSamplerState8x8->DW15.S1U = pParam->Avs.S1U;
}
// For HDC Direct Write, set Writeback same as Original Sample_8x8
if (pParam->Avs.bHdcDwEnable || pParam->Avs.bWritebackStandard)
{
pSamplerState8x8->DW4.ShuffleOutputwritebackForSample8X8 = 0;
}
if (pParam->Avs.pMhwSamplerAvsTableParam)
{
MHW_MI_CHK_STATUS(LoadSamplerAvsTable(pSamplerState8x8, pParam->Avs.pMhwSamplerAvsTableParam));
}
else
{
MHW_ASSERTMESSAGE("Invalid sampler params for avs 8x8 table \n");
return MOS_STATUS_INVALID_PARAMETER;
}
}
}
else
{
MHW_ASSERTMESSAGE("Invalid sampler type '%d'", pParam->SamplerType);
return MOS_STATUS_INVALID_PARAMETER;
}
}
return eStatus;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::AddSamplerStateData(
uint32_t samplerOffset,
MemoryBlock *memoryBlock,
PMHW_SAMPLER_STATE_PARAM pParam)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_CHK_NULL(memoryBlock);
MHW_MI_CHK_NULL(pParam);
if (pParam->SamplerType == MHW_SAMPLER_TYPE_3D)
{
mhw_state_heap_g11_X::SAMPLER_STATE_CMD unormSampler;
mhw_state_heap_g11_X::SAMPLER_INDIRECT_STATE_CMD indirectState;
pParam->Unorm.pIndirectState = &indirectState;
MHW_MI_CHK_STATUS(SetSamplerState(&unormSampler, pParam));
// Add indirect state to heap if necessary
if (pParam->Unorm.bBorderColorIsValid)
{
// adjust unormSampler->DW2.IndirectStatePointer
// to include memoryBlock's offset from base of state heap
unormSampler.DW2.IndirectStatePointer =
(pParam->Unorm.IndirectStateOffset + memoryBlock->GetOffset())
>> MHW_SAMPLER_INDIRECT_SHIFT;
MHW_MI_CHK_STATUS(memoryBlock->AddData(
&indirectState,
pParam->Unorm.IndirectStateOffset,
sizeof(mhw_state_heap_g11_X::SAMPLER_INDIRECT_STATE_CMD)));
}
// Add sampler state data to heap
MHW_MI_CHK_STATUS(memoryBlock->AddData(
&unormSampler,
samplerOffset,
sizeof(mhw_state_heap_g11_X::SAMPLER_STATE_CMD)));
}
else if (pParam->SamplerType == MHW_SAMPLER_TYPE_AVS)
{
mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD samplerState8x8;
MHW_MI_CHK_STATUS(SetSamplerState(&samplerState8x8, pParam));
// Add sampler data to heap
MHW_MI_CHK_STATUS(memoryBlock->AddData(
&samplerState8x8,
samplerOffset,
sizeof(mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD)));
}
else
{
MHW_ASSERTMESSAGE("Invalid sampler type '%d'", pParam->SamplerType);
eStatus = MOS_STATUS_INVALID_PARAMETER;
}
return eStatus;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::InitSamplerStates(
void *pSamplerStates,
int32_t iSamplers)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(pSamplerStates);
mhw_state_heap_g11_X::SAMPLER_STATE_CMD SamplerStateInit;
// Add additional defaults specific to media
SamplerStateInit.DW0.MinModeFilter = SamplerStateInit.MIN_MODE_FILTER_LINEAR;
SamplerStateInit.DW0.MagModeFilter = SamplerStateInit.MAG_MODE_FILTER_LINEAR;
SamplerStateInit.DW0.TextureBorderColorMode = SamplerStateInit.TEXTURE_BORDER_COLOR_MODE_8BIT;
SamplerStateInit.DW0.SamplerDisable = true;
SamplerStateInit.DW1.ShadowFunction = SamplerStateInit.SHADOW_FUNCTION_PREFILTEROPNEVER;
SamplerStateInit.DW3.TczAddressControlMode = SamplerStateInit.TCZ_ADDRESS_CONTROL_MODE_CLAMP;
SamplerStateInit.DW3.TcyAddressControlMode = SamplerStateInit.TCY_ADDRESS_CONTROL_MODE_CLAMP;
SamplerStateInit.DW3.TcxAddressControlMode = SamplerStateInit.TCX_ADDRESS_CONTROL_MODE_CLAMP;
SamplerStateInit.DW3.RAddressMinFilterRoundingEnable = true;
SamplerStateInit.DW3.RAddressMagFilterRoundingEnable = true;
SamplerStateInit.DW3.VAddressMinFilterRoundingEnable = true;
SamplerStateInit.DW3.VAddressMagFilterRoundingEnable = true;
SamplerStateInit.DW3.UAddressMinFilterRoundingEnable = true;
SamplerStateInit.DW3.UAddressMagFilterRoundingEnable = true;
// Initialize Media Sampler States
uint8_t *pu8SamplerState = (uint8_t*)pSamplerStates;
for (; iSamplers > 0; iSamplers--)
{
MOS_SecureMemcpy(pu8SamplerState, SamplerStateInit.byteSize, &SamplerStateInit, SamplerStateInit.byteSize);
pu8SamplerState += SamplerStateInit.byteSize;
}
return eStatus;
}
//!
//! \brief Load Sampler 8X8 State Table for Gen9
//! \details Load Sampler 8x8 State Table
//! \param [in] void *pTable
//! Pointer to 8x8 table in GSH to load
//! \param [in] PMHW_SAMPLER_AVS_TABLE_PARAM pMhwSamplerAvsTableParam
//! Pointer to 8x8 sampler state params
//! \return MOS_STATUS
//!
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::LoadSamplerAvsTable(
void *pvTable,
PMHW_SAMPLER_AVS_TABLE_PARAM pMhwSamplerAvsTableParam)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(pvTable);
MHW_MI_CHK_NULL(pMhwSamplerAvsTableParam);
mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD *pSampler8x8Avs =
(mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_CMD*)pvTable;
// DW0 ~ DW15 are for sampler state and programmed in other function, so no need to setup for it here.
uint32_t u32ConvolveTableNum =
sizeof(pSampler8x8Avs->FilterCoefficient016) / sizeof(pSampler8x8Avs->FilterCoefficient016[0]);
// DW16 ~ DW151 setting for table coefficients (DW0 ~ DW7) * 17
for (uint32_t u32CoeffTableIdx = 0; u32CoeffTableIdx < u32ConvolveTableNum; u32CoeffTableIdx++)
{
PMHW_AVS_COEFFICIENT_PARAM pCoeffParam = &pMhwSamplerAvsTableParam->paMhwAvsCoeffParam[u32CoeffTableIdx];
mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_COEFFICIENTS_CMD *pCoeffTable =
&pSampler8x8Avs->FilterCoefficient016[u32CoeffTableIdx];
MHW_MI_CHK_NULL(pCoeffParam);
MHW_MI_CHK_NULL(pCoeffTable);
pCoeffTable->DW0.Table0XFilterCoefficientN0 = pCoeffParam->ZeroXFilterCoefficient[0];
pCoeffTable->DW0.Table0YFilterCoefficientN0 = pCoeffParam->ZeroYFilterCoefficient[0];
pCoeffTable->DW0.Table0XFilterCoefficientN1 = pCoeffParam->ZeroXFilterCoefficient[1];
pCoeffTable->DW0.Table0YFilterCoefficientN1 = pCoeffParam->ZeroYFilterCoefficient[1];
pCoeffTable->DW1.Table0XFilterCoefficientN2 = pCoeffParam->ZeroXFilterCoefficient[2];
pCoeffTable->DW1.Table0YFilterCoefficientN2 = pCoeffParam->ZeroYFilterCoefficient[2];
pCoeffTable->DW1.Table0XFilterCoefficientN3 = pCoeffParam->ZeroXFilterCoefficient[3];
pCoeffTable->DW1.Table0YFilterCoefficientN3 = pCoeffParam->ZeroYFilterCoefficient[3];
pCoeffTable->DW2.Table0XFilterCoefficientN4 = pCoeffParam->ZeroXFilterCoefficient[4];
pCoeffTable->DW2.Table0YFilterCoefficientN4 = pCoeffParam->ZeroYFilterCoefficient[4];
pCoeffTable->DW2.Table0XFilterCoefficientN5 = pCoeffParam->ZeroXFilterCoefficient[5];
pCoeffTable->DW2.Table0YFilterCoefficientN5 = pCoeffParam->ZeroYFilterCoefficient[5];
pCoeffTable->DW3.Table0XFilterCoefficientN6 = pCoeffParam->ZeroXFilterCoefficient[6];
pCoeffTable->DW3.Table0YFilterCoefficientN6 = pCoeffParam->ZeroYFilterCoefficient[6];
pCoeffTable->DW3.Table0XFilterCoefficientN7 = pCoeffParam->ZeroXFilterCoefficient[7];
pCoeffTable->DW3.Table0YFilterCoefficientN7 = pCoeffParam->ZeroYFilterCoefficient[7];
pCoeffTable->DW4.Table1XFilterCoefficientN2 = pCoeffParam->OneXFilterCoefficient[0];
pCoeffTable->DW4.Table1XFilterCoefficientN3 = pCoeffParam->OneXFilterCoefficient[1];
pCoeffTable->DW5.Table1XFilterCoefficientN4 = pCoeffParam->OneXFilterCoefficient[2];
pCoeffTable->DW5.Table1XFilterCoefficientN5 = pCoeffParam->OneXFilterCoefficient[3];
pCoeffTable->DW6.Table1YFilterCoefficientN2 = pCoeffParam->OneYFilterCoefficient[0];
pCoeffTable->DW6.Table1YFilterCoefficientN3 = pCoeffParam->OneYFilterCoefficient[1];
pCoeffTable->DW7.Table1YFilterCoefficientN4 = pCoeffParam->OneYFilterCoefficient[2];
pCoeffTable->DW7.Table1YFilterCoefficientN5 = pCoeffParam->OneYFilterCoefficient[3];
}
// DW152 ~ DW153 setting for table control
pSampler8x8Avs->DW152.TransitionAreaWith8Pixels = pMhwSamplerAvsTableParam->byteTransitionArea8Pixels; // 3-bits
pSampler8x8Avs->DW152.TransitionAreaWith4Pixels = pMhwSamplerAvsTableParam->byteTransitionArea4Pixels; // 3-bits
pSampler8x8Avs->DW152.MaxDerivative8Pixels = pMhwSamplerAvsTableParam->byteMaxDerivative8Pixels;
pSampler8x8Avs->DW152.MaxDerivative4Pixels = pMhwSamplerAvsTableParam->byteMaxDerivative4Pixels;
pSampler8x8Avs->DW152.DefaultSharpnessLevel = pMhwSamplerAvsTableParam->byteDefaultSharpnessLevel;
pSampler8x8Avs->DW153.RgbAdaptive = pMhwSamplerAvsTableParam->bEnableRGBAdaptive;
pSampler8x8Avs->DW153.AdaptiveFilterForAllChannels = pMhwSamplerAvsTableParam->bAdaptiveFilterAllChannels;
pSampler8x8Avs->DW153.BypassYAdaptiveFiltering = pMhwSamplerAvsTableParam->bBypassYAdaptiveFiltering;
pSampler8x8Avs->DW153.BypassXAdaptiveFiltering = pMhwSamplerAvsTableParam->bBypassXAdaptiveFiltering;
u32ConvolveTableNum =
sizeof(pSampler8x8Avs->FilterCoefficient1731) / sizeof(pSampler8x8Avs->FilterCoefficient1731[0]);
// DW160 ~ DW279 setting for extra table coefficients (DW0 ~ DW7) * 15
for (uint32_t u32CoeffTableIdx = 0; u32CoeffTableIdx < u32ConvolveTableNum; u32CoeffTableIdx++)
{
PMHW_AVS_COEFFICIENT_PARAM pCoeffParamExtra = &pMhwSamplerAvsTableParam->paMhwAvsCoeffParamExtra[u32CoeffTableIdx];
mhw_state_heap_g11_X::SAMPLER_STATE_8x8_AVS_COEFFICIENTS_CMD *pCoeffTableExtra =
&pSampler8x8Avs->FilterCoefficient1731[u32CoeffTableIdx];
MHW_MI_CHK_NULL(pCoeffParamExtra);
MHW_MI_CHK_NULL(pCoeffTableExtra);
pCoeffTableExtra->DW0.Table0XFilterCoefficientN0 = pCoeffParamExtra->ZeroXFilterCoefficient[0];
pCoeffTableExtra->DW0.Table0YFilterCoefficientN0 = pCoeffParamExtra->ZeroYFilterCoefficient[0];
pCoeffTableExtra->DW0.Table0XFilterCoefficientN1 = pCoeffParamExtra->ZeroXFilterCoefficient[1];
pCoeffTableExtra->DW0.Table0YFilterCoefficientN1 = pCoeffParamExtra->ZeroYFilterCoefficient[1];
pCoeffTableExtra->DW1.Table0XFilterCoefficientN2 = pCoeffParamExtra->ZeroXFilterCoefficient[2];
pCoeffTableExtra->DW1.Table0YFilterCoefficientN2 = pCoeffParamExtra->ZeroYFilterCoefficient[2];
pCoeffTableExtra->DW1.Table0XFilterCoefficientN3 = pCoeffParamExtra->ZeroXFilterCoefficient[3];
pCoeffTableExtra->DW1.Table0YFilterCoefficientN3 = pCoeffParamExtra->ZeroYFilterCoefficient[3];
pCoeffTableExtra->DW2.Table0XFilterCoefficientN4 = pCoeffParamExtra->ZeroXFilterCoefficient[4];
pCoeffTableExtra->DW2.Table0YFilterCoefficientN4 = pCoeffParamExtra->ZeroYFilterCoefficient[4];
pCoeffTableExtra->DW2.Table0XFilterCoefficientN5 = pCoeffParamExtra->ZeroXFilterCoefficient[5];
pCoeffTableExtra->DW2.Table0YFilterCoefficientN5 = pCoeffParamExtra->ZeroYFilterCoefficient[5];
pCoeffTableExtra->DW3.Table0XFilterCoefficientN6 = pCoeffParamExtra->ZeroXFilterCoefficient[6];
pCoeffTableExtra->DW3.Table0YFilterCoefficientN6 = pCoeffParamExtra->ZeroYFilterCoefficient[6];
pCoeffTableExtra->DW3.Table0XFilterCoefficientN7 = pCoeffParamExtra->ZeroXFilterCoefficient[7];
pCoeffTableExtra->DW3.Table0YFilterCoefficientN7 = pCoeffParamExtra->ZeroYFilterCoefficient[7];
pCoeffTableExtra->DW4.Table1XFilterCoefficientN2 = pCoeffParamExtra->OneXFilterCoefficient[0];
pCoeffTableExtra->DW4.Table1XFilterCoefficientN3 = pCoeffParamExtra->OneXFilterCoefficient[1];
pCoeffTableExtra->DW5.Table1XFilterCoefficientN4 = pCoeffParamExtra->OneXFilterCoefficient[2];
pCoeffTableExtra->DW5.Table1XFilterCoefficientN5 = pCoeffParamExtra->OneXFilterCoefficient[3];
pCoeffTableExtra->DW6.Table1YFilterCoefficientN2 = pCoeffParamExtra->OneYFilterCoefficient[0];
pCoeffTableExtra->DW6.Table1YFilterCoefficientN3 = pCoeffParamExtra->OneYFilterCoefficient[1];
pCoeffTableExtra->DW7.Table1YFilterCoefficientN4 = pCoeffParamExtra->OneYFilterCoefficient[2];
pCoeffTableExtra->DW7.Table1YFilterCoefficientN5 = pCoeffParamExtra->OneYFilterCoefficient[3];
}
return eStatus;
}
MOS_STATUS MHW_STATE_HEAP_INTERFACE_G11_X::SetInterfaceDescriptor(
uint32_t dwNumIdsToSet,
PMHW_INTERFACE_DESCRIPTOR_PARAMS pParams)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_FUNCTION_ENTER;
MHW_MI_CHK_NULL(pParams);
for (uint32_t dwCurrId = 0; dwCurrId < dwNumIdsToSet; dwCurrId++)
{
PMHW_KERNEL_STATE pKernelState = pParams[dwCurrId].pKernelState;
MHW_MI_CHK_NULL(pKernelState);
mhw_state_heap_g11_X::INTERFACE_DESCRIPTOR_DATA_CMD cmd;
cmd.DW0.KernelStartPointer =
(pKernelState->m_ishRegion.GetOffset() +
pKernelState->dwKernelBinaryOffset +
pParams[dwCurrId].dwKernelStartOffset) >>
MHW_KERNEL_OFFSET_SHIFT;
cmd.DW3.SamplerStatePointer =
(pKernelState->m_dshRegion.GetOffset() +
pKernelState->dwSamplerOffset +
pParams[dwCurrId].dwSamplerOffset) >>
MHW_SAMPLER_SHIFT;
cmd.DW3.SamplerCount = (pKernelState->KernelParams.iSamplerCount - 1) / 4 + 1;
cmd.DW4.BindingTablePointer = MOS_ROUNDUP_SHIFT(
(pKernelState->dwSshOffset +
pParams[dwCurrId].dwBtOffset),
MHW_BINDING_TABLE_ID_SHIFT);
cmd.DW5.ConstantIndirectUrbEntryReadLength = MOS_ROUNDUP_SHIFT(
pParams->pKernelState->KernelParams.iCurbeLength,
MHW_CURBE_SHIFT);
cmd.DW6.NumberOfThreadsInGpgpuThreadGroup = 1;
uint32_t idOffsetInIdSpace =
pKernelState->dwIdOffset +
(pParams[dwCurrId].dwIdIdx * m_wSizeOfCmdInterfaceDescriptorData);
MHW_MI_CHK_STATUS(pKernelState->m_dshRegion.AddData(
&cmd,
idOffsetInIdSpace,
cmd.byteSize));
}
return eStatus;
}