[OPENGL32_NEW]
authorJérôme Gardou <jerome.gardou@reactos.org>
Mon, 16 Sep 2013 17:17:04 +0000 (17:17 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Mon, 16 Sep 2013 17:17:04 +0000 (17:17 +0000)
 - 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

index 00a15d4..61f60cd 100644 (file)
@@ -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                                  \
 {                                                       \