summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp')
-rwxr-xr-xgfx/angle/src/tests/egl_tests/EGLThreadTest.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp b/gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp
new file mode 100755
index 000000000..305ccc25f
--- /dev/null
+++ b/gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp
@@ -0,0 +1,83 @@
+#include "gtest/gtest.h"
+
+#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);
+typedef EGLAPI EGLBoolean EGLAPIENTRY EGLTerminate(EGLDisplay dpy);
+
+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();
+
+ auto terminate = (EGLTerminate *)GetProcAddress(mEGL, "eglTerminate");
+ terminate(mDisplay);
+}