From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 5 +-- dlls/opengl32/unix_thunks.h | 70 ++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 1a77f732b04..b922acb7455 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -541,8 +541,9 @@ sub generate_wrapper_declaration($$$) my $ret = "extern " . get_func_ret( $func, 0 ); 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"; + $ret .= "$name( TEB *teb,"; + $ret .= $decl_args unless $decl_args eq "void"; + $ret =~ s/,$/ /; $ret .= ");\n"; return $ret; } diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 4042faaf162..93c6271ec98 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -1,43 +1,43 @@ /* Automatically generated from http://www.opengl.org/registry files; DO NOT EDIT! */
-extern BOOL wrap_wglCopyContext( TEB *teb , HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask ); -extern HGLRC wrap_wglCreateContext( TEB *teb , HDC hDc ); -extern BOOL wrap_wglDeleteContext( TEB *teb , HGLRC oldContext ); -extern PROC wrap_wglGetProcAddress( TEB *teb , LPCSTR lpszProc ); -extern BOOL wrap_wglMakeCurrent( TEB *teb , HDC hDc, HGLRC newContext ); -extern BOOL wrap_wglShareLists( TEB *teb , HGLRC hrcSrvShare, HGLRC hrcSrvSource ); -extern BOOL wrap_wglSwapBuffers( TEB *teb , HDC hdc ); -extern void wrap_glClear( TEB *teb , GLbitfield mask ); -extern void wrap_glDrawPixels( TEB *teb , GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels ); -extern void wrap_glFinish( TEB *teb); -extern void wrap_glFlush( TEB *teb); -extern void wrap_glGetIntegerv( TEB *teb , GLenum pname, GLint *data ); -extern const GLubyte * wrap_glGetString( TEB *teb , GLenum name ); -extern void wrap_glReadPixels( TEB *teb , GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels ); -extern void wrap_glViewport( TEB *teb , GLint x, GLint y, GLsizei width, GLsizei height ); -extern void wrap_glDebugMessageCallback( TEB *teb , GLDEBUGPROC callback, const void *userParam ); -extern void wrap_glDebugMessageCallbackAMD( TEB *teb , GLDEBUGPROCAMD callback, void *userParam ); -extern void wrap_glDebugMessageCallbackARB( TEB *teb , GLDEBUGPROCARB callback, const void *userParam ); -extern const GLubyte * wrap_glGetStringi( TEB *teb , GLenum name, GLuint index ); -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 ); +extern BOOL wrap_wglCopyContext( TEB *teb, HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask ); +extern HGLRC wrap_wglCreateContext( TEB *teb, HDC hDc ); +extern BOOL wrap_wglDeleteContext( TEB *teb, HGLRC oldContext ); +extern PROC wrap_wglGetProcAddress( TEB *teb, LPCSTR lpszProc ); +extern BOOL wrap_wglMakeCurrent( TEB *teb, HDC hDc, HGLRC newContext ); +extern BOOL wrap_wglShareLists( TEB *teb, HGLRC hrcSrvShare, HGLRC hrcSrvSource ); +extern BOOL wrap_wglSwapBuffers( TEB *teb, HDC hdc ); +extern void wrap_glClear( TEB *teb, GLbitfield mask ); +extern void wrap_glDrawPixels( TEB *teb, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels ); +extern void wrap_glFinish( TEB *teb ); +extern void wrap_glFlush( TEB *teb ); +extern void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data ); +extern const GLubyte * wrap_glGetString( TEB *teb, GLenum name ); +extern void wrap_glReadPixels( TEB *teb, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels ); +extern void wrap_glViewport( TEB *teb, GLint x, GLint y, GLsizei width, GLsizei height ); +extern void wrap_glDebugMessageCallback( TEB *teb, GLDEBUGPROC callback, const void *userParam ); +extern void wrap_glDebugMessageCallbackAMD( TEB *teb, GLDEBUGPROCAMD callback, void *userParam ); +extern void wrap_glDebugMessageCallbackARB( TEB *teb, GLDEBUGPROCARB callback, const void *userParam ); +extern const GLubyte * wrap_glGetStringi( TEB *teb, GLenum name, GLuint index ); +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 typedef ULONG PTR32; -extern GLenum wow64_glClientWaitSync( TEB *teb , GLsync sync, GLbitfield flags, GLuint64 timeout ); -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 void wow64_glWaitSync( TEB *teb , GLsync sync, GLbitfield flags, GLuint64 timeout ); +extern GLenum wow64_glClientWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ); +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 void wow64_glWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ); #endif
extern NTSTATUS wgl_wglGetProcAddress( void *args );
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; }
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; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 11 ++++++---- dlls/opengl32/unix_thunks.c | 36 +++++++++++++++++++++++++++++-- dlls/opengl32/unix_thunks.h | 6 ++---- dlls/opengl32/unix_wgl.c | 42 +++++++++++++------------------------ dlls/opengl32/unixlib.h | 6 ++++++ dlls/opengl32/wgl.c | 12 +++++------ 6 files changed, 70 insertions(+), 43 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index ddd1eea2652..a839ec4a70f 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -218,8 +218,6 @@ my %manual_wow64_thunks = "glGetBufferPointervARB" => 1, "glGetNamedBufferPointerv" => 1, "glGetNamedBufferPointervEXT" => 1, - "glMapBuffer" => 1, - "glMapBufferARB" => 1, "glMapBufferRange" => 1, "glMapNamedBuffer" => 1, "glMapNamedBufferEXT" => 1, @@ -238,6 +236,8 @@ my %manual_wow64_wrappers = "glFenceSync" => 0, "glGetSynciv" => 0, "glIsSync" => 0, + "glMapBuffer" => 1, + "glMapBufferARB" => 1, "glUnmapBuffer" => 1, "glUnmapBufferARB" => 1, "glUnmapNamedBuffer" => 1, @@ -451,7 +451,7 @@ sub generate_unix_thunk($$$$) } elsif ($ptype eq "PTR32") { - $ret_expr .= "(UINT_PTR)"; + $ret_expr .= "(UINT_PTR)" unless $ret_type =~ /*/; $need_manual_thunk = 1 if $ret_type =~ /(GLsync|PROC|GLintptr|*)/; } } @@ -543,8 +543,11 @@ sub generate_unix_thunk($$$$) sub generate_wrapper_declaration($$$) { my ($name, $func, $is_wow64) = @_; - my $ret = "extern " . get_func_ret( $func, 0 ); my $decl_args = get_func_args( $func, 0 ); + my $ret_type = get_func_ret( $func, 0 ); + my $ret = "extern "; + $ret_type = "PTR32" if $is_wow64 && $ret_type =~ /*/; + $ret .= $ret_type; $ret .= $is_wow64 ? " wow64_" : " wrap_"; $ret .= "$name( TEB *teb,"; foreach my $arg (@{$func->[1]}) diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index f670e8905da..3e75d59e856 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -13051,7 +13051,7 @@ static NTSTATUS ext_glMap2xOES( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glMapBuffer( void *args ) +static NTSTATUS ext_glMapBuffer( void *args ) { struct glMapBuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -13060,7 +13060,7 @@ NTSTATUS ext_glMapBuffer( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glMapBufferARB( void *args ) +static NTSTATUS ext_glMapBufferARB( void *args ) { struct glMapBufferARB_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -53690,6 +53690,38 @@ static NTSTATUS wow64_ext_glMap2xOES( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glMapBuffer( void *args ) +{ + struct + { + PTR32 teb; + GLenum target; + GLenum access; + PTR32 ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glMapBuffer( teb, params->target, params->access, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + +static NTSTATUS wow64_ext_glMapBufferARB( void *args ) +{ + struct + { + PTR32 teb; + GLenum target; + GLenum access; + PTR32 ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glMapBufferARB( teb, params->target, params->access, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + static NTSTATUS wow64_ext_glMapControlPointsNV( void *args ) { struct diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 8305ffaaae3..c587d0dd52e 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 PTR32 wow64_glMapBuffer( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ); +extern PTR32 wow64_glMapBufferARB( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ); 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 ); @@ -54,10 +56,6 @@ extern NTSTATUS ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS ext_glGetNamedBufferPointervEXT( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointervEXT( void *args ); -extern NTSTATUS ext_glMapBuffer( void *args ); -extern NTSTATUS wow64_ext_glMapBuffer( void *args ); -extern NTSTATUS ext_glMapBufferARB( void *args ); -extern NTSTATUS wow64_ext_glMapBufferARB( void *args ); extern NTSTATUS ext_glMapBufferRange( void *args ); extern NTSTATUS wow64_ext_glMapBufferRange( void *args ); extern NTSTATUS ext_glMapNamedBuffer( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index c1cc0081460..7bd90498450 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1798,43 +1798,31 @@ NTSTATUS wow64_ext_glGetNamedBufferPointervEXT( void *args ) return wow64_gl_get_named_buffer_pointer_v( args, ext_glGetNamedBufferPointervEXT ); }
-static NTSTATUS wow64_gl_map_buffer( void *args, NTSTATUS (*gl_map_buffer64)(void *) ) +static PTR32 wow64_gl_map_buffer( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr, + PFN_glMapBuffer gl_map_buffer64 ) { - struct - { - PTR32 teb; - GLenum target; - GLenum access; - PTR32 ret; - } *params32 = args; - struct glMapBuffer_params params = - { - .teb = get_teb64(params32->teb), - .target = params32->target, - .access = params32->access, - }; NTSTATUS status; + void *ptr;
- /* already mapped, we're being called again with a wow64 pointer */ - if (params32->ret) params.ret = get_buffer_pointer( params.teb, params.target ); - else if ((status = gl_map_buffer64( ¶ms ))) return status; - - status = wow64_map_buffer( params.teb, 0, params.target, params.ret, 0, - map_range_flags_from_map_flags( params.access ), ¶ms32->ret ); - if (!status || status == STATUS_INVALID_ADDRESS) return status; + /* if *ret, we're being called again with a wow64 pointer */ + ptr = *client_ptr ? get_buffer_pointer( teb, target ) : gl_map_buffer64( target, access );
- unmap_buffer( params.teb, params.target ); - return status; + status = wow64_map_buffer( teb, 0, target, ptr, 0, map_range_flags_from_map_flags( access ), client_ptr ); + if (!status) return *client_ptr; + if (status != STATUS_INVALID_ADDRESS) unmap_buffer( teb, target ); + return 0; }
-NTSTATUS wow64_ext_glMapBuffer( void *args ) +PTR32 wow64_glMapBuffer( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ) { - return wow64_gl_map_buffer( args, ext_glMapBuffer ); + const struct opengl_funcs *funcs = teb->glTable; + return wow64_gl_map_buffer( teb, target, access, client_ptr, funcs->p_glMapBuffer ); }
-NTSTATUS wow64_ext_glMapBufferARB( void *args ) +PTR32 wow64_glMapBufferARB( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ) { - return wow64_gl_map_buffer( args, ext_glMapBufferARB ); + const struct opengl_funcs *funcs = teb->glTable; + return wow64_gl_map_buffer( teb, target, access, client_ptr, funcs->p_glMapBufferARB ); }
NTSTATUS wow64_ext_glMapBufferRange( void *args ) diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index 86ed177fded..948364b787f 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -12379,6 +12379,9 @@ struct glMapBuffer_params GLenum target; GLenum access; void *ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glMapBufferARB_params @@ -12387,6 +12390,9 @@ struct glMapBufferARB_params GLenum target; GLenum access; void *ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glMapBufferRange_params diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 3d8e7e4e024..ca61caf1cc5 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1689,17 +1689,17 @@ static void *gl_map_buffer( enum unix_funcs code, GLenum target, GLenum access )
TRACE( "target %d, access %d\n", target, access );
- 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( "Unable to map wow64 buffer directly, using copy buffer!\n" ); - if (!(args.ret = _aligned_malloc( (size_t)args.ret, 16 ))) status = STATUS_NO_MEMORY; - else if (!(status = WINE_UNIX_CALL( code, &args ))) return args.ret; - _aligned_free( args.ret ); + if (!(args.client_ptr = _aligned_malloc( (size_t)args.client_ptr, 16 ))) return NULL; + status = WINE_UNIX_CALL( code, &args ); + if (args.ret != args.client_ptr) _aligned_free( args.client_ptr ); } #endif - WARN( "glMapBuffer returned %#lx\n", status ); + if (status) WARN( "glMapBuffer returned %#lx\n", status ); return args.ret; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 2 +- dlls/opengl32/unix_thunks.c | 20 +++++++++++++++++++- dlls/opengl32/unix_thunks.h | 3 +-- dlls/opengl32/unix_wgl.c | 34 +++++++++------------------------- dlls/opengl32/unixlib.h | 3 +++ dlls/opengl32/wgl.c | 12 ++++++------ 6 files changed, 39 insertions(+), 35 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index a839ec4a70f..38af409f050 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -218,7 +218,6 @@ my %manual_wow64_thunks = "glGetBufferPointervARB" => 1, "glGetNamedBufferPointerv" => 1, "glGetNamedBufferPointervEXT" => 1, - "glMapBufferRange" => 1, "glMapNamedBuffer" => 1, "glMapNamedBufferEXT" => 1, "glMapNamedBufferRange" => 1, @@ -238,6 +237,7 @@ my %manual_wow64_wrappers = "glIsSync" => 0, "glMapBuffer" => 1, "glMapBufferARB" => 1, + "glMapBufferRange" => 1, "glUnmapBuffer" => 1, "glUnmapBufferARB" => 1, "glUnmapNamedBuffer" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 3e75d59e856..74c98e9984d 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -13069,7 +13069,7 @@ static NTSTATUS ext_glMapBufferARB( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glMapBufferRange( void *args ) +static NTSTATUS ext_glMapBufferRange( void *args ) { struct glMapBufferRange_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -53722,6 +53722,24 @@ static NTSTATUS wow64_ext_glMapBufferARB( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glMapBufferRange( void *args ) +{ + struct + { + PTR32 teb; + GLenum target; + PTR32 offset; + PTR32 length; + GLbitfield access; + PTR32 ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glMapBufferRange( teb, params->target, (GLintptr)ULongToPtr(params->offset), (GLsizeiptr)ULongToPtr(params->length), params->access, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + static NTSTATUS wow64_ext_glMapControlPointsNV( void *args ) { struct diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index c587d0dd52e..f81d7cf3853 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -39,6 +39,7 @@ extern void wow64_glGetSynciv( TEB *teb, GLsync sync, GLenum pname, GLsizei coun extern GLboolean wow64_glIsSync( TEB *teb, GLsync sync ); extern PTR32 wow64_glMapBuffer( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ); extern PTR32 wow64_glMapBufferARB( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ); +extern PTR32 wow64_glMapBufferRange( TEB *teb, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ); 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 ); @@ -56,8 +57,6 @@ extern NTSTATUS ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS ext_glGetNamedBufferPointervEXT( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointervEXT( void *args ); -extern NTSTATUS ext_glMapBufferRange( void *args ); -extern NTSTATUS wow64_ext_glMapBufferRange( void *args ); extern NTSTATUS ext_glMapNamedBuffer( void *args ); extern NTSTATUS wow64_ext_glMapNamedBuffer( void *args ); extern NTSTATUS ext_glMapNamedBufferEXT( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 7bd90498450..abc0592a2fa 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1825,36 +1825,20 @@ PTR32 wow64_glMapBufferARB( TEB *teb, GLenum target, GLenum access, PTR32 *clien return wow64_gl_map_buffer( teb, target, access, client_ptr, funcs->p_glMapBufferARB ); }
-NTSTATUS wow64_ext_glMapBufferRange( void *args ) +PTR32 wow64_glMapBufferRange( TEB *teb, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ) { - struct - { - PTR32 teb; - GLenum target; - PTR32 offset; - PTR32 length; - GLbitfield access; - PTR32 ret; - } *params32 = args; - struct glMapBufferRange_params params = - { - .teb = get_teb64(params32->teb), - .target = params32->target, - .offset = (GLintptr)ULongToPtr(params32->offset), - .length = (GLsizeiptr)ULongToPtr(params32->length), - .access = params32->access, - }; + const struct opengl_funcs *funcs = teb->glTable; NTSTATUS status; + void *ptr;
/* already mapped, we're being called again with a wow64 pointer */ - if (params32->ret) params.ret = (char *)get_buffer_pointer( params.teb, params.target ); - else if ((status = ext_glMapBufferRange( ¶ms ))) return status; + if (*client_ptr) ptr = (char *)get_buffer_pointer( teb, target ); + else ptr = funcs->p_glMapBufferRange( target, offset, length, access );
- status = wow64_map_buffer( params.teb, 0, params.target, params.ret, params.length, params.access, ¶ms32->ret ); - if (!status || status == STATUS_INVALID_ADDRESS) return status; - - unmap_buffer( params.teb, params.target ); - return status; + status = wow64_map_buffer( teb, 0, target, ptr, length, access, client_ptr ); + if (!status) return *client_ptr; + if (status != STATUS_INVALID_ADDRESS) unmap_buffer( teb, target ); + return 0; }
static NTSTATUS wow64_gl_map_named_buffer( void *args, NTSTATUS (*gl_map_named_buffer64)(void *) ) diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index 948364b787f..e673b7b8e7d 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -12403,6 +12403,9 @@ struct glMapBufferRange_params GLsizeiptr length; GLbitfield access; void *ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glMapControlPointsNV_params diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index ca61caf1cc5..d438966f898 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1727,17 +1727,17 @@ void * WINAPI glMapBufferRange( GLenum target, GLintptr offset, GLsizeiptr lengt
TRACE( "target %d, offset %Id, length %Id, access %d\n", target, offset, length, access );
- if (!(status = UNIX_CALL( glMapBufferRange, &args ))) return args.ret; + status = UNIX_CALL( glMapBufferRange, &args ); #ifndef _WIN64 - if (status == STATUS_INVALID_ADDRESS) + if (args.client_ptr) { TRACE( "Unable to map wow64 buffer directly, using copy buffer!\n" ); - if (!(args.ret = _aligned_malloc( length, 16 ))) status = STATUS_NO_MEMORY; - else if (!(status = UNIX_CALL( glMapBufferRange, &args ))) return args.ret; - _aligned_free( args.ret ); + if (!(args.client_ptr = _aligned_malloc( length, 16 ))) return NULL; + status = UNIX_CALL( glMapBufferRange, &args ); + if (args.ret != args.client_ptr) _aligned_free( args.client_ptr ); } #endif - WARN( "glMapBufferRange returned %#lx\n", status ); + if (status) WARN( "glMapBufferRange returned %#lx\n", status ); return args.ret; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 4 ++-- dlls/opengl32/unix_thunks.c | 36 ++++++++++++++++++++++++++++++-- dlls/opengl32/unix_thunks.h | 6 ++---- dlls/opengl32/unix_wgl.c | 41 ++++++++++++++----------------------- dlls/opengl32/unixlib.h | 6 ++++++ dlls/opengl32/wgl.c | 12 +++++------ 6 files changed, 65 insertions(+), 40 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 38af409f050..4109fa1102f 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -218,8 +218,6 @@ my %manual_wow64_thunks = "glGetBufferPointervARB" => 1, "glGetNamedBufferPointerv" => 1, "glGetNamedBufferPointervEXT" => 1, - "glMapNamedBuffer" => 1, - "glMapNamedBufferEXT" => 1, "glMapNamedBufferRange" => 1, "glMapNamedBufferRangeEXT" => 1, "glPathGlyphIndexRangeNV" => 1, @@ -238,6 +236,8 @@ my %manual_wow64_wrappers = "glMapBuffer" => 1, "glMapBufferARB" => 1, "glMapBufferRange" => 1, + "glMapNamedBuffer" => 1, + "glMapNamedBufferEXT" => 1, "glUnmapBuffer" => 1, "glUnmapBufferARB" => 1, "glUnmapNamedBuffer" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 74c98e9984d..69fa7add2af 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -13105,7 +13105,7 @@ static NTSTATUS ext_glMapGrid2xOES( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glMapNamedBuffer( void *args ) +static NTSTATUS ext_glMapNamedBuffer( void *args ) { struct glMapNamedBuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -13114,7 +13114,7 @@ NTSTATUS ext_glMapNamedBuffer( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glMapNamedBufferEXT( void *args ) +static NTSTATUS ext_glMapNamedBufferEXT( void *args ) { struct glMapNamedBufferEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -53796,6 +53796,38 @@ static NTSTATUS wow64_ext_glMapGrid2xOES( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glMapNamedBuffer( void *args ) +{ + struct + { + PTR32 teb; + GLuint buffer; + GLenum access; + PTR32 ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glMapNamedBuffer( teb, params->buffer, params->access, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + +static NTSTATUS wow64_ext_glMapNamedBufferEXT( void *args ) +{ + struct + { + PTR32 teb; + GLuint buffer; + GLenum access; + PTR32 ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glMapNamedBufferEXT( teb, params->buffer, params->access, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + static NTSTATUS wow64_ext_glMapObjectBufferATI( void *args ) { struct diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index f81d7cf3853..f3d6d37bd33 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -40,6 +40,8 @@ extern GLboolean wow64_glIsSync( TEB *teb, GLsync sync ); extern PTR32 wow64_glMapBuffer( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ); extern PTR32 wow64_glMapBufferARB( TEB *teb, GLenum target, GLenum access, PTR32 *client_ptr ); extern PTR32 wow64_glMapBufferRange( TEB *teb, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ); +extern PTR32 wow64_glMapNamedBuffer( TEB *teb, GLuint buffer, GLenum access, PTR32 *client_ptr ); +extern PTR32 wow64_glMapNamedBufferEXT( TEB *teb, GLuint buffer, GLenum access, PTR32 *client_ptr ); 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 ); @@ -57,10 +59,6 @@ extern NTSTATUS ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS ext_glGetNamedBufferPointervEXT( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointervEXT( void *args ); -extern NTSTATUS ext_glMapNamedBuffer( void *args ); -extern NTSTATUS wow64_ext_glMapNamedBuffer( void *args ); -extern NTSTATUS ext_glMapNamedBufferEXT( void *args ); -extern NTSTATUS wow64_ext_glMapNamedBufferEXT( void *args ); extern NTSTATUS ext_glMapNamedBufferRange( void *args ); extern NTSTATUS wow64_ext_glMapNamedBufferRange( void *args ); extern NTSTATUS ext_glMapNamedBufferRangeEXT( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index abc0592a2fa..50b21568a3e 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1841,43 +1841,32 @@ PTR32 wow64_glMapBufferRange( TEB *teb, GLenum target, GLintptr offset, GLsizeip return 0; }
-static NTSTATUS wow64_gl_map_named_buffer( void *args, NTSTATUS (*gl_map_named_buffer64)(void *) ) +static PTR32 wow64_gl_map_named_buffer( TEB *teb, GLuint buffer, GLenum access, PTR32 *client_ptr, + PFN_glMapNamedBuffer gl_map_named_buffer64 ) { - struct - { - PTR32 teb; - GLuint buffer; - GLenum access; - PTR32 ret; - } *params32 = args; - struct glMapNamedBuffer_params params = - { - .teb = get_teb64(params32->teb), - .buffer = params32->buffer, - .access = params32->access, - }; NTSTATUS status; + void *ptr;
/* already mapped, we're being called again with a wow64 pointer */ - if (params32->ret) params.ret = get_named_buffer_pointer( params.teb, params.buffer ); - else if ((status = gl_map_named_buffer64( ¶ms ))) return status; + if (*client_ptr) ptr = get_named_buffer_pointer( teb, buffer ); + else ptr = gl_map_named_buffer64( buffer, access );
- status = wow64_map_buffer( params.teb, params.buffer, 0, params.ret, 0, - map_range_flags_from_map_flags( params.access ), ¶ms32->ret ); - if (!status || status == STATUS_INVALID_ADDRESS) return status; - - unmap_named_buffer( params.teb, params.buffer ); - return status; + status = wow64_map_buffer( teb, buffer, 0, ptr, 0, map_range_flags_from_map_flags( access ), client_ptr ); + if (!status) return *client_ptr; + if (status != STATUS_INVALID_ADDRESS) unmap_named_buffer( teb, buffer ); + return 0; }
-NTSTATUS wow64_ext_glMapNamedBuffer( void *args ) +PTR32 wow64_glMapNamedBuffer( TEB *teb, GLuint buffer, GLenum access, PTR32 *client_ptr ) { - return wow64_gl_map_named_buffer( args, ext_glMapNamedBuffer ); + const struct opengl_funcs *funcs = teb->glTable; + return wow64_gl_map_named_buffer( teb, buffer, access, client_ptr, funcs->p_glMapNamedBuffer ); }
-NTSTATUS wow64_ext_glMapNamedBufferEXT( void *args ) +PTR32 wow64_glMapNamedBufferEXT( TEB *teb, GLuint buffer, GLenum access, PTR32 *client_ptr ) { - return wow64_gl_map_named_buffer( args, ext_glMapNamedBufferEXT ); + const struct opengl_funcs *funcs = teb->glTable; + return wow64_gl_map_named_buffer( teb, buffer, access, client_ptr, funcs->p_glMapNamedBufferEXT ); }
static NTSTATUS wow64_gl_map_named_buffer_range( void *args, NTSTATUS (*gl_map_named_buffer_range64)(void *) ) diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index e673b7b8e7d..3322812f43e 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -12446,6 +12446,9 @@ struct glMapNamedBuffer_params GLuint buffer; GLenum access; void *ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glMapNamedBufferEXT_params @@ -12454,6 +12457,9 @@ struct glMapNamedBufferEXT_params GLuint buffer; GLenum access; void *ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glMapNamedBufferRange_params diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index d438966f898..7aa375d8aa8 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1753,17 +1753,17 @@ static void *gl_map_named_buffer( enum unix_funcs code, GLuint buffer, GLenum ac
TRACE( "(%d, %d)\n", buffer, access );
- 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( "Unable to map wow64 buffer directly, using copy buffer!\n" ); - if (!(args.ret = _aligned_malloc( (size_t)args.ret, 16 ))) status = STATUS_NO_MEMORY; - else if (!(status = WINE_UNIX_CALL( code, &args ))) return args.ret; - _aligned_free( args.ret ); + if (!(args.client_ptr = _aligned_malloc( (size_t)args.client_ptr, 16 ))) return NULL;; + status = WINE_UNIX_CALL( code, &args ); + if (args.ret != args.client_ptr) _aligned_free( args.client_ptr ); } #endif - WARN( "glMapNamedBuffer returned %#lx\n", status ); + if (status) WARN( "glMapNamedBuffer returned %#lx\n", status ); return args.ret; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/make_opengl | 4 ++-- dlls/opengl32/unix_thunks.c | 40 +++++++++++++++++++++++++++++++-- dlls/opengl32/unix_thunks.h | 6 ++--- dlls/opengl32/unix_wgl.c | 44 +++++++++++++------------------------ dlls/opengl32/unixlib.h | 6 +++++ dlls/opengl32/wgl.c | 12 +++++----- 6 files changed, 69 insertions(+), 43 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 4109fa1102f..25c9f27d4db 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -218,8 +218,6 @@ my %manual_wow64_thunks = "glGetBufferPointervARB" => 1, "glGetNamedBufferPointerv" => 1, "glGetNamedBufferPointervEXT" => 1, - "glMapNamedBufferRange" => 1, - "glMapNamedBufferRangeEXT" => 1, "glPathGlyphIndexRangeNV" => 1, "wglCreatePbufferARB" => 1, "wglGetPbufferDCARB" => 1, @@ -238,6 +236,8 @@ my %manual_wow64_wrappers = "glMapBufferRange" => 1, "glMapNamedBuffer" => 1, "glMapNamedBufferEXT" => 1, + "glMapNamedBufferRange" => 1, + "glMapNamedBufferRangeEXT" => 1, "glUnmapBuffer" => 1, "glUnmapBufferARB" => 1, "glUnmapNamedBuffer" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 69fa7add2af..c394f36bec3 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -13123,7 +13123,7 @@ static NTSTATUS ext_glMapNamedBufferEXT( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glMapNamedBufferRange( void *args ) +static NTSTATUS ext_glMapNamedBufferRange( void *args ) { struct glMapNamedBufferRange_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -13132,7 +13132,7 @@ NTSTATUS ext_glMapNamedBufferRange( void *args ) return STATUS_SUCCESS; }
-NTSTATUS ext_glMapNamedBufferRangeEXT( void *args ) +static NTSTATUS ext_glMapNamedBufferRangeEXT( void *args ) { struct glMapNamedBufferRangeEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; @@ -53828,6 +53828,42 @@ static NTSTATUS wow64_ext_glMapNamedBufferEXT( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wow64_ext_glMapNamedBufferRange( void *args ) +{ + struct + { + PTR32 teb; + GLuint buffer; + PTR32 offset; + PTR32 length; + GLbitfield access; + PTR32 ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glMapNamedBufferRange( teb, params->buffer, (GLintptr)ULongToPtr(params->offset), (GLsizeiptr)ULongToPtr(params->length), params->access, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + +static NTSTATUS wow64_ext_glMapNamedBufferRangeEXT( void *args ) +{ + struct + { + PTR32 teb; + GLuint buffer; + PTR32 offset; + PTR32 length; + GLbitfield access; + PTR32 ret; + PTR32 client_ptr; + } *params = args; + TEB *teb = get_teb64( params->teb ); + params->ret = wow64_glMapNamedBufferRangeEXT( teb, params->buffer, (GLintptr)ULongToPtr(params->offset), (GLsizeiptr)ULongToPtr(params->length), params->access, ¶ms->client_ptr ); + set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); + return STATUS_SUCCESS; +} + static NTSTATUS wow64_ext_glMapObjectBufferATI( void *args ) { struct diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index f3d6d37bd33..4b97e1d56ed 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -42,6 +42,8 @@ extern PTR32 wow64_glMapBufferARB( TEB *teb, GLenum target, GLenum access, PTR32 extern PTR32 wow64_glMapBufferRange( TEB *teb, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ); extern PTR32 wow64_glMapNamedBuffer( TEB *teb, GLuint buffer, GLenum access, PTR32 *client_ptr ); extern PTR32 wow64_glMapNamedBufferEXT( TEB *teb, GLuint buffer, GLenum access, PTR32 *client_ptr ); +extern PTR32 wow64_glMapNamedBufferRange( TEB *teb, GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ); +extern PTR32 wow64_glMapNamedBufferRangeEXT( TEB *teb, GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ); 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 ); @@ -59,10 +61,6 @@ extern NTSTATUS ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointerv( void *args ); extern NTSTATUS ext_glGetNamedBufferPointervEXT( void *args ); extern NTSTATUS wow64_ext_glGetNamedBufferPointervEXT( void *args ); -extern NTSTATUS ext_glMapNamedBufferRange( void *args ); -extern NTSTATUS wow64_ext_glMapNamedBufferRange( void *args ); -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_wglCreatePbufferARB( void *args ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 50b21568a3e..1dd29481500 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1869,46 +1869,32 @@ PTR32 wow64_glMapNamedBufferEXT( TEB *teb, GLuint buffer, GLenum access, PTR32 * return wow64_gl_map_named_buffer( teb, buffer, access, client_ptr, funcs->p_glMapNamedBufferEXT ); }
-static NTSTATUS wow64_gl_map_named_buffer_range( void *args, NTSTATUS (*gl_map_named_buffer_range64)(void *) ) +static NTSTATUS wow64_gl_map_named_buffer_range( TEB *teb, GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access, + PTR32 *client_ptr, PFN_glMapNamedBufferRange gl_map_named_buffer_range64 ) { - struct - { - PTR32 teb; - GLuint buffer; - PTR32 offset; - PTR32 length; - GLbitfield access; - PTR32 ret; - } *params32 = args; - struct glMapNamedBufferRange_params params = - { - .teb = get_teb64(params32->teb), - .buffer = params32->buffer, - .offset = (GLintptr)ULongToPtr(params32->offset), - .length = (GLsizeiptr)ULongToPtr(params32->length), - .access = params32->access, - }; NTSTATUS status; + void *ptr;
/* already mapped, we're being called again with a wow64 pointer */ - if (params32->ret) params.ret = get_named_buffer_pointer( params.teb, params.buffer ); - else if ((status = gl_map_named_buffer_range64( ¶ms ))) return status; - - status = wow64_map_buffer( params.teb, params.buffer, 0, params.ret, params.length, params.access, ¶ms32->ret ); - if (!status || status == STATUS_INVALID_ADDRESS) return status; + if (*client_ptr) ptr = get_named_buffer_pointer( teb, buffer ); + else ptr = gl_map_named_buffer_range64( buffer, offset, length, access );
- unmap_named_buffer( params.teb, params.buffer ); - return status; + status = wow64_map_buffer( teb, buffer, 0, ptr, length, access, client_ptr ); + if (!status) return *client_ptr; + if (status != STATUS_INVALID_ADDRESS) unmap_named_buffer( teb, buffer ); + return 0; }
-NTSTATUS wow64_ext_glMapNamedBufferRange( void *args ) +PTR32 wow64_glMapNamedBufferRange( TEB *teb, GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ) { - return wow64_gl_map_named_buffer_range( args, ext_glMapNamedBufferRange ); + const struct opengl_funcs *funcs = teb->glTable; + return wow64_gl_map_named_buffer_range( teb, buffer, offset, length, access, client_ptr, funcs->p_glMapNamedBufferRange ); }
-NTSTATUS wow64_ext_glMapNamedBufferRangeEXT( void *args ) +PTR32 wow64_glMapNamedBufferRangeEXT( TEB *teb, GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access, PTR32 *client_ptr ) { - return wow64_gl_map_named_buffer_range( args, ext_glMapNamedBufferRangeEXT ); + const struct opengl_funcs *funcs = teb->glTable; + return wow64_gl_map_named_buffer_range( teb, buffer, offset, length, access, client_ptr, funcs->p_glMapNamedBufferRangeEXT ); }
static PTR32 wow64_unmap_client_buffer( TEB *teb, GLenum target ) diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index 3322812f43e..afd349a5601 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -12470,6 +12470,9 @@ struct glMapNamedBufferRange_params GLsizeiptr length; GLbitfield access; void *ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glMapNamedBufferRangeEXT_params @@ -12480,6 +12483,9 @@ struct glMapNamedBufferRangeEXT_params GLsizeiptr length; GLbitfield access; void *ret; +#ifndef _WIN64 + void *client_ptr; +#endif };
struct glMapObjectBufferATI_params diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 7aa375d8aa8..ed5a12ffa98 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1791,17 +1791,17 @@ static void *gl_map_named_buffer_range( enum unix_funcs code, GLuint buffer, GLi
TRACE( "buffer %d, offset %Id, length %Id, access %d\n", buffer, offset, length, access );
- 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( "Unable to map wow64 buffer directly, using copy buffer!\n" ); - if (!(args.ret = _aligned_malloc( length, 16 ))) status = STATUS_NO_MEMORY; - else if (!(status = WINE_UNIX_CALL( code, &args ))) return args.ret; - _aligned_free( args.ret ); + if (!(args.client_ptr = _aligned_malloc( length, 16 ))) return NULL; + status = WINE_UNIX_CALL( code, &args ); + if (args.ret != args.client_ptr) _aligned_free( args.ret ); } #endif - WARN( "glMapNamedBufferRange returned %#lx\n", status ); + if (status) WARN( "glMapNamedBufferRange returned %#lx\n", status ); return args.ret; }