gfx/angle/src/libEGL/main.cpp

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:c8f25134dd1b
1 //
2 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // main.cpp: DLL entry point and management of thread-local data.
8
9 #include "libEGL/main.h"
10
11 #include "common/debug.h"
12
13 static DWORD currentTLS = TLS_OUT_OF_INDEXES;
14
15 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
16 {
17 switch (reason)
18 {
19 case DLL_PROCESS_ATTACH:
20 {
21 #if !defined(ANGLE_DISABLE_TRACE)
22 FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt");
23
24 if (debug)
25 {
26 fclose(debug);
27 debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase
28
29 if (debug)
30 {
31 fclose(debug);
32 }
33 }
34 #endif
35
36 currentTLS = TlsAlloc();
37
38 if (currentTLS == TLS_OUT_OF_INDEXES)
39 {
40 return FALSE;
41 }
42 }
43 // Fall throught to initialize index
44 case DLL_THREAD_ATTACH:
45 {
46 egl::Current *current = (egl::Current*)LocalAlloc(LPTR, sizeof(egl::Current));
47
48 if (current)
49 {
50 TlsSetValue(currentTLS, current);
51
52 current->error = EGL_SUCCESS;
53 current->API = EGL_OPENGL_ES_API;
54 current->display = EGL_NO_DISPLAY;
55 current->drawSurface = EGL_NO_SURFACE;
56 current->readSurface = EGL_NO_SURFACE;
57 }
58 }
59 break;
60 case DLL_THREAD_DETACH:
61 {
62 void *current = TlsGetValue(currentTLS);
63
64 if (current)
65 {
66 LocalFree((HLOCAL)current);
67 }
68 }
69 break;
70 case DLL_PROCESS_DETACH:
71 {
72 void *current = TlsGetValue(currentTLS);
73
74 if (current)
75 {
76 LocalFree((HLOCAL)current);
77 }
78
79 TlsFree(currentTLS);
80 }
81 break;
82 default:
83 break;
84 }
85
86 return TRUE;
87 }
88
89 namespace egl
90 {
91 void setCurrentError(EGLint error)
92 {
93 Current *current = (Current*)TlsGetValue(currentTLS);
94
95 current->error = error;
96 }
97
98 EGLint getCurrentError()
99 {
100 Current *current = (Current*)TlsGetValue(currentTLS);
101
102 return current->error;
103 }
104
105 void setCurrentAPI(EGLenum API)
106 {
107 Current *current = (Current*)TlsGetValue(currentTLS);
108
109 current->API = API;
110 }
111
112 EGLenum getCurrentAPI()
113 {
114 Current *current = (Current*)TlsGetValue(currentTLS);
115
116 return current->API;
117 }
118
119 void setCurrentDisplay(EGLDisplay dpy)
120 {
121 Current *current = (Current*)TlsGetValue(currentTLS);
122
123 current->display = dpy;
124 }
125
126 EGLDisplay getCurrentDisplay()
127 {
128 Current *current = (Current*)TlsGetValue(currentTLS);
129
130 return current->display;
131 }
132
133 void setCurrentDrawSurface(EGLSurface surface)
134 {
135 Current *current = (Current*)TlsGetValue(currentTLS);
136
137 current->drawSurface = surface;
138 }
139
140 EGLSurface getCurrentDrawSurface()
141 {
142 Current *current = (Current*)TlsGetValue(currentTLS);
143
144 return current->drawSurface;
145 }
146
147 void setCurrentReadSurface(EGLSurface surface)
148 {
149 Current *current = (Current*)TlsGetValue(currentTLS);
150
151 current->readSurface = surface;
152 }
153
154 EGLSurface getCurrentReadSurface()
155 {
156 Current *current = (Current*)TlsGetValue(currentTLS);
157
158 return current->readSurface;
159 }
160
161 void error(EGLint errorCode)
162 {
163 egl::setCurrentError(errorCode);
164 }
165
166 }

mercurial