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 }