From: Sven Baars <sbaars@codeweavers.com> Fixes 11728e0a9c58f1b7a8d320b05f1ce40e4fa3c790. --- dlls/opengl32/make_opengl | 13 +++++---- dlls/opengl32/unix_thunks.c | 54 ++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 98b3ee2e359..caab4b9903c 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -452,6 +452,7 @@ sub generate_unix_thunk($$$$) my $call_args = ""; my $ret_expr = ""; my $use_dc = 0; + my $vars = ""; my $ret = ""; foreach my $arg (@{$func->[1]}) @@ -495,14 +496,15 @@ sub generate_unix_thunk($$$$) { $arg_type =~ s/^const //; } - $input_conv .= " $arg_type$pname = copy_wow64_ptr32s( params->$pname, params->$pointer_array_count{$_} );\n"; + $vars .= " $arg_type$pname;\n"; + $input_conv .= " $pname = copy_wow64_ptr32s( params->$pname, params->$pointer_array_count{$_} );\n"; $output_conv .= " free( $pname );\n"; $call_args .= " $pname,"; } elsif (defined $pointer_is_offset{$_} && $pname =~ $pointer_is_offset{$_}) { $arg_type =~ s/\*$//; - $input_conv .= " $arg_type$pname\_arg;\n"; + $vars .= " $arg_type$pname\_arg;\n"; $output_conv .= " *(PTR32 *)UlongToPtr(params->$pname) = PtrToUlong( $pname\_arg );\n"; $call_args .= " &$pname\_arg,"; } @@ -524,7 +526,7 @@ sub generate_unix_thunk($$$$) $ret .= " $ptype ret;\n"; if ($ret_type eq "const GLubyte *" || $ret_type eq "const char *" || $ret_type eq "const GLchar *") { - $input_conv .= " " . $ret_type . "ret;\n"; + $vars .= " " . $ret_type . "ret;\n"; $ret_expr = "ret = "; $ret_stat = "return return_wow64_string( ret, ¶ms->ret );"; } @@ -546,7 +548,7 @@ sub generate_unix_thunk($$$$) { $need_lock = 1; $need_funcs = 1; - $input_conv .= " struct buffer *buffer;\n"; + $vars .= " struct buffer *buffer;\n"; $invalidation .= $name =~ /NamedBuffer/ ? " buffer = invalidate_buffer_name( $teb, params->buffer );\n" : " buffer = invalidate_buffer_target( $teb, params->target );\n"; @@ -571,7 +573,7 @@ sub generate_unix_thunk($$$$) } $ret .= " struct $name\_params *params = args;\n"; } - $ret .= $input_conv; + $ret .= $vars; if ($use_dc) { my $param = "params->" . get_arg_name( ${$func->[1]}[0] ); @@ -584,6 +586,7 @@ sub generate_unix_thunk($$$$) $ret .= " const struct opengl_funcs *funcs = $teb->glTable;\n"; $ret .= " if (!funcs->p_$name) return STATUS_NOT_IMPLEMENTED;\n"; } + $ret .= $input_conv; foreach my $arg (@{$map_default_fbo_thunks{$name}}) { my $target = "GL_DRAW_FRAMEBUFFER"; diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index ee54accfc57..5e1f6f4c2e2 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -40128,10 +40128,12 @@ static NTSTATUS wow64_ext_glBindBuffersRange( void *args ) PTR32 sizes; } *params = args; TEB *teb = get_teb64( params->teb ); - GLintptr *offsets = copy_wow64_ptr32s( params->offsets, params->count ); - GLsizeiptr *sizes = copy_wow64_ptr32s( params->sizes, params->count ); + GLintptr *offsets; + GLsizeiptr *sizes; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glBindBuffersRange) return STATUS_NOT_IMPLEMENTED; + offsets = copy_wow64_ptr32s( params->offsets, params->count ); + sizes = copy_wow64_ptr32s( params->sizes, params->count ); funcs->p_glBindBuffersRange( params->target, params->first, params->count, ULongToPtr(params->buffers), offsets, sizes ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( offsets ); @@ -40671,9 +40673,10 @@ static NTSTATUS wow64_ext_glBindVertexBuffers( void *args ) PTR32 strides; } *params = args; TEB *teb = get_teb64( params->teb ); - GLintptr *offsets = copy_wow64_ptr32s( params->offsets, params->count ); + GLintptr *offsets; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glBindVertexBuffers) return STATUS_NOT_IMPLEMENTED; + offsets = copy_wow64_ptr32s( params->offsets, params->count ); funcs->p_glBindVertexBuffers( params->first, params->count, ULongToPtr(params->buffers), offsets, ULongToPtr(params->strides) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( offsets ); @@ -43407,9 +43410,10 @@ static NTSTATUS wow64_ext_glCompileShaderIncludeARB( void *args ) PTR32 length; } *params = args; TEB *teb = get_teb64( params->teb ); - const GLchar **path = copy_wow64_ptr32s( params->path, params->count ); + const GLchar **path; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glCompileShaderIncludeARB) return STATUS_NOT_IMPLEMENTED; + path = copy_wow64_ptr32s( params->path, params->count ); funcs->p_glCompileShaderIncludeARB( params->shader, params->count, path, ULongToPtr(params->length) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( path ); @@ -45385,9 +45389,10 @@ static NTSTATUS wow64_ext_glCreateShaderProgramv( void *args ) GLuint ret; } *params = args; TEB *teb = get_teb64( params->teb ); - const GLchar **strings = copy_wow64_ptr32s( params->strings, params->count ); + const GLchar **strings; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glCreateShaderProgramv) return STATUS_NOT_IMPLEMENTED; + strings = copy_wow64_ptr32s( params->strings, params->count ); params->ret = funcs->p_glCreateShaderProgramv( params->type, params->count, strings ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( strings ); @@ -47034,9 +47039,10 @@ static NTSTATUS wow64_ext_glDrawCommandsNV( void *args ) GLuint count; } *params = args; TEB *teb = get_teb64( params->teb ); - GLintptr *indirects = copy_wow64_ptr32s( params->indirects, params->count ); + GLintptr *indirects; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glDrawCommandsNV) return STATUS_NOT_IMPLEMENTED; + indirects = copy_wow64_ptr32s( params->indirects, params->count ); funcs->p_glDrawCommandsNV( params->primitiveMode, params->buffer, indirects, ULongToPtr(params->sizes), params->count ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( indirects ); @@ -47075,9 +47081,10 @@ static NTSTATUS wow64_ext_glDrawCommandsStatesNV( void *args ) GLuint count; } *params = args; TEB *teb = get_teb64( params->teb ); - GLintptr *indirects = copy_wow64_ptr32s( params->indirects, params->count ); + GLintptr *indirects; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glDrawCommandsStatesNV) return STATUS_NOT_IMPLEMENTED; + indirects = copy_wow64_ptr32s( params->indirects, params->count ); funcs->p_glDrawCommandsStatesNV( params->buffer, indirects, ULongToPtr(params->sizes), ULongToPtr(params->states), ULongToPtr(params->fbos), params->count ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( indirects ); @@ -55742,9 +55749,10 @@ static NTSTATUS wow64_ext_glGetUniformIndices( void *args ) PTR32 uniformIndices; } *params = args; TEB *teb = get_teb64( params->teb ); - const GLchar **uniformNames = copy_wow64_ptr32s( params->uniformNames, params->uniformCount ); + const GLchar **uniformNames; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glGetUniformIndices) return STATUS_NOT_IMPLEMENTED; + uniformNames = copy_wow64_ptr32s( params->uniformNames, params->uniformCount ); funcs->p_glGetUniformIndices( params->program, params->uniformCount, uniformNames, ULongToPtr(params->uniformIndices) ); free( uniformNames ); return STATUS_SUCCESS; @@ -59086,9 +59094,10 @@ static NTSTATUS wow64_ext_glListDrawCommandsStatesClientNV( void *args ) GLuint count; } *params = args; TEB *teb = get_teb64( params->teb ); - const void **indirects = copy_wow64_ptr32s( params->indirects, params->count ); + const void **indirects; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glListDrawCommandsStatesClientNV) return STATUS_NOT_IMPLEMENTED; + indirects = copy_wow64_ptr32s( params->indirects, params->count ); funcs->p_glListDrawCommandsStatesClientNV( params->list, params->segment, indirects, ULongToPtr(params->sizes), ULongToPtr(params->states), ULongToPtr(params->fbos), params->count ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( indirects ); @@ -60911,9 +60920,10 @@ static NTSTATUS wow64_ext_glMultiDrawElements( void *args ) GLsizei drawcount; } *params = args; TEB *teb = get_teb64( params->teb ); - const void **indices = copy_wow64_ptr32s( params->indices, params->drawcount ); + const void **indices; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glMultiDrawElements) return STATUS_NOT_IMPLEMENTED; + indices = copy_wow64_ptr32s( params->indices, params->drawcount ); funcs->p_glMultiDrawElements( params->mode, ULongToPtr(params->count), params->type, indices, params->drawcount ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( indices ); @@ -60933,9 +60943,10 @@ static NTSTATUS wow64_ext_glMultiDrawElementsBaseVertex( void *args ) PTR32 basevertex; } *params = args; TEB *teb = get_teb64( params->teb ); - const void **indices = copy_wow64_ptr32s( params->indices, params->drawcount ); + const void **indices; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glMultiDrawElementsBaseVertex) return STATUS_NOT_IMPLEMENTED; + indices = copy_wow64_ptr32s( params->indices, params->drawcount ); funcs->p_glMultiDrawElementsBaseVertex( params->mode, ULongToPtr(params->count), params->type, indices, params->drawcount, ULongToPtr(params->basevertex) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( indices ); @@ -60954,9 +60965,10 @@ static NTSTATUS wow64_ext_glMultiDrawElementsEXT( void *args ) GLsizei primcount; } *params = args; TEB *teb = get_teb64( params->teb ); - const void **indices = copy_wow64_ptr32s( params->indices, params->primcount ); + const void **indices; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glMultiDrawElementsEXT) return STATUS_NOT_IMPLEMENTED; + indices = copy_wow64_ptr32s( params->indices, params->primcount ); funcs->p_glMultiDrawElementsEXT( params->mode, ULongToPtr(params->count), params->type, indices, params->primcount ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( indices ); @@ -61204,9 +61216,10 @@ static NTSTATUS wow64_ext_glMultiModeDrawElementsIBM( void *args ) GLint modestride; } *params = args; TEB *teb = get_teb64( params->teb ); - const void **indices = copy_wow64_ptr32s( params->indices, params->primcount ); + const void **indices; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glMultiModeDrawElementsIBM) return STATUS_NOT_IMPLEMENTED; + indices = copy_wow64_ptr32s( params->indices, params->primcount ); funcs->p_glMultiModeDrawElementsIBM( ULongToPtr(params->mode), ULongToPtr(params->count), params->type, indices, params->primcount, params->modestride ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( indices ); @@ -72873,9 +72886,10 @@ static NTSTATUS wow64_ext_glShaderSource( void *args ) PTR32 length; } *params = args; TEB *teb = get_teb64( params->teb ); - const GLchar **string = copy_wow64_ptr32s( params->string, params->count ); + const GLchar **string; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glShaderSource) return STATUS_NOT_IMPLEMENTED; + string = copy_wow64_ptr32s( params->string, params->count ); funcs->p_glShaderSource( params->shader, params->count, string, ULongToPtr(params->length) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( string ); @@ -72893,9 +72907,10 @@ static NTSTATUS wow64_ext_glShaderSourceARB( void *args ) PTR32 length; } *params = args; TEB *teb = get_teb64( params->teb ); - const GLcharARB **string = copy_wow64_ptr32s( params->string, params->count ); + const GLcharARB **string; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glShaderSourceARB) return STATUS_NOT_IMPLEMENTED; + string = copy_wow64_ptr32s( params->string, params->count ); funcs->p_glShaderSourceARB( params->shaderObj, params->count, string, ULongToPtr(params->length) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( string ); @@ -76933,9 +76948,10 @@ static NTSTATUS wow64_ext_glTransformFeedbackVaryings( void *args ) GLenum bufferMode; } *params = args; TEB *teb = get_teb64( params->teb ); - const GLchar **varyings = copy_wow64_ptr32s( params->varyings, params->count ); + const GLchar **varyings; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glTransformFeedbackVaryings) return STATUS_NOT_IMPLEMENTED; + varyings = copy_wow64_ptr32s( params->varyings, params->count ); funcs->p_glTransformFeedbackVaryings( params->program, params->count, varyings, params->bufferMode ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( varyings ); @@ -76953,9 +76969,10 @@ static NTSTATUS wow64_ext_glTransformFeedbackVaryingsEXT( void *args ) GLenum bufferMode; } *params = args; TEB *teb = get_teb64( params->teb ); - const GLchar **varyings = copy_wow64_ptr32s( params->varyings, params->count ); + const GLchar **varyings; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glTransformFeedbackVaryingsEXT) return STATUS_NOT_IMPLEMENTED; + varyings = copy_wow64_ptr32s( params->varyings, params->count ); funcs->p_glTransformFeedbackVaryingsEXT( params->program, params->count, varyings, params->bufferMode ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( varyings ); @@ -80501,9 +80518,10 @@ static NTSTATUS wow64_ext_glVertexArrayVertexBuffers( void *args ) PTR32 strides; } *params = args; TEB *teb = get_teb64( params->teb ); - GLintptr *offsets = copy_wow64_ptr32s( params->offsets, params->count ); + GLintptr *offsets; const struct opengl_funcs *funcs = teb->glTable; if (!funcs->p_glVertexArrayVertexBuffers) return STATUS_NOT_IMPLEMENTED; + offsets = copy_wow64_ptr32s( params->offsets, params->count ); funcs->p_glVertexArrayVertexBuffers( params->vaobj, params->first, params->count, ULongToPtr(params->buffers), offsets, ULongToPtr(params->strides) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); free( offsets ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9838