summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/wgl
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2015-06-16 15:32:46 -0600
committerBrian Paul <brianp@vmware.com>2015-06-19 08:45:00 -0600
commit73bdf4ba86751983dff011ac488ac60321d70a7f (patch)
tree20272b2075f96a356640e70a452519815db84bc5 /src/gallium/state_trackers/wgl
parent8d005a643ed94c1871ec854bc069366cdda6581f (diff)
downloadexternal_mesa3d-73bdf4ba86751983dff011ac488ac60321d70a7f.zip
external_mesa3d-73bdf4ba86751983dff011ac488ac60321d70a7f.tar.gz
external_mesa3d-73bdf4ba86751983dff011ac488ac60321d70a7f.tar.bz2
stw: use new stw_get_nop_function() function to avoid Viewperf 12 crashes
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>
Diffstat (limited to 'src/gallium/state_trackers/wgl')
-rw-r--r--src/gallium/state_trackers/wgl/stw_getprocaddress.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/wgl/stw_getprocaddress.c b/src/gallium/state_trackers/wgl/stw_getprocaddress.c
index 2ffeec1..33949b6 100644
--- a/src/gallium/state_trackers/wgl/stw_getprocaddress.c
+++ b/src/gallium/state_trackers/wgl/stw_getprocaddress.c
@@ -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;
}