mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 02:04:46 +00:00
opengl32: Implement wow64 thunks for input pointer arrays.
This commit is contained in:
parent
173e91a4b6
commit
edcea32c6a
|
@ -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";
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in a new issue