summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libEGL/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libEGL/main.cpp')
-rw-r--r--src/3rdparty/angle/src/libEGL/main.cpp83
1 files changed, 38 insertions, 45 deletions
diff --git a/src/3rdparty/angle/src/libEGL/main.cpp b/src/3rdparty/angle/src/libEGL/main.cpp
index 4cdf5f0362..5788af7827 100644
--- a/src/3rdparty/angle/src/libEGL/main.cpp
+++ b/src/3rdparty/angle/src/libEGL/main.cpp
@@ -1,4 +1,3 @@
-#include "../libGLESv2/precompiled.h"
//
// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
@@ -10,61 +9,57 @@
#include "libEGL/main.h"
#include "common/debug.h"
+#include "common/tls.h"
-#if !defined(ANGLE_OS_WINRT)
-static DWORD currentTLS = TLS_OUT_OF_INDEXES;
-#else
-static __declspec(thread) void *currentTLS = 0;
+#if defined(ANGLE_PLATFORM_WINRT)
+__declspec(thread)
#endif
+static TLSIndex currentTLS = TLS_OUT_OF_INDEXES;
namespace egl
{
Current *AllocateCurrent()
{
-#if !defined(ANGLE_OS_WINRT)
- Current *current = (egl::Current*)LocalAlloc(LPTR, sizeof(egl::Current));
-#else
- currentTLS = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Current));
- Current *current = (egl::Current*)currentTLS;
+#if defined(ANGLE_PLATFORM_WINRT)
+ if (currentTLS == TLS_OUT_OF_INDEXES)
+ {
+ currentTLS = CreateTLSIndex();
+ }
#endif
-
- if (!current)
+ ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
+ if (currentTLS == TLS_OUT_OF_INDEXES)
{
- ERR("Could not allocate thread local storage.");
return NULL;
}
-#if !defined(ANGLE_OS_WINRT)
- ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
- TlsSetValue(currentTLS, current);
-#endif
-
+ Current *current = new Current();
current->error = EGL_SUCCESS;
current->API = EGL_OPENGL_ES_API;
current->display = EGL_NO_DISPLAY;
current->drawSurface = EGL_NO_SURFACE;
current->readSurface = EGL_NO_SURFACE;
+ if (!SetTLSValue(currentTLS, current))
+ {
+ ERR("Could not set thread local storage.");
+ return NULL;
+ }
+
return current;
}
void DeallocateCurrent()
{
-#if !defined(ANGLE_OS_WINRT)
- void *current = TlsGetValue(currentTLS);
-
- if (current)
+#if defined(ANGLE_PLATFORM_WINRT)
+ if (currentTLS == TLS_OUT_OF_INDEXES)
{
- LocalFree((HLOCAL)current);
- }
-#else
- if (currentTLS)
- {
- HeapFree(GetProcessHeap(), 0, currentTLS);
- currentTLS = 0;
+ return;
}
#endif
+ Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
+ SafeDelete(current);
+ SetTLSValue(currentTLS, NULL);
}
}
@@ -91,16 +86,18 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
}
}
#endif
-#if !defined(ANGLE_OS_WINRT)
- currentTLS = TlsAlloc();
+#if defined(ANGLE_PLATFORM_WINRT) // On WinRT, don't handle TLS from DllMain
+ return DisableThreadLibraryCalls(instance);
+#endif
+
+ currentTLS = CreateTLSIndex();
if (currentTLS == TLS_OUT_OF_INDEXES)
{
return FALSE;
}
-#endif
}
- // Fall throught to initialize index
+ // Fall through to initialize index
case DLL_THREAD_ATTACH:
{
egl::AllocateCurrent();
@@ -113,9 +110,9 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
break;
case DLL_PROCESS_DETACH:
{
+#if !defined(ANGLE_PLATFORM_WINRT)
egl::DeallocateCurrent();
-#if !defined(ANGLE_OS_WINRT)
- TlsFree(currentTLS);
+ DestroyTLSIndex(currentTLS);
#endif
}
break;
@@ -134,20 +131,16 @@ namespace egl
Current *GetCurrentData()
{
#ifndef QT_OPENGL_ES_2_ANGLE_STATIC
-#if !defined(ANGLE_OS_WINRT)
- Current *current = (Current*)TlsGetValue(currentTLS);
-#else
- Current *current = (Current*)currentTLS;
-#endif
-#else
- // No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
- static Current s_current = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE };
- Current *current = &s_current;
-#endif
+ Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
// ANGLE issue 488: when the dll is loaded after thread initialization,
// thread local storage (current) might not exist yet.
return (current ? current : AllocateCurrent());
+#else
+ // No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
+ static Current current = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE };
+ return &current;
+#endif
}
void setCurrentError(EGLint error)