blob: a09ab9dae7f1c75bbad8603a6a79a6c7e49bbb34 [file] [log] [blame]
/*
* Copyright (c) 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.
*/
#include "ddi_test_encode.h"
using namespace std;
TEST_F(MediaEncodeDdiTest, EncodeHEVC_DualPipe)
{
m_GpuCmdFactory = g_gpuCmdFactoryEncodeHevcDualPipe;
EncTestData *pEncData = m_encTestFactory.GetEncTestData("HEVC-DualPipe");
ExectueEncodeTest(pEncData);
delete pEncData;
}
TEST_F(MediaEncodeDdiTest, EncodeAVC_DualPipe)
{
m_GpuCmdFactory = g_gpuCmdFactoryEncodeAvcDualPipe;
EncTestData *pEncData = m_encTestFactory.GetEncTestData("AVC-DualPipe");
ExectueEncodeTest(pEncData);
delete pEncData;
}
void MediaEncodeDdiTest::ExectueEncodeTest(EncTestData *pEncData)
{
vector<Platform_t> platforms = m_driverLoader.GetPlatforms();
for (int i = 0; i < m_driverLoader.GetPlatformNum(); i++)
{
if (m_encTestCfg.IsEncTestEnabled(DeviceConfigTable[platforms[i]],
pEncData->GetFeatureID()))
{
CmdValidator::GpuCmdsValidationInit(m_GpuCmdFactory, platforms[i]);
EncodeExecute(pEncData, platforms[i]);
}
}
}
void MediaEncodeDdiTest::EncodeExecute(EncTestData *pEncData, Platform_t platform)
{
VAConfigID config_id;
VAContextID context_id;
VASurfaceStatus surface_status;
// So far we still use DeviceConfigTable to find the platform, as the libdrm mock use this.
// If we want to use vector Platforms, we would use vector in libdrm too.
int ret = m_driverLoader.InitDriver(platform);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.InitDriver" << endl;
// The attribute only use RCType and FEI function type in createconfig.
ret = m_driverLoader.m_ctx.vtable->vaCreateConfig(&m_driverLoader.m_ctx,
pEncData->GetFeatureID().profile, pEncData->GetFeatureID().entrypoint,
(VAConfigAttrib *)&(pEncData->GetConfAttrib()[0]), pEncData->GetConfAttrib().size(), &config_id);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaCreateConfig" << endl;
vector<VASurfaceID> &resources = pEncData->GetResources();
ret = m_driverLoader.m_ctx.vtable->vaCreateSurfaces2(&m_driverLoader.m_ctx, VA_RT_FORMAT_YUV420,
pEncData->GetWidth(), pEncData->GetHeight(), &resources[0], resources.size(),
(VASurfaceAttrib *)&(pEncData->GetSurfAttrib()[0]), pEncData->GetSurfAttrib().size());
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaCreateSurfaces2" << endl;
ret = m_driverLoader.m_ctx.vtable->vaCreateContext(&m_driverLoader.m_ctx, config_id, pEncData->GetWidth(),
pEncData->GetHeight(), VA_PROGRESSIVE, &resources[0], resources.size(), &context_id);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaCreateContext" << endl;
for (int i = 0; i < pEncData->m_num_frames; i++)
{
ret = m_driverLoader.m_ctx.vtable->vaBeginPicture(&m_driverLoader.m_ctx, context_id,resources[0]);
vector<vector<CompBufConif>> &compBufs = pEncData->GetCompBuffers();
ret = m_driverLoader.m_ctx.vtable->vaCreateBuffer(&m_driverLoader.m_ctx, context_id, compBufs[i][0].bufType,
compBufs[i][0].bufSize, 1, compBufs[i][0].pData, &compBufs[i][0].bufID);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaCreateBuffer" << endl;
pEncData->UpdateCompBuffers(i);
for (int j = 1; j < compBufs[i].size(); j++)
{
ret = m_driverLoader.m_ctx.vtable->vaCreateBuffer(&m_driverLoader.m_ctx, context_id,
compBufs[i][j].bufType, compBufs[i][j].bufSize, 1, compBufs[i][j].pData, &compBufs[i][j].bufID);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaCreateBuffer" << endl;
// In RenderPicture, it suppose all needed buffer has been created already.
// Suppose the compBufs[0] is always EncCodedBuffer, so we won't render it.
// If we render it, the ret is still Success, but would with log"not supported
// buffer type in vpgEncodeRenderPicture."
ret = m_driverLoader.m_ctx.vtable->vaRenderPicture(&m_driverLoader.m_ctx,
context_id, &compBufs[i][j].bufID, 1);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaRenderPicture" << endl;
}
ret = m_driverLoader.m_ctx.vtable->vaEndPicture(&m_driverLoader.m_ctx, context_id);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaEndPicture" << endl;
ret = m_driverLoader.m_ctx.vtable->vaSyncSurface(&m_driverLoader.m_ctx, resources[0]);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaSyncSurface" << endl;
do
{
ret = m_driverLoader.m_ctx.vtable->vaQuerySurfaceStatus(&m_driverLoader.m_ctx,
resources[0], &surface_status);
} while (surface_status != VASurfaceReady);
for (int j = 0; j < compBufs[i].size(); j++)
{
ret = m_driverLoader.m_ctx.vtable->vaDestroyBuffer(&m_driverLoader.m_ctx, compBufs[i][j].bufID);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaDestroyBuffer" << endl;
}
}
ret = m_driverLoader.m_ctx.vtable->vaDestroySurfaces(&m_driverLoader.m_ctx,
&resources[0], resources.size());
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaDestroySurfaces" << endl;
ret = m_driverLoader.m_ctx.vtable->vaDestroyContext(&m_driverLoader.m_ctx, context_id);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaDestroyContext" << endl;
ret = m_driverLoader.m_ctx.vtable->vaDestroyConfig(&m_driverLoader.m_ctx, config_id);
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.m_ctx.vtable->vaDestroyConfig" << endl;
ret = m_driverLoader.CloseDriver();
EXPECT_EQ(VA_STATUS_SUCCESS, ret) << "Platform = " << g_platformName[platform]
<< ", Failed function = m_driverLoader.CloseDriver" << endl;
}
EncodeTestConfig::EncodeTestConfig()
{
m_mapPlatformFeatureID[DeviceConfigTable[igfxSKLAKE]] = {
TEST_Intel_Encode_HEVC,
TEST_Intel_Encode_AVC ,
};
m_mapPlatformFeatureID[DeviceConfigTable[igfxBROXTON]] = {
TEST_Intel_Encode_HEVC,
TEST_Intel_Encode_AVC ,
};
m_mapPlatformFeatureID[DeviceConfigTable[igfxBROADWELL]] = {
TEST_Intel_Encode_AVC ,
};
}
bool EncodeTestConfig::IsEncTestEnabled(DeviceConfig platform, FeatureID featureId)
{
const auto &featureIdArray = m_mapPlatformFeatureID[platform];
for (int i = 0; i < featureIdArray.size(); i++)
{
// In fact, we may need to call QueryEntroyPoint to make sure it does have this config.
// But we suppose this test is done in Caps test.
// Otherwise, here is need to call QueryEntroyPoint to check if it's supported.
if (featureId == featureIdArray[i])
{
return true;
}
}
return false;
}