2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: dll/opengl/opengl32/dllmain.c
5 * PURPOSE: OpenGL32 DLL
10 #ifdef OPENGL32_USE_TLS
11 DWORD OglTlsIndex
= 0xFFFFFFFF;
15 DllMain(HINSTANCE hInstance
, DWORD Reason
, LPVOID Reserved
)
17 #ifdef OPENGL32_USE_TLS
18 struct Opengl32_ThreadData
* ThreadData
;
22 case DLL_PROCESS_ATTACH
:
23 #ifdef OPENGL32_USE_TLS
24 OglTlsIndex
= TlsAlloc();
25 if(OglTlsIndex
== TLS_OUT_OF_INDEXES
)
28 /* Initialize Context list */
29 InitializeListHead(&ContextListHead
);
31 case DLL_THREAD_ATTACH
:
32 #ifdef OPENGL32_USE_TLS
33 ThreadData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*ThreadData
));
36 TlsSetValue(OglTlsIndex
, ThreadData
);
37 ThreadData
->glDispatchTable
= &StubTable
.glDispatchTable
;
38 ThreadData
->hglrc
= NULL
;
39 ThreadData
->hdc
= NULL
;
40 ThreadData
->dc_data
= NULL
;
42 NtCurrentTeb()->glTable
= &StubTable
.glDispatchTable
;
43 #endif // defined(OPENGL32_USE_TLS)
46 case DLL_THREAD_DETACH
:
47 /* Set NULL context for this thread */
48 wglMakeCurrent(NULL
, NULL
);
50 #ifdef OPENGL32_USE_TLS
51 ThreadData
= TlsGetValue(OglTlsIndex
);
53 HeapFree(GetProcessHeap(), 0, ThreadData
);
55 NtCurrentTeb()->glTable
= NULL
;
56 #endif // defined(OPENGL32_USE_TLS)
58 case DLL_PROCESS_DETACH
:
62 /* The process is not shutting down: release everything */
63 wglMakeCurrent(NULL
, NULL
);
64 IntDeleteAllContexts();
66 #ifdef OPENGL32_USE_TLS
67 ThreadData
= TlsGetValue(OglTlsIndex
);
69 HeapFree(GetProcessHeap(), 0, ThreadData
);
72 #ifdef OPENGL32_USE_TLS