1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libEGL/main.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,166 @@ 1.4 +// 1.5 +// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 1.6 +// Use of this source code is governed by a BSD-style license that can be 1.7 +// found in the LICENSE file. 1.8 +// 1.9 + 1.10 +// main.cpp: DLL entry point and management of thread-local data. 1.11 + 1.12 +#include "libEGL/main.h" 1.13 + 1.14 +#include "common/debug.h" 1.15 + 1.16 +static DWORD currentTLS = TLS_OUT_OF_INDEXES; 1.17 + 1.18 +extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) 1.19 +{ 1.20 + switch (reason) 1.21 + { 1.22 + case DLL_PROCESS_ATTACH: 1.23 + { 1.24 +#if !defined(ANGLE_DISABLE_TRACE) 1.25 + FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt"); 1.26 + 1.27 + if (debug) 1.28 + { 1.29 + fclose(debug); 1.30 + debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase 1.31 + 1.32 + if (debug) 1.33 + { 1.34 + fclose(debug); 1.35 + } 1.36 + } 1.37 +#endif 1.38 + 1.39 + currentTLS = TlsAlloc(); 1.40 + 1.41 + if (currentTLS == TLS_OUT_OF_INDEXES) 1.42 + { 1.43 + return FALSE; 1.44 + } 1.45 + } 1.46 + // Fall throught to initialize index 1.47 + case DLL_THREAD_ATTACH: 1.48 + { 1.49 + egl::Current *current = (egl::Current*)LocalAlloc(LPTR, sizeof(egl::Current)); 1.50 + 1.51 + if (current) 1.52 + { 1.53 + TlsSetValue(currentTLS, current); 1.54 + 1.55 + current->error = EGL_SUCCESS; 1.56 + current->API = EGL_OPENGL_ES_API; 1.57 + current->display = EGL_NO_DISPLAY; 1.58 + current->drawSurface = EGL_NO_SURFACE; 1.59 + current->readSurface = EGL_NO_SURFACE; 1.60 + } 1.61 + } 1.62 + break; 1.63 + case DLL_THREAD_DETACH: 1.64 + { 1.65 + void *current = TlsGetValue(currentTLS); 1.66 + 1.67 + if (current) 1.68 + { 1.69 + LocalFree((HLOCAL)current); 1.70 + } 1.71 + } 1.72 + break; 1.73 + case DLL_PROCESS_DETACH: 1.74 + { 1.75 + void *current = TlsGetValue(currentTLS); 1.76 + 1.77 + if (current) 1.78 + { 1.79 + LocalFree((HLOCAL)current); 1.80 + } 1.81 + 1.82 + TlsFree(currentTLS); 1.83 + } 1.84 + break; 1.85 + default: 1.86 + break; 1.87 + } 1.88 + 1.89 + return TRUE; 1.90 +} 1.91 + 1.92 +namespace egl 1.93 +{ 1.94 +void setCurrentError(EGLint error) 1.95 +{ 1.96 + Current *current = (Current*)TlsGetValue(currentTLS); 1.97 + 1.98 + current->error = error; 1.99 +} 1.100 + 1.101 +EGLint getCurrentError() 1.102 +{ 1.103 + Current *current = (Current*)TlsGetValue(currentTLS); 1.104 + 1.105 + return current->error; 1.106 +} 1.107 + 1.108 +void setCurrentAPI(EGLenum API) 1.109 +{ 1.110 + Current *current = (Current*)TlsGetValue(currentTLS); 1.111 + 1.112 + current->API = API; 1.113 +} 1.114 + 1.115 +EGLenum getCurrentAPI() 1.116 +{ 1.117 + Current *current = (Current*)TlsGetValue(currentTLS); 1.118 + 1.119 + return current->API; 1.120 +} 1.121 + 1.122 +void setCurrentDisplay(EGLDisplay dpy) 1.123 +{ 1.124 + Current *current = (Current*)TlsGetValue(currentTLS); 1.125 + 1.126 + current->display = dpy; 1.127 +} 1.128 + 1.129 +EGLDisplay getCurrentDisplay() 1.130 +{ 1.131 + Current *current = (Current*)TlsGetValue(currentTLS); 1.132 + 1.133 + return current->display; 1.134 +} 1.135 + 1.136 +void setCurrentDrawSurface(EGLSurface surface) 1.137 +{ 1.138 + Current *current = (Current*)TlsGetValue(currentTLS); 1.139 + 1.140 + current->drawSurface = surface; 1.141 +} 1.142 + 1.143 +EGLSurface getCurrentDrawSurface() 1.144 +{ 1.145 + Current *current = (Current*)TlsGetValue(currentTLS); 1.146 + 1.147 + return current->drawSurface; 1.148 +} 1.149 + 1.150 +void setCurrentReadSurface(EGLSurface surface) 1.151 +{ 1.152 + Current *current = (Current*)TlsGetValue(currentTLS); 1.153 + 1.154 + current->readSurface = surface; 1.155 +} 1.156 + 1.157 +EGLSurface getCurrentReadSurface() 1.158 +{ 1.159 + Current *current = (Current*)TlsGetValue(currentTLS); 1.160 + 1.161 + return current->readSurface; 1.162 +} 1.163 + 1.164 +void error(EGLint errorCode) 1.165 +{ 1.166 + egl::setCurrentError(errorCode); 1.167 +} 1.168 + 1.169 +}