[OPENGL32]
[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 #endif // defined(OPENGL32_USE_TLS)
52 IntSetCurrentDispatchTable(&StubTable.glDispatchTable);
53 break;
54
55 case DLL_THREAD_DETACH:
56 /* Set NULL context for this thread */
57 wglMakeCurrent(NULL, NULL);
58 /* Clean up */
59 #ifdef OPENGL32_USE_TLS
60 ThreadData = TlsGetValue(OglTlsIndex);
61 if(ThreadData)
62 HeapFree(GetProcessHeap(), 0, ThreadData);
63 #else
64 NtCurrentTeb()->glTable = NULL;
65 #endif // defined(OPENGL32_USE_TLS)
66 break;
67 case DLL_PROCESS_DETACH:
68 /* Clean up */
69 if (!Reserved)
70 {
71 /* The process is not shutting down: release everything */
72 wglMakeCurrent(NULL, NULL);
73 IntDeleteAllContexts();
74 IntDeleteAllICDs();
75 #ifdef OPENGL32_USE_TLS
76 ThreadData = TlsGetValue(OglTlsIndex);
77 if(ThreadData)
78 HeapFree(GetProcessHeap(), 0, ThreadData);
79 #endif
80 }
81 #ifdef OPENGL32_USE_TLS
82 TlsFree(OglTlsIndex);
83 #endif
84 break;
85 }
86
87 return TRUE;
88 }