From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 30 +++++++++++++++++++-------- dlls/opengl32/unix_thunks.c | 34 ++++++++++++++++++++++++++++-- dlls/opengl32/unix_thunks.h | 6 ++---- dlls/opengl32/unix_wgl.c | 41 ++++++++++++++----------------------- dlls/opengl32/unixlib.h | 6 ++++++ dlls/opengl32/wgl.c | 23 +++++---------------- 6 files changed, 81 insertions(+), 59 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index b922acb7455..b126e6b14b8 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -226,8 +226,6 @@ my %manual_wow64_thunks = "glMapNamedBufferRange" => 1, "glMapNamedBufferRangeEXT" => 1, "glPathGlyphIndexRangeNV" => 1, - "glUnmapBuffer" => 1, - "glUnmapBufferARB" => 1, "glUnmapNamedBuffer" => 1, "glUnmapNamedBufferEXT" => 1, "wglCreatePbufferARB" => 1, @@ -237,12 +235,14 @@ my %manual_wow64_thunks = ); my %manual_wow64_wrappers = ( - "glClientWaitSync" => 1, - "glDeleteSync" => 1, - "glFenceSync" => 1, - "glGetSynciv" => 1, - "glIsSync" => 1, - "glWaitSync" => 1, + "glClientWaitSync" => 0, + "glDeleteSync" => 0, + "glFenceSync" => 0, + "glGetSynciv" => 0, + "glIsSync" => 0, + "glUnmapBuffer" => 1, + "glUnmapBufferARB" => 1, + "glWaitSync" => 0, ); my %pointer_array_count = ( @@ -455,6 +455,11 @@ sub generate_unix_thunk($$$$) $need_manual_thunk = 1 if $ret_type =~ /(GLsync|PROC|GLintptr|*)/; } } + if ($manual_wow64_wrappers{$name}) + { + $ret .= " PTR32 client_ptr;\n"; + $call_args .= " ¶ms->client_ptr,"; + } $ret .= " } *params = args;\n"; if (!$need_wrap && $need_manual_thunk) { @@ -542,7 +547,13 @@ sub generate_wrapper_declaration($$$) my $decl_args = get_func_args( $func, 0 ); $ret .= $is_wow64 ? " wow64_" : " wrap_"; $ret .= "$name( TEB *teb,"; - $ret .= $decl_args unless $decl_args eq "void"; + foreach my $arg (@{$func->[1]}) + { + my $ptype = get_arg_type( $arg ); + my $pname = get_arg_name( $arg ); + $ret .= " " . $arg->textContent() . ","; + } + $ret .= " PTR32 *client_ptr," if $manual_wow64_wrappers{$name}; $ret =~ s/,$/ /; $ret .= ");\n"; return $ret; @@ -646,6 +657,7 @@ sub generate_func_params($$) $ret .= sprintf " %s;\n", $arg->textContent(); } $ret .= sprintf " %sret;\n", $func->[0]->textContent() unless is_void_func($func); + $ret .= "#ifndef _WIN64\n void *client_ptr;\n#endif\n" if $manual_wow64_wrappers{$name}; $ret .= "};\n\n"; return $ret; } diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 257685179d3..5a003b3260c 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -22681,7 +22681,7 @@ static NTSTATUS ext_glUnlockArraysEXT( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glUnmapBuffer( void *args ) +static NTSTATUS ext_glUnmapBuffer( void *args ) { struct glUnmapBuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -22690,7 +22690,7 @@ NTSTATUS ext_glUnmapBuffer( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glUnmapBufferARB( void *args ) +static NTSTATUS ext_glUnmapBufferARB( void *args ) { struct glUnmapBufferARB_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -71438,6 +71438,36 @@ static NTSTATUS wow64_ext_glUnlockArraysEXT( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glUnmapBuffer( void *args ) +{ + struct + { + PTR32 teb; + GLenum target; + GLboolean ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glUnmapBuffer( teb, params->target, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + +static NTSTATUS wow64_ext_glUnmapBufferARB( void *args ) +{ + struct + { + PTR32 teb; + GLenum target; + GLboolean ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glUnmapBufferARB( teb, params->target, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + static NTSTATUS wow64_ext_glUnmapObjectBufferATI( void *args ) { struct diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 93c6271ec98..a756f33d8f4 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -37,6 +37,8 @@ extern void wow64_glDeleteSync( TEB *teb, GLsync sync ); extern GLsync wow64_glFenceSync( TEB *teb, GLenum condition, GLbitfield flags ); 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 GLboolean wow64_glUnmapBuffer( TEB *teb, GLenum target, PTR32 *client_ptr ); +extern GLboolean wow64_glUnmapBufferARB( TEB *teb, GLenum target, PTR32 *client_ptr ); extern void wow64_glWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ); #endif
@@ -66,10 +68,6 @@ extern NTSTATUS ext_glMapNamedBufferRangeEXT( void *args ); extern NTSTATUS wow64_ext_glMapNamedBufferRangeEXT( void *args ); extern NTSTATUS ext_glPathGlyphIndexRangeNV( void *args ); extern NTSTATUS wow64_ext_glPathGlyphIndexRangeNV( void *args ); -extern NTSTATUS ext_glUnmapBuffer( void *args ); -extern NTSTATUS wow64_ext_glUnmapBuffer( void *args ); -extern NTSTATUS ext_glUnmapBufferARB( void *args ); -extern NTSTATUS wow64_ext_glUnmapBufferARB( void *args ); extern NTSTATUS ext_glUnmapNamedBuffer( void *args ); extern NTSTATUS wow64_ext_glUnmapNamedBuffer( void *args ); extern NTSTATUS ext_glUnmapNamedBufferEXT( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 62008cce91d..7ed81790aaf 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1950,41 +1950,30 @@ NTSTATUS wow64_ext_glMapNamedBufferRangeEXT( void *args ) return wow64_gl_map_named_buffer_range( args, ext_glMapNamedBufferRangeEXT ); }
-static NTSTATUS wow64_gl_unmap_buffer( void *args, NTSTATUS (*gl_unmap_buffer64)(void *) ) +static PTR32 wow64_unmap_client_buffer( TEB *teb, GLenum target ) { - PTR32 *ptr; - struct - { - PTR32 teb; - GLenum target; - GLboolean ret; - } *params32 = args; - struct glUnmapBuffer_params params = - { - .teb = get_teb64(params32->teb), - .target = params32->target, - .ret = TRUE, - }; - NTSTATUS status; + PTR32 *ptr, ret;
- if (!(ptr = get_buffer_pointer( params.teb, params.target ))) return STATUS_SUCCESS; - - status = wow64_unmap_buffer( ptr, get_buffer_param( params.teb, params.target, GL_BUFFER_MAP_LENGTH ), - get_buffer_param( params.teb, params.target, GL_BUFFER_ACCESS_FLAGS ) ); - gl_unmap_buffer64( ¶ms ); - params32->ret = params.ret; + if (!(ptr = get_buffer_pointer( teb, target ))) return 0; + ret = *ptr;
- return status; + wow64_unmap_buffer( ptr, get_buffer_param( teb, target, GL_BUFFER_MAP_LENGTH ), + get_buffer_param( teb, target, GL_BUFFER_ACCESS_FLAGS ) ); + return ret; }
-NTSTATUS wow64_ext_glUnmapBuffer( void *args ) +GLboolean wow64_glUnmapBuffer( TEB *teb, GLenum target, PTR32 *client_ptr ) { - return wow64_gl_unmap_buffer( args, ext_glUnmapBuffer ); + const struct opengl_funcs *funcs = teb->glTable; + *client_ptr = wow64_unmap_client_buffer( teb, target ); + return funcs->p_glUnmapBuffer( target ); }
-NTSTATUS wow64_ext_glUnmapBufferARB( void *args ) +GLboolean wow64_glUnmapBufferARB( TEB *teb, GLenum target, PTR32 *client_ptr ) { - return wow64_gl_unmap_buffer( args, ext_glUnmapBufferARB ); + const struct opengl_funcs *funcs = teb->glTable; + *client_ptr = wow64_unmap_client_buffer( teb, target ); + return funcs->p_glUnmapBuffer( target ); }
static NTSTATUS wow64_gl_unmap_named_buffer( void *args, NTSTATUS (*gl_unmap_named_buffer64)(void *) ) diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index 0bac7adee89..d031d97a183 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -21712,6 +21712,9 @@ struct glUnmapBuffer_params TEB *teb; GLenum target; GLboolean ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glUnmapBufferARB_params @@ -21719,6 +21722,9 @@ struct glUnmapBufferARB_params TEB *teb; GLenum target; GLboolean ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glUnmapNamedBuffer_params diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index b24225684e0..8f2cab94d64 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1678,15 +1678,6 @@ const GLchar * WINAPI wglQueryRendererStringWINE( HDC dc, GLint renderer, GLenum }
#ifndef _WIN64 -static void *get_buffer_pointer( GLenum target ) -{ - void (WINAPI *p_glGetBufferPointerv)( GLenum target, GLenum pname, void **params ); - void *ptr; - if (!(p_glGetBufferPointerv = (void *)wglGetProcAddress( "glGetBufferPointerv" ))) return 0; - p_glGetBufferPointerv( target, GL_BUFFER_MAP_POINTER, &ptr ); - return ptr; -} - static void *get_named_buffer_pointer( GLint buffer ) { void (WINAPI *p_glGetNamedBufferPointerv)( GLuint buffer, GLenum pname, void **params ); @@ -1843,22 +1834,18 @@ static GLboolean gl_unmap_buffer( enum unix_funcs code, GLenum target ) .target = target, }; NTSTATUS status; -#ifndef _WIN64 - void *ptr = get_buffer_pointer( target ); -#endif
TRACE( "target %d\n", target );
- if (!(status = WINE_UNIX_CALL( code, &args ))) return args.ret; + status = WINE_UNIX_CALL( code, &args ); #ifndef _WIN64 - if (status == STATUS_INVALID_ADDRESS) + if (args.client_ptr) { - TRACE( "Releasing wow64 copy buffer %p\n", ptr ); - _aligned_free( ptr ); - return args.ret; + TRACE( "Releasing wow64 copy buffer %p\n", args.client_ptr ); + _aligned_free( args.client_ptr ); } #endif - WARN( "glUnmapBuffer returned %#lx\n", status ); + if (status) WARN( "glUnmapBuffer returned %#lx\n", status ); return args.ret; }