stw: use new stw_get_nop_function() function to avoid Viewperf 12 crashes
authorBrian Paul <brianp@vmware.com>
Tue, 16 Jun 2015 21:32:46 +0000 (15:32 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 19 Jun 2015 14:45:00 +0000 (08:45 -0600)
Also, print a warning if we do return NULL from wglGetProcAddress() to
help spot this sort of problem in the future.

Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/state_trackers/wgl/stw_getprocaddress.c

index 2ffeec1..33949b6 100644 (file)
@@ -35,6 +35,7 @@
 #include "glapi/glapi.h"
 #include "stw_device.h"
 #include "stw_icd.h"
+#include "stw_nopfuncs.h"
 
 struct stw_extension_entry
 {
@@ -79,6 +80,7 @@ DrvGetProcAddress(
    LPCSTR lpszProc )
 {
    const struct stw_extension_entry *entry;
+   PROC p;
 
    if (!stw_dev)
       return NULL;
@@ -88,8 +90,23 @@ DrvGetProcAddress(
          if (strcmp( lpszProc, entry->name ) == 0)
             return entry->proc;
 
-   if (lpszProc[0] == 'g' && lpszProc[1] == 'l')
-      return (PROC) _glapi_get_proc_address( lpszProc );
-
+   if (lpszProc[0] == 'g' && lpszProc[1] == 'l') {
+      p = (PROC) _glapi_get_proc_address(lpszProc);
+      if (p)
+         return p;
+   }
+
+   /* If we get here, we'd normally just return NULL, but since some apps
+    * (like Viewperf12) crash when they try to use the null pointer, try
+    * returning a pointer to a no-op function instead.
+    */
+   p = stw_get_nop_function(lpszProc);
+   if (p) {
+      debug_printf("wglGetProcAddress(\"%s\") returning no-op function\n",
+                   lpszProc);
+      return p;
+   }
+
+   debug_printf("wglGetProcAddress(\"%s\") returning NULL\n", lpszProc);
    return NULL;
 }