diff options
Diffstat (limited to 'src/3rdparty/angle/src/libGLESv2/main.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libGLESv2/main.cpp | 130 |
1 files changed, 57 insertions, 73 deletions
diff --git a/src/3rdparty/angle/src/libGLESv2/main.cpp b/src/3rdparty/angle/src/libGLESv2/main.cpp index e52799438d..51447e273a 100644 --- a/src/3rdparty/angle/src/libGLESv2/main.cpp +++ b/src/3rdparty/angle/src/libGLESv2/main.cpp @@ -1,4 +1,3 @@ -#include "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 @@ -8,60 +7,56 @@ // main.cpp: DLL entry point and management of thread-local data. #include "libGLESv2/main.h" - #include "libGLESv2/Context.h" -#if !defined(ANGLE_OS_WINRT) -static DWORD currentTLS = TLS_OUT_OF_INDEXES; -#else -static __declspec(thread) void *currentTLS = 0; +#include "common/tls.h" + +#if defined(ANGLE_PLATFORM_WINRT) +__declspec(thread) #endif +static TLSIndex currentTLS = TLS_OUT_OF_INDEXES; namespace gl { Current *AllocateCurrent() { -#if !defined(ANGLE_OS_WINRT) - Current *current = (Current*)LocalAlloc(LPTR, sizeof(Current)); -#else - currentTLS = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Current)); - Current *current = (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->context = NULL; current->display = NULL; + 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); } } @@ -74,16 +69,16 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved { case DLL_PROCESS_ATTACH: { -#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: { gl::AllocateCurrent(); @@ -96,9 +91,9 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved break; case DLL_PROCESS_DETACH: { +#if !defined(ANGLE_PLATFORM_WINRT) gl::DeallocateCurrent(); -#if !defined(ANGLE_OS_WINRT) - TlsFree(currentTLS); + DestroyTLSIndex(currentTLS); #endif } break; @@ -117,20 +112,16 @@ namespace gl 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 = { 0, 0 }; - 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 = { 0, 0 }; + return ¤t; +#endif } void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface) @@ -156,7 +147,7 @@ Context *getContext() Context *getNonLostContext() { Context *context = getContext(); - + if (context) { if (context->isContextLost()) @@ -183,33 +174,26 @@ egl::Display *getDisplay() void error(GLenum errorCode) { gl::Context *context = glGetCurrentContext(); + context->recordError(Error(errorCode)); - if (context) + switch (errorCode) { - switch (errorCode) - { - case GL_INVALID_ENUM: - context->recordInvalidEnum(); - TRACE("\t! Error generated: invalid enum\n"); - break; - case GL_INVALID_VALUE: - context->recordInvalidValue(); - TRACE("\t! Error generated: invalid value\n"); - break; - case GL_INVALID_OPERATION: - context->recordInvalidOperation(); - TRACE("\t! Error generated: invalid operation\n"); - break; - case GL_OUT_OF_MEMORY: - context->recordOutOfMemory(); - TRACE("\t! Error generated: out of memory\n"); - break; - case GL_INVALID_FRAMEBUFFER_OPERATION: - context->recordInvalidFramebufferOperation(); - TRACE("\t! Error generated: invalid framebuffer operation\n"); - break; - default: UNREACHABLE(); - } + case GL_INVALID_ENUM: + TRACE("\t! Error generated: invalid enum\n"); + break; + case GL_INVALID_VALUE: + TRACE("\t! Error generated: invalid value\n"); + break; + case GL_INVALID_OPERATION: + TRACE("\t! Error generated: invalid operation\n"); + break; + case GL_OUT_OF_MEMORY: + TRACE("\t! Error generated: out of memory\n"); + break; + case GL_INVALID_FRAMEBUFFER_OPERATION: + TRACE("\t! Error generated: invalid framebuffer operation\n"); + break; + default: UNREACHABLE(); } } |