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;
13 BOOL
init_tls_data(void)
15 struct Opengl32_ThreadData
* ThreadData
;
17 ThreadData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*ThreadData
));
20 TlsSetValue(OglTlsIndex
, ThreadData
);
21 ThreadData
->glDispatchTable
= &StubTable
.glDispatchTable
;
22 ThreadData
->hglrc
= NULL
;
23 ThreadData
->hdc
= NULL
;
24 ThreadData
->dc_data
= NULL
;
31 DllMain(HINSTANCE hInstance
, DWORD Reason
, LPVOID Reserved
)
33 #ifdef OPENGL32_USE_TLS
34 struct Opengl32_ThreadData
* ThreadData
;
38 case DLL_PROCESS_ATTACH
:
39 #ifdef OPENGL32_USE_TLS
40 OglTlsIndex
= TlsAlloc();
41 if(OglTlsIndex
== TLS_OUT_OF_INDEXES
)
44 /* Initialize Context list */
45 InitializeListHead(&ContextListHead
);
47 case DLL_THREAD_ATTACH
:
48 #ifdef OPENGL32_USE_TLS
51 #endif // defined(OPENGL32_USE_TLS)
52 IntSetCurrentDispatchTable(&StubTable
.glDispatchTable
);
55 case DLL_THREAD_DETACH
:
56 /* Set NULL context for this thread */
57 wglMakeCurrent(NULL
, NULL
);
59 #ifdef OPENGL32_USE_TLS
60 ThreadData
= TlsGetValue(OglTlsIndex
);
62 HeapFree(GetProcessHeap(), 0, ThreadData
);
64 NtCurrentTeb()->glTable
= NULL
;
65 #endif // defined(OPENGL32_USE_TLS)
67 case DLL_PROCESS_DETACH
:
71 /* The process is not shutting down: release everything */
72 wglMakeCurrent(NULL
, NULL
);
73 IntDeleteAllContexts();
75 #ifdef OPENGL32_USE_TLS
76 ThreadData
= TlsGetValue(OglTlsIndex
);
78 HeapFree(GetProcessHeap(), 0, ThreadData
);
81 #ifdef OPENGL32_USE_TLS