Fix EGL tests that called EGL functions before init()
authorPyry Haulos <phaulos@google.com>
Fri, 3 Apr 2015 22:36:22 +0000 (15:36 -0700)
committerPyry Haulos <phaulos@google.com>
Fri, 3 Apr 2015 22:48:45 +0000 (15:48 -0700)
 * GL function table must not be initialized in constructor as
initialization may call eglGetProcAddress().

 * deinit()s called from destructors should touch EGL functions only if
there are live EGL objects (display teardown).

Change-Id: Ibfdbc0ff2280c3339c7c473d51fef5c88dbcc9fd

modules/egl/teglGLES2SharingTests.cpp
modules/egl/teglGLES2SharingThreadedTests.cpp
modules/egl/teglMakeCurrentPerfTests.cpp
modules/egl/teglMultiThreadTests.cpp
modules/egl/teglRenderTests.cpp
modules/egl/teglSimpleConfigCase.cpp
modules/egl/teglSyncTests.cpp

index cde391d..0219e38 100644 (file)
@@ -92,6 +92,8 @@ public:
 
                                        GLES2SharingTest        (EglTestContext& eglTestCtx, const char* name , const char* desc, const TestSpec& spec);
 
+       void                    init                            (void);
+
        IterateResult   iterate                         (void);
 
 private:
@@ -116,6 +118,10 @@ GLES2SharingTest::GLES2SharingTest (EglTestContext& eglTestCtx, const char* name
        , m_random      (deStringHash(name))
        , m_log         (eglTestCtx.getTestContext().getLog())
 {
+}
+
+void GLES2SharingTest::init (void)
+{
        m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
 }
 
index aab481a..964a3fb 100644 (file)
@@ -2127,7 +2127,6 @@ GLES2SharingRandomTest::GLES2SharingRandomTest (EglTestContext& context, const T
        , m_eglConfig           (0)
        , m_lastOperation       (THREADOPERATIONID_NONE)
 {
-       m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
 }
 
 GLES2SharingRandomTest::~GLES2SharingRandomTest (void)
@@ -2150,6 +2149,8 @@ void GLES2SharingRandomTest::init (void)
        m_eglDisplay    = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
        m_eglConfig     = eglu::chooseSingleConfig(egl, m_eglDisplay, attribList);
 
+       m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
+
        // Check extensions
        if (m_config.useFenceSync)
                requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_fence_sync");
@@ -2242,7 +2243,11 @@ void GLES2SharingRandomTest::deinit (void)
 
        m_threads.clear();
 
-       m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
+       if (m_eglDisplay != EGL_NO_DISPLAY)
+       {
+               m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
+               m_eglDisplay = EGL_NO_DISPLAY;
+       }
 
        TCU_CHECK(!m_requiresRestart);
 }
@@ -2980,7 +2985,6 @@ GLES2ThreadedSharingTest::GLES2ThreadedSharingTest (EglTestContext& context, con
        , m_eglDisplay          (EGL_NO_DISPLAY)
        , m_eglConfig           (0)
 {
-       m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
 }
 
 GLES2ThreadedSharingTest::~GLES2ThreadedSharingTest (void)
@@ -3003,6 +3007,8 @@ void GLES2ThreadedSharingTest::init (void)
        m_eglDisplay    = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
        m_eglConfig     = eglu::chooseSingleConfig(egl, m_eglDisplay, attribList);
 
+       m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
+
        // Check extensions
        if (m_config.useFenceSync)
                requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_fence_sync");
@@ -3570,7 +3576,12 @@ void GLES2ThreadedSharingTest::deinit (void)
                delete m_threads[threadNdx];
 
        m_threads.clear();
-       m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
+
+       if (m_eglDisplay != EGL_NO_DISPLAY)
+       {
+               m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
+               m_eglDisplay = EGL_NO_DISPLAY;
+       }
 
        TCU_CHECK(!m_requiresRestart);
 }
index 8c796cd..9bf82ed 100644 (file)
@@ -182,8 +182,11 @@ void MakeCurrentPerfCase::deinit (void)
        destroyContexts();
        destroySurfaces();
 
-       m_eglTestCtx.getLibrary().terminate(m_display);
-       m_display = EGL_NO_DISPLAY;
+       if (m_display != EGL_NO_DISPLAY)
+       {
+               m_eglTestCtx.getLibrary().terminate(m_display);
+               m_display = EGL_NO_DISPLAY;
+       }
 }
 
 void MakeCurrentPerfCase::chooseConfig (void)
index e73e3d6..0e4fa2f 100644 (file)
@@ -286,8 +286,11 @@ void MultiThreadedTest::init (void)
 
 void MultiThreadedTest::deinit (void)
 {
-       m_eglTestCtx.getLibrary().terminate(m_display);
-       m_display = EGL_NO_DISPLAY;
+       if (m_display != EGL_NO_DISPLAY)
+       {
+               m_eglTestCtx.getLibrary().terminate(m_display);
+               m_display = EGL_NO_DISPLAY;
+       }
 }
 
 void MultiThreadedTest::barrier (TestThread& thread)
index f14ae60..b1e97f3 100644 (file)
@@ -610,6 +610,8 @@ class SingleThreadRenderCase : public MultiContextRenderCase
 public:
                                                SingleThreadRenderCase          (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint api, EGLint surfaceType, const eglu::FilterList& filters, int numContextsPerApi);
 
+       void                            init                                            (void);
+
 private:
        virtual void            executeForContexts                      (EGLDisplay display, EGLSurface surface, const Config& config, const std::vector<std::pair<EGLint, EGLContext> >& contexts);
 
@@ -621,6 +623,10 @@ private:
 SingleThreadRenderCase::SingleThreadRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint api, EGLint surfaceType, const eglu::FilterList& filters, int numContextsPerApi)
        : MultiContextRenderCase(eglTestCtx, name, description, api, surfaceType, filters, numContextsPerApi)
 {
+}
+
+void SingleThreadRenderCase::init (void)
+{
        m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
 }
 
@@ -734,6 +740,8 @@ class MultiThreadRenderCase : public MultiContextRenderCase
 public:
                                                MultiThreadRenderCase           (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint api, EGLint surfaceType, const eglu::FilterList& filters, int numContextsPerApi);
 
+       void                            init                                            (void);
+
 private:
        virtual void            executeForContexts                      (EGLDisplay display, EGLSurface surface, const Config& config, const std::vector<std::pair<EGLint, EGLContext> >& contexts);
 
@@ -810,6 +818,10 @@ private:
 MultiThreadRenderCase::MultiThreadRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint api, EGLint surfaceType, const eglu::FilterList& filters, int numContextsPerApi)
        : MultiContextRenderCase(eglTestCtx, name, description, api, surfaceType, filters, numContextsPerApi)
 {
+}
+
+void MultiThreadRenderCase::init (void)
+{
        m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
 }
 
index f8210bf..49e4f77 100644 (file)
@@ -87,8 +87,11 @@ void SimpleConfigCase::init (void)
 
 void SimpleConfigCase::deinit (void)
 {
-       m_eglTestCtx.getLibrary().terminate(m_display);
-       m_display = EGL_NO_DISPLAY;
+       if (m_display != EGL_NO_DISPLAY)
+       {
+               m_eglTestCtx.getLibrary().terminate(m_display);
+               m_display = EGL_NO_DISPLAY;
+       }
        m_configs.clear();
 }
 
index 02c31a2..c48b587 100644 (file)
@@ -111,7 +111,6 @@ SyncTest::SyncTest (EglTestContext& eglTestCtx, EGLenum syncType, Extension exte
        , m_eglContext          (EGL_NO_CONTEXT)
        , m_sync                        (EGL_NO_SYNC_KHR)
 {
-       m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
 }
 
 SyncTest::~SyncTest (void)
@@ -203,6 +202,8 @@ void SyncTest::init (void)
        m_eglDisplay    = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
        m_eglConfig     = eglu::chooseSingleConfig(egl, m_eglDisplay, displayAttribList);
 
+       m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
+
        {
                const Extension syncTypeExtension = getSyncTypeExtension(m_syncType);
                requiredEGLExtensions(egl, m_eglDisplay, (Extension)(m_extensions | syncTypeExtension));