From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/opengl32/make_opengl | 44 ++++++++--- dlls/opengl32/private.h | 2 + dlls/opengl32/thunks.c | 38 ++++----- dlls/opengl32/unix_private.h | 6 ++ dlls/opengl32/unix_thunks.c | 100 +++++++++++------------- dlls/opengl32/unix_thunks.h | 8 -- dlls/opengl32/unix_wgl.c | 83 -------------------- dlls/opengl32/wgl.c | 147 +++++++++++++++++++++++++++++++++++ dlls/win32u/opengl.c | 67 +++++++++++----- include/wine/opengl_driver.h | 12 +++ include/wine/wgl.h | 17 ++-- 11 files changed, 315 insertions(+), 209 deletions(-) diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 1754ea4e971..e592a97b7d5 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -129,7 +129,6 @@ my %arg_types = my %remap_types = ( "HGLRC" => "struct wgl_context *", - "HPBUFFERARB" => "struct wgl_pbuffer *", ); my %khronos_types = @@ -174,6 +173,8 @@ my %manual_win_thunks = "glGetString" => 1, "glGetStringi" => 1, "wglChoosePixelFormatARB" => 1, + "wglCreatePbufferARB" => 1, + "wglDestroyPbufferARB" => 1, "wglGetExtensionsStringARB" => 1, "wglGetExtensionsStringEXT" => 1, "wglGetPixelFormat" => 1, @@ -424,6 +425,7 @@ sub get_func_args($$) my $pname = get_arg_name( $arg ); $ret .= " " . ($unix ? ConvertType( $arg ) : $arg->textContent()) . ","; } + $ret .= " HPBUFFERARB client_pbuffer," if $unix && $func->[0] =~ /HPBUFFERARB/; $ret =~ s/,$/ /; $ret ||= "void"; return $ret; @@ -443,13 +445,14 @@ sub generate_unix_thunk($$$$) my $func_ret = get_func_ret( $func, 0 ); 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 $need_lock = $func_ret =~ /HGLRC/; my $need_funcs = !$need_wrap || ($prefix eq "ext" && $name !~ /^wgl/); my $teb = $is_wow64 ? "teb" : "params->teb"; my $ret_stat = "return STATUS_SUCCESS;"; my $invalidation = ""; my $input_conv = ""; my $output_conv = ""; + my $use_pbuffer = 0; my $call_args = ""; my $ret_expr = ""; my $use_dc = 0; @@ -458,7 +461,7 @@ sub generate_unix_thunk($$$$) foreach my $arg (@{$func->[1]}) { - $need_lock = 1 if $arg->textContent() =~ /HGLRC|HPBUFFERARB/; + $need_lock = 1 if $arg->textContent() =~ /HGLRC/; } $ret .= "static NTSTATUS "; @@ -468,6 +471,7 @@ sub generate_unix_thunk($$$$) # special case for functions that take an HDC as first parameter $use_dc = @{$func->[1]} && get_arg_type( ${$func->[1]}[0] ) eq "HDC" && $name !~ /wglMake(Context)?Current/; + $use_pbuffer = @{$func->[1]} && get_arg_type( ${$func->[1]}[0] ) eq "HPBUFFERARB"; $ret_expr = "params->ret = " if !is_void_func( $func ); $call_args .= " $teb," if $need_wrap; @@ -520,6 +524,7 @@ sub generate_unix_thunk($$$$) $need_lock = 1 if $arg_type =~ /GLsync/; } } + $call_args .= " UlongToHandle( params->ret )," if $func_ret =~ /HPBUFFERARB/; if (!is_void_func($func)) { my $ret_type = get_arg_type( $func->[0] ); @@ -534,7 +539,7 @@ sub generate_unix_thunk($$$$) elsif ($ptype eq "PTR32") { $ret_expr .= "(UINT_PTR)"; - $need_manual_thunk = 1; + $need_manual_thunk = 1 if $func_ret !~ /HDC|HPBUFFERARB/; } } $ret .= " } *params = args;\n"; @@ -555,7 +560,7 @@ sub generate_unix_thunk($$$$) : " buffer = invalidate_buffer_target( $teb, params->target );\n"; $output_conv .= " if (buffer) free_buffer( funcs, buffer );\n"; } - $ret .= " TEB *teb = get_teb64( params->teb );\n" if $need_wrap || !$use_dc; + $ret .= " TEB *teb = get_teb64( params->teb );\n" if $need_wrap || (!$use_dc && !$use_pbuffer); } else { @@ -572,14 +577,17 @@ sub generate_unix_thunk($$$$) $call_args .= " params->$pname,"; } } + $call_args .= " params->ret," if $func_ret =~ /HPBUFFERARB/; $ret .= " struct $name\_params *params = args;\n"; } $ret .= $vars; - if ($use_dc) + if ($use_dc || $use_pbuffer) { my $param = "params->" . get_arg_name( ${$func->[1]}[0] ); $param = "ULongToPtr($param)" if $is_wow64; - $ret .= " const struct opengl_funcs *funcs = get_dc_funcs( $param );\n"; + $ret .= " const struct opengl_funcs *funcs = "; + $ret .= "get_dc_funcs( $param );\n" if $use_dc; + $ret .= "get_pbuffer_funcs( $param );\n" if $use_pbuffer; $ret .= " if (!funcs || !funcs->p_$name) return STATUS_NOT_IMPLEMENTED;\n"; } elsif ($need_funcs) @@ -661,17 +669,26 @@ sub generate_wrapper_declaration($$$) } $ret .= " " . $arg->textContent() . ","; } + $ret .= " HPBUFFERARB handle," if $ret_type =~ /HPBUFFERARB/; $ret =~ s/,$/ /; $ret .= ");\n"; return $ret; } +sub get_handle_function($) +{ + my $ptype = shift; + return "get_pbuffer_from_handle" if $ptype =~ /HPBUFFERARB/; + return 0; +} + sub generate_win_thunk($$) { my ($name, $func) = @_; my $decl_args = get_func_args( $func, 0 ); my $func_ret = get_func_ret( $func, 0 ); my $params = ""; + my $checks = ""; my $ret = ""; $ret .= "$func_ret WINAPI $name($decl_args)\n"; @@ -681,12 +698,22 @@ sub generate_win_thunk($$) foreach my $arg (@{$func->[1]}) { my $pname = get_arg_name( $arg ); - $params .= ", .$pname = $pname"; + my $ptype = get_arg_type( $arg ); + if (my $get_handle = get_handle_function( $ptype )) + { + my $retval = is_void_func($func) ? "return;" : "return 0;"; + $checks .= " if (!$get_handle( $pname, &args.$pname )) $retval\n"; + } + else + { + $params .= ", .$pname = $pname"; + } } $ret .= " = {$params }"; $ret .= ";\n"; $ret .= " NTSTATUS status;\n"; $ret .= " " . get_func_trace( $name, $func, 1 ) if $gen_traces; + $ret .= $checks; $ret .= " if ((status = UNIX_CALL( $name, &args ))) WARN( \"$name returned %#lx\\n\", status );\n"; $ret .= " return args.ret;\n" unless is_void_func($func); $ret .= "}\n"; @@ -1162,7 +1189,6 @@ print HEADER "#define EGL_CAST(t,x) ((t)(x))\n"; print HEADER "#endif\n\n"; print HEADER "struct wgl_context;\n"; -print HEADER "struct wgl_pbuffer;\n"; foreach (@gl_types) { diff --git a/dlls/opengl32/private.h b/dlls/opengl32/private.h index f40b6a2ba9a..3a1dc0cd433 100644 --- a/dlls/opengl32/private.h +++ b/dlls/opengl32/private.h @@ -27,9 +27,11 @@ #include "winbase.h" #include "winternl.h" #include "wingdi.h" +#include "wine/wgl.h" extern const void *extension_procs[]; extern int WINAPI wglDescribePixelFormat( HDC hdc, int ipfd, UINT cjpfd, PIXELFORMATDESCRIPTOR *ppfd ); +extern BOOL get_pbuffer_from_handle( HPBUFFERARB handle, HPBUFFERARB *obj ); #endif /* __WINE_OPENGL32_PRIVATE_H */ diff --git a/dlls/opengl32/thunks.c b/dlls/opengl32/thunks.c index fabe1da516b..bbf1070feab 100644 --- a/dlls/opengl32/thunks.c +++ b/dlls/opengl32/thunks.c @@ -24735,9 +24735,10 @@ static void * WINAPI wglAllocateMemoryNV( GLsizei size, GLfloat readfreq, GLfloa static BOOL WINAPI wglBindTexImageARB( HPBUFFERARB hPbuffer, int iBuffer ) { - struct wglBindTexImageARB_params args = { .teb = NtCurrentTeb(), .hPbuffer = hPbuffer, .iBuffer = iBuffer }; + struct wglBindTexImageARB_params args = { .teb = NtCurrentTeb(), .iBuffer = iBuffer }; NTSTATUS status; TRACE( "hPbuffer %p, iBuffer %d\n", hPbuffer, iBuffer ); + if (!get_pbuffer_from_handle( hPbuffer, &args.hPbuffer )) return 0; if ((status = UNIX_CALL( wglBindTexImageARB, &args ))) WARN( "wglBindTexImageARB returned %#lx\n", status ); return args.ret; } @@ -24751,24 +24752,6 @@ static HGLRC WINAPI wglCreateContextAttribsARB( HDC hDC, HGLRC hShareContext, co return args.ret; } -static HPBUFFERARB WINAPI wglCreatePbufferARB( HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList ) -{ - struct wglCreatePbufferARB_params args = { .teb = NtCurrentTeb(), .hDC = hDC, .iPixelFormat = iPixelFormat, .iWidth = iWidth, .iHeight = iHeight, .piAttribList = piAttribList }; - NTSTATUS status; - TRACE( "hDC %p, iPixelFormat %d, iWidth %d, iHeight %d, piAttribList %p\n", hDC, iPixelFormat, iWidth, iHeight, piAttribList ); - if ((status = UNIX_CALL( wglCreatePbufferARB, &args ))) WARN( "wglCreatePbufferARB returned %#lx\n", status ); - return args.ret; -} - -static BOOL WINAPI wglDestroyPbufferARB( HPBUFFERARB hPbuffer ) -{ - struct wglDestroyPbufferARB_params args = { .teb = NtCurrentTeb(), .hPbuffer = hPbuffer }; - NTSTATUS status; - TRACE( "hPbuffer %p\n", hPbuffer ); - if ((status = UNIX_CALL( wglDestroyPbufferARB, &args ))) WARN( "wglDestroyPbufferARB returned %#lx\n", status ); - return args.ret; -} - static void WINAPI wglFreeMemoryNV( void *pointer ) { struct wglFreeMemoryNV_params args = { .teb = NtCurrentTeb(), .pointer = pointer }; @@ -24779,9 +24762,10 @@ static void WINAPI wglFreeMemoryNV( void *pointer ) static HDC WINAPI wglGetPbufferDCARB( HPBUFFERARB hPbuffer ) { - struct wglGetPbufferDCARB_params args = { .teb = NtCurrentTeb(), .hPbuffer = hPbuffer }; + struct wglGetPbufferDCARB_params args = { .teb = NtCurrentTeb() }; NTSTATUS status; TRACE( "hPbuffer %p\n", hPbuffer ); + if (!get_pbuffer_from_handle( hPbuffer, &args.hPbuffer )) return 0; if ((status = UNIX_CALL( wglGetPbufferDCARB, &args ))) WARN( "wglGetPbufferDCARB returned %#lx\n", status ); return args.ret; } @@ -24815,9 +24799,10 @@ static BOOL WINAPI wglQueryCurrentRendererIntegerWINE( GLenum attribute, GLuint static BOOL WINAPI wglQueryPbufferARB( HPBUFFERARB hPbuffer, int iAttribute, int *piValue ) { - struct wglQueryPbufferARB_params args = { .teb = NtCurrentTeb(), .hPbuffer = hPbuffer, .iAttribute = iAttribute, .piValue = piValue }; + struct wglQueryPbufferARB_params args = { .teb = NtCurrentTeb(), .iAttribute = iAttribute, .piValue = piValue }; NTSTATUS status; TRACE( "hPbuffer %p, iAttribute %d, piValue %p\n", hPbuffer, iAttribute, piValue ); + if (!get_pbuffer_from_handle( hPbuffer, &args.hPbuffer )) return 0; if ((status = UNIX_CALL( wglQueryPbufferARB, &args ))) WARN( "wglQueryPbufferARB returned %#lx\n", status ); return args.ret; } @@ -24833,27 +24818,30 @@ static BOOL WINAPI wglQueryRendererIntegerWINE( HDC dc, GLint renderer, GLenum a static int WINAPI wglReleasePbufferDCARB( HPBUFFERARB hPbuffer, HDC hDC ) { - struct wglReleasePbufferDCARB_params args = { .teb = NtCurrentTeb(), .hPbuffer = hPbuffer, .hDC = hDC }; + struct wglReleasePbufferDCARB_params args = { .teb = NtCurrentTeb(), .hDC = hDC }; NTSTATUS status; TRACE( "hPbuffer %p, hDC %p\n", hPbuffer, hDC ); + if (!get_pbuffer_from_handle( hPbuffer, &args.hPbuffer )) return 0; if ((status = UNIX_CALL( wglReleasePbufferDCARB, &args ))) WARN( "wglReleasePbufferDCARB returned %#lx\n", status ); return args.ret; } static BOOL WINAPI wglReleaseTexImageARB( HPBUFFERARB hPbuffer, int iBuffer ) { - struct wglReleaseTexImageARB_params args = { .teb = NtCurrentTeb(), .hPbuffer = hPbuffer, .iBuffer = iBuffer }; + struct wglReleaseTexImageARB_params args = { .teb = NtCurrentTeb(), .iBuffer = iBuffer }; NTSTATUS status; TRACE( "hPbuffer %p, iBuffer %d\n", hPbuffer, iBuffer ); + if (!get_pbuffer_from_handle( hPbuffer, &args.hPbuffer )) return 0; if ((status = UNIX_CALL( wglReleaseTexImageARB, &args ))) WARN( "wglReleaseTexImageARB returned %#lx\n", status ); return args.ret; } static BOOL WINAPI wglSetPbufferAttribARB( HPBUFFERARB hPbuffer, const int *piAttribList ) { - struct wglSetPbufferAttribARB_params args = { .teb = NtCurrentTeb(), .hPbuffer = hPbuffer, .piAttribList = piAttribList }; + struct wglSetPbufferAttribARB_params args = { .teb = NtCurrentTeb(), .piAttribList = piAttribList }; NTSTATUS status; TRACE( "hPbuffer %p, piAttribList %p\n", hPbuffer, piAttribList ); + if (!get_pbuffer_from_handle( hPbuffer, &args.hPbuffer )) return 0; if ((status = UNIX_CALL( wglSetPbufferAttribARB, &args ))) WARN( "wglSetPbufferAttribARB returned %#lx\n", status ); return args.ret; } @@ -24878,6 +24866,8 @@ static BOOL WINAPI wglSwapIntervalEXT( int interval ) extern const GLubyte * WINAPI glGetStringi( GLenum name, GLuint index ); extern BOOL WINAPI wglChoosePixelFormatARB( HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats ); +extern HPBUFFERARB WINAPI wglCreatePbufferARB( HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList ); +extern BOOL WINAPI wglDestroyPbufferARB( HPBUFFERARB hPbuffer ); extern HDC WINAPI wglGetCurrentReadDCARB(void); extern const char * WINAPI wglGetExtensionsStringARB( HDC hdc ); extern const char * WINAPI wglGetExtensionsStringEXT(void); diff --git a/dlls/opengl32/unix_private.h b/dlls/opengl32/unix_private.h index ffae783ead2..a42445a0983 100644 --- a/dlls/opengl32/unix_private.h +++ b/dlls/opengl32/unix_private.h @@ -57,6 +57,12 @@ static inline const struct opengl_funcs *get_dc_funcs( HDC hdc ) return &null_opengl_funcs; } +static inline const struct opengl_funcs *get_pbuffer_funcs( HPBUFFERARB client_pbuffer ) +{ + struct opengl_client_pbuffer *client = opengl_client_pbuffer_from_client( client_pbuffer ); + return client_pbuffer ? (struct opengl_funcs *)(UINT_PTR)client->unix_funcs : NULL; +} + #ifdef _WIN64 static inline void *copy_wow64_ptr32s( UINT_PTR address, ULONG count ) diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 5461b8e42a4..5ef8612bb9a 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -30299,9 +30299,9 @@ static NTSTATUS ext_wglAllocateMemoryNV( void *args ) static NTSTATUS ext_wglBindTexImageARB( void *args ) { struct wglBindTexImageARB_params *params = args; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglBindTexImageARB( params->teb, params->hPbuffer, params->iBuffer ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( params->hPbuffer ); + if (!funcs || !funcs->p_wglBindTexImageARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglBindTexImageARB( params->hPbuffer, params->iBuffer ); return STATUS_SUCCESS; } @@ -30330,18 +30330,16 @@ static NTSTATUS ext_wglCreatePbufferARB( void *args ) struct wglCreatePbufferARB_params *params = args; const struct opengl_funcs *funcs = get_dc_funcs( params->hDC ); if (!funcs || !funcs->p_wglCreatePbufferARB) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglCreatePbufferARB( params->teb, params->hDC, params->iPixelFormat, params->iWidth, params->iHeight, params->piAttribList ); - pthread_mutex_unlock( &wgl_lock ); + params->ret = funcs->p_wglCreatePbufferARB( params->hDC, params->iPixelFormat, params->iWidth, params->iHeight, params->piAttribList, params->ret ); return STATUS_SUCCESS; } static NTSTATUS ext_wglDestroyPbufferARB( void *args ) { struct wglDestroyPbufferARB_params *params = args; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglDestroyPbufferARB( params->teb, params->hPbuffer ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( params->hPbuffer ); + if (!funcs || !funcs->p_wglDestroyPbufferARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglDestroyPbufferARB( params->hPbuffer ); return STATUS_SUCCESS; } @@ -30375,9 +30373,9 @@ static NTSTATUS ext_wglGetExtensionsStringEXT( void *args ) static NTSTATUS ext_wglGetPbufferDCARB( void *args ) { struct wglGetPbufferDCARB_params *params = args; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglGetPbufferDCARB( params->teb, params->hPbuffer ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( params->hPbuffer ); + if (!funcs || !funcs->p_wglGetPbufferDCARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglGetPbufferDCARB( params->hPbuffer ); return STATUS_SUCCESS; } @@ -30438,9 +30436,9 @@ static NTSTATUS ext_wglQueryCurrentRendererStringWINE( void *args ) static NTSTATUS ext_wglQueryPbufferARB( void *args ) { struct wglQueryPbufferARB_params *params = args; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglQueryPbufferARB( params->teb, params->hPbuffer, params->iAttribute, params->piValue ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( params->hPbuffer ); + if (!funcs || !funcs->p_wglQueryPbufferARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglQueryPbufferARB( params->hPbuffer, params->iAttribute, params->piValue ); return STATUS_SUCCESS; } @@ -30465,27 +30463,27 @@ static NTSTATUS ext_wglQueryRendererStringWINE( void *args ) static NTSTATUS ext_wglReleasePbufferDCARB( void *args ) { struct wglReleasePbufferDCARB_params *params = args; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglReleasePbufferDCARB( params->teb, params->hPbuffer, params->hDC ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( params->hPbuffer ); + if (!funcs || !funcs->p_wglReleasePbufferDCARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglReleasePbufferDCARB( params->hPbuffer, params->hDC ); return STATUS_SUCCESS; } static NTSTATUS ext_wglReleaseTexImageARB( void *args ) { struct wglReleaseTexImageARB_params *params = args; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglReleaseTexImageARB( params->teb, params->hPbuffer, params->iBuffer ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( params->hPbuffer ); + if (!funcs || !funcs->p_wglReleaseTexImageARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglReleaseTexImageARB( params->hPbuffer, params->iBuffer ); return STATUS_SUCCESS; } static NTSTATUS ext_wglSetPbufferAttribARB( void *args ) { struct wglSetPbufferAttribARB_params *params = args; - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglSetPbufferAttribARB( params->teb, params->hPbuffer, params->piAttribList ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( params->hPbuffer ); + if (!funcs || !funcs->p_wglSetPbufferAttribARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglSetPbufferAttribARB( params->hPbuffer, params->piAttribList ); return STATUS_SUCCESS; } @@ -86491,10 +86489,9 @@ static NTSTATUS wow64_ext_wglBindTexImageARB( void *args ) int iBuffer; BOOL ret; } *params = args; - TEB *teb = get_teb64( params->teb ); - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglBindTexImageARB( teb, ULongToPtr(params->hPbuffer), params->iBuffer ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( ULongToPtr(params->hPbuffer) ); + if (!funcs || !funcs->p_wglBindTexImageARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglBindTexImageARB( ULongToPtr(params->hPbuffer), params->iBuffer ); return STATUS_SUCCESS; } @@ -86548,12 +86545,9 @@ static NTSTATUS wow64_ext_wglCreatePbufferARB( void *args ) PTR32 piAttribList; PTR32 ret; } *params = args; - TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = get_dc_funcs( ULongToPtr(params->hDC) ); if (!funcs || !funcs->p_wglCreatePbufferARB) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - params->ret = (UINT_PTR)wrap_wglCreatePbufferARB( teb, ULongToPtr(params->hDC), params->iPixelFormat, params->iWidth, params->iHeight, ULongToPtr(params->piAttribList) ); - pthread_mutex_unlock( &wgl_lock ); + params->ret = (UINT_PTR)funcs->p_wglCreatePbufferARB( ULongToPtr(params->hDC), params->iPixelFormat, params->iWidth, params->iHeight, ULongToPtr(params->piAttribList), UlongToHandle( params->ret ) ); return STATUS_SUCCESS; } @@ -86565,10 +86559,9 @@ static NTSTATUS wow64_ext_wglDestroyPbufferARB( void *args ) PTR32 hPbuffer; BOOL ret; } *params = args; - TEB *teb = get_teb64( params->teb ); - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglDestroyPbufferARB( teb, ULongToPtr(params->hPbuffer) ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( ULongToPtr(params->hPbuffer) ); + if (!funcs || !funcs->p_wglDestroyPbufferARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglDestroyPbufferARB( ULongToPtr(params->hPbuffer) ); return STATUS_SUCCESS; } @@ -86624,10 +86617,9 @@ static NTSTATUS wow64_ext_wglGetPbufferDCARB( void *args ) PTR32 hPbuffer; PTR32 ret; } *params = args; - TEB *teb = get_teb64( params->teb ); - pthread_mutex_lock( &wgl_lock ); - params->ret = (UINT_PTR)wrap_wglGetPbufferDCARB( teb, ULongToPtr(params->hPbuffer) ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( ULongToPtr(params->hPbuffer) ); + if (!funcs || !funcs->p_wglGetPbufferDCARB) return STATUS_NOT_IMPLEMENTED; + params->ret = (UINT_PTR)funcs->p_wglGetPbufferDCARB( ULongToPtr(params->hPbuffer) ); return STATUS_SUCCESS; } @@ -86742,10 +86734,9 @@ static NTSTATUS wow64_ext_wglQueryPbufferARB( void *args ) PTR32 piValue; BOOL ret; } *params = args; - TEB *teb = get_teb64( params->teb ); - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglQueryPbufferARB( teb, ULongToPtr(params->hPbuffer), params->iAttribute, ULongToPtr(params->piValue) ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( ULongToPtr(params->hPbuffer) ); + if (!funcs || !funcs->p_wglQueryPbufferARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglQueryPbufferARB( ULongToPtr(params->hPbuffer), params->iAttribute, ULongToPtr(params->piValue) ); return STATUS_SUCCESS; } @@ -86792,10 +86783,9 @@ static NTSTATUS wow64_ext_wglReleasePbufferDCARB( void *args ) PTR32 hDC; int ret; } *params = args; - TEB *teb = get_teb64( params->teb ); - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglReleasePbufferDCARB( teb, ULongToPtr(params->hPbuffer), ULongToPtr(params->hDC) ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( ULongToPtr(params->hPbuffer) ); + if (!funcs || !funcs->p_wglReleasePbufferDCARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglReleasePbufferDCARB( ULongToPtr(params->hPbuffer), ULongToPtr(params->hDC) ); return STATUS_SUCCESS; } @@ -86808,10 +86798,9 @@ static NTSTATUS wow64_ext_wglReleaseTexImageARB( void *args ) int iBuffer; BOOL ret; } *params = args; - TEB *teb = get_teb64( params->teb ); - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglReleaseTexImageARB( teb, ULongToPtr(params->hPbuffer), params->iBuffer ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( ULongToPtr(params->hPbuffer) ); + if (!funcs || !funcs->p_wglReleaseTexImageARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglReleaseTexImageARB( ULongToPtr(params->hPbuffer), params->iBuffer ); return STATUS_SUCCESS; } @@ -86824,10 +86813,9 @@ static NTSTATUS wow64_ext_wglSetPbufferAttribARB( void *args ) PTR32 piAttribList; BOOL ret; } *params = args; - TEB *teb = get_teb64( params->teb ); - pthread_mutex_lock( &wgl_lock ); - params->ret = wrap_wglSetPbufferAttribARB( teb, ULongToPtr(params->hPbuffer), ULongToPtr(params->piAttribList) ); - pthread_mutex_unlock( &wgl_lock ); + const struct opengl_funcs *funcs = get_pbuffer_funcs( ULongToPtr(params->hPbuffer) ); + if (!funcs || !funcs->p_wglSetPbufferAttribARB) return STATUS_NOT_IMPLEMENTED; + params->ret = funcs->p_wglSetPbufferAttribARB( ULongToPtr(params->hPbuffer), ULongToPtr(params->piAttribList) ); return STATUS_SUCCESS; } diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 99ecd2ae6d6..2d42d73de03 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -37,16 +37,8 @@ extern void wrap_glGetUnsignedBytevEXT( TEB *teb, GLenum pname, GLubyte *data ); extern void wrap_glNamedFramebufferDrawBuffer( TEB *teb, GLuint framebuffer, GLenum buf ); extern void wrap_glNamedFramebufferDrawBuffers( TEB *teb, GLuint framebuffer, GLsizei n, const GLenum *bufs ); extern void wrap_glNamedFramebufferReadBuffer( TEB *teb, GLuint framebuffer, GLenum src ); -extern BOOL wrap_wglBindTexImageARB( TEB *teb, HPBUFFERARB hPbuffer, int iBuffer ); extern HGLRC wrap_wglCreateContextAttribsARB( TEB *teb, HDC hDC, HGLRC hShareContext, const int *attribList ); -extern HPBUFFERARB wrap_wglCreatePbufferARB( TEB *teb, HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList ); -extern BOOL wrap_wglDestroyPbufferARB( TEB *teb, HPBUFFERARB hPbuffer ); -extern HDC wrap_wglGetPbufferDCARB( TEB *teb, HPBUFFERARB hPbuffer ); extern BOOL wrap_wglMakeContextCurrentARB( TEB *teb, HDC hDrawDC, HDC hReadDC, HGLRC hglrc ); -extern BOOL wrap_wglQueryPbufferARB( TEB *teb, HPBUFFERARB hPbuffer, int iAttribute, int *piValue ); -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 void wow64_glBufferStorage( TEB *teb, GLenum target, GLsizeiptr size, const void *data, GLbitfield flags ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 4d98142a544..16ae78a963e 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -60,7 +60,6 @@ pthread_mutex_t wgl_lock = PTHREAD_MUTEX_INITIALIZER; enum wgl_handle_type { - HANDLE_PBUFFER = 0 << 12, HANDLE_CONTEXT = 1 << 12, HANDLE_GLSYNC = 2 << 12, HANDLE_TYPE_MASK = 15 << 12, @@ -203,7 +202,6 @@ struct wgl_handle union { struct wgl_context *context; /* for HANDLE_CONTEXT */ - struct wgl_pbuffer *pbuffer; /* for HANDLE_PBUFFER */ GLsync sync; /* for HANDLE_GLSYNC */ struct wgl_handle *next; /* for free handles */ } u; @@ -458,14 +456,6 @@ static struct context *opengl_context_from_handle( TEB *teb, HGLRC handle, const return context_from_wgl_context( entry->u.context ); } -static struct wgl_pbuffer *wgl_pbuffer_from_handle( HPBUFFERARB handle, const struct opengl_funcs **funcs ) -{ - struct wgl_handle *entry; - if (!(entry = get_handle_ptr( handle ))) return NULL; - *funcs = entry->funcs; - return entry->u.pbuffer; -} - static HANDLE alloc_handle( enum wgl_handle_type type, const struct opengl_funcs *funcs, void *user_ptr ) { HANDLE handle = 0; @@ -1577,14 +1567,6 @@ BOOL wrap_wglShareLists( TEB *teb, HGLRC hglrcSrc, HGLRC hglrcDst ) return ret; } -BOOL wrap_wglBindTexImageARB( TEB *teb, HPBUFFERARB handle, int buffer ) -{ - const struct opengl_funcs *funcs; - struct wgl_pbuffer *pbuffer; - if (!(pbuffer = wgl_pbuffer_from_handle( handle, &funcs ))) return FALSE; - return funcs->p_wglBindTexImageARB( pbuffer, buffer ); -} - HGLRC wrap_wglCreateContextAttribsARB( TEB *teb, HDC hdc, HGLRC share, const int *attribs ) { HGLRC ret = 0; @@ -1640,39 +1622,6 @@ HGLRC wrap_wglCreateContext( TEB *teb, HDC hdc ) return wrap_wglCreateContextAttribsARB( teb, hdc, NULL, NULL ); } -HPBUFFERARB wrap_wglCreatePbufferARB( TEB *teb, HDC hdc, int format, int width, int height, const int *attribs ) -{ - HPBUFFERARB ret; - struct wgl_pbuffer *pbuffer; - const struct opengl_funcs *funcs = get_dc_funcs( hdc ); - - if (!funcs || !funcs->p_wglCreatePbufferARB) return 0; - if (!(pbuffer = funcs->p_wglCreatePbufferARB( hdc, format, width, height, attribs ))) return 0; - ret = alloc_handle( HANDLE_PBUFFER, funcs, pbuffer ); - if (!ret) funcs->p_wglDestroyPbufferARB( pbuffer ); - return ret; -} - -BOOL wrap_wglDestroyPbufferARB( TEB *teb, HPBUFFERARB handle ) -{ - struct wgl_pbuffer *pbuffer; - struct wgl_handle *ptr; - - if (!(ptr = get_handle_ptr( handle ))) return FALSE; - pbuffer = ptr->u.pbuffer; - ptr->funcs->p_wglDestroyPbufferARB( pbuffer ); - free_handle_ptr( ptr ); - return TRUE; -} - -HDC wrap_wglGetPbufferDCARB( TEB *teb, HPBUFFERARB handle ) -{ - const struct opengl_funcs *funcs; - struct wgl_pbuffer *pbuffer; - if (!(pbuffer = wgl_pbuffer_from_handle( handle, &funcs ))) return 0; - return funcs->p_wglGetPbufferDCARB( pbuffer ); -} - BOOL wrap_wglMakeContextCurrentARB( TEB *teb, HDC draw_hdc, HDC read_hdc, HGLRC hglrc ) { DWORD tid = HandleToULong(teb->ClientId.UniqueThread); @@ -1704,38 +1653,6 @@ BOOL wrap_wglMakeContextCurrentARB( TEB *teb, HDC draw_hdc, HDC read_hdc, HGLRC return TRUE; } -BOOL wrap_wglQueryPbufferARB( TEB *teb, HPBUFFERARB handle, int attrib, int *value ) -{ - const struct opengl_funcs *funcs; - struct wgl_pbuffer *pbuffer; - if (!(pbuffer = wgl_pbuffer_from_handle( handle, &funcs ))) return FALSE; - return funcs->p_wglQueryPbufferARB( pbuffer, attrib, value ); -} - -int wrap_wglReleasePbufferDCARB( TEB *teb, HPBUFFERARB handle, HDC hdc ) -{ - const struct opengl_funcs *funcs; - struct wgl_pbuffer *pbuffer; - if (!(pbuffer = wgl_pbuffer_from_handle( handle, &funcs ))) return FALSE; - return funcs->p_wglReleasePbufferDCARB( pbuffer, hdc ); -} - -BOOL wrap_wglReleaseTexImageARB( TEB *teb, HPBUFFERARB handle, int buffer ) -{ - const struct opengl_funcs *funcs; - struct wgl_pbuffer *pbuffer; - if (!(pbuffer = wgl_pbuffer_from_handle( handle, &funcs ))) return FALSE; - return funcs->p_wglReleaseTexImageARB( pbuffer, buffer ); -} - -BOOL wrap_wglSetPbufferAttribARB( TEB *teb, HPBUFFERARB handle, const int *attribs ) -{ - const struct opengl_funcs *funcs; - struct wgl_pbuffer *pbuffer; - if (!(pbuffer = wgl_pbuffer_from_handle( handle, &funcs ))) return FALSE; - return funcs->p_wglSetPbufferAttribARB( pbuffer, attribs ); -} - static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *user ) { diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index e18c5ee0563..40ebed8bebd 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -49,6 +49,15 @@ static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; #define WINE_GL_RESERVED_FORMATS_NUM 4 #define WINE_GL_RESERVED_FORMATS_ONSCREEN 5 +static CRITICAL_SECTION wgl_cs; +static CRITICAL_SECTION_DEBUG wgl_cs_debug = { + 0, 0, &wgl_cs, + { &wgl_cs_debug.ProcessLocksList, + &wgl_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": wgl_cs") } +}; +static CRITICAL_SECTION wgl_cs = { &wgl_cs_debug, -1, 0, 0, 0, 0 }; + #ifndef _WIN64 static char **wow64_strings; @@ -89,6 +98,144 @@ static void cleanup_wow64_strings(void) #endif +struct handle_entry +{ + UINT handle; + union + { + struct opengl_client_pbuffer *pbuffer; + struct handle_entry *next_free; + void *user_data; + }; +}; + +struct handle_table +{ + struct handle_entry handles[1024]; + struct handle_entry *next_free; + UINT count; +}; + +static struct handle_table pbuffers; + +static struct handle_entry *alloc_handle( struct handle_table *table, void *user_data ) +{ + struct handle_entry *ptr = NULL; + WORD generation; + + EnterCriticalSection( &wgl_cs ); + + if ((ptr = table->next_free)) table->next_free = ptr->next_free; + else if (table->count < ARRAY_SIZE(table->handles)) ptr = table->handles + table->count++; + else ptr = NULL; + + if (ptr) + { + if (!(generation = HIWORD( ptr->handle ) + 1)) generation++; + ptr->handle = MAKELONG( ptr - table->handles + 1, generation ); + ptr->user_data = user_data; + } + + LeaveCriticalSection( &wgl_cs ); + + if (!ptr) RtlSetLastWin32Error( ERROR_NOT_ENOUGH_MEMORY ); + return ptr; +} + +static void free_handle( struct handle_table *table, struct handle_entry *ptr ) +{ + EnterCriticalSection( &wgl_cs ); + ptr->handle |= 0xffff; + ptr->next_free = table->next_free; + table->next_free = ptr; + LeaveCriticalSection( &wgl_cs ); +} + +static struct handle_entry *get_handle_ptr( struct handle_table *table, HANDLE handle ) +{ + WORD index = LOWORD( handle ) - 1; + struct handle_entry *ptr = table->handles + index; + + EnterCriticalSection( &wgl_cs ); + if (index >= table->count || ULongToHandle( ptr->handle ) != handle) ptr = NULL; + LeaveCriticalSection( &wgl_cs ); + + if (!ptr) RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); + return ptr; +} + +static struct opengl_client_pbuffer *pbuffer_from_handle( HPBUFFERARB handle ) +{ + struct handle_entry *ptr; + if (!(ptr = get_handle_ptr( &pbuffers, handle ))) return NULL; + return ptr->pbuffer; +} + +BOOL get_pbuffer_from_handle( HPBUFFERARB handle, HPBUFFERARB *obj ) +{ + struct opengl_client_pbuffer *pbuffer = pbuffer_from_handle( handle ); + *obj = pbuffer ? &pbuffer->obj : NULL; + return pbuffer || !handle; +} + +static struct handle_entry *alloc_client_pbuffer(void) +{ + struct opengl_client_pbuffer *pbuffer; + struct handle_entry *ptr; + + if (!(pbuffer = calloc( 1, sizeof(*pbuffer) ))) return NULL; + if (!(ptr = alloc_handle( &pbuffers, pbuffer ))) + { + free( pbuffer ); + return NULL; + } + + return ptr; +} + +static void free_client_pbuffer( struct handle_entry *ptr ) +{ + struct opengl_client_pbuffer *pbuffer = ptr->pbuffer; + free_handle( &pbuffers, ptr ); + free( pbuffer ); +} + +HPBUFFERARB WINAPI wglCreatePbufferARB( HDC hdc, int format, int width, int height, const int *attribs ) +{ + struct wglCreatePbufferARB_params args = { .teb = NtCurrentTeb(), .hDC = hdc, .iPixelFormat = format, .iWidth = width, .iHeight = height, .piAttribList = attribs }; + struct handle_entry *ptr; + NTSTATUS status; + + TRACE( "hdc %p, format %d, width %d, height %d, attribs %p\n", hdc, format, width, height, attribs ); + + if (!(ptr = alloc_client_pbuffer())) return 0; + args.ret = &ptr->pbuffer->obj; + + if ((status = UNIX_CALL( wglCreatePbufferARB, &args ))) WARN( "wglCreatePbufferARB returned %#lx\n", status ); + assert( args.ret == &ptr->pbuffer->obj || !args.ret ); + + if (!status && args.ret) return UlongToHandle( ptr->handle ); + free_client_pbuffer( ptr ); + return NULL; +} + +BOOL WINAPI wglDestroyPbufferARB( HPBUFFERARB handle ) +{ + struct wglDestroyPbufferARB_params args = { .teb = NtCurrentTeb() }; + struct handle_entry *ptr; + NTSTATUS status; + + TRACE( "handle %p\n", handle ); + + if (!(ptr = get_handle_ptr( &pbuffers, handle ))) return FALSE; + args.hPbuffer = &ptr->pbuffer->obj; + + if ((status = UNIX_CALL( wglDestroyPbufferARB, &args ))) WARN( "wglDestroyPbufferARB returned %#lx\n", status ); + if (args.ret) free_client_pbuffer( ptr ); + + return args.ret; +} + /*********************************************************************** * wglGetCurrentReadDCARB * diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 320dc571b82..779c5bb2153 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -40,7 +40,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wgl); -struct wgl_pbuffer +struct pbuffer { struct opengl_drawable *drawable; @@ -53,6 +53,12 @@ struct wgl_pbuffer GLenum cube_face; }; +static struct pbuffer *pbuffer_from_client_pbuffer( HPBUFFERARB client_pbuffer ) +{ + struct opengl_client_pbuffer *client = opengl_client_pbuffer_from_client( client_pbuffer ); + return (struct pbuffer *)(UINT_PTR)client->unix_handle; +} + static const struct opengl_driver_funcs nulldrv_funcs, *driver_funcs = &nulldrv_funcs; static struct list devices_egl = LIST_INIT( devices_egl ); static struct egl_platform display_egl; @@ -1438,16 +1444,16 @@ static struct opengl_drawable *get_dc_opengl_drawable( HDC hdc ) return drawable; } -static void wgl_pbuffer_destroy( struct wgl_pbuffer *pbuffer ) +static void pbuffer_destroy( struct pbuffer *pbuffer ) { opengl_drawable_release( pbuffer->drawable ); NtGdiDeleteObjectApp( pbuffer->hdc ); free( pbuffer ); } -static struct wgl_pbuffer *wgl_pbuffer_create( HDC hdc, int format, int width, int height, const int *attribs ) +static struct pbuffer *pbuffer_create( HDC hdc, int format, int width, int height, const int *attribs ) { - struct wgl_pbuffer *pbuffer; + struct pbuffer *pbuffer; UINT size, max_level = 0; BOOL largest = FALSE; @@ -1582,15 +1588,15 @@ static BOOL create_memory_pbuffer( HDC hdc ) if (ret) { int width = dib.rect.right - dib.rect.left, height = dib.rect.bottom - dib.rect.top; - struct wgl_pbuffer *pbuffer; + struct pbuffer *pbuffer; - if (!(pbuffer = wgl_pbuffer_create( hdc, format, width, height, NULL ))) + if (!(pbuffer = pbuffer_create( hdc, format, width, height, NULL ))) WARN( "Failed to create pbuffer for memory DC %p\n", hdc ); else { TRACE( "Created pbuffer %p for memory DC %p\n", pbuffer, hdc ); set_dc_opengl_drawable( hdc, pbuffer->drawable ); - wgl_pbuffer_destroy( pbuffer ); + pbuffer_destroy( pbuffer ); } } @@ -1929,10 +1935,18 @@ static BOOL win32u_wglMakeCurrent( HDC hdc, struct wgl_context *context ) return win32u_wglMakeContextCurrentARB( hdc, hdc, context ); } -static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int width, int height, - const int *attribs ) +static void opengl_client_pbuffer_init( HPBUFFERARB client_pbuffer, struct pbuffer *pbuffer, const struct opengl_funcs *funcs ) +{ + struct opengl_client_pbuffer *client = opengl_client_pbuffer_from_client( client_pbuffer ); + client->unix_handle = (UINT_PTR)pbuffer; + client->unix_funcs = (UINT_PTR)funcs; +} + +static HPBUFFERARB win32u_wglCreatePbufferARB( HDC hdc, int format, int width, int height, const int *attribs, + HPBUFFERARB client_pbuffer ) { const struct opengl_funcs *funcs = &display_funcs; + struct pbuffer *pbuffer; UINT total, onscreen; TRACE( "(%p, %d, %d, %d, %p)\n", hdc, format, width, height, attribs ); @@ -1941,32 +1955,38 @@ static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int if (format <= 0 || format > total) { RtlSetLastWin32Error( ERROR_INVALID_PIXEL_FORMAT ); - return NULL; + return 0; } if (width <= 0 || height <= 0) { RtlSetLastWin32Error( ERROR_INVALID_DATA ); - return NULL; + return 0; } - return wgl_pbuffer_create( hdc, format, width, height, attribs ); + if (!(pbuffer = pbuffer_create( hdc, format, width, height, attribs ))) return 0; + opengl_client_pbuffer_init( client_pbuffer, pbuffer, funcs ); + return client_pbuffer; } -static BOOL win32u_wglDestroyPbufferARB( struct wgl_pbuffer *pbuffer ) +static BOOL win32u_wglDestroyPbufferARB( HPBUFFERARB client_pbuffer ) { + struct pbuffer *pbuffer = pbuffer_from_client_pbuffer( client_pbuffer ); TRACE( "pbuffer %p\n", pbuffer ); - wgl_pbuffer_destroy( pbuffer ); + pbuffer_destroy( pbuffer ); return GL_TRUE; } -static HDC win32u_wglGetPbufferDCARB( struct wgl_pbuffer *pbuffer ) +static HDC win32u_wglGetPbufferDCARB( HPBUFFERARB client_pbuffer ) { + struct pbuffer *pbuffer = pbuffer_from_client_pbuffer( client_pbuffer ); TRACE( "pbuffer %p\n", pbuffer ); return pbuffer->hdc; } -static int win32u_wglReleasePbufferDCARB( struct wgl_pbuffer *pbuffer, HDC hdc ) +static int win32u_wglReleasePbufferDCARB( HPBUFFERARB client_pbuffer, HDC hdc ) { + struct pbuffer *pbuffer = pbuffer_from_client_pbuffer( client_pbuffer ); + TRACE( "pbuffer %p, hdc %p\n", pbuffer, hdc ); if (hdc != pbuffer->hdc) @@ -1978,8 +1998,10 @@ static int win32u_wglReleasePbufferDCARB( struct wgl_pbuffer *pbuffer, HDC hdc ) return TRUE; } -static BOOL win32u_wglQueryPbufferARB( struct wgl_pbuffer *pbuffer, int attrib, int *value ) +static BOOL win32u_wglQueryPbufferARB( HPBUFFERARB client_pbuffer, int attrib, int *value ) { + struct pbuffer *pbuffer = pbuffer_from_client_pbuffer( client_pbuffer ); + TRACE( "pbuffer %p, attrib %#x, value %p\n", pbuffer, attrib, value ); switch (attrib) @@ -2072,9 +2094,10 @@ static GLenum binding_from_target( GLenum target ) return 0; } -static BOOL win32u_wglBindTexImageARB( struct wgl_pbuffer *pbuffer, int buffer ) +static BOOL win32u_wglBindTexImageARB( HPBUFFERARB client_pbuffer, int buffer ) { const struct opengl_funcs *funcs = &display_funcs; + struct pbuffer *pbuffer = pbuffer_from_client_pbuffer( client_pbuffer ); int prev_texture = 0, format = win32u_wglGetPixelFormat( pbuffer->hdc ); struct wgl_pixel_format desc; GLenum source; @@ -2147,8 +2170,10 @@ static BOOL win32u_wglBindTexImageARB( struct wgl_pbuffer *pbuffer, int buffer ) return GL_TRUE; } -static BOOL win32u_wglReleaseTexImageARB( struct wgl_pbuffer *pbuffer, int buffer ) +static BOOL win32u_wglReleaseTexImageARB( HPBUFFERARB client_pbuffer, int buffer ) { + struct pbuffer *pbuffer = pbuffer_from_client_pbuffer( client_pbuffer ); + TRACE( "pbuffer %p, buffer %d\n", pbuffer, buffer ); if (!pbuffer->texture_format) @@ -2160,8 +2185,10 @@ static BOOL win32u_wglReleaseTexImageARB( struct wgl_pbuffer *pbuffer, int buffe return !!driver_funcs->p_pbuffer_bind( pbuffer->hdc, pbuffer->drawable, GL_NONE ); } -static BOOL win32u_wglSetPbufferAttribARB( struct wgl_pbuffer *pbuffer, const int *attribs ) +static BOOL win32u_wglSetPbufferAttribARB( HPBUFFERARB client_pbuffer, const int *attribs ) { + struct pbuffer *pbuffer = pbuffer_from_client_pbuffer( client_pbuffer ); + TRACE( "pbuffer %p, attribs %p\n", pbuffer, attribs ); if (!pbuffer->texture_format) diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index d9f4da04953..e545418258a 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -59,6 +59,18 @@ struct wgl_pixel_format int float_components; }; +struct opengl_client_pbuffer +{ + struct HPBUFFERARB__ obj; /* client object header */ + UINT64 unix_handle; + UINT64 unix_funcs; +}; + +static inline struct opengl_client_pbuffer *opengl_client_pbuffer_from_client( HPBUFFERARB client_pbuffer ) +{ + return CONTAINING_RECORD( client_pbuffer, struct opengl_client_pbuffer, obj ); +} + #ifdef WINE_UNIX_LIB #include "wine/gdi_driver.h" diff --git a/include/wine/wgl.h b/include/wine/wgl.h index a611ed25cff..90b7be366c4 100644 --- a/include/wine/wgl.h +++ b/include/wine/wgl.h @@ -25,7 +25,6 @@ #endif struct wgl_context; -struct wgl_pbuffer; typedef void *EGLNativeDisplayType; typedef void *EGLNativePixmapType; typedef void *EGLNativeWindowType; @@ -9518,28 +9517,28 @@ typedef void (GLAPIENTRY *PFN_glWindowPos4svMESA)( const GLshort *v ); typedef void (GLAPIENTRY *PFN_glWindowRectanglesEXT)( GLenum mode, GLsizei count, const GLint *box ); typedef void (GLAPIENTRY *PFN_glWriteMaskEXT)( GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW ); typedef void * (GLAPIENTRY *PFN_wglAllocateMemoryNV)( GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority ); -typedef BOOL (GLAPIENTRY *PFN_wglBindTexImageARB)( struct wgl_pbuffer * hPbuffer, int iBuffer ); +typedef BOOL (GLAPIENTRY *PFN_wglBindTexImageARB)( HPBUFFERARB hPbuffer, int iBuffer ); typedef BOOL (GLAPIENTRY *PFN_wglChoosePixelFormatARB)( HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats ); typedef struct wgl_context * (GLAPIENTRY *PFN_wglCreateContextAttribsARB)( HDC hDC, struct wgl_context * hShareContext, const int *attribList ); -typedef struct wgl_pbuffer * (GLAPIENTRY *PFN_wglCreatePbufferARB)( HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList ); -typedef BOOL (GLAPIENTRY *PFN_wglDestroyPbufferARB)( struct wgl_pbuffer * hPbuffer ); +typedef HPBUFFERARB (GLAPIENTRY *PFN_wglCreatePbufferARB)( HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList, HPBUFFERARB client_pbuffer ); +typedef BOOL (GLAPIENTRY *PFN_wglDestroyPbufferARB)( HPBUFFERARB hPbuffer ); typedef void (GLAPIENTRY *PFN_wglFreeMemoryNV)( void *pointer ); typedef HDC (GLAPIENTRY *PFN_wglGetCurrentReadDCARB)(void); typedef const char * (GLAPIENTRY *PFN_wglGetExtensionsStringARB)( HDC hdc ); typedef const char * (GLAPIENTRY *PFN_wglGetExtensionsStringEXT)(void); -typedef HDC (GLAPIENTRY *PFN_wglGetPbufferDCARB)( struct wgl_pbuffer * hPbuffer ); +typedef HDC (GLAPIENTRY *PFN_wglGetPbufferDCARB)( HPBUFFERARB hPbuffer ); typedef BOOL (GLAPIENTRY *PFN_wglGetPixelFormatAttribfvARB)( HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues ); typedef BOOL (GLAPIENTRY *PFN_wglGetPixelFormatAttribivARB)( HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues ); typedef int (GLAPIENTRY *PFN_wglGetSwapIntervalEXT)(void); typedef BOOL (GLAPIENTRY *PFN_wglMakeContextCurrentARB)( HDC hDrawDC, HDC hReadDC, struct wgl_context * hglrc ); typedef BOOL (GLAPIENTRY *PFN_wglQueryCurrentRendererIntegerWINE)( GLenum attribute, GLuint *value ); typedef const GLchar * (GLAPIENTRY *PFN_wglQueryCurrentRendererStringWINE)( GLenum attribute ); -typedef BOOL (GLAPIENTRY *PFN_wglQueryPbufferARB)( struct wgl_pbuffer * hPbuffer, int iAttribute, int *piValue ); +typedef BOOL (GLAPIENTRY *PFN_wglQueryPbufferARB)( HPBUFFERARB hPbuffer, int iAttribute, int *piValue ); typedef BOOL (GLAPIENTRY *PFN_wglQueryRendererIntegerWINE)( HDC dc, GLint renderer, GLenum attribute, GLuint *value ); typedef const GLchar * (GLAPIENTRY *PFN_wglQueryRendererStringWINE)( HDC dc, GLint renderer, GLenum attribute ); -typedef int (GLAPIENTRY *PFN_wglReleasePbufferDCARB)( struct wgl_pbuffer * hPbuffer, HDC hDC ); -typedef BOOL (GLAPIENTRY *PFN_wglReleaseTexImageARB)( struct wgl_pbuffer * hPbuffer, int iBuffer ); -typedef BOOL (GLAPIENTRY *PFN_wglSetPbufferAttribARB)( struct wgl_pbuffer * hPbuffer, const int *piAttribList ); +typedef int (GLAPIENTRY *PFN_wglReleasePbufferDCARB)( HPBUFFERARB hPbuffer, HDC hDC ); +typedef BOOL (GLAPIENTRY *PFN_wglReleaseTexImageARB)( HPBUFFERARB hPbuffer, int iBuffer ); +typedef BOOL (GLAPIENTRY *PFN_wglSetPbufferAttribARB)( HPBUFFERARB hPbuffer, const int *piAttribList ); typedef BOOL (GLAPIENTRY *PFN_wglSetPixelFormatWINE)( HDC hdc, int format ); typedef BOOL (GLAPIENTRY *PFN_wglSwapIntervalEXT)( int interval ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9953