Home | History | Annotate | Download | only in standalone_tests
      1 #include "gtest/gtest.h"
      2 
      3 #define GL_GLEXT_PROTOTYPES
      4 
      5 #include <EGL/egl.h>
      6 #include <EGL/eglext.h>
      7 
      8 typedef EGLAPI EGLDisplay EGLAPIENTRY EGLGetDisplay(EGLNativeDisplayType display_id);
      9 typedef EGLAPI EGLBoolean EGLAPIENTRY EGLInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
     10 typedef EGLAPI EGLContext EGLAPIENTRY EGLGetCurrentContext(void);
     11 typedef EGLAPI EGLSurface EGLAPIENTRY EGLGetCurrentSurface(EGLint readdraw);
     12 
     13 class EGLThreadTest : public testing::Test
     14 {
     15   public:
     16     virtual void SetUp() {}
     17     virtual void TearDown() {}
     18 
     19     EGLGetDisplay *mGetDisplay;
     20     EGLInitialize *mInitialize;
     21     EGLGetCurrentContext *mGetCurrentContext;
     22     EGLGetCurrentSurface *mGetCurrentSurface;
     23 
     24     EGLDisplay mDisplay;
     25 
     26     HMODULE mEGL;
     27     HMODULE mGLESv2;
     28 
     29     static DWORD WINAPI ThreadingTestEntryPoint(LPVOID thisPointer);
     30 
     31   private:
     32     void ThreadingTest();
     33 };
     34 
     35 DWORD WINAPI EGLThreadTest::ThreadingTestEntryPoint(LPVOID lpParameter)
     36 {
     37     EGLThreadTest *test = (EGLThreadTest *)lpParameter;
     38     test->ThreadingTest();
     39     return 0;
     40 }
     41 
     42 void EGLThreadTest::ThreadingTest()
     43 {
     44     mEGL = LoadLibrary(TEXT("libEGL.dll"));
     45     mGLESv2 = LoadLibrary(TEXT("libGLESv2.dll"));
     46 
     47     EXPECT_TRUE(mEGL != NULL);
     48     EXPECT_TRUE(mGLESv2 != NULL);
     49 
     50     mGetDisplay = (EGLGetDisplay *)GetProcAddress(mEGL, "eglGetDisplay");
     51     mInitialize = (EGLInitialize *)GetProcAddress(mEGL, "eglInitialize");
     52     mGetCurrentContext = (EGLGetCurrentContext *)GetProcAddress(mEGL, "eglGetCurrentContext");
     53     mGetCurrentSurface = (EGLGetCurrentSurface *)GetProcAddress(mEGL, "eglGetCurrentSurface");
     54 
     55     EXPECT_TRUE(mGetDisplay != NULL);
     56     EXPECT_TRUE(mInitialize != NULL);
     57     EXPECT_TRUE(mGetCurrentContext != NULL);
     58     EXPECT_TRUE(mGetCurrentSurface != NULL);
     59 
     60     mDisplay = mGetDisplay(EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE);
     61 
     62     EXPECT_TRUE(mDisplay!= EGL_NO_DISPLAY);
     63 
     64     mInitialize(mDisplay, NULL, NULL);
     65     mGetCurrentContext();
     66 }
     67 
     68 TEST_F(EGLThreadTest, thread_init_crash)
     69 {
     70     DWORD threadId;
     71     HANDLE threadHandle = CreateThread(NULL, 0, EGLThreadTest::ThreadingTestEntryPoint, this, 0, &threadId);
     72     EXPECT_TRUE(threadHandle != NULL);
     73 
     74     // wait for signal from thread
     75     DWORD waitResult = WaitForSingleObject(threadHandle, 1000);
     76     EXPECT_EQ(waitResult, WAIT_OBJECT_0);
     77 
     78     // crash, because the TLS value is NULL on main thread
     79     mGetCurrentSurface(EGL_DRAW);
     80     mGetCurrentContext();
     81 }