| #include "gtest/gtest.h" |
| |
| #define GL_GLEXT_PROTOTYPES |
| |
| #include <EGL/egl.h> |
| #include <EGL/eglext.h> |
| |
| typedef EGLAPI EGLDisplay EGLAPIENTRY EGLGetDisplay(EGLNativeDisplayType display_id); |
| typedef EGLAPI EGLBoolean EGLAPIENTRY EGLInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor); |
| typedef EGLAPI EGLContext EGLAPIENTRY EGLGetCurrentContext(void); |
| typedef EGLAPI EGLSurface EGLAPIENTRY EGLGetCurrentSurface(EGLint readdraw); |
| |
| class EGLThreadTest : public testing::Test |
| { |
| public: |
| virtual void SetUp() {} |
| virtual void TearDown() {} |
| |
| EGLGetDisplay *mGetDisplay; |
| EGLInitialize *mInitialize; |
| EGLGetCurrentContext *mGetCurrentContext; |
| EGLGetCurrentSurface *mGetCurrentSurface; |
| |
| EGLDisplay mDisplay; |
| |
| HMODULE mEGL; |
| HMODULE mGLESv2; |
| |
| static DWORD WINAPI ThreadingTestEntryPoint(LPVOID thisPointer); |
| |
| private: |
| void ThreadingTest(); |
| }; |
| |
| DWORD WINAPI EGLThreadTest::ThreadingTestEntryPoint(LPVOID lpParameter) |
| { |
| EGLThreadTest *test = (EGLThreadTest *)lpParameter; |
| test->ThreadingTest(); |
| return 0; |
| } |
| |
| void EGLThreadTest::ThreadingTest() |
| { |
| mEGL = LoadLibrary(TEXT("libEGL.dll")); |
| mGLESv2 = LoadLibrary(TEXT("libGLESv2.dll")); |
| |
| EXPECT_TRUE(mEGL != NULL); |
| EXPECT_TRUE(mGLESv2 != NULL); |
| |
| mGetDisplay = (EGLGetDisplay *)GetProcAddress(mEGL, "eglGetDisplay"); |
| mInitialize = (EGLInitialize *)GetProcAddress(mEGL, "eglInitialize"); |
| mGetCurrentContext = (EGLGetCurrentContext *)GetProcAddress(mEGL, "eglGetCurrentContext"); |
| mGetCurrentSurface = (EGLGetCurrentSurface *)GetProcAddress(mEGL, "eglGetCurrentSurface"); |
| |
| EXPECT_TRUE(mGetDisplay != NULL); |
| EXPECT_TRUE(mInitialize != NULL); |
| EXPECT_TRUE(mGetCurrentContext != NULL); |
| EXPECT_TRUE(mGetCurrentSurface != NULL); |
| |
| mDisplay = mGetDisplay(EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE); |
| |
| EXPECT_TRUE(mDisplay!= EGL_NO_DISPLAY); |
| |
| mInitialize(mDisplay, NULL, NULL); |
| mGetCurrentContext(); |
| } |
| |
| TEST_F(EGLThreadTest, thread_init_crash) |
| { |
| DWORD threadId; |
| HANDLE threadHandle = CreateThread(NULL, 0, EGLThreadTest::ThreadingTestEntryPoint, this, 0, &threadId); |
| EXPECT_TRUE(threadHandle != NULL); |
| |
| // wait for signal from thread |
| DWORD waitResult = WaitForSingleObject(threadHandle, 1000); |
| EXPECT_EQ(waitResult, WAIT_OBJECT_0); |
| |
| // crash, because the TLS value is NULL on main thread |
| mGetCurrentSurface(EGL_DRAW); |
| mGetCurrentContext(); |
| } |