From d0840bf250ec49b0ab3533d0ccf083fba55b21bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Mon, 16 Sep 2013 17:17:04 +0000 Subject: [PATCH] [OPENGL32_NEW] - Call DrvSetCallbackProcs when initializing the ICD. Prototype taken from mesa ICD, functionality documented by one of them. svn path=/trunk/; revision=60171 --- reactos/dll/opengl/opengl32_new/icdload.c | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/reactos/dll/opengl/opengl32_new/icdload.c b/reactos/dll/opengl/opengl32_new/icdload.c index 00a15d4ce89..61f60cd236f 100644 --- a/reactos/dll/opengl/opengl32_new/icdload.c +++ b/reactos/dll/opengl/opengl32_new/icdload.c @@ -22,6 +22,31 @@ static CRITICAL_SECTION icdload_cs = {NULL, -1, 0, 0, 0, 0}; static struct ICD_Data* ICD_Data_List = NULL; static const WCHAR OpenGLDrivers_Key[] = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\OpenGLDrivers"; +static void APIENTRY wglSetCurrentValue(PVOID value) +{ +#ifdef OPENGL32_USE_TLS + struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex); + data->icdData = value; +#else + NtCurrentTeb()->glReserved2 = value; +#endif +} + +static PVOID APIENTRY wglGetCurrentValue() +{ +#ifdef OPENGL32_USE_TLS + struct Opengl32_ThreadData* data = TlsGetValue(OglTlsIndex); + return data->icdData; +#else + return NtCurrentTeb()->glReserved2; +#endif +} + +static DHGLRC wglGetDHGLRC(struct wgl_context* context) +{ + return context->dhglrc; +} + /* Retrieves the ICD data (driver version + relevant DLL entry points) for a device context */ struct ICD_Data* IntGetIcdData(HDC hdc) { @@ -32,6 +57,7 @@ struct ICD_Data* IntGetIcdData(HDC hdc) HKEY OglKey, DrvKey; WCHAR DllName[MAX_PATH]; BOOL (WINAPI *DrvValidateVersion)(DWORD); + void (WINAPI *DrvSetCallbackProcs)(int nProcs, PROC* pProcs); /* First, see if the driver supports this */ dwInput = OPENGL_GETINFO; @@ -192,6 +218,16 @@ struct ICD_Data* IntGetIcdData(HDC hdc) } } + /* Pass the callbacks */ + DrvSetCallbackProcs = (void*)GetProcAddress(data->hModule, "DrvSetCallbackProcs"); + if(DrvSetCallbackProcs) + { + PROC callbacks[] = {(PROC)wglGetCurrentValue, + (PROC)wglSetCurrentValue, + (PROC)wglGetDHGLRC}; + DrvSetCallbackProcs(3, callbacks); + } + /* Get the DLL exports */ #define DRV_LOAD(x) do \ { \