From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 9 +++++++-- dlls/opengl32/unix_thunks.c | 32 +++++++++++++++++++++++++++-- dlls/opengl32/unix_thunks.h | 6 ++---- dlls/opengl32/unix_wgl.c | 40 ++++++++++++------------------------- 4 files changed, 52 insertions(+), 35 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 25c9f27d4db..bda6934a6c5 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -214,8 +214,6 @@ my %manual_unix_thunks = ); my %manual_wow64_thunks = ( - "glGetBufferPointerv" => 1, - "glGetBufferPointervARB" => 1, "glGetNamedBufferPointerv" => 1, "glGetNamedBufferPointervEXT" => 1, "glPathGlyphIndexRangeNV" => 1, @@ -229,6 +227,8 @@ my %manual_wow64_wrappers = "glClientWaitSync" => 0, "glDeleteSync" => 0, "glFenceSync" => 0, + "glGetBufferPointerv" => 0, + "glGetBufferPointervARB" => 0, "glGetSynciv" => 0, "glIsSync" => 0, "glMapBuffer" => 1, @@ -554,6 +554,11 @@ sub generate_wrapper_declaration($$$) { my $ptype = get_arg_type( $arg ); my $pname = get_arg_name( $arg ); + if ($is_wow64 && ($ptype =~ /*.**/ || $ptype =~ /(sizei|int)ptr.**/)) + { + $ret .= " PTR32 *$pname,"; + next; + } $ret .= " " . $arg->textContent() . ","; } $ret .= " PTR32 *client_ptr," if $manual_wow64_wrappers{$name}; diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index c394f36bec3..e21c0743ae9 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -8736,7 +8736,7 @@ static NTSTATUS ext_glGetBufferParameterui64vNV( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glGetBufferPointerv( void *args ) +static NTSTATUS ext_glGetBufferPointerv( void *args ) { struct glGetBufferPointerv_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -8744,7 +8744,7 @@ NTSTATUS ext_glGetBufferPointerv( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glGetBufferPointervARB( void *args ) +static NTSTATUS ext_glGetBufferPointervARB( void *args ) { struct glGetBufferPointervARB_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -45543,6 +45543,34 @@ static NTSTATUS wow64_ext_glGetBufferParameterui64vNV( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glGetBufferPointerv( void *args ) +{ + struct + { + PTR32 teb; + GLenum target; + GLenum pname; + PTR32 params; + } *params = args; + TEB *teb = get_teb64( params->teb ); + wow64_glGetBufferPointerv( teb, params->target, params->pname, ULongToPtr(params->params) ); + return STATUS_SUCCESS; +} + +static NTSTATUS wow64_ext_glGetBufferPointervARB( void *args ) +{ + struct + { + PTR32 teb; + GLenum target; + GLenum pname; + PTR32 params; + } *params = args; + TEB *teb = get_teb64( params->teb ); + wow64_glGetBufferPointervARB( teb, params->target, params->pname, ULongToPtr(params->params) ); + return STATUS_SUCCESS; +} + static NTSTATUS wow64_ext_glGetBufferSubData( void *args ) { struct diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 4b97e1d56ed..b3997574f95 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -35,6 +35,8 @@ typedef ULONG PTR32; extern GLenum wow64_glClientWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ); extern void wow64_glDeleteSync( TEB *teb, GLsync sync ); extern GLsync wow64_glFenceSync( TEB *teb, GLenum condition, GLbitfield flags ); +extern void wow64_glGetBufferPointerv( TEB *teb, GLenum target, GLenum pname, PTR32 *params ); +extern void wow64_glGetBufferPointervARB( TEB *teb, GLenum target, GLenum pname, PTR32 *params ); extern void wow64_glGetSynciv( TEB *teb, GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values ); extern GLboolean wow64_glIsSync( TEB *teb, GLsync sync ); extern PTR32 wow64_glMapBuffer( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ); @@ -53,10 +55,6 @@ extern void wow64_glWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64
extern NTSTATUS wgl_wglGetProcAddress( void *args ); extern NTSTATUS wow64_wgl_wglGetProcAddress( void *args ); -extern NTSTATUS ext_glGetBufferPointerv( void *args ); -extern NTSTATUS wow64_ext_glGetBufferPointerv( void *args ); -extern NTSTATUS ext_glGetBufferPointervARB( void *args ); -extern NTSTATUS wow64_ext_glGetBufferPointervARB( void *args ); extern NTSTATUS ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS ext_glGetNamedBufferPointervEXT( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 1dd29481500..f1e644a9cd4 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1724,41 +1724,27 @@ static PTR32 wow64_unmap_buffer( void *ptr, SIZE_T size, GLbitfield access ) return PtrToUlong( wow_ptr ); }
-static NTSTATUS wow64_gl_get_buffer_pointer_v( void *args, NTSTATUS (*get_buffer_pointer_v64)(void *) ) +static void wow64_gl_get_buffer_pointer_v( GLenum pname, PTR32 *ptr, PTR32 *wow_ptr ) { - PTR32 *ptr; /* pointer to the buffer data, where we saved the wow64 pointer */ - struct - { - PTR32 teb; - GLenum target; - GLenum pname; - PTR32 params; - } *params32 = args; - struct glGetBufferPointerv_params params = - { - .teb = get_teb64(params32->teb), - .target = params32->target, - .pname = params32->pname, - .params = (void **)&ptr, - }; - PTR32 *wow_ptr = UlongToPtr(params32->params); - NTSTATUS status; - - if ((status = get_buffer_pointer_v64( ¶ms ))) return status; - if (params.pname != GL_BUFFER_MAP_POINTER) return STATUS_NOT_IMPLEMENTED; - if (ULongToPtr(*wow_ptr = PtrToUlong(ptr)) == ptr) return STATUS_SUCCESS; /* we're lucky */ + if (pname != GL_BUFFER_MAP_POINTER) return; + if (ULongToPtr(*wow_ptr = PtrToUlong(ptr)) == ptr) return; /* we're lucky */ *wow_ptr = ptr[0]; - return STATUS_SUCCESS; }
-NTSTATUS wow64_ext_glGetBufferPointerv( void *args ) +void wow64_glGetBufferPointerv( TEB *teb, GLenum target, GLenum pname, PTR32 *params ) { - return wow64_gl_get_buffer_pointer_v( args, ext_glGetBufferPointerv ); + const struct opengl_funcs *funcs = teb->glTable; + void *ptr; + funcs->p_glGetBufferPointerv( target, pname, &ptr ); + return wow64_gl_get_buffer_pointer_v( pname, ptr, params ); }
-NTSTATUS wow64_ext_glGetBufferPointervARB( void *args ) +void wow64_glGetBufferPointervARB( TEB *teb, GLenum target, GLenum pname, PTR32 *params ) { - return wow64_gl_get_buffer_pointer_v( args, ext_glGetBufferPointervARB ); + const struct opengl_funcs *funcs = teb->glTable; + void *ptr; + funcs->p_glGetBufferPointervARB( target, pname, &ptr ); + return wow64_gl_get_buffer_pointer_v( pname, ptr, params ); }
static NTSTATUS wow64_gl_get_named_buffer_pointer_v( void *args, NTSTATUS (*gl_get_named_buffer_pointer_v64)(void *) )