• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2002-2010 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 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
16 {
17     switch (reason)
18     {
19       case DLL_PROCESS_ATTACH:
20         {
21             #ifndef NDEBUG
22                 FILE *debug = fopen("debug.txt", "rt");
23 
24                 if (debug)
25                 {
26                     fclose(debug);
27                     debug = fopen("debug.txt", "wt");   // Erase
28                     fclose(debug);
29                 }
30             #endif
31 
32             currentTLS = TlsAlloc();
33 
34             if (currentTLS == TLS_OUT_OF_INDEXES)
35             {
36                 return FALSE;
37             }
38         }
39         // Fall throught to initialize index
40       case DLL_THREAD_ATTACH:
41         {
42             egl::Current *current = (egl::Current*)LocalAlloc(LPTR, sizeof(egl::Current));
43 
44             if (current)
45             {
46                 TlsSetValue(currentTLS, current);
47 
48                 current->error = EGL_SUCCESS;
49                 current->API = EGL_OPENGL_ES_API;
50                 current->display = EGL_NO_DISPLAY;
51                 current->drawSurface = EGL_NO_SURFACE;
52                 current->readSurface = EGL_NO_SURFACE;
53             }
54         }
55         break;
56       case DLL_THREAD_DETACH:
57         {
58             void *current = TlsGetValue(currentTLS);
59 
60             if (current)
61             {
62                 LocalFree((HLOCAL)current);
63             }
64         }
65         break;
66       case DLL_PROCESS_DETACH:
67         {
68             void *current = TlsGetValue(currentTLS);
69 
70             if (current)
71             {
72                 LocalFree((HLOCAL)current);
73             }
74 
75             TlsFree(currentTLS);
76         }
77         break;
78       default:
79         break;
80     }
81 
82     return TRUE;
83 }
84 
85 namespace egl
86 {
setCurrentError(EGLint error)87 void setCurrentError(EGLint error)
88 {
89     Current *current = (Current*)TlsGetValue(currentTLS);
90 
91     current->error = error;
92 }
93 
getCurrentError()94 EGLint getCurrentError()
95 {
96     Current *current = (Current*)TlsGetValue(currentTLS);
97 
98     return current->error;
99 }
100 
setCurrentAPI(EGLenum API)101 void setCurrentAPI(EGLenum API)
102 {
103     Current *current = (Current*)TlsGetValue(currentTLS);
104 
105     current->API = API;
106 }
107 
getCurrentAPI()108 EGLenum getCurrentAPI()
109 {
110     Current *current = (Current*)TlsGetValue(currentTLS);
111 
112     return current->API;
113 }
114 
setCurrentDisplay(EGLDisplay dpy)115 void setCurrentDisplay(EGLDisplay dpy)
116 {
117     Current *current = (Current*)TlsGetValue(currentTLS);
118 
119     current->display = dpy;
120 }
121 
getCurrentDisplay()122 EGLDisplay getCurrentDisplay()
123 {
124     Current *current = (Current*)TlsGetValue(currentTLS);
125 
126     return current->display;
127 }
128 
setCurrentDrawSurface(EGLSurface surface)129 void setCurrentDrawSurface(EGLSurface surface)
130 {
131     Current *current = (Current*)TlsGetValue(currentTLS);
132 
133     current->drawSurface = surface;
134 }
135 
getCurrentDrawSurface()136 EGLSurface getCurrentDrawSurface()
137 {
138     Current *current = (Current*)TlsGetValue(currentTLS);
139 
140     return current->drawSurface;
141 }
142 
setCurrentReadSurface(EGLSurface surface)143 void setCurrentReadSurface(EGLSurface surface)
144 {
145     Current *current = (Current*)TlsGetValue(currentTLS);
146 
147     current->readSurface = surface;
148 }
149 
getCurrentReadSurface()150 EGLSurface getCurrentReadSurface()
151 {
152     Current *current = (Current*)TlsGetValue(currentTLS);
153 
154     return current->readSurface;
155 }
156 }
157 
error(EGLint errorCode)158 void error(EGLint errorCode)
159 {
160     egl::setCurrentError(errorCode);
161 }
162