From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/opengl32/make_opengl | 39 ++--------- dlls/opengl32/unix_private.h | 5 -- dlls/opengl32/unix_thunks.c | 71 +++----------------- dlls/opengl32/unix_thunks.h | 6 ++ dlls/opengl32/unix_wgl.c | 127 +++++++++++++++++++++++++---------- 5 files changed, 110 insertions(+), 138 deletions(-) diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 9824efd3375..e9b584859c5 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -276,8 +276,9 @@ sub map_default_fbo($$) sub manual_wow64_wrapper($) { my $name = shift; - return 0 if $name =~ /^glBufferStorageExternal/; - return 0 if $name =~ /^glBufferStorageMem/; + return "glBufferAttachMemoryNV" if $name =~ /^glBufferAttachMemory/; + return "glBufferData" if $name =~ /^glBufferData/; + return "glBufferStorageMemEXT" if $name =~ /^glBufferStorageMem/; return "glBufferStorage" if $name =~ /^glBufferStorage/; return "glDeleteBuffers" if $name =~ /^glDeleteBuffers/; return "glFlushMappedBufferRange" if $name =~ /^glFlushMappedBufferRange/; @@ -288,27 +289,14 @@ sub manual_wow64_wrapper($) return "glMapBuffer" if $name =~ /^glMapBuffer/; return "glMapNamedBufferRange" if $name =~ /^glMapNamedBufferRange/; return "glMapNamedBuffer" if $name =~ /^glMapNamedBuffer/; - return 0 if $name =~ /^glNamedBufferStorageExternal/; - return 0 if $name =~ /^glNamedBufferStorageMem/; + return "glNamedBufferAttachMemoryNV" if $name =~ /^glNamedBufferAttachMemory/; + return "glNamedBufferData" if $name =~ /^glNamedBufferData/; + return "glNamedBufferStorageMemEXT" if $name =~ /^glNamedBufferStorageMem/; return "glNamedBufferStorage" if $name =~ /^glNamedBufferStorage/; return "glUnmapBuffer" if $name =~ /^glUnmapBuffer/; return "glUnmapNamedBuffer" if $name =~ /^glUnmapNamedBuffer/; } -my %wow64_invalidate_buffer = - ( - "glBufferAttachMemoryNV" => 1, - "glBufferData" => 1, - "glBufferDataARB" => 1, - "glBufferStorage" => 1, - "glBufferStorageMemEXT" => 1, - "glNamedBufferAttachMemoryNV" => 1, - "glNamedBufferData" => 1, - "glNamedBufferDataEXT" => 1, - "glNamedBufferStorage" => 1, - "glNamedBufferStorageEXT" => 1, - "glNamedBufferStorageMemEXT" => 1, - ); my %pointer_array_count = ( "glCompileShaderIncludeARB" => "count", @@ -410,11 +398,9 @@ sub generate_unix_thunk($$$$) my $func_ret = get_func_ret( $func ); my $wow64_wrap = $is_wow64 ? manual_wow64_wrapper( $name ) : 0; my $wrapper = $wow64_wrap || needs_wrapper( $name, $func ); - my $need_lock = 0; my $need_funcs = !$wrapper || $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; @@ -495,7 +481,6 @@ sub generate_unix_thunk($$$$) { $call_args .= " ULongToPtr(params->$pname),"; $need_manual_thunk = 1 if $arg_type =~ /(\*.*\*|(sizei|int)ptr.*\*)/; - $need_lock = 1 if $arg_type =~ /GLsync/; } } $call_args .= " UlongToHandle( params->ret )," if $func_ret =~ /HPBUFFERARB|HGLRC|GLsync/; @@ -524,16 +509,6 @@ sub generate_unix_thunk($$$$) $ret .= "}\n\n"; return $ret; } - if (defined $wow64_invalidate_buffer{$name}) - { - $need_lock = 1; - $need_funcs = 1; - $vars .= " struct buffer *buffer;\n"; - $invalidation .= $name =~ /NamedBuffer/ - ? " buffer = invalidate_buffer_name( $teb, params->buffer );\n" - : " 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 $wrapper || (!$use_dc && !$use_pbuffer && !$use_context); } else @@ -597,7 +572,6 @@ sub generate_unix_thunk($$$$) } $ret .= " resolve_default_fbo( $teb, TRUE );\n" if resolve_default_fbo( $name ); $ret .= " push_default_fbo( $teb );\n" if hide_default_fbo( $name ); - $ret .= " pthread_mutex_lock( &wgl_lock );\n$invalidation" if $need_lock; $ret .= " $ret_expr"; if ($wow64_wrap) { @@ -614,7 +588,6 @@ sub generate_unix_thunk($$$$) $call_args =~ s/,$/ /; $ret .= "funcs->p_$name($call_args);\n"; } - $ret .= " pthread_mutex_unlock( &wgl_lock );\n" if $need_lock; $ret .= " set_current_fbo( $teb, params->target, params->framebuffer );\n" if $name =~ /glBindFramebuffer/; $ret .= " pop_default_fbo( $teb );\n" if hide_default_fbo( $name ); if (defined $state_attrib_funcs{$name}) diff --git a/dlls/opengl32/unix_private.h b/dlls/opengl32/unix_private.h index 8f05f6218e7..10722acf7ec 100644 --- a/dlls/opengl32/unix_private.h +++ b/dlls/opengl32/unix_private.h @@ -81,15 +81,10 @@ static inline TEB *get_teb64( ULONG teb32 ) return (TEB *)((char *)teb32_ptr + teb32_ptr->WowTebOffset); } -extern struct buffer *invalidate_buffer_name( TEB *teb, GLuint name ); -extern struct buffer *invalidate_buffer_target( TEB *teb, GLenum target ); -extern void free_buffer( const struct opengl_funcs *funcs, struct buffer *buffer ); extern NTSTATUS return_wow64_string( const void *str, PTR32 *wow64_str ); #endif -extern pthread_mutex_t wgl_lock; - extern NTSTATUS process_attach( void *args ); extern NTSTATUS thread_attach( void *args ); extern NTSTATUS process_detach( void *args ); diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 04b6b25bfd5..ee35199ffc0 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -41476,15 +41476,10 @@ static NTSTATUS wow64_ext_glBufferAttachMemoryNV( void *args ) GLuint64 offset; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glBufferAttachMemoryNV) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_target( teb, params->target ); - funcs->p_glBufferAttachMemoryNV( params->target, params->memory, params->offset ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glBufferAttachMemoryNV( teb, params->target, params->memory, params->offset, funcs->p_glBufferAttachMemoryNV ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -41499,15 +41494,10 @@ static NTSTATUS wow64_ext_glBufferData( void *args ) GLenum usage; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glBufferData) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_target( teb, params->target ); - funcs->p_glBufferData( params->target, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->usage ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glBufferData( teb, params->target, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->usage, funcs->p_glBufferData ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -41522,15 +41512,10 @@ static NTSTATUS wow64_ext_glBufferDataARB( void *args ) GLenum usage; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glBufferDataARB) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_target( teb, params->target ); - funcs->p_glBufferDataARB( params->target, (GLsizeiptrARB)ULongToPtr(params->size), ULongToPtr(params->data), params->usage ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glBufferData( teb, params->target, (GLsizeiptrARB)ULongToPtr(params->size), ULongToPtr(params->data), params->usage, funcs->p_glBufferDataARB ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -41615,15 +41600,10 @@ static NTSTATUS wow64_ext_glBufferStorage( void *args ) GLbitfield flags; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glBufferStorage) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_target( teb, params->target ); wow64_glBufferStorage( teb, params->target, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->flags, funcs->p_glBufferStorage ); - pthread_mutex_unlock( &wgl_lock ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -41638,15 +41618,10 @@ static NTSTATUS wow64_ext_glBufferStorageMemEXT( void *args ) GLuint64 offset; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glBufferStorageMemEXT) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_target( teb, params->target ); - funcs->p_glBufferStorageMemEXT( params->target, (GLsizeiptr)ULongToPtr(params->size), params->memory, params->offset ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glBufferStorageMemEXT( teb, params->target, (GLsizeiptr)ULongToPtr(params->size), params->memory, params->offset, funcs->p_glBufferStorageMemEXT ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -64147,15 +64122,10 @@ static NTSTATUS wow64_ext_glNamedBufferAttachMemoryNV( void *args ) GLuint64 offset; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glNamedBufferAttachMemoryNV) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_name( teb, params->buffer ); - funcs->p_glNamedBufferAttachMemoryNV( params->buffer, params->memory, params->offset ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glNamedBufferAttachMemoryNV( teb, params->buffer, params->memory, params->offset, funcs->p_glNamedBufferAttachMemoryNV ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -64170,15 +64140,10 @@ static NTSTATUS wow64_ext_glNamedBufferData( void *args ) GLenum usage; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glNamedBufferData) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_name( teb, params->buffer ); - funcs->p_glNamedBufferData( params->buffer, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->usage ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glNamedBufferData( teb, params->buffer, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->usage, funcs->p_glNamedBufferData ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -64193,15 +64158,10 @@ static NTSTATUS wow64_ext_glNamedBufferDataEXT( void *args ) GLenum usage; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glNamedBufferDataEXT) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_name( teb, params->buffer ); - funcs->p_glNamedBufferDataEXT( params->buffer, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->usage ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glNamedBufferData( teb, params->buffer, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->usage, funcs->p_glNamedBufferDataEXT ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -64272,15 +64232,10 @@ static NTSTATUS wow64_ext_glNamedBufferStorage( void *args ) GLbitfield flags; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glNamedBufferStorage) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_name( teb, params->buffer ); wow64_glNamedBufferStorage( teb, params->buffer, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->flags, funcs->p_glNamedBufferStorage ); - pthread_mutex_unlock( &wgl_lock ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -64295,15 +64250,10 @@ static NTSTATUS wow64_ext_glNamedBufferStorageEXT( void *args ) GLbitfield flags; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glNamedBufferStorageEXT) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_name( teb, params->buffer ); wow64_glNamedBufferStorage( teb, params->buffer, (GLsizeiptr)ULongToPtr(params->size), ULongToPtr(params->data), params->flags, funcs->p_glNamedBufferStorageEXT ); - pthread_mutex_unlock( &wgl_lock ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } @@ -64318,15 +64268,10 @@ static NTSTATUS wow64_ext_glNamedBufferStorageMemEXT( void *args ) GLuint64 offset; } *params = args; TEB *teb = get_teb64( params->teb ); - struct buffer *buffer; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glNamedBufferStorageMemEXT) return STATUS_NOT_IMPLEMENTED; - pthread_mutex_lock( &wgl_lock ); - buffer = invalidate_buffer_name( teb, params->buffer ); - funcs->p_glNamedBufferStorageMemEXT( params->buffer, (GLsizeiptr)ULongToPtr(params->size), params->memory, params->offset ); - pthread_mutex_unlock( &wgl_lock ); + wow64_glNamedBufferStorageMemEXT( teb, params->buffer, (GLsizeiptr)ULongToPtr(params->size), params->memory, params->offset, funcs->p_glNamedBufferStorageMemEXT ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); - if (buffer) free_buffer( funcs, buffer ); return STATUS_SUCCESS; } diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index bc83223cdef..1ba8ad4c5a0 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -39,7 +39,10 @@ extern HPBUFFERARB wrap_wglCreatePbufferARB( TEB *teb, HDC hDC, int iPixelFormat extern BOOL wrap_wglMakeContextCurrentARB( TEB *teb, HDC hDrawDC, HDC hReadDC, HGLRC hglrc ); #ifdef _WIN64 +extern void wow64_glBufferAttachMemoryNV( TEB *teb, GLenum target, GLuint memory, GLuint64 offset, PFN_glBufferAttachMemoryNV func ); +extern void wow64_glBufferData( TEB *teb, GLenum target, GLsizeiptr size, const void *data, GLenum usage, PFN_glBufferData func ); extern void wow64_glBufferStorage( TEB *teb, GLenum target, GLsizeiptr size, const void *data, GLbitfield flags, PFN_glBufferStorage func ); +extern void wow64_glBufferStorageMemEXT( TEB *teb, GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset, PFN_glBufferStorageMemEXT func ); extern void wow64_glDeleteBuffers( TEB *teb, GLsizei n, const GLuint *buffers, PFN_glDeleteBuffers func ); extern void wow64_glFlushMappedBufferRange( TEB *teb, GLenum target, GLintptr offset, GLsizeiptr length, PFN_glFlushMappedBufferRange func ); extern void wow64_glFlushMappedNamedBufferRange( TEB *teb, GLuint buffer, GLintptr offset, GLsizeiptr length, PFN_glFlushMappedNamedBufferRange func ); @@ -49,7 +52,10 @@ extern void *wow64_glMapBuffer( TEB *teb, GLenum target, GLenum access, PFN_glMa extern void *wow64_glMapBufferRange( TEB *teb, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, PFN_glMapBufferRange func ); extern void *wow64_glMapNamedBuffer( TEB *teb, GLuint buffer, GLenum access, PFN_glMapNamedBuffer func ); extern void *wow64_glMapNamedBufferRange( TEB *teb, GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access, PFN_glMapNamedBufferRange func ); +extern void wow64_glNamedBufferAttachMemoryNV( TEB *teb, GLuint buffer, GLuint memory, GLuint64 offset, PFN_glNamedBufferAttachMemoryNV func ); +extern void wow64_glNamedBufferData( TEB *teb, GLuint buffer, GLsizeiptr size, const void *data, GLenum usage, PFN_glNamedBufferData func ); extern void wow64_glNamedBufferStorage( TEB *teb, GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags, PFN_glNamedBufferStorage func ); +extern void wow64_glNamedBufferStorageMemEXT( TEB *teb, GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset, PFN_glNamedBufferStorageMemEXT func ); extern GLboolean wow64_glUnmapBuffer( TEB *teb, GLenum target, PFN_glUnmapBuffer func ); extern GLboolean wow64_glUnmapNamedBuffer( TEB *teb, GLuint buffer, PFN_glUnmapNamedBuffer func ); #endif diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 9786a32e209..5f5fae6a2a1 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -53,7 +53,6 @@ static BOOL is_wow64(void) } static UINT64 call_gl_debug_message_callback; -pthread_mutex_t wgl_lock = PTHREAD_MUTEX_INITIALIZER; /* context state management */ @@ -397,7 +396,7 @@ static int compare_buffer_name( const void *key, const struct rb_entry *entry ) return memcmp( key, &buffer->name, sizeof(buffer->name) ); } -void free_buffer( const struct opengl_funcs *funcs, struct buffer *buffer ) +static void free_buffer( const struct opengl_funcs *funcs, struct buffer *buffer ) { if (buffer->vk_memory) { @@ -1798,6 +1797,8 @@ NTSTATUS get_pixel_formats( void *args ) #ifdef _WIN64 +static pthread_mutex_t wgl_lock = PTHREAD_MUTEX_INITIALIZER; + struct wow64_string_entry { const char *str; @@ -1884,7 +1885,7 @@ static struct buffer *get_named_buffer( TEB *teb, GLuint name ) return NULL; } -struct buffer *invalidate_buffer_name( TEB *teb, GLuint name ) +static struct buffer *invalidate_buffer_name( TEB *teb, GLuint name ) { struct buffer *buffer = get_named_buffer( teb, name ); if (buffer) @@ -1895,7 +1896,7 @@ struct buffer *invalidate_buffer_name( TEB *teb, GLuint name ) return buffer; } -struct buffer *invalidate_buffer_target( TEB *teb, GLenum target ) +static struct buffer *invalidate_buffer_target( TEB *teb, GLenum target ) { GLuint name = get_target_name( teb, target ); return name ? invalidate_buffer_name( teb, name ) : NULL; @@ -2218,34 +2219,37 @@ void wow64_glDeleteBuffers( TEB *teb, GLsizei n, const GLuint *buffers, PFN_glDe void wow64_glBufferStorage( TEB *teb, GLenum target, GLsizeiptr size, const void *data, GLbitfield flags, PFN_glBufferStorage p_glBufferStorage ) { - struct buffer *buffer = NULL; + const struct opengl_funcs *funcs = teb->glTable; + struct buffer *buffer = NULL, *previous; + + pthread_mutex_lock( &wgl_lock ); + previous = invalidate_buffer_target( teb, target ); if (flags & GL_MAP_PERSISTENT_BIT) buffer = create_buffer_storage( teb, target, 0, size, data, flags ); if (!buffer) p_glBufferStorage( target, size, data, flags ); + + pthread_mutex_unlock( &wgl_lock ); + if (previous) free_buffer( funcs, previous ); } void wow64_glNamedBufferStorage( TEB *teb, GLuint name, GLsizeiptr size, const void *data, GLbitfield flags, PFN_glNamedBufferStorage p_glNamedBufferStorage ) { - struct buffer *buffer = NULL; + const struct opengl_funcs *funcs = teb->glTable; + struct buffer *buffer = NULL, *previous; + + pthread_mutex_lock( &wgl_lock ); + previous = invalidate_buffer_name( teb, name ); if (flags & GL_MAP_PERSISTENT_BIT) buffer = create_buffer_storage( teb, 0, name, size, data, flags ); if (!buffer) p_glNamedBufferStorage( name, size, data, flags ); -} -void wow64_glNamedBufferStorageEXT( TEB *teb, GLuint name, GLsizeiptr size, const void *data, - GLbitfield flags, PFN_glNamedBufferStorageEXT p_glNamedBufferStorageEXT ) -{ - struct buffer *buffer = NULL; - - if (flags & GL_MAP_PERSISTENT_BIT) - buffer = create_buffer_storage( teb, 0, name, size, data, flags ); - - if (!buffer) p_glNamedBufferStorageEXT( name, size, data, flags ); + pthread_mutex_unlock( &wgl_lock ); + if (previous) free_buffer( funcs, previous ); } static BOOL wow64_gl_get_buffer_pointer_v( TEB *teb, GLenum target, GLuint name, GLenum pname, PTR32 *wow_ptr ) @@ -2274,15 +2278,6 @@ void wow64_glGetBufferPointerv( TEB *teb, GLenum target, GLenum pname, PTR32 *pa *params = PtrToUlong(ptr); } -void wow64_glGetBufferPointervARB( TEB *teb, GLenum target, GLenum pname, PTR32 *params ) -{ - const struct opengl_funcs *funcs = teb->glTable; - void *ptr; - if (wow64_gl_get_buffer_pointer_v( teb, target, 0, pname, params )) return; - funcs->p_glGetBufferPointerv( target, pname, &ptr ); - *params = PtrToUlong(ptr); -} - void wow64_glGetNamedBufferPointerv( TEB *teb, GLuint buffer, GLenum pname, PTR32 *params, PFN_glGetNamedBufferPointerv p_glGetNamedBufferPointerv ) { @@ -2292,15 +2287,6 @@ void wow64_glGetNamedBufferPointerv( TEB *teb, GLuint buffer, GLenum pname, PTR3 *params = PtrToUlong(ptr); } -void wow64_glGetNamedBufferPointervEXT( TEB *teb, GLuint buffer, GLenum pname, PTR32 *params ) -{ - const struct opengl_funcs *funcs = teb->glTable; - void *ptr; - if (buffer && wow64_gl_get_buffer_pointer_v( teb, 0, buffer, pname, params )) return; - funcs->p_glGetNamedBufferPointervEXT( buffer, pname, &ptr ); - *params = PtrToUlong(ptr); -} - void *wow64_glMapBuffer( TEB *teb, GLenum target, GLenum access, PFN_glMapBuffer p_glMapBuffer ) { GLbitfield range_access = map_range_flags_from_map_flags( access ); @@ -2427,15 +2413,82 @@ void wow64_glFlushMappedNamedBufferRange( TEB *teb, GLuint name, GLintptr offset pthread_mutex_unlock( &wgl_lock ); } -void wow64_glFlushMappedNamedBufferRangeEXT( TEB *teb, GLuint name, GLintptr offset, GLsizeiptr length ) +void wow64_glBufferAttachMemoryNV( TEB *teb, GLenum target, GLuint memory, GLuint64 offset, PFN_glBufferAttachMemoryNV p_glBufferAttachMemoryNV ) { const struct opengl_funcs *funcs = teb->glTable; struct buffer *buffer; pthread_mutex_lock( &wgl_lock ); - if ((buffer = get_named_buffer( teb, name ))) flush_buffer( teb, buffer, offset, length ); - if (use_driver_buffer_map( buffer )) funcs->p_glFlushMappedNamedBufferRangeEXT( name, offset, length ); + buffer = invalidate_buffer_target( teb, target ); + p_glBufferAttachMemoryNV( target, memory, offset ); pthread_mutex_unlock( &wgl_lock ); + + if (buffer) free_buffer( funcs, buffer ); +} + +void wow64_glBufferData( TEB *teb, GLenum target, GLsizeiptr size, const void *data, GLenum usage, PFN_glBufferData p_glBufferData ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct buffer *buffer; + + pthread_mutex_lock( &wgl_lock ); + buffer = invalidate_buffer_target( teb, target ); + p_glBufferData( target, size, data, usage ); + pthread_mutex_unlock( &wgl_lock ); + + if (buffer) free_buffer( funcs, buffer ); +} + +void wow64_glBufferStorageMemEXT( TEB *teb, GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset, PFN_glBufferStorageMemEXT p_glBufferStorageMemEXT ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct buffer *buffer; + + pthread_mutex_lock( &wgl_lock ); + buffer = invalidate_buffer_target( teb, target ); + p_glBufferStorageMemEXT( target, size, memory, offset ); + pthread_mutex_unlock( &wgl_lock ); + + if (buffer) free_buffer( funcs, buffer ); +} + +void wow64_glNamedBufferAttachMemoryNV( TEB *teb, GLuint name, GLuint memory, GLuint64 offset, PFN_glNamedBufferAttachMemoryNV p_glNamedBufferAttachMemoryNV ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct buffer *buffer; + + pthread_mutex_lock( &wgl_lock ); + buffer = invalidate_buffer_name( teb, name ); + p_glNamedBufferAttachMemoryNV( name, memory, offset ); + pthread_mutex_unlock( &wgl_lock ); + + if (buffer) free_buffer( funcs, buffer ); +} + +void wow64_glNamedBufferData( TEB *teb, GLuint name, GLsizeiptr size, const void *data, GLenum usage, PFN_glNamedBufferData p_glNamedBufferData ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct buffer *buffer; + + pthread_mutex_lock( &wgl_lock ); + buffer = invalidate_buffer_name( teb, name ); + p_glNamedBufferData( name, size, data, usage ); + pthread_mutex_unlock( &wgl_lock ); + + if (buffer) free_buffer( funcs, buffer ); +} + +void wow64_glNamedBufferStorageMemEXT( TEB *teb, GLuint name, GLsizeiptr size, GLuint memory, GLuint64 offset, PFN_glNamedBufferStorageMemEXT p_glNamedBufferStorageMemEXT ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct buffer *buffer; + + pthread_mutex_lock( &wgl_lock ); + buffer = invalidate_buffer_name( teb, name ); + p_glNamedBufferStorageMemEXT( name, size, memory, offset ); + pthread_mutex_unlock( &wgl_lock ); + + if (buffer) free_buffer( funcs, buffer ); } NTSTATUS wow64_thread_attach( void *args ) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11226