• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
DllMain(HINSTANCE instance,DWORD reason,LPVOID reserved)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 {
setCurrentError(EGLint error)91 void setCurrentError(EGLint error)
92 {
93     Current *current = (Current*)TlsGetValue(currentTLS);
94 
95     current->error = error;
96 }
97 
getCurrentError()98 EGLint getCurrentError()
99 {
100     Current *current = (Current*)TlsGetValue(currentTLS);
101 
102     return current->error;
103 }
104 
setCurrentAPI(EGLenum API)105 void setCurrentAPI(EGLenum API)
106 {
107     Current *current = (Current*)TlsGetValue(currentTLS);
108 
109     current->API = API;
110 }
111 
getCurrentAPI()112 EGLenum getCurrentAPI()
113 {
114     Current *current = (Current*)TlsGetValue(currentTLS);
115 
116     return current->API;
117 }
118 
setCurrentDisplay(EGLDisplay dpy)119 void setCurrentDisplay(EGLDisplay dpy)
120 {
121     Current *current = (Current*)TlsGetValue(currentTLS);
122 
123     current->display = dpy;
124 }
125 
getCurrentDisplay()126 EGLDisplay getCurrentDisplay()
127 {
128     Current *current = (Current*)TlsGetValue(currentTLS);
129 
130     return current->display;
131 }
132 
setCurrentDrawSurface(EGLSurface surface)133 void setCurrentDrawSurface(EGLSurface surface)
134 {
135     Current *current = (Current*)TlsGetValue(currentTLS);
136 
137     current->drawSurface = surface;
138 }
139 
getCurrentDrawSurface()140 EGLSurface getCurrentDrawSurface()
141 {
142     Current *current = (Current*)TlsGetValue(currentTLS);
143 
144     return current->drawSurface;
145 }
146 
setCurrentReadSurface(EGLSurface surface)147 void setCurrentReadSurface(EGLSurface surface)
148 {
149     Current *current = (Current*)TlsGetValue(currentTLS);
150 
151     current->readSurface = surface;
152 }
153 
getCurrentReadSurface()154 EGLSurface getCurrentReadSurface()
155 {
156     Current *current = (Current*)TlsGetValue(currentTLS);
157 
158     return current->readSurface;
159 }
160 
error(EGLint errorCode)161 void error(EGLint errorCode)
162 {
163     egl::setCurrentError(errorCode);
164 }
165 
166 }
167