From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 40 +++++++++++- dlls/opengl32/unix_private.h | 11 ++++ dlls/opengl32/unix_thunks.c | 122 +++++++++++++++++++++++++---------- 3 files changed, 138 insertions(+), 35 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 1d15234b73d..6748350529c 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -179,6 +179,26 @@ my %manual_wow64_thunks = "wglMakeContextCurrentARB" => 1, "wglMakeCurrent" => 1, ); +my %pointer_array_count = + ( + "glCompileShaderIncludeARB" => "count", + "glCreateShaderProgramv" => "count", + "glGetUniformIndices" => "uniformCount", + "glMultiDrawElements" => "drawcount", + "glMultiDrawElementsBaseVertex" => "drawcount", + "glMultiDrawElementsEXT" => "primcount", + "glMultiModeDrawElementsIBM" => "primcount", + "glTransformFeedbackVaryings" => "count", + "glTransformFeedbackVaryingsEXT" => "count", + "glShaderSource" => "count", + "glShaderSourceARB" => "count", + "glBindBuffersRange" => "count", + "glBindVertexBuffers" => "count", + "glDrawCommandsNV" => "count", + "glVertexArrayVertexBuffers" => "count", + "glDrawCommandsStatesNV" => "count", + "glListDrawCommandsStatesClientNV" => "count", + );
# # Used to convert some types @@ -364,7 +384,7 @@ sub generate_wow64_thunk($$$) my $ptype = get_wow64_arg_type( $arg ); my $pname = get_arg_name( $arg ); $ret .= " $ptype $pname;\n"; - $need_manual_thunk = 1 if $arg->textContent() =~ /(*.**|[)/ || $arg->textContent() =~ /(sizei|int)ptr.**/; + $need_manual_thunk = 1 if ($arg->textContent() =~ /(*.**|[)/ || $arg->textContent() =~ /(sizei|int)ptr.**/) && !defined $pointer_array_count{$_}; } if (!is_void_func($func)) { @@ -403,6 +423,15 @@ sub generate_wow64_thunk($$$) }
$ret .= " NTSTATUS status;\n"; + + foreach my $arg (@{$func->[1]}) + { + next unless $arg->textContent() =~ /*.**/ || $arg->textContent() =~ /(sizei|int)ptr.**/; + next unless defined $pointer_array_count{$_}; + my $pname = get_arg_name( $arg ); + $ret .= " params.$pname = copy_wow64_ptr32s( (UINT_PTR)params32->$pname, params32->$pointer_array_count{$_} );\n"; + } + $ret .= " status = $prefix_$name( ¶ms );\n"; if (!is_void_func( $func )) { @@ -410,6 +439,15 @@ sub generate_wow64_thunk($$$) $ret .= "(UINT_PTR)" if get_wow64_arg_type( $func->[0] ) =~ /PTR32/; $ret .= "params.ret;\n"; } + + foreach my $arg (@{$func->[1]}) + { + next unless $arg->textContent() =~ /*.**/ || $arg->textContent() =~ /(sizei|int)ptr.**/; + next unless defined $pointer_array_count{$_}; + my $pname = get_arg_name( $arg ); + $ret .= " free( (void *)params.$pname );\n"; + } + $ret .= " return status;\n"; $ret .= "}\n\n";
diff --git a/dlls/opengl32/unix_private.h b/dlls/opengl32/unix_private.h index cab4b8fc502..f67372f4c2f 100644 --- a/dlls/opengl32/unix_private.h +++ b/dlls/opengl32/unix_private.h @@ -20,6 +20,7 @@
#include <stdarg.h> #include <stddef.h> +#include <stdlib.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -50,4 +51,14 @@ static inline struct opengl_funcs *get_dc_funcs( HDC hdc ) return funcs; }
+static inline void *copy_wow64_ptr32s( UINT_PTR address, ULONG count ) +{ + ULONG *ptrs = (ULONG *)address; + void **tmp; + + if (!ptrs || !(tmp = calloc( count, sizeof(*tmp) ))) return NULL; + while (count--) tmp[count] = ULongToPtr(ptrs[count]); + return tmp; +} + #endif /* __WINE_OPENGL32_UNIX_PRIVATE_H */ diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 09d1c145bd1..f00ae443216 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -30337,8 +30337,13 @@ static NTSTATUS wow64_ext_glBindBuffersRange( void *args ) .count = params32->count, .buffers = ULongToPtr(params32->buffers), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.offsets = copy_wow64_ptr32s( (UINT_PTR)params32->offsets, params32->count ); + params.sizes = copy_wow64_ptr32s( (UINT_PTR)params32->sizes, params32->count ); + status = ext_glBindBuffersRange( ¶ms ); + free( (void *)params.offsets ); + free( (void *)params.sizes ); + return status; }
static NTSTATUS wow64_ext_glBindFragDataLocation( void *args ) @@ -30495,8 +30500,11 @@ static NTSTATUS wow64_ext_glBindVertexBuffers( void *args ) .buffers = ULongToPtr(params32->buffers), .strides = ULongToPtr(params32->strides), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.offsets = copy_wow64_ptr32s( (UINT_PTR)params32->offsets, params32->count ); + status = ext_glBindVertexBuffers( ¶ms ); + free( (void *)params.offsets ); + return status; }
static NTSTATUS wow64_ext_glBindVideoCaptureStreamBufferNV( void *args ) @@ -31728,8 +31736,11 @@ static NTSTATUS wow64_ext_glCompileShaderIncludeARB( void *args ) .count = params32->count, .length = ULongToPtr(params32->length), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.path = copy_wow64_ptr32s( (UINT_PTR)params32->path, params32->count ); + status = ext_glCompileShaderIncludeARB( ¶ms ); + free( (void *)params.path ); + return status; }
static NTSTATUS wow64_ext_glCompressedMultiTexImage1DEXT( void *args ) @@ -33073,8 +33084,12 @@ static NTSTATUS wow64_ext_glCreateShaderProgramv( void *args ) .type = params32->type, .count = params32->count, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.strings = copy_wow64_ptr32s( (UINT_PTR)params32->strings, params32->count ); + status = ext_glCreateShaderProgramv( ¶ms ); + params32->ret = params.ret; + free( (void *)params.strings ); + return status; }
static NTSTATUS wow64_ext_glCreateStatesNV( void *args ) @@ -34150,8 +34165,11 @@ static NTSTATUS wow64_ext_glDrawCommandsNV( void *args ) .sizes = ULongToPtr(params32->sizes), .count = params32->count, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.indirects = copy_wow64_ptr32s( (UINT_PTR)params32->indirects, params32->count ); + status = ext_glDrawCommandsNV( ¶ms ); + free( (void *)params.indirects ); + return status; }
static NTSTATUS wow64_ext_glDrawCommandsStatesAddressNV( void *args ) @@ -34196,8 +34214,11 @@ static NTSTATUS wow64_ext_glDrawCommandsStatesNV( void *args ) .fbos = ULongToPtr(params32->fbos), .count = params32->count, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.indirects = copy_wow64_ptr32s( (UINT_PTR)params32->indirects, params32->count ); + status = ext_glDrawCommandsStatesNV( ¶ms ); + free( (void *)params.indirects ); + return status; }
static NTSTATUS wow64_ext_glDrawElementsBaseVertex( void *args ) @@ -41899,8 +41920,11 @@ static NTSTATUS wow64_ext_glGetUniformIndices( void *args ) .uniformCount = params32->uniformCount, .uniformIndices = ULongToPtr(params32->uniformIndices), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.uniformNames = copy_wow64_ptr32s( (UINT_PTR)params32->uniformNames, params32->uniformCount ); + status = ext_glGetUniformIndices( ¶ms ); + free( (void *)params.uniformNames ); + return status; }
static NTSTATUS wow64_ext_glGetUniformLocation( void *args ) @@ -44411,8 +44435,11 @@ static NTSTATUS wow64_ext_glListDrawCommandsStatesClientNV( void *args ) .fbos = ULongToPtr(params32->fbos), .count = params32->count, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.indirects = copy_wow64_ptr32s( (UINT_PTR)params32->indirects, params32->count ); + status = ext_glListDrawCommandsStatesClientNV( ¶ms ); + free( (void *)params.indirects ); + return status; }
static NTSTATUS wow64_ext_glListParameterfvSGIX( void *args ) @@ -45597,8 +45624,11 @@ static NTSTATUS wow64_ext_glMultiDrawElements( void *args ) .type = params32->type, .drawcount = params32->drawcount, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.indices = copy_wow64_ptr32s( (UINT_PTR)params32->indices, params32->drawcount ); + status = ext_glMultiDrawElements( ¶ms ); + free( (void *)params.indices ); + return status; }
static NTSTATUS wow64_ext_glMultiDrawElementsBaseVertex( void *args ) @@ -45620,8 +45650,11 @@ static NTSTATUS wow64_ext_glMultiDrawElementsBaseVertex( void *args ) .drawcount = params32->drawcount, .basevertex = ULongToPtr(params32->basevertex), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.indices = copy_wow64_ptr32s( (UINT_PTR)params32->indices, params32->drawcount ); + status = ext_glMultiDrawElementsBaseVertex( ¶ms ); + free( (void *)params.indices ); + return status; }
static NTSTATUS wow64_ext_glMultiDrawElementsEXT( void *args ) @@ -45641,8 +45674,11 @@ static NTSTATUS wow64_ext_glMultiDrawElementsEXT( void *args ) .type = params32->type, .primcount = params32->primcount, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.indices = copy_wow64_ptr32s( (UINT_PTR)params32->indices, params32->primcount ); + status = ext_glMultiDrawElementsEXT( ¶ms ); + free( (void *)params.indices ); + return status; }
static NTSTATUS wow64_ext_glMultiDrawElementsIndirect( void *args ) @@ -45900,8 +45936,11 @@ static NTSTATUS wow64_ext_glMultiModeDrawElementsIBM( void *args ) .primcount = params32->primcount, .modestride = params32->modestride, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.indices = copy_wow64_ptr32s( (UINT_PTR)params32->indices, params32->primcount ); + status = ext_glMultiModeDrawElementsIBM( ¶ms ); + free( (void *)params.indices ); + return status; }
static NTSTATUS wow64_ext_glMultiTexCoord1bvOES( void *args ) @@ -52761,8 +52800,11 @@ static NTSTATUS wow64_ext_glShaderSource( void *args ) .count = params32->count, .length = ULongToPtr(params32->length), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.string = copy_wow64_ptr32s( (UINT_PTR)params32->string, params32->count ); + status = ext_glShaderSource( ¶ms ); + free( (void *)params.string ); + return status; }
static NTSTATUS wow64_ext_glShaderSourceARB( void *args ) @@ -52780,8 +52822,11 @@ static NTSTATUS wow64_ext_glShaderSourceARB( void *args ) .count = params32->count, .length = ULongToPtr(params32->length), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.string = copy_wow64_ptr32s( (UINT_PTR)params32->string, params32->count ); + status = ext_glShaderSourceARB( ¶ms ); + free( (void *)params.string ); + return status; }
static NTSTATUS wow64_ext_glShadingRateImagePaletteNV( void *args ) @@ -54719,8 +54764,11 @@ static NTSTATUS wow64_ext_glTransformFeedbackVaryings( void *args ) .count = params32->count, .bufferMode = params32->bufferMode, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.varyings = copy_wow64_ptr32s( (UINT_PTR)params32->varyings, params32->count ); + status = ext_glTransformFeedbackVaryings( ¶ms ); + free( (void *)params.varyings ); + return status; }
static NTSTATUS wow64_ext_glTransformFeedbackVaryingsEXT( void *args ) @@ -54738,8 +54786,11 @@ static NTSTATUS wow64_ext_glTransformFeedbackVaryingsEXT( void *args ) .count = params32->count, .bufferMode = params32->bufferMode, }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.varyings = copy_wow64_ptr32s( (UINT_PTR)params32->varyings, params32->count ); + status = ext_glTransformFeedbackVaryingsEXT( ¶ms ); + free( (void *)params.varyings ); + return status; }
static NTSTATUS wow64_ext_glTransformFeedbackVaryingsNV( void *args ) @@ -56971,8 +57022,11 @@ static NTSTATUS wow64_ext_glVertexArrayVertexBuffers( void *args ) .buffers = ULongToPtr(params32->buffers), .strides = ULongToPtr(params32->strides), }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS status; + params.offsets = copy_wow64_ptr32s( (UINT_PTR)params32->offsets, params32->count ); + status = ext_glVertexArrayVertexBuffers( ¶ms ); + free( (void *)params.offsets ); + return status; }
static NTSTATUS wow64_ext_glVertexArrayVertexOffsetEXT( void *args )