Module: wine Branch: master Commit: dec91f063122ce08c25eade1d51f2e36a59326aa URL: https://gitlab.winehq.org/wine/wine/-/commit/dec91f063122ce08c25eade1d51f2e3...
Author: Rémi Bernon rbernon@codeweavers.com Date: Thu Oct 6 03:55:54 2022 +0200
opengl32: Introduce a new NtUserCallOpenGLDebugMessageCallback callback.
---
dlls/opengl32/wgl.c | 57 +++++++++++++++++++++++++++++++++++++++++++--------- dlls/wow64win/user.c | 8 ++++++++ include/ntuser.h | 2 ++ 3 files changed, 57 insertions(+), 10 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 987fa36ce2a..cf0b8e0330f 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -22,25 +22,19 @@
#include <stdarg.h> #include <stdlib.h> -#include <string.h> -#include <sys/types.h> #include <math.h>
#include "ntstatus.h" #define WIN32_NO_STATUS #include "windef.h" #include "winbase.h" -#include "winuser.h" #include "winreg.h" -#include "wingdi.h" -#include "winternl.h" -#include "winnt.h" +#include "ntuser.h"
#include "opengl_ext.h"
#include "unixlib.h"
-#include "wine/gdi_driver.h" #include "wine/glu.h" #include "wine/debug.h"
@@ -1714,12 +1708,50 @@ const GLubyte * WINAPI glGetString( GLenum name ) }
/* wrapper for glDebugMessageCallback* functions */ +typedef void (WINAPI *gl_debug_cb)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *, const void *); + +struct wine_gl_debug_message_params +{ + gl_debug_cb user_callback; + const void *user_data; + + GLenum source; + GLenum type; + GLuint id; + GLenum severity; + GLsizei length; + const GLchar *message; +}; + +static BOOL WINAPI call_opengl_debug_message_callback( struct wine_gl_debug_message_params *params, ULONG size ) +{ + params->user_callback( params->source, params->type, params->id, params->severity, + params->length, params->message, params->user_data ); + return TRUE; +} + static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GLenum severity, - GLsizei length, const GLchar *message,const void *userParam ) + GLsizei length, const GLchar *message, const void *userParam ) { + struct wine_gl_debug_message_params params = + { + .source = source, + .type = type, + .id = id, + .severity = severity, + .length = length, + .message = message, + }; + void **kernel_callback_table; + BOOL (WINAPI *callback)( struct wine_gl_debug_message_params *params, ULONG size ); + struct wgl_handle *ptr = (struct wgl_handle *)userParam; - if (!ptr->u.context->debug_callback) return; - ptr->u.context->debug_callback( source, type, id, severity, length, message, ptr->u.context->debug_user ); + if (!(params.user_callback = ptr->u.context->debug_callback)) return; + params.user_data = ptr->u.context->debug_user; + + kernel_callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; + callback = kernel_callback_table[NtUserCallOpenGLDebugMessageCallback]; + callback( ¶ms, sizeof(params) ); }
/*********************************************************************** @@ -1772,10 +1804,15 @@ void WINAPI glDebugMessageCallbackARB( GLDEBUGPROCARB callback, const void *user */ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) { + void **kernel_callback_table; + switch(reason) { case DLL_PROCESS_ATTACH: NtCurrentTeb()->glTable = &null_opengl_funcs; + + kernel_callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; + kernel_callback_table[NtUserCallOpenGLDebugMessageCallback] = call_opengl_debug_message_callback; break; case DLL_THREAD_ATTACH: NtCurrentTeb()->glTable = &null_opengl_funcs; diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index e1454347ecf..79f85d45834 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1008,6 +1008,12 @@ static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugUtilsCallback( void *arg, ULON return 0; }
+static NTSTATUS WINAPI wow64_NtUserCallOpenGLDebugMessageCallback( void *arg, ULONG size ) +{ + FIXME( "\n" ); + return 0; +} + static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst0( void *arg, ULONG size ) { return dispatch_callback( NtUserDriverCallbackFirst + 0, arg, size ); @@ -1085,6 +1091,8 @@ user_callback user_callbacks[] = /* Vulkan support */ wow64_NtUserCallVulkanDebugReportCallback, wow64_NtUserCallVulkanDebugUtilsCallback, + /* OpenGL support */ + wow64_NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */ wow64_NtUserDriverCallbackFirst0, wow64_NtUserDriverCallbackFirst1, diff --git a/include/ntuser.h b/include/ntuser.h index 7759f2b3174..0e14ee3ccb0 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -52,6 +52,8 @@ enum /* Vulkan support */ NtUserCallVulkanDebugReportCallback, NtUserCallVulkanDebugUtilsCallback, + /* OpenGL support */ + NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */ NtUserDriverCallbackFirst, NtUserDriverCallbackLast = NtUserDriverCallbackFirst + 9,