diff -urN wine-2.2-orig/dlls/opengl32/opengl_ext.c wine-2.2/dlls/opengl32/opengl_ext.c
--- wine-2.2-orig/dlls/opengl32/opengl_ext.c	2017-02-18 05:35:09 +0900
+++ wine-2.2/dlls/opengl32/opengl_ext.c	2017-03-14 21:50:40 +0900
@@ -16,6 +16,12 @@
 
 const int extension_registry_size = 2580;
 
+/* TODO: callback pointer should be context-specific */
+static void (WINAPI *debug_callback)( GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, void *userParam );
+static void debug_callback_wrapper( GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, void *userParam ) {
+    (*debug_callback)( source, type, id, severity, length, message, userParam );
+}
+
 static void WINAPI glAccumxOES( GLenum op, GLfixed value ) {
   const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
   TRACE("(%d, %d)\n", op, value );
@@ -1957,19 +1963,22 @@
 static void WINAPI glDebugMessageCallback( void * callback, const void* userParam ) {
   const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
   TRACE("(%p, %p)\n", callback, userParam );
-  funcs->ext.p_glDebugMessageCallback( callback, userParam );
+  debug_callback = callback;
+  funcs->ext.p_glDebugMessageCallback( callback ? debug_callback_wrapper : NULL, userParam );
 }
 
 static void WINAPI glDebugMessageCallbackAMD( void * callback, void* userParam ) {
   const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
   TRACE("(%p, %p)\n", callback, userParam );
-  funcs->ext.p_glDebugMessageCallbackAMD( callback, userParam );
+  debug_callback = callback;
+  funcs->ext.p_glDebugMessageCallback( callback ? debug_callback_wrapper : NULL, userParam );
 }
 
 static void WINAPI glDebugMessageCallbackARB( void * callback, const void* userParam ) {
   const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
   TRACE("(%p, %p)\n", callback, userParam );
-  funcs->ext.p_glDebugMessageCallbackARB( callback, userParam );
+  debug_callback = callback;
+  funcs->ext.p_glDebugMessageCallback( callback ? debug_callback_wrapper : NULL, userParam );
 }
 
 static void WINAPI glDebugMessageControl( GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled ) {
