From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 51 +++++++++++++++++++++++++++++-------- dlls/opengl32/unix_thunks.c | 20 ++++++++++++++- dlls/opengl32/unix_thunks.h | 6 +++-- dlls/opengl32/unix_wgl.c | 33 +++--------------------- 4 files changed, 67 insertions(+), 43 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 7cd773c8e30..53f2f9fad8f 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -214,7 +214,6 @@ my %manual_unix_thunks = ); my %manual_wow64_thunks = ( - "glClientWaitSync" => 1, "glDeleteSync" => 1, "glFenceSync" => 1, "glGetBufferPointerv" => 1, @@ -247,6 +246,10 @@ my %manual_wow64_thunks = "wglQueryCurrentRendererStringWINE" => 1, "wglQueryRendererStringWINE" => 1, ); +my %manual_wow64_wrappers = + ( + "glClientWaitSync" => 1, + ); my %pointer_array_count = ( "glCompileShaderIncludeARB" => "count", @@ -363,7 +366,8 @@ sub generate_unix_thunk($$$$) { my ($name, $func, $is_wow64, $prefix) = @_; my $func_ret = get_func_ret( $func, 0 ); - my $need_wrap = needs_wrapper( $name, $func ); + my $manual_wow64_wrapper = $is_wow64 && defined $manual_wow64_wrappers{$name}; + my $need_wrap = $manual_wow64_wrapper || needs_wrapper( $name, $func ); my $need_lock = $func_ret =~ /HGLRC|HPBUFFERARB/; my $teb = $is_wow64 ? "teb" : "params->teb"; my $input_conv = ""; @@ -434,6 +438,7 @@ sub generate_unix_thunk($$$$) { $call_args .= " ULongToPtr(params->$pname),"; $need_manual_thunk = 1 if $arg->textContent() =~ /(*.**|[|(sizei|int)ptr.**)/; + $need_lock = 1 if $arg->textContent() =~ /GLsync/; } } if (!is_void_func($func)) @@ -442,7 +447,7 @@ sub generate_unix_thunk($$$$) $ret .= " $ptype ret;\n"; } $ret .= " } *params = args;\n"; - if ($need_manual_thunk || $func->[0]->textContent() =~ /(GLsync|PROC|GLintptr|*)/) + if (!$need_wrap && ($need_manual_thunk || $func->[0]->textContent() =~ /(GLsync|PROC|GLintptr|*)/)) { $ret .= " FIXME( "params %p stub!\n", params );\n"; $ret .= " return STATUS_NOT_IMPLEMENTED;\n"; @@ -488,7 +493,11 @@ sub generate_unix_thunk($$$$) $ret .= "(UINT_PTR)" if $is_wow64 && get_wow64_arg_type( $func->[0] ) =~ /PTR32/; } $call_args =~ s/,$/ /; - if ($need_wrap) + if ($manual_wow64_wrapper) + { + $ret .= "wow64_$name($call_args);\n"; + } + elsif ($need_wrap) { $ret .= "wrap_$name($call_args);\n"; } @@ -522,12 +531,13 @@ sub generate_unix_thunk($$$$) return $ret; }
-sub generate_wrapper_declaration($$) +sub generate_wrapper_declaration($$$) { - my ($name, $func) = @_; + my ($name, $func, $is_wow64) = @_; my $ret = "extern " . get_func_ret( $func, 0 ); my $decl_args = get_func_args( $func, 0 ); - $ret .= " wrap_$name( TEB *teb"; + $ret .= $is_wow64 ? " wow64_" : " wrap_"; + $ret .= "$name( TEB *teb"; $ret .= " ,$decl_args" unless $decl_args eq "void"; $ret .= ");\n"; return $ret; @@ -1284,21 +1294,40 @@ print OUT "/* Automatically generated from http://www.opengl.org/registry files; foreach (sort keys %wgl_functions) { next if !needs_wrapper( $_, $wgl_functions{$_} ); - print OUT generate_wrapper_declaration($_, $wgl_functions{$_}); + print OUT generate_wrapper_declaration($_, $wgl_functions{$_}, 0); } foreach (sort keys %norm_functions) { next if !needs_wrapper( $_, $norm_functions{$_} ); - print OUT generate_wrapper_declaration($_, $norm_functions{$_}); + print OUT generate_wrapper_declaration($_, $norm_functions{$_}, 0); } foreach (sort keys %ext_functions) { next if $_ =~ /^egl/; # unix-side only API next if !needs_wrapper( $_, $ext_functions{$_} ); - print OUT generate_wrapper_declaration($_, $ext_functions{$_}); + print OUT generate_wrapper_declaration($_, $ext_functions{$_}, 0); }
-print OUT "\n"; +print OUT "\n#ifdef _WIN64\n"; + +foreach (sort keys %wgl_functions) +{ + next unless defined $manual_wow64_wrappers{$_}; + print OUT generate_wrapper_declaration($_, $wgl_functions{$_}, 1); +} +foreach (sort keys %norm_functions) +{ + next unless defined $manual_wow64_wrappers{$_}; + print OUT generate_wrapper_declaration($_, $norm_functions{$_}, 1); +} +foreach (sort keys %ext_functions) +{ + next if $_ =~ /^egl/; # unix-side only API + next unless defined $manual_wow64_wrappers{$_}; + print OUT generate_wrapper_declaration($_, $ext_functions{$_}, 1); +} + +print OUT "#endif\n\n";
foreach (sort keys %wgl_functions) { diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index f544d723739..51c16726688 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -4669,7 +4669,7 @@ static NTSTATUS ext_glClientWaitSemaphoreui64NVX( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glClientWaitSync( void *args ) +static NTSTATUS ext_glClientWaitSync( void *args ) { struct glClientWaitSync_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -38000,6 +38000,24 @@ static NTSTATUS wow64_ext_glClientWaitSemaphoreui64NVX( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glClientWaitSync( void *args ) +{ + struct + { + PTR32 teb; + PTR32 sync; + GLbitfield flags; + GLuint64 timeout; + GLenum ret; + } *params = args; + TEB *teb = get_teb64( params->teb ); + pthread_mutex_lock( &wgl_lock ); + params->ret = wow64_glClientWaitSync( teb, ULongToPtr(params->sync), params->flags, params->timeout ); + pthread_mutex_unlock( &wgl_lock ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + static NTSTATUS wow64_ext_glClipControl( void *args ) { struct diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index c93c3dc34e7..990a6762693 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -30,12 +30,14 @@ extern int wrap_wglReleasePbufferDCARB( TEB *teb , HPBUFFERARB hPbuffer, HDC hDC extern BOOL wrap_wglReleaseTexImageARB( TEB *teb , HPBUFFERARB hPbuffer, int iBuffer ); extern BOOL wrap_wglSetPbufferAttribARB( TEB *teb , HPBUFFERARB hPbuffer, const int *piAttribList );
+#ifdef _WIN64 +extern GLenum wow64_glClientWaitSync( TEB *teb , GLsync sync, GLbitfield flags, GLuint64 timeout ); +#endif + extern NTSTATUS wgl_wglGetProcAddress( void *args ); extern NTSTATUS wow64_wgl_wglGetProcAddress( void *args ); extern NTSTATUS gl_glGetString( void *args ); extern NTSTATUS wow64_gl_glGetString( void *args ); -extern NTSTATUS ext_glClientWaitSync( void *args ); -extern NTSTATUS wow64_ext_glClientWaitSync( void *args ); extern NTSTATUS ext_glDeleteSync( void *args ); extern NTSTATUS wow64_ext_glDeleteSync( void *args ); extern NTSTATUS ext_glFenceSync( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 6560b0f3082..ebcf7ce5637 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1694,38 +1694,13 @@ NTSTATUS wow64_ext_wglQueryRendererStringWINE( void *args ) return STATUS_SUCCESS; }
-NTSTATUS wow64_ext_glClientWaitSync( void *args ) +GLenum wow64_glClientWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ) { + const struct opengl_funcs *funcs = teb->glTable; struct wgl_handle *handle; - struct - { - PTR32 teb; - PTR32 sync; - GLbitfield flags; - GLuint64 timeout; - GLenum ret; - } *params32 = args; - NTSTATUS status;
- pthread_mutex_lock( &wgl_lock ); - - if (!(handle = get_handle_ptr( ULongToPtr(params32->sync) ))) - status = STATUS_INVALID_HANDLE; - else - { - struct glClientWaitSync_params params = - { - .teb = get_teb64(params32->teb), - .sync = handle->u.sync, - .flags = params32->flags, - .timeout = params32->timeout, - }; - status = ext_glClientWaitSync( ¶ms ); - params32->ret = params.ret; - } - - pthread_mutex_unlock( &wgl_lock ); - return status; + if (!(handle = get_handle_ptr( sync ))) return GL_INVALID_VALUE; + return funcs->p_glClientWaitSync( handle->u.sync, flags, timeout ); }
NTSTATUS wow64_ext_glDeleteSync( void *args )