mirror of https://github.com/intel/gmmlib.git
777 lines
31 KiB
C++
777 lines
31 KiB
C++
/*==============================================================================
|
|
Copyright(c) 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.
|
|
============================================================================*/
|
|
|
|
#include "Internal/Common/GmmLibInc.h"
|
|
#include "External/Common/GmmClientContext.h"
|
|
|
|
#if !__GMM_KMD__ && _WIN32
|
|
#include "..\..\inc\common\gfxEscape.h"
|
|
#include "..\..\..\miniport\LHDM\inc\gmmEscape.h"
|
|
#include "Internal\Windows\GmmResourceInfoWinInt.h"
|
|
#include "../TranslationTable/GmmUmdTranslationTable.h"
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Constructor to zero initialize the GmmLib::GmmClientContext object and create
|
|
/// Utility class object
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GmmLib::GmmClientContext::GmmClientContext(GMM_CLIENT ClientType)
|
|
: ClientType(),
|
|
pUmdAdapter(),
|
|
pGmmUmdContext(),
|
|
DeviceCB(),
|
|
IsDeviceCbReceived(0)
|
|
{
|
|
this->ClientType = ClientType;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Destructor to free GmmLib::GmmClientContext object memory
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GmmLib::GmmClientContext::~GmmClientContext()
|
|
{
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning
|
|
/// MEMORY_OBJECT_CONTROL_STATE for a given Resource Usage Type
|
|
///
|
|
/// @param[in] GMM_RESOURCE_INFO : Pointer to ResInfo object
|
|
/// @param[in] GMM_RESOURCE_USAGE_TYPE : Resource Usage Type
|
|
/// @return MEMORY_OBJECT_CONTROL_STATE for the resource of "Usage" type.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
MEMORY_OBJECT_CONTROL_STATE GMM_STDCALL GmmLib::GmmClientContext::CachePolicyGetMemoryObject(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage)
|
|
{
|
|
return pGmmGlobalContext->GetCachePolicyObj()->CachePolicyGetMemoryObject(pResInfo, Usage);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning
|
|
/// GMM_PTE_CACHE_CONTROL_BITS for a given Resource Usage Type
|
|
///
|
|
/// @param[in] GMM_RESOURCE_USAGE_TYPE : Resource Usage Type
|
|
/// @return GMM_PTE_CACHE_CONTROL_BITS for the resource of "Usage" type.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_PTE_CACHE_CONTROL_BITS GMM_STDCALL GmmLib::GmmClientContext::CachePolicyGetPteType(GMM_RESOURCE_USAGE_TYPE Usage)
|
|
{
|
|
return pGmmGlobalContext->GetCachePolicyObj()->CachePolicyGetPteType(Usage);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning
|
|
/// MEMORY_OBJECT_CONTROL_STATE for a given ResInfo Object
|
|
///
|
|
/// @param[in] GMM_RESOURCE_INFO : Pointer to ResInfo object
|
|
/// @return MEMORY_OBJECT_CONTROL_STATE for the ResInfo object
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
MEMORY_OBJECT_CONTROL_STATE GMM_STDCALL GmmLib::GmmClientContext::CachePolicyGetOriginalMemoryObject(GMM_RESOURCE_INFO *pResInfo)
|
|
{
|
|
return pGmmGlobalContext->GetCachePolicyObj()->CachePolicyGetOriginalMemoryObject(pResInfo);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for checking if PTE is cached for a
|
|
/// given resource usage type
|
|
///
|
|
/// @param[in] GMM_RESOURCE_USAGE_TYPE : Resource Usage Type
|
|
/// @return True if PTE cached, else false
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::CachePolicyIsUsagePTECached(GMM_RESOURCE_USAGE_TYPE Usage)
|
|
{
|
|
return pGmmGlobalContext->GetCachePolicyObj()->CachePolicyIsUsagePTECached(Usage);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning Max MOCS index used
|
|
/// on a platform
|
|
///
|
|
/// @return Max MOCS Index
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint32_t GMM_STDCALL GmmLib::GmmClientContext::CachePolicyGetMaxMocsIndex()
|
|
{
|
|
GMM_CACHE_POLICY * pCachePolicy = pGmmGlobalContext->GetCachePolicyObj();
|
|
GmmLib::GmmGen9CachePolicy *ptr = static_cast<GmmLib::GmmGen9CachePolicy *>(pCachePolicy);
|
|
return ptr->CurrentMaxMocsIndex;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning Max L1 HDC MOCS index used
|
|
/// on a platform
|
|
///
|
|
/// @return Max L1 HDC MOCS Index
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint32_t GMM_STDCALL GmmLib::GmmClientContext::CachePolicyGetMaxL1HdcMocsIndex()
|
|
{
|
|
GMM_CACHE_POLICY * pCachePolicy = pGmmGlobalContext->GetCachePolicyObj();
|
|
GmmLib::GmmGen9CachePolicy *ptr = static_cast<GmmLib::GmmGen9CachePolicy *>(pCachePolicy);
|
|
return ptr->CurrentMaxL1HdcMocsIndex;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Returns count of current Special MOCS values for MOCS Table programming at GMM boot
|
|
///
|
|
/// @param[in] none:
|
|
/// @return uint32_t max special mocs index needed to program
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint32_t GMM_STDCALL GmmLib::GmmClientContext::CachePolicyGetMaxSpecialMocsIndex(void)
|
|
{
|
|
GMM_CACHE_POLICY *pCachePolicy = pGmmGlobalContext->GetCachePolicyObj();
|
|
return pCachePolicy->GetMaxSpecialMocsIndex();
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning GMM_CACHE_POLICY_ELEMENT
|
|
/// Table defiend for a platform
|
|
///
|
|
/// @return Const GMM_CACHE_POLICY_ELEMENT Table
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_CACHE_POLICY_ELEMENT *GMM_STDCALL GmmLib::GmmClientContext::GetCachePolicyUsage()
|
|
{
|
|
return (pGmmGlobalContext->GetCachePolicyUsage());
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for populating GMM_CACHE_SIZES
|
|
/// available on a platform
|
|
///
|
|
/// @return In/Out GMM_CACHE_SIZES Populated Caches sizes
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void GMM_STDCALL GmmLib::GmmClientContext::GetCacheSizes(GMM_CACHE_SIZES *pCacheSizes)
|
|
{
|
|
return GmmGetCacheSizes(pCacheSizes);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning GMM_CACHE_POLICY_ELEMENT
|
|
/// for a given Resource Usage Type
|
|
///
|
|
/// @return GMM_CACHE_POLICY_ELEMENT
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_CACHE_POLICY_ELEMENT GMM_STDCALL GmmLib::GmmClientContext::GetCachePolicyElement(GMM_RESOURCE_USAGE_TYPE Usage)
|
|
{
|
|
return pGmmGlobalContext->GetCachePolicyElement(Usage);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning GMM_CACHE_POLICY_TBL_ELEMENT
|
|
/// for a given Mocs Index
|
|
///
|
|
/// @return GMM_CACHE_POLICY_TBL_ELEMENT
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_CACHE_POLICY_TBL_ELEMENT GMM_STDCALL GmmLib::GmmClientContext::GetCachePolicyTlbElement(uint32_t MocsIdx)
|
|
{
|
|
return pGmmGlobalContext->GetCachePolicyTlbElement()[MocsIdx];
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning GMM_PLATFORM_INFO data
|
|
///
|
|
/// @return GMM_PLATFORM_INFO&
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_PLATFORM_INFO &GMM_STDCALL GmmLib::GmmClientContext::GetPlatformInfo()
|
|
{
|
|
return pGmmGlobalContext->GetPlatformInfo();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for getting Alignment info
|
|
///
|
|
/// @return void
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
void GMM_STDCALL GmmLib::GmmClientContext::GetExtendedTextureAlign(uint32_t Mode, ALIGNMENT &UnitAlign)
|
|
{
|
|
ALIGNMENT AlignInfo;
|
|
pGmmGlobalContext->GetPlatformInfoObj()->ApplyExtendedTexAlign(Mode, AlignInfo);
|
|
UnitAlign = AlignInfo;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning SKU_FEATURE_TABLE data
|
|
///
|
|
/// @return SKU_FEATURE_TABLE&
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
const SKU_FEATURE_TABLE &GMM_STDCALL GmmLib::GmmClientContext::GetSkuTable()
|
|
{
|
|
return pGmmGlobalContext->GetSkuTable();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning whether the given Resource
|
|
/// format is Planar
|
|
///
|
|
/// @return True if the Given format is planar
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::IsPlanar(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
return GmmIsPlanar(Format);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning whether the given Resource
|
|
/// format is P0xx
|
|
///
|
|
/// @return True if the Given format is P0xx
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::IsP0xx(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
return GmmIsP0xx(Format);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning whether the given Resource
|
|
/// format is UV Packed plane
|
|
///
|
|
/// @return True if the Given format is UV packed
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::IsUVPacked(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
return GmmIsUVPacked(Format);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning whether the given Resource
|
|
/// format is Compressed
|
|
///
|
|
/// @return True if the Given format is Compressed
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::IsCompressed(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
return (Format > GMM_FORMAT_INVALID) &&
|
|
(Format < GMM_RESOURCE_FORMATS) &&
|
|
pGmmGlobalContext->GetPlatformInfo().FormatTable[Format].Compressed;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning whether the given Resource
|
|
/// format is YUV Packed plane
|
|
///
|
|
/// @return True if the Given format is YUV packed
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::IsYUVPacked(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
return GmmIsYUVPacked(Format);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning its GMM_SURFACESTATE_FORMAT
|
|
/// for the given equivalent GMM_RESOURCE_FORMAT type
|
|
///
|
|
/// @return GMM_SURFACESTATE_FORMAT for the given format type
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_SURFACESTATE_FORMAT GMM_STDCALL GmmLib::GmmClientContext::GetSurfaceStateFormat(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
// ToDo: Remove the definition of GmmGetSurfaceStateFormat(Format)
|
|
return ((Format > GMM_FORMAT_INVALID) &&
|
|
(Format < GMM_RESOURCE_FORMATS)) ?
|
|
pGmmGlobalContext->GetPlatformInfo().FormatTable[Format].SurfaceStateFormat :
|
|
GMM_SURFACESTATE_FORMAT_INVALID;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning
|
|
/// RENDER_SURFACE_STATE::CompressionFormat
|
|
///
|
|
/// @return uint8_t
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::GetSurfaceStateCompressionFormat(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
__GMM_ASSERT((Format > GMM_FORMAT_INVALID) && (Format < GMM_RESOURCE_FORMATS));
|
|
|
|
return pGmmGlobalContext->GetPlatformInfo().FormatTable[Format].CompressionFormat.AuxL1eFormat;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning
|
|
/// MEDIA_SURFACE_STATE::CompressionFormat
|
|
///
|
|
/// @return uint8_t
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint8_t GMM_STDCALL GmmLib::GmmClientContext::GetMediaSurfaceStateCompressionFormat(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
__GMM_ASSERT((Format > GMM_FORMAT_INVALID) && (Format < GMM_RESOURCE_FORMATS));
|
|
|
|
return pGmmGlobalContext->GetPlatformInfoObj()->OverrideCompressionFormat(Format, (uint8_t)0x1);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for returning E2E compression format
|
|
///
|
|
/// @return GMM_E2ECOMP_FORMAT
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_E2ECOMP_FORMAT GMM_STDCALL GmmLib::GmmClientContext::GetLosslessCompressionType(GMM_RESOURCE_FORMAT Format)
|
|
{
|
|
// ToDo: Remove the definition of GmmGetLosslessCompressionType(Format)
|
|
__GMM_ASSERT((Format > GMM_FORMAT_INVALID) && (Format < GMM_RESOURCE_FORMATS));
|
|
|
|
return pGmmGlobalContext->GetPlatformInfo().FormatTable[Format].CompressionFormat.AuxL1eFormat;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class to return InternalGpuVaMax value
|
|
/// stored in pGmmGlobalContext
|
|
///
|
|
/// @return GMM_SUCCESS
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
uint64_t GMM_STDCALL GmmLib::GmmClientContext::GetInternalGpuVaRangeLimit()
|
|
{
|
|
return pGmmGlobalContext->GetInternalGpuVaRangeLimit();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of Custiom ResourceInfo Object .
|
|
/// @see GmmLib::GmmResourceInfoCommon::Create()
|
|
///
|
|
/// @param[in] pCreateParams: Flags which specify what sort of resource to create
|
|
/// @return Pointer to GmmResourceInfo class.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_RESOURCE_INFO *GMM_STDCALL GmmLib::GmmClientContext::CreateCustomResInfoObject(GMM_RESCREATE_CUSTOM_PARAMS *pCreateParams)
|
|
{
|
|
GMM_RESOURCE_INFO *pRes = NULL;
|
|
GmmClientContext * pClientContextIn = NULL;
|
|
|
|
pClientContextIn = this;
|
|
|
|
if((pRes = new GMM_RESOURCE_INFO(pClientContextIn)) == NULL)
|
|
{
|
|
GMM_ASSERTDPF(0, "Allocation failed!");
|
|
goto ERROR_CASE;
|
|
}
|
|
|
|
if(pRes->CreateCustomRes(*pGmmGlobalContext, *pCreateParams) != GMM_SUCCESS)
|
|
{
|
|
goto ERROR_CASE;
|
|
}
|
|
|
|
return (pRes);
|
|
|
|
ERROR_CASE:
|
|
if(pRes)
|
|
{
|
|
DestroyResInfoObject(pRes);
|
|
}
|
|
|
|
return (NULL);
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of ResourceInfo Object .
|
|
/// @see GmmLib::GmmResourceInfoCommon::Create()
|
|
///
|
|
/// @param[in] pCreateParams: Flags which specify what sort of resource to create
|
|
/// @return Pointer to GmmResourceInfo class.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_RESOURCE_INFO *GMM_STDCALL GmmLib::GmmClientContext::CreateResInfoObject(GMM_RESCREATE_PARAMS *pCreateParams)
|
|
{
|
|
GMM_RESOURCE_INFO *pRes = NULL;
|
|
GmmClientContext * pClientContextIn = NULL;
|
|
|
|
#if(!defined(GMM_UNIFIED_LIB))
|
|
pClientContextIn = pGmmGlobalContext->pGmmGlobalClientContext;
|
|
#else
|
|
pClientContextIn = this;
|
|
#endif
|
|
|
|
// GMM_RESOURCE_INFO...
|
|
if(pCreateParams->pPreallocatedResInfo)
|
|
{
|
|
pRes = new(pCreateParams->pPreallocatedResInfo) GmmLib::GmmResourceInfo(pClientContextIn); // Use preallocated memory as a class
|
|
pCreateParams->Flags.Info.__PreallocatedResInfo =
|
|
pRes->GetResFlags().Info.__PreallocatedResInfo = 1; // Set both in case we can die before copying over the flags.
|
|
}
|
|
else
|
|
{
|
|
if((pRes = new GMM_RESOURCE_INFO(pClientContextIn)) == NULL)
|
|
{
|
|
GMM_ASSERTDPF(0, "Allocation failed!");
|
|
goto ERROR_CASE;
|
|
}
|
|
}
|
|
|
|
if(pRes->Create(*pCreateParams) != GMM_SUCCESS)
|
|
{
|
|
goto ERROR_CASE;
|
|
}
|
|
|
|
return (pRes);
|
|
|
|
ERROR_CASE:
|
|
if(pRes)
|
|
{
|
|
DestroyResInfoObject(pRes);
|
|
}
|
|
|
|
return (NULL);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of ResourceInfo Object from
|
|
/// already created Src ResInfo object
|
|
/// @see GmmLib::GmmResourceInfoCommon::Create()
|
|
///
|
|
/// @param[in] pSrcRes: Existing ResInfoObj
|
|
/// @return Pointer to GmmResourceInfo class.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_RESOURCE_INFO *GMM_STDCALL GmmLib::GmmClientContext::CopyResInfoObject(GMM_RESOURCE_INFO *pSrcRes)
|
|
{
|
|
GMM_RESOURCE_INFO *pResCopy = NULL;
|
|
GmmClientContext * pClientContextIn = NULL;
|
|
|
|
#if(!defined(GMM_UNIFIED_LIB))
|
|
pClientContextIn = pGmmGlobalContext->pGmmGlobalClientContext;
|
|
#else
|
|
pClientContextIn = this;
|
|
#endif
|
|
|
|
__GMM_ASSERTPTR(pSrcRes, NULL);
|
|
|
|
pResCopy = new GMM_RESOURCE_INFO(pClientContextIn);
|
|
if(!pResCopy)
|
|
{
|
|
GMM_ASSERTDPF(0, "Allocation failed.");
|
|
return NULL;
|
|
}
|
|
|
|
*pResCopy = *pSrcRes;
|
|
|
|
// We are allocating new class, flag must be false to avoid leak at DestroyResource
|
|
pResCopy->GetResFlags().Info.__PreallocatedResInfo = 0;
|
|
|
|
return (pResCopy);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for copy of ResourceInfo Object from
|
|
/// already created Src ResInfo object
|
|
/// @see GmmLib::GmmResourceInfoCommon::Create()
|
|
///
|
|
/// @param[in] pDst: Pointer to memory when pSrc will be copied
|
|
/// @param[in] pSrc: Pointer to GmmResourceInfo class that needs to be copied
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void GMM_STDCALL GmmLib::GmmClientContext::ResMemcpy(void *pDst, void *pSrc)
|
|
{
|
|
GmmClientContext *pClientContextIn = NULL;
|
|
|
|
#if(!defined(GMM_UNIFIED_LIB))
|
|
pClientContextIn = pGmmGlobalContext->pGmmGlobalClientContext;
|
|
#else
|
|
pClientContextIn = this;
|
|
#endif
|
|
|
|
GMM_RESOURCE_INFO *pResSrc = reinterpret_cast<GMM_RESOURCE_INFO *>(pSrc);
|
|
// Init memory correctly, in case the pointer is a raw memory pointer
|
|
GMM_RESOURCE_INFO *pResDst = new(pDst) GMM_RESOURCE_INFO(pClientContextIn);
|
|
|
|
*pResDst = *pResSrc;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for Destroying ResInfoObject
|
|
///
|
|
/// @param[in] pResInfo: Pointer to ResInfoObject
|
|
/// @return void.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void GMM_STDCALL GmmLib::GmmClientContext::DestroyResInfoObject(GMM_RESOURCE_INFO *pResInfo)
|
|
{
|
|
__GMM_ASSERTPTR(pResInfo, VOIDRETURN);
|
|
|
|
if(pResInfo->GetResFlags().Info.__PreallocatedResInfo)
|
|
{
|
|
*pResInfo = GmmLib::GmmResourceInfo();
|
|
}
|
|
else
|
|
{
|
|
delete pResInfo;
|
|
pResInfo = NULL;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of PAgeTableMgr Object .
|
|
/// @see GmmLib::GMM_PAGETABLE_MGR::GMM_PAGETABLE_MGR
|
|
///
|
|
/// @param[in] TTFags
|
|
/// @return Pointer to GMM_PAGETABLE_MGR class.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_PAGETABLE_MGR* GMM_STDCALL GmmLib::GmmClientContext::CreatePageTblMgrObject(uint32_t TTFlags)
|
|
{
|
|
if (!IsDeviceCbReceived)
|
|
{
|
|
GMM_ASSERTDPF(0, "Device_callbacks not set");
|
|
return NULL;
|
|
}
|
|
|
|
return CreatePageTblMgrObject(&DeviceCB, TTFlags);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of PAgeTableMgr Object .
|
|
/// @see GmmLib::GMM_PAGETABLE_MGR::GMM_PAGETABLE_MGR
|
|
///
|
|
/// @param[in] pDevCb: Pointer to GMM_DEVICE_CALLBACKS_INT
|
|
/// @param[in] TTFags
|
|
/// @return Pointer to GMM_PAGETABLE_MGR class.
|
|
//TBD: move the code to new overloaded the API and remove this API once all clients are moved to new API.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_PAGETABLE_MGR* GMM_STDCALL GmmLib::GmmClientContext::CreatePageTblMgrObject(GMM_DEVICE_CALLBACKS_INT* pDevCb,
|
|
uint32_t TTFlags)
|
|
{
|
|
GMM_PAGETABLE_MGR* pPageTableMgr = NULL;
|
|
|
|
pPageTableMgr = new GMM_PAGETABLE_MGR(pDevCb, TTFlags, this);
|
|
|
|
return pPageTableMgr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for destroy of PageTableMgr Object .
|
|
///
|
|
/// @param[in] pPageTableMgr: Pointer to GMM_PAGETABLE_MGR
|
|
/// @return void.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void GMM_STDCALL GmmLib::GmmClientContext::DestroyPageTblMgrObject(GMM_PAGETABLE_MGR* pPageTableMgr)
|
|
{
|
|
if (pPageTableMgr)
|
|
{
|
|
delete pPageTableMgr;
|
|
}
|
|
}
|
|
|
|
#ifdef GMM_LIB_DLL
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of ResourceInfo Object .
|
|
/// @see GmmLib::GmmResourceInfoCommon::Create()
|
|
///
|
|
/// @param[in] pCreateParams: Flags which specify what sort of resource to create
|
|
/// @return Pointer to GmmResourceInfo class.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_RESOURCE_INFO *GMM_STDCALL GmmLib::GmmClientContext::CreateResInfoObject(GMM_RESCREATE_PARAMS * pCreateParams,
|
|
GmmClientAllocationCallbacks *pAllocCbs)
|
|
{
|
|
if(!pAllocCbs || !pAllocCbs->pfnAllocation)
|
|
{
|
|
return CreateResInfoObject(pCreateParams);
|
|
}
|
|
else
|
|
{
|
|
GMM_RESOURCE_INFO *pRes = NULL;
|
|
void * pConst = NULL;
|
|
|
|
// GMM_RESOURCE_INFO...
|
|
if(pCreateParams->pPreallocatedResInfo)
|
|
{
|
|
pRes = new(pCreateParams->pPreallocatedResInfo) GmmLib::GmmResourceInfo(this); // Use preallocated memory as a class
|
|
pCreateParams->Flags.Info.__PreallocatedResInfo =
|
|
pRes->GetResFlags().Info.__PreallocatedResInfo = 1; // Set both in case we can die before copying over the flags.
|
|
}
|
|
else
|
|
{
|
|
pConst = pAllocCbs->pfnAllocation(pAllocCbs->pUserData,
|
|
sizeof(GMM_RESOURCE_INFO),
|
|
alignof(GMM_RESOURCE_INFO));
|
|
if(pConst == NULL)
|
|
{
|
|
GMM_ASSERTDPF(0, "Allocation failed!");
|
|
goto ERROR_CASE;
|
|
}
|
|
else
|
|
{
|
|
pRes = new(pConst) GMM_RESOURCE_INFO(this);
|
|
}
|
|
}
|
|
|
|
if(pRes->Create(*pCreateParams) != GMM_SUCCESS)
|
|
{
|
|
goto ERROR_CASE;
|
|
}
|
|
|
|
return (pRes);
|
|
|
|
ERROR_CASE:
|
|
if(pRes)
|
|
{
|
|
if(pAllocCbs->pfnFree)
|
|
{
|
|
#ifdef _WIN32
|
|
pRes->~GmmResourceInfoWin();
|
|
#else
|
|
pRes->~GmmResourceInfoLin();
|
|
#endif
|
|
|
|
pAllocCbs->pfnFree(pAllocCbs->pUserData, (void *)pRes);
|
|
}
|
|
}
|
|
|
|
return (NULL);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for Destroying ResInfoObject
|
|
///
|
|
/// @param[in] pResInfo: Pointer to ResInfoObject
|
|
/// @return void.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void GMM_STDCALL GmmLib::GmmClientContext::DestroyResInfoObject(GMM_RESOURCE_INFO * pResInfo,
|
|
GmmClientAllocationCallbacks *pAllocCbs)
|
|
{
|
|
__GMM_ASSERTPTR(pResInfo, VOIDRETURN);
|
|
|
|
if(!pAllocCbs || !pAllocCbs->pfnFree)
|
|
{
|
|
return DestroyResInfoObject(pResInfo);
|
|
}
|
|
else
|
|
{
|
|
if(pResInfo->GetResFlags().Info.__PreallocatedResInfo)
|
|
{
|
|
*pResInfo = GmmLib::GmmResourceInfo();
|
|
}
|
|
else
|
|
{
|
|
#ifdef _WIN32
|
|
pResInfo->~GmmResourceInfoWin();
|
|
#else
|
|
pResInfo->~GmmResourceInfoLin();
|
|
#endif
|
|
pAllocCbs->pfnFree(pAllocCbs->pUserData, (void *)pResInfo);
|
|
pResInfo = NULL;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of PAgeTableMgr Object .
|
|
/// @see GmmLib::GMM_PAGETABLE_MGR::GMM_PAGETABLE_MGR
|
|
///
|
|
/// @param[in] TTFags
|
|
/// @return Pointer to GMM_PAGETABLE_MGR class.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_PAGETABLE_MGR* GMM_STDCALL GmmLib::GmmClientContext::CreatePageTblMgrObject(uint32_t TTFlags,
|
|
GmmClientAllocationCallbacks* pAllocCbs)
|
|
{
|
|
if (!IsDeviceCbReceived)
|
|
{
|
|
GMM_ASSERTDPF(0, "Device_callbacks not set");
|
|
return NULL;
|
|
}
|
|
return CreatePageTblMgrObject(
|
|
&DeviceCB,
|
|
TTFlags,
|
|
pAllocCbs);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for creation of PAgeTableMgr Object .
|
|
/// @see GmmLib::GMM_PAGETABLE_MGR::GMM_PAGETABLE_MGR
|
|
///
|
|
/// @param[in] pDevCb: Pointer to GMM_DEVICE_CALLBACKS_INT
|
|
/// @param[in] TTFags
|
|
/// @return Pointer to GMM_PAGETABLE_MGR class.
|
|
/// TBD: move the code to new overloaded the API and remove this API once all clients are moved to new API.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_PAGETABLE_MGR* GMM_STDCALL GmmLib::GmmClientContext::CreatePageTblMgrObject(
|
|
GMM_DEVICE_CALLBACKS_INT* pDevCb,
|
|
uint32_t TTFlags,
|
|
GmmClientAllocationCallbacks* pAllocCbs)
|
|
{
|
|
if (!pAllocCbs || !pAllocCbs->pfnAllocation)
|
|
{
|
|
return CreatePageTblMgrObject(
|
|
pDevCb,
|
|
TTFlags);
|
|
}
|
|
else
|
|
{
|
|
GMM_PAGETABLE_MGR* pPageTableMgr = NULL;
|
|
return pPageTableMgr;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for destroy of PageTableMgr Object .
|
|
///
|
|
/// @param[in] pPageTableMgr: Pointer to GMM_PAGETABLE_MGR
|
|
/// @return void.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void GMM_STDCALL GmmLib::GmmClientContext::DestroyPageTblMgrObject(GMM_PAGETABLE_MGR* pPageTableMgr,
|
|
GmmClientAllocationCallbacks* pAllocCbs)
|
|
{
|
|
if (!pAllocCbs || !pAllocCbs->pfnFree)
|
|
{
|
|
return DestroyPageTblMgrObject(pPageTableMgr);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
/// Member function of ClientContext class for doing device specific operations.
|
|
/// Clients must call it before any Gfx resource (incl. svm)
|
|
/// is mapped, must happen before any use of GfxPartition, or PageTableMgr init.
|
|
/// @param[in] DeviceInfo : Pointer to info related to Device Operations.
|
|
/// @return GMM_STATUS.
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
GMM_STATUS GMM_STDCALL GmmLib::GmmClientContext::GmmSetDeviceInfo(GMM_DEVICE_INFO* DeviceInfo)
|
|
{
|
|
GMM_STATUS Status = GMM_SUCCESS;
|
|
|
|
if (DeviceInfo == NULL || DeviceInfo->pDeviceCb == NULL)
|
|
{
|
|
return GMM_INVALIDPARAM;
|
|
}
|
|
|
|
DeviceCB = *(DeviceInfo->pDeviceCb);
|
|
IsDeviceCbReceived = 1;
|
|
return Status;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Gmm lib DLL exported C wrapper for creating GmmLib::GmmClientContext object
|
|
/// @see Class GmmLib::GmmClientContext
|
|
///
|
|
/// @param[in] ClientType : describles the UMD clients such as OCL, DX, OGL, Vulkan etc
|
|
///
|
|
/// @return Pointer to GmmClientContext, if Context is created
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
extern "C" GMM_CLIENT_CONTEXT *GMM_STDCALL GmmCreateClientContext(GMM_CLIENT ClientType)
|
|
{
|
|
GMM_CLIENT_CONTEXT *pGmmClientContext = nullptr;
|
|
|
|
pGmmClientContext = new GMM_CLIENT_CONTEXT(ClientType);
|
|
|
|
return pGmmClientContext;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
/// Gmm lib DLL exported C wrapper for deleting GmmLib::GmmClientContext object
|
|
/// @see Class GmmLib::GmmClientContext
|
|
///
|
|
/// @param[in] GMM_CLIENT_CONTEXT * : Pointer to ClientContext object
|
|
/// @return Void
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
extern "C" void GMM_STDCALL GmmDeleteClientContext(GMM_CLIENT_CONTEXT *pGmmClientContext)
|
|
{
|
|
if(pGmmClientContext)
|
|
{
|
|
delete pGmmClientContext;
|
|
pGmmClientContext = NULL;
|
|
}
|
|
}
|