dae16d28c9636f48bdce61b7be9bd18f23e03b52
[reactos.git] / dll / opengl / opengl32 / dllmain.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS
4 * FILE: dll/opengl/opengl32/dllmain.c
5 * PURPOSE: OpenGL32 DLL
6 */
7
8 #include "opengl32.h"
9
10 #ifdef OPENGL32_USE_TLS
11 DWORD OglTlsIndex = 0xFFFFFFFF;
12
13 BOOL init_tls_data(void)
14 {
15 struct Opengl32_ThreadData* ThreadData;
16
17 ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ThreadData));
18 if(!ThreadData)
19 return FALSE;
20 TlsSetValue(OglTlsIndex, ThreadData);
21 ThreadData->glDispatchTable = &StubTable.glDispatchTable;
22 ThreadData->hglrc = NULL;
23 ThreadData->hdc = NULL;
24 ThreadData->dc_data = NULL;
25 return TRUE;
26 }
27
28 #endif
29
30 BOOL WINAPI
31 DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
32 {
33 #ifdef OPENGL32_USE_TLS
34 struct Opengl32_ThreadData* ThreadData;
35 #endif
36 switch ( Reason )
37 {
38 case DLL_PROCESS_ATTACH:
39 #ifdef OPENGL32_USE_TLS
40 OglTlsIndex = TlsAlloc();
41 if(OglTlsIndex == TLS_OUT_OF_INDEXES)
42 return FALSE;
43 #endif
44 /* Initialize Context list */
45 InitializeListHead(&ContextListHead);
46 /* no break */
47 case DLL_THREAD_ATTACH:
48 #ifdef OPENGL32_USE_TLS
49 if (!init_tls_data())
50 return FALSE;
51 #else
52 NtCurrentTeb()->glTable = &StubTable.glDispatchTable;
53 #endif // defined(OPENGL32_USE_TLS)
54 break;
55
56 case DLL_THREAD_DETACH:
57 /* Set NULL context for this thread */
58 wglMakeCurrent(NULL, NULL);
59 /* Clean up */
60 #ifdef OPENGL32_USE_TLS
61 ThreadData = TlsGetValue(OglTlsIndex);
62 if(ThreadData)
63 HeapFree(GetProcessHeap(), 0, ThreadData);
64 #else
65 NtCurrentTeb()->glTable = NULL;
66 #endif // defined(OPENGL32_USE_TLS)
67 break;
68 case DLL_PROCESS_DETACH:
69 /* Clean up */
70 if (!Reserved)
71 {
72 /* The process is not shutting down: release everything */
73 wglMakeCurrent(NULL, NULL);
74 IntDeleteAllContexts();
75 IntDeleteAllICDs();
76 #ifdef OPENGL32_USE_TLS
77 ThreadData = TlsGetValue(OglTlsIndex);
78 if(ThreadData)
79 HeapFree(GetProcessHeap(), 0, ThreadData);
80 #endif
81 }
82 #ifdef OPENGL32_USE_TLS
83 TlsFree(OglTlsIndex);
84 #endif
85 break;
86 }
87
88 return TRUE;
89 }