/*-------------------------------------------------------------------------
* drawElements Quality Program EGL Module
* ---------------------------------------
*
* Copyright 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief EGL Test Package
*//*--------------------------------------------------------------------*/
#include "teglTestPackage.hpp"
#include "tcuTestLog.hpp"
#include "tcuPlatform.hpp"
#include "tcuCommandLine.hpp"
#include "egluPlatform.hpp"
#include "egluNativeDisplay.hpp"
#include "egluNativeWindow.hpp"
#include "egluNativePixmap.hpp"
#include "teglInfoTests.hpp"
#include "teglCreateContextTests.hpp"
#include "teglQueryContextTests.hpp"
#include "teglCreateSurfaceTests.hpp"
#include "teglQuerySurfaceTests.hpp"
#include "teglChooseConfigTests.hpp"
#include "teglQueryConfigTests.hpp"
#include "teglColorClearTests.hpp"
#include "teglRenderTests.hpp"
#include "teglImageTests.hpp"
#include "teglGLES2SharingTests.hpp"
#include "teglNegativeApiTests.hpp"
#include "teglSyncTests.hpp"
#include "teglMultiThreadTests.hpp"
#include "teglGetProcAddressTests.hpp"
#include "teglMemoryStressTests.hpp"
#include "teglMakeCurrentPerfTests.hpp"
#include "teglGLES2SharedRenderingPerfTests.hpp"
#include "teglPreservingSwapTests.hpp"
#include "teglClientExtensionTests.hpp"
#include "teglCreateContextExtTests.hpp"
#include "teglSurfacelessContextTests.hpp"
#include "teglSwapBuffersTests.hpp"
#include "teglNativeColorMappingTests.hpp"
#include "teglNativeCoordMappingTests.hpp"
#include "teglResizeTests.hpp"
#include <typeinfo>
using std::vector;
namespace deqp
{
namespace egl
{
class StressTests : public TestCaseGroup
{
public:
StressTests (EglTestContext& eglTestCtx)
: TestCaseGroup(eglTestCtx, "stress", "EGL stress tests")
{
}
void init (void)
{
addChild(new MemoryStressTests(m_eglTestCtx));
}
};
class PerformanceTests : public TestCaseGroup
{
public:
PerformanceTests (EglTestContext& eglTestCtx)
: TestCaseGroup(eglTestCtx, "performance", "EGL performance tests")
{
}
void init (void)
{
addChild(new MakeCurrentPerfTests (m_eglTestCtx));
addChild(new GLES2SharedRenderingPerfTests (m_eglTestCtx));
}
};
class FunctionalTests : public TestCaseGroup
{
public:
FunctionalTests (EglTestContext& eglTestCtx)
: TestCaseGroup(eglTestCtx, "functional", "EGL functional tests")
{
}
void init (void)
{
addChild(new CreateContextTests (m_eglTestCtx));
addChild(new QueryContextTests (m_eglTestCtx));
addChild(new CreateSurfaceTests (m_eglTestCtx));
addChild(new QuerySurfaceTests (m_eglTestCtx));
addChild(new QueryConfigTests (m_eglTestCtx));
addChild(new ChooseConfigTests (m_eglTestCtx));
addChild(new ColorClearTests (m_eglTestCtx));
addChild(new RenderTests (m_eglTestCtx));
addChild(new ImageTests (m_eglTestCtx));
addChild(new SharingTests (m_eglTestCtx));
addChild(new NegativeApiTests (m_eglTestCtx));
addChild(new FenceSyncTests (m_eglTestCtx));
addChild(new MultiThreadedTests (m_eglTestCtx));
addChild(new GetProcAddressTests (m_eglTestCtx));
addChild(new PreservingSwapTests (m_eglTestCtx));
addChild(new ClientExtensionTests (m_eglTestCtx));
addChild(new CreateContextExtTests (m_eglTestCtx));
addChild(new SurfacelessContextTests (m_eglTestCtx));
addChild(new SwapBuffersTests (m_eglTestCtx));
addChild(new NativeColorMappingTests (m_eglTestCtx));
addChild(new NativeCoordMappingTests (m_eglTestCtx));
addChild(new ReusableSyncTests (m_eglTestCtx));
addChild(new ResizeTests (m_eglTestCtx));
}
};
TestCaseWrapper::TestCaseWrapper (EglTestContext& eglTestCtx)
: tcu::TestCaseWrapper (eglTestCtx.getTestContext())
, m_eglTestCtx (eglTestCtx)
{
}
TestCaseWrapper::~TestCaseWrapper (void)
{
}
bool TestCaseWrapper::initTestCase (tcu::TestCase* testCase)
{
tcu::TestLog& log = m_eglTestCtx.getTestContext().getLog();
// Create display
try
{
m_eglTestCtx.createDefaultDisplay();
}
catch (const std::exception& e)
{
log << e;
m_eglTestCtx.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Failed to initialize EGL for default display");
return false;
}
return tcu::TestCaseWrapper::initTestCase(testCase);
}
bool TestCaseWrapper::deinitTestCase (tcu::TestCase* testCase)
{
tcu::TestLog& log = m_eglTestCtx.getTestContext().getLog();
bool deinitOk = tcu::TestCaseWrapper::deinitTestCase(testCase);
// Destroy display
try
{
TCU_CHECK_EGL_CALL(eglMakeCurrent(m_eglTestCtx.getDisplay().getEGLDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
m_eglTestCtx.destroyDefaultDisplay();
}
catch (const std::exception& e)
{
log << e;
log << tcu::TestLog::Message << "Error in EGL deinit, test program will teminate." << tcu::TestLog::EndMessage;
return false;
}
return deinitOk;
}
tcu::TestNode::IterateResult TestCaseWrapper::iterateTestCase (tcu::TestCase* testCase)
{
return tcu::TestCaseWrapper::iterateTestCase(testCase);
}
PackageContext::PackageContext (tcu::TestContext& testCtx)
: m_eglTestCtx (DE_NULL)
, m_caseWrapper (DE_NULL)
{
const eglu::NativeDisplayFactoryRegistry& dpyFactoryRegistry = testCtx.getPlatform().getEGLPlatform().getNativeDisplayFactoryRegistry();
const std::string displayFactoryName = testCtx.getCommandLine().getEGLDisplayType();
const std::string windowFactoryName = testCtx.getCommandLine().getEGLWindowType();
const std::string pixmapFactoryName = testCtx.getCommandLine().getEGLPixmapType();
const eglu::NativeDisplayFactory* displayFactory = DE_NULL;
const eglu::NativeWindowFactory* windowFactory = DE_NULL;
const eglu::NativePixmapFactory* pixmapFactory = DE_NULL;
if (dpyFactoryRegistry.empty())
{
tcu::print("ERROR: Platform doesn't support any EGL native display types!\n");
throw tcu::NotSupportedError("Platform doesn't have EGL any native display factories", DE_NULL, __FILE__, __LINE__);
}
if (displayFactoryName.empty())
displayFactory = dpyFactoryRegistry.getDefaultFactory();
else
{
displayFactory = dpyFactoryRegistry.getFactoryByName(displayFactoryName.c_str());
if (!displayFactory)
{
tcu::print("ERROR: Unknown/unsupported EGL native display type '%s'\n", displayFactoryName.c_str());
tcu::print("Supported EGL native display types:\n");
for (int factoryNdx = 0; factoryNdx < (int)dpyFactoryRegistry.getFactoryCount(); factoryNdx++)
{
const char* name = dpyFactoryRegistry.getFactoryByIndex(factoryNdx)->getName();
const char* desc = dpyFactoryRegistry.getFactoryByIndex(factoryNdx)->getDescription();
tcu::print(" %s: %s\n", name, desc);
}
throw tcu::NotSupportedError(("Unknown EGL native display type '" + displayFactoryName + "'.").c_str(), DE_NULL, __FILE__, __LINE__);
}
}
tcu::print("Using EGL native display type '%s'\n", displayFactory->getName());
if (!displayFactory->getNativeWindowRegistry().empty())
{
windowFactory = windowFactoryName.empty() ? displayFactory->getNativeWindowRegistry().getDefaultFactory()
: displayFactory->getNativeWindowRegistry().getFactoryByName(windowFactoryName.c_str());
if (!windowFactory)
{
DE_ASSERT(!windowFactoryName.empty());
tcu::print("ERROR: Unknown/unsupported EGL native window type '%s'\n", windowFactoryName.c_str());
tcu::print("Supported EGL native window types for native display '%s':\n", displayFactory->getName());
for (int factoryNdx = 0; factoryNdx < (int)displayFactory->getNativeWindowRegistry().getFactoryCount(); factoryNdx++)
{
const char* name = displayFactory->getNativeWindowRegistry().getFactoryByIndex(factoryNdx)->getName();
const char* desc = displayFactory->getNativeWindowRegistry().getFactoryByIndex(factoryNdx)->getDescription();
tcu::print(" %s: %s\n", name, desc);
}
throw tcu::NotSupportedError(("Unknown EGL native window type '" + windowFactoryName + "'").c_str(), DE_NULL, __FILE__, __LINE__);
}
}
else
tcu::print("Warning: EGL native display doesn't have any native window types.\n");
if (!displayFactory->getNativePixmapRegistry().empty())
{
pixmapFactory = pixmapFactoryName.empty() ? displayFactory->getNativePixmapRegistry().getDefaultFactory()
: displayFactory->getNativePixmapRegistry().getFactoryByName(pixmapFactoryName.c_str());
if (!pixmapFactory)
{
DE_ASSERT(!pixmapFactoryName.empty());
tcu::print("ERROR: Unknown/unsupported EGL native pixmap type '%s'\n", pixmapFactoryName.c_str());
tcu::print("Supported EGL native pixmap types for native display '%s':\n", displayFactory->getName());
for (int factoryNdx = 0; factoryNdx < (int)displayFactory->getNativePixmapRegistry().getFactoryCount(); factoryNdx++)
{
const char* name = displayFactory->getNativePixmapRegistry().getFactoryByIndex(factoryNdx)->getName();
const char* desc = displayFactory->getNativePixmapRegistry().getFactoryByIndex(factoryNdx)->getDescription();
tcu::print(" %s: %s\n", name, desc);
}
throw tcu::NotSupportedError(("Unknown EGL native pixmap type '" + pixmapFactoryName + "'").c_str(), DE_NULL, __FILE__, __LINE__);
}
}
else
tcu::print("Warning: EGL native display doesn't have any native pixmap types.\n");
if (windowFactory)
tcu::print("Using EGL native window type '%s'\n", windowFactory->getName());
if (pixmapFactory)
tcu::print("Using EGL native pixmap type '%s'\n", pixmapFactory->getName());
try
{
m_eglTestCtx = new EglTestContext(testCtx, *displayFactory, windowFactory, pixmapFactory);
m_caseWrapper = new TestCaseWrapper(*m_eglTestCtx);
}
catch (...)
{
delete m_caseWrapper;
delete m_eglTestCtx;
throw;
}
}
PackageContext::~PackageContext (void)
{
delete m_caseWrapper;
delete m_eglTestCtx;
}
TestPackage::TestPackage (tcu::TestContext& testCtx)
: tcu::TestPackage (testCtx, "dEQP-EGL", "dEQP EGL Tests")
, m_packageCtx (DE_NULL)
, m_archive (testCtx.getRootArchive(), "egl/")
{
}
TestPackage::~TestPackage (void)
{
// Destroy children first since destructors may access context.
TestNode::deinit();
delete m_packageCtx;
}
void TestPackage::init (void)
{
DE_ASSERT(!m_packageCtx);
m_packageCtx = new PackageContext(m_testCtx);
try
{
addChild(new InfoTests (m_packageCtx->getEglTestContext()));
addChild(new FunctionalTests (m_packageCtx->getEglTestContext()));
addChild(new PerformanceTests (m_packageCtx->getEglTestContext()));
addChild(new StressTests (m_packageCtx->getEglTestContext()));
}
catch (...)
{
delete m_packageCtx;
m_packageCtx = DE_NULL;
throw;
}
}
void TestPackage::deinit (void)
{
tcu::TestNode::deinit();
delete m_packageCtx;
m_packageCtx = DE_NULL;
}
} // egl
} // deqp