opengl32: Add wrappers for glDebugMessageCallback to handle calling convention differences.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=38402
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Sebastian Lackner 2018-10-05 04:20:30 +00:00 committed by Alexandre Julliard
parent d900547f58
commit e07230ed4e
4 changed files with 107 additions and 21 deletions

View file

@ -416,6 +416,9 @@ sub needs_wrapper($$)
my %funcs =
(
"glDebugEntry" => 1,
"glDebugMessageCallback" => 1,
"glDebugMessageCallbackAMD" => 1,
"glDebugMessageCallbackARB" => 1,
"glGetIntegerv" => 1,
"glGetString" => 1,
"glGetStringi" => 1,

View file

@ -2327,27 +2327,6 @@ static void WINAPI glCurrentPaletteMatrixARB( GLint index )
funcs->ext.p_glCurrentPaletteMatrixARB( index );
}
static void WINAPI glDebugMessageCallback( GLDEBUGPROC callback, const void *userParam )
{
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
TRACE( "(%p, %p)\n", callback, userParam );
funcs->ext.p_glDebugMessageCallback( callback, userParam );
}
static void WINAPI glDebugMessageCallbackAMD( GLDEBUGPROCAMD callback, void *userParam )
{
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
TRACE( "(%p, %p)\n", callback, userParam );
funcs->ext.p_glDebugMessageCallbackAMD( callback, userParam );
}
static void WINAPI glDebugMessageCallbackARB( GLDEBUGPROCARB callback, const void *userParam )
{
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
TRACE( "(%p, %p)\n", callback, userParam );
funcs->ext.p_glDebugMessageCallbackARB( callback, userParam );
}
static void WINAPI glDebugMessageControl( GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled )
{
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
@ -18686,6 +18665,9 @@ static BOOL WINAPI wglSwapIntervalEXT( int interval )
return funcs->ext.p_wglSwapIntervalEXT( interval );
}
extern void WINAPI glDebugMessageCallback( GLDEBUGPROC callback, const void *userParam ) DECLSPEC_HIDDEN;
extern void WINAPI glDebugMessageCallbackAMD( GLDEBUGPROCAMD callback, void *userParam ) DECLSPEC_HIDDEN;
extern void WINAPI glDebugMessageCallbackARB( GLDEBUGPROCARB callback, const void *userParam ) DECLSPEC_HIDDEN;
extern const GLubyte * WINAPI glGetStringi( GLenum name, GLuint index ) DECLSPEC_HIDDEN;
extern BOOL WINAPI wglBindTexImageARB( HPBUFFERARB hPbuffer, int iBuffer ) DECLSPEC_HIDDEN;
extern HGLRC WINAPI wglCreateContextAttribsARB( HDC hDC, HGLRC hShareContext, const int *attribList ) DECLSPEC_HIDDEN;

View file

@ -48,6 +48,11 @@ static HDC (WINAPI *pwglGetPbufferDCARB)(HPBUFFERARB);
static BOOL (WINAPI *pwglSwapIntervalEXT)(int interval);
static int (WINAPI *pwglGetSwapIntervalEXT)(void);
/* GL_ARB_debug_output */
static void (WINAPI *pglDebugMessageCallbackARB)(void *, void *);
static void (WINAPI *pglDebugMessageControlARB)(GLenum, GLenum, GLenum, GLsizei, const GLuint *, GLboolean);
static void (WINAPI *pglDebugMessageInsertARB)(GLenum, GLenum, GLuint, GLenum, GLsizei, const char *);
static const char* wgl_extensions = NULL;
static void init_functions(void)
@ -80,6 +85,11 @@ static void init_functions(void)
GET_PROC(wglSwapIntervalEXT)
GET_PROC(wglGetSwapIntervalEXT)
/* GL_ARB_debug_output */
GET_PROC(glDebugMessageCallbackARB)
GET_PROC(glDebugMessageControlARB)
GET_PROC(glDebugMessageInsertARB)
#undef GET_PROC
}
@ -305,6 +315,39 @@ static void test_choosepixelformat(void)
pfd.cAuxBuffers = 0;
}
static void WINAPI gl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar *message, const void *userParam)
{
DWORD *count = (DWORD *)userParam;
(*count)++;
}
static void test_debug_message_callback(void)
{
static const char testmsg[] = "Hello World";
DWORD count;
if (!pglDebugMessageCallbackARB)
{
skip("glDebugMessageCallbackARB not supported\n");
return;
}
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
pglDebugMessageCallbackARB(gl_debug_message_callback, &count);
pglDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
count = 0;
pglDebugMessageInsertARB(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, 0x42424242,
GL_DEBUG_SEVERITY_LOW, sizeof(testmsg), testmsg);
ok(count == 1, "expected count == 1, got %u\n", count);
glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDisable(GL_DEBUG_OUTPUT);
}
static void test_setpixelformat(HDC winhdc)
{
int res = 0;
@ -1786,6 +1829,7 @@ START_TEST(opengl)
}
test_choosepixelformat();
test_debug_message_callback();
test_setpixelformat(hdc);
test_destroy(hdc);
test_sharelists(hdc);

View file

@ -58,6 +58,9 @@ struct opengl_context
DWORD tid; /* thread that the context is current in */
HDC draw_dc; /* current drawing DC */
HDC read_dc; /* current reading DC */
void (CALLBACK *debug_callback)(GLenum, GLenum, GLuint, GLenum,
GLsizei, const GLchar *, const void *); /* debug callback */
const void *debug_user; /* debug user parameter */
GLubyte *extensions; /* extension string */
GLuint *disabled_exts; /* indices of disabled extensions */
struct wgl_context *drv_ctx; /* driver context */
@ -1746,6 +1749,60 @@ const GLubyte * WINAPI glGetString( GLenum name )
return ret;
}
/* wrapper for glDebugMessageCallback* functions */
static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar *message,const void *userParam )
{
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 );
}
/***********************************************************************
* glDebugMessageCallback
*/
void WINAPI glDebugMessageCallback( GLDEBUGPROC callback, const void *userParam )
{
struct wgl_handle *ptr = get_current_context_ptr();
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
TRACE( "(%p, %p)\n", callback, userParam );
ptr->u.context->debug_callback = callback;
ptr->u.context->debug_user = userParam;
funcs->ext.p_glDebugMessageCallback( gl_debug_message_callback, ptr );
}
/***********************************************************************
* glDebugMessageCallbackAMD
*/
void WINAPI glDebugMessageCallbackAMD( GLDEBUGPROCAMD callback, void *userParam )
{
struct wgl_handle *ptr = get_current_context_ptr();
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
TRACE( "(%p, %p)\n", callback, userParam );
ptr->u.context->debug_callback = callback;
ptr->u.context->debug_user = userParam;
funcs->ext.p_glDebugMessageCallbackAMD( gl_debug_message_callback, ptr );
}
/***********************************************************************
* glDebugMessageCallbackARB
*/
void WINAPI glDebugMessageCallbackARB( GLDEBUGPROCARB callback, const void *userParam )
{
struct wgl_handle *ptr = get_current_context_ptr();
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
TRACE( "(%p, %p)\n", callback, userParam );
ptr->u.context->debug_callback = callback;
ptr->u.context->debug_user = userParam;
funcs->ext.p_glDebugMessageCallbackARB( gl_debug_message_callback, ptr );
}
/***********************************************************************
* OpenGL initialisation routine
*/