From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 4 +-- dlls/opengl32/unix_thunks.c | 34 ++++++++++++++++++++++-- dlls/opengl32/unix_thunks.h | 6 ++--- dlls/opengl32/unix_wgl.c | 53 +++++++++++++------------------------ dlls/opengl32/unixlib.h | 6 +++++ dlls/opengl32/wgl.c | 25 ++++------------- 6 files changed, 65 insertions(+), 63 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index b126e6b14b8..ddd1eea2652 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, - "glUnmapNamedBuffer" => 1, - "glUnmapNamedBufferEXT" => 1, "wglCreatePbufferARB" => 1, "wglGetPbufferDCARB" => 1, "wglGetProcAddress" => 1, @@ -242,6 +240,8 @@ my %manual_wow64_wrappers = "glIsSync" => 0, "glUnmapBuffer" => 1, "glUnmapBufferARB" => 1, + "glUnmapNamedBuffer" => 1, + "glUnmapNamedBufferEXT" => 1, "glWaitSync" => 0, ); my %pointer_array_count = diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 5a003b3260c..f670e8905da 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -22699,7 +22699,7 @@ static NTSTATUS ext_glUnmapBufferARB( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glUnmapNamedBuffer( void *args ) +static NTSTATUS ext_glUnmapNamedBuffer( void *args ) { struct glUnmapNamedBuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -22708,7 +22708,7 @@ NTSTATUS ext_glUnmapNamedBuffer( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glUnmapNamedBufferEXT( void *args ) +static NTSTATUS ext_glUnmapNamedBufferEXT( void *args ) { struct glUnmapNamedBufferEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -71468,6 +71468,36 @@ static NTSTATUS wow64_ext_glUnmapBufferARB( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glUnmapNamedBuffer( void *args ) +{ + struct + { + PTR32 teb; + GLuint buffer; + GLboolean ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glUnmapNamedBuffer( teb, params->buffer, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + +static NTSTATUS wow64_ext_glUnmapNamedBufferEXT( void *args ) +{ + struct + { + PTR32 teb; + GLuint buffer; + GLboolean ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glUnmapNamedBufferEXT( teb, params->buffer, ¶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 a756f33d8f4..8305ffaaae3 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -39,6 +39,8 @@ extern void wow64_glGetSynciv( TEB *teb, GLsync sync, GLenum pname, GLsizei coun 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 GLboolean wow64_glUnmapNamedBuffer( TEB *teb, GLuint buffer, PTR32 *client_ptr ); +extern GLboolean wow64_glUnmapNamedBufferEXT( TEB *teb, GLuint buffer, PTR32 *client_ptr ); extern void wow64_glWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ); #endif
@@ -68,10 +70,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_glUnmapNamedBuffer( void *args ); -extern NTSTATUS wow64_ext_glUnmapNamedBuffer( void *args ); -extern NTSTATUS ext_glUnmapNamedBufferEXT( void *args ); -extern NTSTATUS wow64_ext_glUnmapNamedBufferEXT( void *args ); extern NTSTATUS ext_wglCreatePbufferARB( void *args ); extern NTSTATUS wow64_ext_wglCreatePbufferARB( void *args ); extern NTSTATUS ext_wglGetPbufferDCARB( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 7ed81790aaf..c1cc0081460 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1708,11 +1708,11 @@ static GLbitfield map_range_flags_from_map_flags( GLenum flags ) } }
-static NTSTATUS wow64_unmap_buffer( void *ptr, SIZE_T size, GLbitfield access ) +static PTR32 wow64_unmap_buffer( void *ptr, SIZE_T size, GLbitfield access ) { void *wow_ptr;
- if (ULongToPtr(PtrToUlong(ptr)) == ptr) return STATUS_SUCCESS; /* we're lucky */ + if (ULongToPtr(PtrToUlong(ptr)) == ptr) return 0; /* we're lucky */
wow_ptr = UlongToPtr(*(PTR32 *)ptr); if (access & GL_MAP_WRITE_BIT) @@ -1721,7 +1721,7 @@ static NTSTATUS wow64_unmap_buffer( void *ptr, SIZE_T size, GLbitfield access ) memcpy( ptr, wow_ptr, size ); }
- return STATUS_INVALID_ADDRESS; + return PtrToUlong( wow_ptr ); }
static NTSTATUS wow64_gl_get_buffer_pointer_v( void *args, NTSTATUS (*get_buffer_pointer_v64)(void *) ) @@ -1952,14 +1952,11 @@ NTSTATUS wow64_ext_glMapNamedBufferRangeEXT( void *args )
static PTR32 wow64_unmap_client_buffer( TEB *teb, GLenum target ) { - PTR32 *ptr, ret; + PTR32 *ptr;
if (!(ptr = get_buffer_pointer( teb, target ))) return 0; - ret = *ptr; - - wow64_unmap_buffer( ptr, get_buffer_param( teb, target, GL_BUFFER_MAP_LENGTH ), - get_buffer_param( teb, target, GL_BUFFER_ACCESS_FLAGS ) ); - return ret; + return wow64_unmap_buffer( ptr, get_buffer_param( teb, target, GL_BUFFER_MAP_LENGTH ), + get_buffer_param( teb, target, GL_BUFFER_ACCESS_FLAGS ) ); }
GLboolean wow64_glUnmapBuffer( TEB *teb, GLenum target, PTR32 *client_ptr ) @@ -1976,41 +1973,27 @@ GLboolean wow64_glUnmapBufferARB( TEB *teb, GLenum target, PTR32 *client_ptr ) return funcs->p_glUnmapBuffer( target ); }
-static NTSTATUS wow64_gl_unmap_named_buffer( void *args, NTSTATUS (*gl_unmap_named_buffer64)(void *) ) +static PTR32 wow64_gl_unmap_named_buffer( TEB *teb, GLuint buffer ) { PTR32 *ptr; - struct - { - PTR32 teb; - GLint buffer; - GLboolean ret; - } *params32 = args; - struct glUnmapNamedBuffer_params params = - { - .teb = get_teb64(params32->teb), - .buffer = params32->buffer, - .ret = TRUE, - }; - NTSTATUS status;
- if (!(ptr = get_named_buffer_pointer( params.teb, params.buffer ))) return STATUS_SUCCESS; - - status = wow64_unmap_buffer( ptr, get_named_buffer_param( params.teb, params.buffer, GL_BUFFER_MAP_LENGTH ), - get_named_buffer_param( params.teb, params.buffer, GL_BUFFER_ACCESS_FLAGS ) ); - gl_unmap_named_buffer64( ¶ms ); - params32->ret = params.ret; - - return status; + if (!(ptr = get_named_buffer_pointer( teb, buffer ))) return 0; + return wow64_unmap_buffer( ptr, get_named_buffer_param( teb, buffer, GL_BUFFER_MAP_LENGTH ), + get_named_buffer_param( teb, buffer, GL_BUFFER_ACCESS_FLAGS ) ); }
-NTSTATUS wow64_ext_glUnmapNamedBuffer( void *args ) +GLboolean wow64_glUnmapNamedBuffer( TEB *teb, GLuint buffer, PTR32 *client_ptr ) { - return wow64_gl_unmap_named_buffer( args, ext_glUnmapNamedBuffer ); + const struct opengl_funcs *funcs = teb->glTable; + *client_ptr = wow64_gl_unmap_named_buffer( teb, buffer ); + return funcs->p_glUnmapNamedBuffer( buffer ); }
-NTSTATUS wow64_ext_glUnmapNamedBufferEXT( void *args ) +GLboolean wow64_glUnmapNamedBufferEXT( TEB *teb, GLuint buffer, PTR32 *client_ptr ) { - return wow64_gl_unmap_named_buffer( args, ext_glUnmapNamedBufferEXT ); + const struct opengl_funcs *funcs = teb->glTable; + *client_ptr = wow64_gl_unmap_named_buffer( teb, buffer ); + return funcs->p_glUnmapNamedBufferEXT( buffer ); }
NTSTATUS wow64_thread_attach( void *args ) diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index d031d97a183..86ed177fded 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -21732,6 +21732,9 @@ struct glUnmapNamedBuffer_params TEB *teb; GLuint buffer; GLboolean ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glUnmapNamedBufferEXT_params @@ -21739,6 +21742,9 @@ struct glUnmapNamedBufferEXT_params TEB *teb; GLuint buffer; GLboolean ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glUnmapObjectBufferATI_params diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 8f2cab94d64..3d8e7e4e024 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1677,17 +1677,6 @@ const GLchar * WINAPI wglQueryRendererStringWINE( HDC dc, GLint renderer, GLenum return args.ret; }
-#ifndef _WIN64 -static void *get_named_buffer_pointer( GLint buffer ) -{ - void (WINAPI *p_glGetNamedBufferPointerv)( GLuint buffer, GLenum pname, void **params ); - void *ptr; - if (!(p_glGetNamedBufferPointerv = (void *)wglGetProcAddress( "glGetNamedBufferPointerv" ))) return 0; - p_glGetNamedBufferPointerv( buffer, GL_BUFFER_MAP_POINTER, &ptr ); - return ptr; -} -#endif - static void *gl_map_buffer( enum unix_funcs code, GLenum target, GLenum access ) { struct glMapBuffer_params args = @@ -1867,22 +1856,18 @@ static GLboolean gl_unmap_named_buffer( enum unix_funcs code, GLuint buffer ) .buffer = buffer, }; NTSTATUS status; -#ifndef _WIN64 - void *ptr = get_named_buffer_pointer( buffer ); -#endif
TRACE( "buffer %d\n", buffer );
- 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( "glUnmapNamedBuffer returned %#lx\n", status ); + if (status) WARN( "glUnmapNamedBuffer returned %#lx\n", status ); return args.ret; }