From: Rémi Bernon rbernon@codeweavers.com
Based on a patch from Torge Matthies. --- dlls/opengl32/make_opengl | 14 ++++++++++++-- dlls/opengl32/unix_thunks.c | 2 ++ dlls/opengl32/unix_wgl.c | 17 +++++++++++++---- dlls/opengl32/unixlib.h | 10 +++++++++- dlls/opengl32/wgl.c | 12 +++++++----- dlls/wow64win/user.c | 7 ------- include/ntuser.h | 2 -- 7 files changed, 43 insertions(+), 21 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 4c2b2f77167..cbdc88f31d4 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -1027,10 +1027,16 @@ print OUT "#define WIN32_NO_STATUS\n"; print OUT "#include "windef.h"\n"; print OUT "#include "winbase.h"\n"; print OUT "#include "winternl.h"\n"; -print OUT "#include "wingdi.h"\n\n"; +print OUT "#include "wingdi.h"\n"; +print OUT "#include "ntuser.h"\n\n"; print OUT "#include "wine/wgl.h"\n"; print OUT "#include "wine/unixlib.h"\n\n";
+print OUT "struct process_attach_params\n"; +print OUT "{\n"; +print OUT " UINT64 call_gl_debug_message_callback;\n"; +print OUT "};\n\n"; + foreach (sort keys %wgl_functions) { next if defined $manual_win_functions{$_}; @@ -1059,6 +1065,7 @@ print OUT "};\n\n";
print OUT "enum unix_funcs\n"; print OUT "{\n"; +print OUT " unix_process_attach,\n"; print OUT " unix_thread_attach,\n"; print OUT " unix_process_detach,\n"; print OUT " unix_get_pixel_formats,\n"; @@ -1079,8 +1086,9 @@ foreach (sort keys %ext_functions) } print OUT "};\n\n";
-print OUT "struct wine_gl_debug_message_params\n"; +print OUT "struct gl_debug_message_callback_params\n"; print OUT "{\n"; +print OUT " struct dispatch_callback_params dispatch;\n"; print OUT " UINT64 debug_callback; /* client pointer */\n"; print OUT " UINT64 debug_user; /* client pointer */\n"; print OUT " UINT32 source;\n"; @@ -1181,6 +1189,7 @@ print OUT "#ifdef _WIN64\n"; print OUT "WINE_DEFAULT_DEBUG_CHANNEL(opengl);\n"; print OUT "#endif\n\n";
+print OUT "extern NTSTATUS process_attach( void *args );\n"; print OUT "extern NTSTATUS thread_attach( void *args );\n"; print OUT "extern NTSTATUS process_detach( void *args );\n"; print OUT "extern NTSTATUS get_pixel_formats( void *args );\n"; @@ -1228,6 +1237,7 @@ foreach (sort keys %ext_functions)
print OUT "const unixlib_entry_t __wine_unix_call_funcs[] =\n"; print OUT "{\n"; +print OUT " &process_attach,\n"; print OUT " &thread_attach,\n"; print OUT " &process_detach,\n"; print OUT " &get_pixel_formats,\n"; diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index ef14887461a..b8b4e5fb908 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -22,6 +22,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(opengl); #endif
+extern NTSTATUS process_attach( void *args ); extern NTSTATUS thread_attach( void *args ); extern NTSTATUS process_detach( void *args ); extern NTSTATUS get_pixel_formats( void *args ); @@ -24196,6 +24197,7 @@ static NTSTATUS ext_wglSwapIntervalEXT( void *args )
const unixlib_entry_t __wine_unix_call_funcs[] = { + &process_attach, &thread_attach, &process_detach, &get_pixel_formats, diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index c5c584fc848..6e6fcdf7607 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -50,6 +50,8 @@ static BOOL is_wow64(void) return !!NtCurrentTeb()->WowTebOffset; }
+static UINT64 call_gl_debug_message_callback; + static pthread_mutex_t wgl_lock = PTHREAD_MUTEX_INITIALIZER;
/* handle management */ @@ -898,7 +900,7 @@ static BOOL wrap_wglSetPbufferAttribARB( HPBUFFERARB handle, const int *attribs static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *user ) { - struct wine_gl_debug_message_params *params; + struct gl_debug_message_callback_params *params; void *ret_ptr; ULONG ret_len; struct wgl_handle *ptr = (struct wgl_handle *)user; @@ -912,8 +914,9 @@ static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GL return; }
- size = offsetof(struct wine_gl_debug_message_params, message[len] ); + size = offsetof(struct gl_debug_message_callback_params, message[len] ); if (!(params = malloc( size ))) return; + params->dispatch.callback = call_gl_debug_message_callback; params->debug_callback = ptr->u.context->debug_callback; params->debug_user = ptr->u.context->debug_user; params->source = source; @@ -923,8 +926,7 @@ static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GL params->length = length; memcpy( params->message, message, len );
- KeUserModeCallback( NtUserCallOpenGLDebugMessageCallback, params, size, - &ret_ptr, &ret_len ); + KeUserDispatchCallback( ¶ms->dispatch, size, &ret_ptr, &ret_len ); free( params ); }
@@ -1148,6 +1150,13 @@ NTSTATUS ext_wglSetPbufferAttribARB( void *args ) return STATUS_SUCCESS; }
+NTSTATUS process_attach( void *args ) +{ + struct process_attach_params *params = args; + call_gl_debug_message_callback = params->call_gl_debug_message_callback; + return STATUS_SUCCESS; +} + NTSTATUS thread_attach( void *args ) { TEB *teb = args; diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index 46b081e0b18..b754751f33f 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -12,10 +12,16 @@ #include "winbase.h" #include "winternl.h" #include "wingdi.h" +#include "ntuser.h"
#include "wine/wgl.h" #include "wine/unixlib.h"
+struct process_attach_params +{ + UINT64 call_gl_debug_message_callback; +}; + struct wglCopyContext_params { TEB *teb; @@ -25333,6 +25339,7 @@ struct get_pixel_formats_params
enum unix_funcs { + unix_process_attach, unix_thread_attach, unix_process_detach, unix_get_pixel_formats, @@ -28377,8 +28384,9 @@ enum unix_funcs unix_wglSwapIntervalEXT, };
-struct wine_gl_debug_message_params +struct gl_debug_message_callback_params { + struct dispatch_callback_params dispatch; UINT64 debug_callback; /* client pointer */ UINT64 debug_user; /* client pointer */ UINT32 source; diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 6e24e4d5ed1..c6414054ff5 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1880,7 +1880,7 @@ typedef void (WINAPI *gl_debug_message)(GLenum, GLenum, GLuint, GLenum, GLsizei,
static NTSTATUS WINAPI call_gl_debug_message_callback( void *args, ULONG size ) { - struct wine_gl_debug_message_params *params = args; + struct gl_debug_message_callback_params *params = args; gl_debug_message callback = (void *)(UINT_PTR)params->debug_callback; const void *user = (void *)(UINT_PTR)params->debug_user; callback( params->source, params->type, params->id, params->severity, @@ -1893,20 +1893,22 @@ static NTSTATUS WINAPI call_gl_debug_message_callback( void *args, ULONG size ) */ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) { - KERNEL_CALLBACK_PROC *kernel_callback_table; + struct process_attach_params params = + { + .call_gl_debug_message_callback = (UINT_PTR)call_gl_debug_message_callback, + }; NTSTATUS status;
switch(reason) { case DLL_PROCESS_ATTACH: - if ((status = __wine_init_unix_call())) + if ((status = __wine_init_unix_call()) || + (status = UNIX_CALL( process_attach, ¶ms ))) { ERR( "Failed to load unixlib, status %#lx\n", status ); return FALSE; }
- kernel_callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - kernel_callback_table[NtUserCallOpenGLDebugMessageCallback] = call_gl_debug_message_callback; /* fallthrough */ case DLL_THREAD_ATTACH: if ((status = UNIX_CALL( thread_attach, NtCurrentTeb() ))) diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index b473d21617a..7c606101a29 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1450,11 +1450,6 @@ static NTSTATUS WINAPI wow64_NtUserCallDispatchCallback( void *arg, ULONG size ) return dispatch_callback( NtUserCallDispatchCallback, arg, size ); }
-static NTSTATUS WINAPI wow64_NtUserCallOpenGLDebugMessageCallback( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserCallOpenGLDebugMessageCallback, arg, size ); -} - static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst0( void *arg, ULONG size ) { return dispatch_callback( NtUserDriverCallbackFirst + 0, arg, size ); @@ -1528,8 +1523,6 @@ ntuser_callback user_callbacks[] = wow64_NtUserPostDDEMessage, wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, - /* OpenGL support */ - wow64_NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */ wow64_NtUserDriverCallbackFirst0, wow64_NtUserDriverCallbackFirst1, diff --git a/include/ntuser.h b/include/ntuser.h index 9ce3afdfa63..c8fbe4be57f 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -61,8 +61,6 @@ enum NtUserPostDDEMessage, NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, - /* OpenGL support */ - NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */ NtUserDriverCallbackFirst, NtUserDriverCallbackLast = NtUserDriverCallbackFirst + 9,