mirror of https://github.com/intel/gmmlib.git
266 lines
7.6 KiB
C++
266 lines
7.6 KiB
C++
![]() |
/*==============================================================================
|
||
|
Copyright(c) 2019 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.
|
||
|
============================================================================*/
|
||
|
|
||
|
#ifdef __linux__
|
||
|
|
||
|
#include "GmmAuxTableULT.h"
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace GmmLib;
|
||
|
|
||
|
static GMM_DEVICE_CALLBACKS_INT DeviceCBInt;
|
||
|
|
||
|
CTestAuxTable::CTestAuxTable()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CTestAuxTable::~CTestAuxTable()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
int CTestAuxTable::allocCB(void *bufMgr, size_t size, size_t alignment, void **bo, void **cpuAddr, uint64_t *gpuAddr)
|
||
|
{
|
||
|
if(bufMgr != (void *)0xdeadbeef)
|
||
|
return -1;
|
||
|
|
||
|
if(!bo || !cpuAddr || !gpuAddr)
|
||
|
return -2;
|
||
|
|
||
|
*cpuAddr = aligned_alloc(alignment, ALIGN(size, alignment));
|
||
|
if(!*cpuAddr)
|
||
|
return -3;
|
||
|
|
||
|
*bo = *cpuAddr;
|
||
|
*gpuAddr = (uint64_t)*cpuAddr;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void CTestAuxTable::freeCB(void *bo)
|
||
|
{
|
||
|
ASSERT_TRUE(bo != NULL);
|
||
|
|
||
|
free(bo);
|
||
|
}
|
||
|
|
||
|
void CTestAuxTable::waitFromCpuCB(void *bo)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CTestAuxTable::SetUpTestCase()
|
||
|
{
|
||
|
GfxPlatform.eProductFamily = IGFX_TIGERLAKE_LP;
|
||
|
GfxPlatform.eRenderCoreFamily = IGFX_GEN12_CORE;
|
||
|
|
||
|
DeviceCBInt.pBufMgr = (void *)0xdeadbeef;
|
||
|
DeviceCBInt.DevCbPtrs_.pfnAllocate = CTestAuxTable::allocCB;
|
||
|
DeviceCBInt.DevCbPtrs_.pfnDeallocate = CTestAuxTable::freeCB;
|
||
|
DeviceCBInt.DevCbPtrs_.pfnWaitFromCpu = CTestAuxTable::waitFromCpuCB;
|
||
|
|
||
|
if(GfxPlatform.eProductFamily == IGFX_UNKNOWN ||
|
||
|
GfxPlatform.eRenderCoreFamily == IGFX_UNKNOWN_CORE)
|
||
|
{
|
||
|
GfxPlatform.eProductFamily = IGFX_BROADWELL;
|
||
|
GfxPlatform.eRenderCoreFamily = IGFX_GEN8_CORE;
|
||
|
}
|
||
|
|
||
|
AllocateAdapterInfo();
|
||
|
if(pGfxAdapterInfo)
|
||
|
{
|
||
|
pGfxAdapterInfo->SkuTable.FtrE2ECompression = true;
|
||
|
pGfxAdapterInfo->SkuTable.FtrLinearCCS = true;
|
||
|
}
|
||
|
|
||
|
CommonULT::SetUpTestCase();
|
||
|
}
|
||
|
|
||
|
void CTestAuxTable::TearDownTestCase()
|
||
|
{
|
||
|
CommonULT::TearDownTestCase();
|
||
|
}
|
||
|
|
||
|
TEST_F(CTestAuxTable, TestUpdateAuxTableCompressedSurface)
|
||
|
{
|
||
|
GmmPageTableMgr *mgr = pGmmULTClientContext->CreatePageTblMgrObject(&DeviceCBInt, TT_TYPE::AUXTT);
|
||
|
|
||
|
ASSERT_TRUE(mgr != NULL);
|
||
|
|
||
|
Surface *surf = new Surface(7680, 4320);
|
||
|
|
||
|
ASSERT_TRUE(surf != NULL && surf->init());
|
||
|
|
||
|
GMM_DDI_UPDATEAUXTABLE updateReq = {0};
|
||
|
|
||
|
updateReq.BaseResInfo = surf->getGMMResourceInfo();
|
||
|
updateReq.BaseGpuVA = surf->getGfxAddress(GMM_PLANE_Y);
|
||
|
updateReq.Map = 1;
|
||
|
|
||
|
GMM_STATUS res = mgr->UpdateAuxTable(&updateReq);
|
||
|
ASSERT_TRUE(res == GMM_SUCCESS);
|
||
|
|
||
|
delete surf;
|
||
|
pGmmULTClientContext->DestroyPageTblMgrObject(mgr);
|
||
|
}
|
||
|
|
||
|
TEST_F(CTestAuxTable, DISABLED_TestUpdateAuxTableNonCompressedSurface)
|
||
|
{
|
||
|
GmmPageTableMgr *mgr = pGmmULTClientContext->CreatePageTblMgrObject(&DeviceCBInt, TT_TYPE::AUXTT);
|
||
|
|
||
|
ASSERT_TRUE(mgr != NULL);
|
||
|
|
||
|
Surface *surf = new Surface(7680, 4320, false);
|
||
|
|
||
|
ASSERT_TRUE(surf != NULL && surf->init());
|
||
|
|
||
|
GMM_DDI_UPDATEAUXTABLE updateReq = {0};
|
||
|
|
||
|
memset(&updateReq, 0, sizeof(GMM_DDI_UPDATEAUXTABLE));
|
||
|
|
||
|
updateReq.BaseResInfo = surf->getGMMResourceInfo();
|
||
|
updateReq.BaseGpuVA = surf->getGfxAddress(GMM_PLANE_Y);
|
||
|
updateReq.Map = 1;
|
||
|
|
||
|
GMM_STATUS res = mgr->UpdateAuxTable(&updateReq);
|
||
|
ASSERT_TRUE(res != GMM_SUCCESS);
|
||
|
|
||
|
delete surf;
|
||
|
pGmmULTClientContext->DestroyPageTblMgrObject(mgr);
|
||
|
}
|
||
|
|
||
|
TEST_F(CTestAuxTable, TestInvalidateAuxTable)
|
||
|
{
|
||
|
GmmPageTableMgr *mgr = pGmmULTClientContext->CreatePageTblMgrObject(&DeviceCBInt, TT_TYPE::AUXTT);
|
||
|
|
||
|
ASSERT_TRUE(mgr != NULL);
|
||
|
|
||
|
Surface *surf = new Surface(7680, 4320);
|
||
|
|
||
|
ASSERT_TRUE(surf != NULL && surf->init());
|
||
|
|
||
|
GMM_DDI_UPDATEAUXTABLE updateReq = {0};
|
||
|
|
||
|
updateReq.BaseResInfo = surf->getGMMResourceInfo();
|
||
|
updateReq.BaseGpuVA = surf->getGfxAddress(GMM_PLANE_Y);
|
||
|
updateReq.Map = 1;
|
||
|
|
||
|
GMM_STATUS res = mgr->UpdateAuxTable(&updateReq);
|
||
|
ASSERT_TRUE(res == GMM_SUCCESS);
|
||
|
|
||
|
memset(&updateReq, 0, sizeof(updateReq));
|
||
|
|
||
|
updateReq.BaseResInfo = surf->getGMMResourceInfo();
|
||
|
updateReq.Map = 0;
|
||
|
|
||
|
res = mgr->UpdateAuxTable(&updateReq);
|
||
|
ASSERT_TRUE(res == GMM_SUCCESS);
|
||
|
|
||
|
delete surf;
|
||
|
pGmmULTClientContext->DestroyPageTblMgrObject(mgr);
|
||
|
}
|
||
|
|
||
|
TEST_F(CTestAuxTable, DISABLED_TestUpdateAuxTableStress)
|
||
|
{
|
||
|
const int num_surf = 1000;
|
||
|
Surface * surfaces[num_surf];
|
||
|
Surface * surf;
|
||
|
int i;
|
||
|
|
||
|
GmmPageTableMgr *mgr = pGmmULTClientContext->CreatePageTblMgrObject(&DeviceCBInt, TT_TYPE::AUXTT);
|
||
|
|
||
|
ASSERT_TRUE(mgr != NULL);
|
||
|
|
||
|
for(i = 0; i < num_surf; i++)
|
||
|
{
|
||
|
surf = new Surface(7680, 4320);
|
||
|
surfaces[i] = surf;
|
||
|
|
||
|
ASSERT_TRUE(surf != NULL && surf->init());
|
||
|
|
||
|
GMM_DDI_UPDATEAUXTABLE updateReq = {0};
|
||
|
|
||
|
updateReq.BaseResInfo = surf->getGMMResourceInfo();
|
||
|
updateReq.BaseGpuVA = surf->getGfxAddress(GMM_PLANE_Y);
|
||
|
updateReq.Map = 1;
|
||
|
|
||
|
mgr->UpdateAuxTable(&updateReq);
|
||
|
}
|
||
|
|
||
|
for(i = 0; i < num_surf; i++)
|
||
|
{
|
||
|
surf = surfaces[i];
|
||
|
delete surf;
|
||
|
}
|
||
|
|
||
|
pGmmULTClientContext->DestroyPageTblMgrObject(mgr);
|
||
|
}
|
||
|
|
||
|
TEST_F(CTestAuxTable, TestAuxTableContent)
|
||
|
{
|
||
|
GmmPageTableMgr *mgr = pGmmULTClientContext->CreatePageTblMgrObject(&DeviceCBInt, TT_TYPE::AUXTT);
|
||
|
|
||
|
ASSERT_TRUE(mgr != NULL);
|
||
|
|
||
|
Surface *surf = new Surface(720, 480);
|
||
|
|
||
|
ASSERT_TRUE(surf != NULL && surf->init());
|
||
|
|
||
|
GMM_DDI_UPDATEAUXTABLE updateReq = {0};
|
||
|
|
||
|
updateReq.BaseResInfo = surf->getGMMResourceInfo();
|
||
|
updateReq.BaseGpuVA = surf->getGfxAddress(GMM_PLANE_Y);
|
||
|
updateReq.Map = 1;
|
||
|
|
||
|
GMM_STATUS res = mgr->UpdateAuxTable(&updateReq);
|
||
|
ASSERT_TRUE(res == GMM_SUCCESS);
|
||
|
|
||
|
Walker *ywalker = new Walker(surf->getGfxAddress(GMM_PLANE_Y),
|
||
|
surf->getAuxGfxAddress(GMM_AUX_CCS),
|
||
|
mgr->GetAuxL3TableAddr());
|
||
|
|
||
|
for(size_t i = 0; i < surf->getSurfaceSize(GMM_PLANE_Y); i++)
|
||
|
{
|
||
|
GMM_GFX_ADDRESS addr = surf->getGfxAddress(GMM_PLANE_Y) + i;
|
||
|
GMM_GFX_ADDRESS val = ywalker->walk(addr);
|
||
|
GMM_GFX_ADDRESS expected = ywalker->expected(addr);
|
||
|
ASSERT_EQ(expected, val);
|
||
|
}
|
||
|
|
||
|
Walker *uvwalker = new Walker(surf->getGfxAddress(GMM_PLANE_U),
|
||
|
surf->getAuxGfxAddress(GMM_AUX_UV_CCS),
|
||
|
mgr->GetAuxL3TableAddr());
|
||
|
|
||
|
for(size_t i = 0; i < surf->getSurfaceSize(GMM_PLANE_U); i++)
|
||
|
{
|
||
|
GMM_GFX_ADDRESS addr = surf->getGfxAddress(GMM_PLANE_U) + i;
|
||
|
GMM_GFX_ADDRESS val = uvwalker->walk(addr);
|
||
|
GMM_GFX_ADDRESS expected = uvwalker->expected(addr);
|
||
|
ASSERT_EQ(expected, val);
|
||
|
}
|
||
|
|
||
|
delete uvwalker;
|
||
|
delete ywalker;
|
||
|
delete surf;
|
||
|
pGmmULTClientContext->DestroyPageTblMgrObject(mgr);
|
||
|
}
|
||
|
|
||
|
#endif /* __linux__ */
|