#include <winddi.h>
#include <GL/gl.h>
+#ifndef OPENGL32_USE_TLS
+#include <pstypes.h>
+#endif
+
#include <wine/debug.h>
#include "icd.h"
void IntDeleteAllContexts(void);
void IntDeleteAllICDs(void);
-#ifdef OPENGL32_USE_TLS
-extern DWORD OglTlsIndex;
-
-struct Opengl32_ThreadData
+FORCEINLINE
+const GLDISPATCHTABLE*
+IntGetCurrentDispatchTable(void)
{
- const GLDISPATCHTABLE* glDispatchTable;
- HGLRC hglrc;
- HDC hdc;
- struct wgl_dc_data* dc_data;
- PVOID* icdData;
-};
-C_ASSERT(FIELD_OFFSET(struct Opengl32_ThreadData, glDispatchTable) == 0);
+ return (GLDISPATCHTABLE*)NtCurrentTeb()->glTable;
+}
-/* dllmain.c */
-BOOL init_tls_data(void);
+FORCEINLINE
+void
+IntSetCurrentDispatchTable(const GLDISPATCHTABLE* table)
+{
+ NtCurrentTeb()->glTable = (void*)table;
+}
-static inline
+FORCEINLINE
void
IntMakeCurrent(HGLRC hglrc, HDC hdc, struct wgl_dc_data* dc_data)
{
- struct Opengl32_ThreadData* thread_data = TlsGetValue(OglTlsIndex);
- if (!thread_data)
- {
- OutputDebugStringA("Calling init_tls_data from IntMakeCurrent\n");
- if (!init_tls_data())
- OutputDebugStringA("init_tls_data failed, brace for impact...\n");
-
- thread_data = TlsGetValue(OglTlsIndex);
- }
+ TEB* CurrentTeb = NtCurrentTeb();
- thread_data->hglrc = hglrc;
- thread_data->hdc = hdc;
- thread_data->dc_data = dc_data;
+ CurrentTeb->glCurrentRC = hglrc;
+ CurrentTeb->glReserved2 = hdc;
+ CurrentTeb->glContext = dc_data;
}
-static inline
+FORCEINLINE
HGLRC
IntGetCurrentRC(void)
{
- struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex);
- return data ? data->hglrc : NULL;
-}
-
-static inline
-DHGLRC
-IntGetCurrentDHGLRC(void)
-{
- struct wgl_context* ctx = (struct wgl_context*)IntGetCurrentRC();
- if(!ctx) return NULL;
- return ctx->dhglrc;
+ return NtCurrentTeb()->glCurrentRC;
}
-static inline
+FORCEINLINE
HDC
IntGetCurrentDC(void)
{
- struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex);
- return data ? data->hdc : NULL;
+ return NtCurrentTeb()->glReserved2;
}
static inline
struct wgl_dc_data*
IntGetCurrentDcData(void)
{
- struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex);
- return data->dc_data;
-}
-
-static inline
-const GLDISPATCHTABLE *
-IntGetCurrentDispatchTable(void)
-{
- struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex);
- return data->glDispatchTable;
-}
-
-static inline
-void
-IntSetCurrentDispatchTable(const GLDISPATCHTABLE* table)
-{
- struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex);
- data->glDispatchTable = table;
+ return NtCurrentTeb()->glContext;
}
-static inline
+FORCEINLINE
void
IntSetCurrentICDPrivate(void* value)
{
- struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex);
- data->icdData = value;
+ NtCurrentTeb()->glReserved1[0] = (ULONG_PTR)value;
}
-static inline
+FORCEINLINE
void*
IntGetCurrentICDPrivate(void)
{
- struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex);
- return data->icdData;
+ return (void*)NtCurrentTeb()->glReserved1[0];
}
-
-#else
-static inline
-const GLDISPATCHTABLE*
-IntGetCurrentDispatchTable(void)
+FORCEINLINE
+DHGLRC
+IntGetCurrentDHGLRC(void)
{
- return (GLDISPATCHTABLE*)NtCurrentTeb()->glTable;
+ struct wgl_context* ctx = (struct wgl_context*)IntGetCurrentRC();
+ if(!ctx) return NULL;
+ return ctx->dhglrc;
}
-#endif // defined(OPENGL32_USE_TLS)
/* Software implementation functions */
INT sw_DescribePixelFormat(HDC hdc, INT format, UINT size, PIXELFORMATDESCRIPTOR* descr);