Merge vk-gl-cts/vulkan-cts-1.1.3 into vk-gl-cts/vulkan-cts-1.1.4
[platform/upstream/VK-GL-CTS.git] / modules / egl / teglTestCase.cpp
index 3beeb76..91ebdd5 100644 (file)
 #include "egluGLFunctionLoader.hpp"
 #include "egluPlatform.hpp"
 
+#include "eglwLibrary.hpp"
+#include "eglwEnums.hpp"
+
 #include "gluRenderContext.hpp"
 #include "glwInitFunctions.hpp"
 
-#include <set>
-
-using std::vector;
-using std::set;
-
 namespace deqp
 {
 namespace egl
 {
 
-namespace
-{
-
-void split (std::vector<std::string>& dst, const std::string& src)
-{
-       size_t start = 0;
-       size_t end       = std::string::npos;
-
-       while ((end = src.find(' ', start)) != std::string::npos)
-       {
-               dst.push_back(src.substr(start, end-start));
-               start = end+1;
-       }
+using namespace eglw;
 
-       if (start < end)
-               dst.push_back(src.substr(start, end-start));
-}
-
-EGLint parseAPI (const std::string& api)
-{
-       if (api == "OpenGL")
-               return EGL_OPENGL_API;
-       else if (api == "OpenGL_ES")
-               return EGL_OPENGL_ES_API;
-       else if (api == "OpenVG")
-               return EGL_OPENVG_API;
-       else
-       {
-               tcu::print("Warning: Unknown API '%s'", api.c_str());
-               return 0;
-       }
-}
-
-} // anonymous
-
-EglTestContext::EglTestContext (tcu::TestContext& testCtx, const eglu::NativeDisplayFactory& displayFactory, const eglu::NativeWindowFactory* windowFactory, const eglu::NativePixmapFactory* pixmapFactory)
+EglTestContext::EglTestContext (tcu::TestContext& testCtx, const eglu::NativeDisplayFactory& displayFactory)
        : m_testCtx                                     (testCtx)
-       , m_displayFactory                      (displayFactory)
-       , m_windowFactory                       (windowFactory)
-       , m_pixmapFactory                       (pixmapFactory)
-       , m_defaultNativeDisplay        (DE_NULL)
-       , m_defaultEGLDisplay           (DE_NULL)
+       , m_nativeDisplayFactory        (displayFactory)
+       , m_nativeDisplay                       (m_nativeDisplayFactory.createDisplay())
+       , m_glLibraryCache                      (testCtx.getPlatform().getEGLPlatform(), testCtx.getCommandLine())
 {
-       // Temporarily allocate default display for storing config list
-       try
-       {
-               EGLDisplay      eglDisplay      = EGL_NO_DISPLAY;
-               EGLint          majorVersion;
-               EGLint          minorVersion;
-
-               m_defaultNativeDisplay  = m_displayFactory.createDisplay();
-
-               eglDisplay = eglu::getDisplay(*m_defaultNativeDisplay);
-               TCU_CHECK_EGL_CALL(eglInitialize(eglDisplay, &majorVersion, &minorVersion));
-
-               m_defaultEGLDisplay = new tcu::egl::Display(eglDisplay, majorVersion, minorVersion);
-
-               // Create config list
-               {
-                       vector<EGLConfig>       configs;
-                       set<EGLint>                     idSet; // For checking for duplicate config IDs
-
-                       m_defaultEGLDisplay->getConfigs(configs);
-
-                       m_configs.resize(configs.size());
-                       for (int ndx = 0; ndx < (int)configs.size(); ndx++)
-                       {
-                               m_defaultEGLDisplay->describeConfig(configs[ndx], m_configs[ndx]);
-
-                               EGLint id = m_configs[ndx].configId;
-                               if (idSet.find(id) != idSet.end())
-                                       tcu::print("Warning: Duplicate config ID %d\n", id);
-                               idSet.insert(id);
-                       }
-               }
-
-               // Query supported APIs
-               {
-                       const char*                                     clientAPIs      = eglQueryString(eglDisplay, EGL_CLIENT_APIS);
-                       std::vector<std::string>        apis;
-                       TCU_CHECK(clientAPIs);
-
-                       split(apis, clientAPIs);
-                       for (std::vector<std::string>::const_iterator apiIter = apis.begin(); apiIter != apis.end(); apiIter++)
-                       {
-                               EGLint parsedAPI = parseAPI(*apiIter);
-                               if (parsedAPI != 0)
-                                       m_supportedAPIs.insert(parsedAPI);
-                       }
-               }
-
-               delete m_defaultEGLDisplay;
-               m_defaultEGLDisplay = DE_NULL;
-               delete m_defaultNativeDisplay;
-               m_defaultNativeDisplay = DE_NULL;
-       }
-       catch (...)
-       {
-               delete m_defaultEGLDisplay;
-               m_defaultEGLDisplay = DE_NULL;
-               delete m_defaultNativeDisplay;
-               m_defaultNativeDisplay = DE_NULL;
-               throw;
-       }
 }
 
 EglTestContext::~EglTestContext (void)
 {
-       for (GLLibraryMap::iterator iter = m_glLibraries.begin(); iter != m_glLibraries.end(); ++iter)
-               delete iter->second;
-
-       delete m_defaultEGLDisplay;
-       delete m_defaultNativeDisplay;
-}
-
-void EglTestContext::createDefaultDisplay (void)
-{
-       EGLDisplay      eglDisplay      = EGL_NO_DISPLAY;
-       EGLint          majorVersion;
-       EGLint          minorVersion;
-
-       DE_ASSERT(!m_defaultEGLDisplay);
-       DE_ASSERT(!m_defaultNativeDisplay);
-
-       try
-       {
-               m_defaultNativeDisplay  = m_displayFactory.createDisplay();
-
-               eglDisplay = eglu::getDisplay(*m_defaultNativeDisplay);
-               TCU_CHECK_EGL_CALL(eglInitialize(eglDisplay, &majorVersion, &minorVersion));
-
-               m_defaultEGLDisplay = new tcu::egl::Display(eglDisplay, majorVersion, minorVersion);
-       }
-       catch (const std::exception&)
-       {
-               delete m_defaultEGLDisplay;
-               m_defaultEGLDisplay = DE_NULL;
-               delete m_defaultNativeDisplay;
-               m_defaultNativeDisplay = DE_NULL;
-               throw;
-       }
-}
-
-const eglu::NativeWindowFactory& EglTestContext::getNativeWindowFactory (void) const
-{
-       if (m_windowFactory)
-               return *m_windowFactory;
-       else
-               throw tcu::NotSupportedError("No default native window factory available", "", __FILE__, __LINE__);
-}
-
-const eglu::NativePixmapFactory& EglTestContext::getNativePixmapFactory (void) const
-{
-       if (m_pixmapFactory)
-               return *m_pixmapFactory;
-       else
-               throw tcu::NotSupportedError("No default native pixmap factory available", "", __FILE__, __LINE__);
 }
 
-void EglTestContext::destroyDefaultDisplay (void)
+const eglw::Library& EglTestContext::getLibrary (void) const
 {
-       DE_ASSERT(m_defaultEGLDisplay);
-       DE_ASSERT(m_defaultNativeDisplay);
-
-       delete m_defaultEGLDisplay;
-       m_defaultEGLDisplay = DE_NULL;
-
-       delete m_defaultNativeDisplay;
-       m_defaultNativeDisplay = DE_NULL;
-}
-
-eglu::NativeWindow* EglTestContext::createNativeWindow (EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, int width, int height, eglu::WindowParams::Visibility visibility)
-{
-       if (!m_windowFactory)
-               throw tcu::NotSupportedError("Windows not supported", "", __FILE__, __LINE__);
-
-       return m_windowFactory->createWindow(m_defaultNativeDisplay, display, config, attribList, eglu::WindowParams(width, height, visibility));
-}
-
-eglu::NativeWindow* EglTestContext::createNativeWindow (EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, int width, int height)
-{
-       return createNativeWindow(display, config, attribList, width, height, eglu::parseWindowVisibility(getTestContext().getCommandLine()));
-}
-
-eglu::NativePixmap* EglTestContext::createNativePixmap (EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, int width, int height)
-{
-       if (!m_pixmapFactory)
-               throw tcu::NotSupportedError("Pixmaps not supported", "", __FILE__, __LINE__);
-
-       return m_pixmapFactory->createPixmap(m_defaultNativeDisplay, display, config, attribList, width, height);
-}
-
-// \todo [2014-10-06 pyry] Quite hacky, expose ApiType internals?
-static deUint32 makeKey (glu::ApiType apiType)
-{
-       return (apiType.getMajorVersion() << 8) | (apiType.getMinorVersion() << 4) | apiType.getProfile();
-}
-
-const tcu::FunctionLibrary* EglTestContext::getGLLibrary (glu::ApiType apiType) const
-{
-       tcu::FunctionLibrary*           library = DE_NULL;
-       const deUint32                          key             = makeKey(apiType);
-       GLLibraryMap::iterator          iter    = m_glLibraries.find(key);
-
-       if (iter == m_glLibraries.end())
-       {
-               library = m_testCtx.getPlatform().getEGLPlatform().createDefaultGLFunctionLibrary(apiType, m_testCtx.getCommandLine());
-               m_glLibraries.insert(std::make_pair(key, library));
-       }
-       else
-               library = iter->second;
-
-       return library;
+       return m_nativeDisplay->getLibrary();
 }
 
-deFunctionPtr EglTestContext::getGLFunction (glu::ApiType apiType, const char* name) const
+void EglTestContext::initGLFunctions (glw::Functions* dst, glu::ApiType apiType) const
 {
-       // \todo [2014-03-11 pyry] This requires fall-back to eglGetProcAddress(), right?
-       const tcu::FunctionLibrary* const       library = getGLLibrary(apiType);
-       return library->getFunction(name);
+       initGLFunctions(dst, apiType, 0, DE_NULL);
 }
 
-void EglTestContext::getGLFunctions (glw::Functions& gl, glu::ApiType apiType, const std::vector<const char*>& extensions) const
+void EglTestContext::initGLFunctions (glw::Functions* dst, glu::ApiType apiType, int numExtensions, const char* const* extensions) const
 {
-       const tcu::FunctionLibrary* const       library         = getGLLibrary(apiType);
-       const eglu::GLFunctionLoader            loader          (library);
+       const tcu::FunctionLibrary*             platformLib             = m_glLibraryCache.getLibrary(apiType);
+       const eglu::GLFunctionLoader    loader                  (getLibrary(), platformLib);
 
-       // \note There may not be current context, so we can't use initFunctions().
-       glu::initCoreFunctions(&gl, &loader, apiType);
-       glu::initExtensionFunctions(&gl, &loader, apiType, extensions.size(), &extensions.front());
+       glu::initCoreFunctions(dst, &loader, apiType);
+       glu::initExtensionFunctions(dst, &loader, apiType, numExtensions, extensions);
 }
 
 TestCaseGroup::TestCaseGroup (EglTestContext& eglTestCtx, const char* name, const char* description)