From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/opengl32/make_opengl | 30 ++++++++++++---- dlls/opengl32/private.h | 1 + dlls/opengl32/thunks.c | 50 ++++++++++++++++++++++++++ dlls/opengl32/thunks.h | 1 - dlls/opengl32/wgl.c | 76 +++------------------------------------ 5 files changed, 80 insertions(+), 78 deletions(-) diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 1c865158263..3dec39cc0f0 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -158,11 +158,6 @@ my %manual_win_thunks = "glCreateSyncFromCLeventARB" => 1, "glDeleteSync" => 1, "glFenceSync" => 1, - "glGetBooleanv" => 1, - "glGetDoublev" => 1, - "glGetFloatv" => 1, - "glGetInteger64v" => 1, - "glGetIntegerv" => 1, "glGetString" => 1, "glGetStringi" => 1, "glImportSyncEXT" => 1, @@ -685,6 +680,7 @@ sub get_handle_function($) sub generate_win_thunk($$) { my ($name, $func) = @_; + my $get_integer = get_integer_call( $name, $func ); my $decl_args = get_func_args( $func ); my $func_ret = get_func_ret( $func ); my $params = ""; @@ -713,9 +709,11 @@ sub generate_win_thunk($$) $ret .= " = {$params }"; $ret .= ";\n"; $ret .= " NTSTATUS status;\n"; + $ret .= " int integer;\n" if $get_integer; $ret .= " " . get_func_trace( $name, $func, 1 ); $ret .= $checks; - $ret .= " if ((status = UNIX_CALL( $name, &args ))) WARN( \"$name returned %#lx\\n\", status );\n"; + $ret .= $get_integer ? " $get_integer\n else " : " "; + $ret .= "if ((status = UNIX_CALL( $name, &args ))) WARN( \"$name returned %#lx\\n\", status );\n"; $ret .= " return args.ret;\n" unless is_void_func($func); $ret .= "}\n"; @@ -1096,6 +1094,26 @@ sub add_extension($) } } +sub get_integer_call($) +{ + my ($name, $func) = @_; + my $params; + my $pname; + + foreach my $arg (@{$func->[1]}) + { + my $name = get_arg_name( $arg ); + my $type = get_arg_type( $arg ); + $pname = $name if $name =~ /^(pname|target|value)$/; + $params = $name; + } + + return 0 if !$pname; + + my $hook = "if (get_integer( $pname, &integer )) *$params = integer;"; + return $hook if $name =~ /^glGet(Boolean|Double|Float|Integer|Integer64)v/; +} + sub parse_registry($) { my $file = shift; diff --git a/dlls/opengl32/private.h b/dlls/opengl32/private.h index 3c3a218e31a..aa14924d1a8 100644 --- a/dlls/opengl32/private.h +++ b/dlls/opengl32/private.h @@ -44,5 +44,6 @@ extern BOOL get_context_from_handle( HGLRC handle, HGLRC *obj ); extern BOOL get_sync_from_handle( GLsync handle, GLsync *obj ); extern void set_gl_error( GLenum error ); extern struct registry_entry *get_function_entry( const char *name ); +extern BOOL get_integer( GLenum name, GLint *data ); #endif /* __WINE_OPENGL32_PRIVATE_H */ diff --git a/dlls/opengl32/thunks.c b/dlls/opengl32/thunks.c index 8e555b037b5..c62a6fdaa9f 100644 --- a/dlls/opengl32/thunks.c +++ b/dlls/opengl32/thunks.c @@ -841,6 +841,16 @@ void WINAPI glGenTextures( GLsizei n, GLuint *textures ) if ((status = UNIX_CALL( glGenTextures, &args ))) WARN( "glGenTextures returned %#lx\n", status ); } +void WINAPI glGetBooleanv( GLenum pname, GLboolean *data ) +{ + struct glGetBooleanv_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; + NTSTATUS status; + int integer; + TRACE( "pname %d, data %p\n", pname, data ); + if (get_integer( pname, &integer )) *data = integer; + else if ((status = UNIX_CALL( glGetBooleanv, &args ))) WARN( "glGetBooleanv returned %#lx\n", status ); +} + void WINAPI glGetClipPlane( GLenum plane, GLdouble *equation ) { struct glGetClipPlane_params args = { .teb = NtCurrentTeb(), .plane = plane, .equation = equation }; @@ -849,6 +859,16 @@ void WINAPI glGetClipPlane( GLenum plane, GLdouble *equation ) if ((status = UNIX_CALL( glGetClipPlane, &args ))) WARN( "glGetClipPlane returned %#lx\n", status ); } +void WINAPI glGetDoublev( GLenum pname, GLdouble *data ) +{ + struct glGetDoublev_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; + NTSTATUS status; + int integer; + TRACE( "pname %d, data %p\n", pname, data ); + if (get_integer( pname, &integer )) *data = integer; + else if ((status = UNIX_CALL( glGetDoublev, &args ))) WARN( "glGetDoublev returned %#lx\n", status ); +} + GLenum WINAPI glGetError(void) { struct glGetError_params args = { .teb = NtCurrentTeb() }; @@ -858,6 +878,26 @@ GLenum WINAPI glGetError(void) return args.ret; } +void WINAPI glGetFloatv( GLenum pname, GLfloat *data ) +{ + struct glGetFloatv_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; + NTSTATUS status; + int integer; + TRACE( "pname %d, data %p\n", pname, data ); + if (get_integer( pname, &integer )) *data = integer; + else if ((status = UNIX_CALL( glGetFloatv, &args ))) WARN( "glGetFloatv returned %#lx\n", status ); +} + +void WINAPI glGetIntegerv( GLenum pname, GLint *data ) +{ + struct glGetIntegerv_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; + NTSTATUS status; + int integer; + TRACE( "pname %d, data %p\n", pname, data ); + if (get_integer( pname, &integer )) *data = integer; + else if ((status = UNIX_CALL( glGetIntegerv, &args ))) WARN( "glGetIntegerv returned %#lx\n", status ); +} + void WINAPI glGetLightfv( GLenum light, GLenum pname, GLfloat *params ) { struct glGetLightfv_params args = { .teb = NtCurrentTeb(), .light = light, .pname = pname, .params = params }; @@ -8603,6 +8643,16 @@ static void WINAPI glGetInteger64i_v( GLenum target, GLuint index, GLint64 *data if ((status = UNIX_CALL( glGetInteger64i_v, &args ))) WARN( "glGetInteger64i_v returned %#lx\n", status ); } +static void WINAPI glGetInteger64v( GLenum pname, GLint64 *data ) +{ + struct glGetInteger64v_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; + NTSTATUS status; + int integer; + TRACE( "pname %d, data %p\n", pname, data ); + if (get_integer( pname, &integer )) *data = integer; + else if ((status = UNIX_CALL( glGetInteger64v, &args ))) WARN( "glGetInteger64v returned %#lx\n", status ); +} + static void WINAPI glGetIntegerIndexedvEXT( GLenum target, GLuint index, GLint *data ) { struct glGetIntegerIndexedvEXT_params args = { .teb = NtCurrentTeb(), .target = target, .index = index, .data = data }; diff --git a/dlls/opengl32/thunks.h b/dlls/opengl32/thunks.h index c59ae7ff2c9..67d5691ed8c 100644 --- a/dlls/opengl32/thunks.h +++ b/dlls/opengl32/thunks.h @@ -3,7 +3,6 @@ extern GLsync WINAPI glCreateSyncFromCLeventARB( struct _cl_context *context, struct _cl_event *event, GLbitfield flags ); extern void WINAPI glDeleteSync( GLsync sync ); extern GLsync WINAPI glFenceSync( GLenum condition, GLbitfield flags ); -extern void WINAPI glGetInteger64v( GLenum pname, GLint64 *data ); extern const GLubyte * WINAPI glGetStringi( GLenum name, GLuint index ); extern GLsync WINAPI glImportSyncEXT( GLenum external_sync_type, GLintptr external_sync, GLbitfield flags ); extern BOOL WINAPI wglChoosePixelFormatARB( HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats ); diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 27aae7cf6d8..f4ca0e924b9 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -2039,8 +2039,12 @@ GLsync WINAPI glImportSyncEXT( GLenum external_sync_type, GLintptr external_sync return NULL; } -static BOOL get_integer( struct context *ctx, GLenum name, GLint *data ) +BOOL get_integer( GLenum name, GLint *data ) { + struct context *ctx; + + if (!(ctx = context_from_handle( NtCurrentTeb()->glCurrentRC ))) return FALSE; + switch (name) { case GL_MAJOR_VERSION: @@ -2119,76 +2123,6 @@ const GLubyte * WINAPI glGetString( GLenum name ) return args.ret; } -void WINAPI glGetBooleanv( GLenum pname, GLboolean *data ) -{ - struct glGetBooleanv_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; - struct context *ctx; - NTSTATUS status; - GLint value; - - TRACE( "pname %d, data %p\n", pname, data ); - - if (!(ctx = context_from_handle( NtCurrentTeb()->glCurrentRC ))) return; - if (get_integer( ctx, pname, &value )) *data = value; - else if ((status = UNIX_CALL( glGetBooleanv, &args ))) WARN( "glGetBooleanv returned %#lx\n", status ); -} - -void WINAPI glGetDoublev( GLenum pname, GLdouble *data ) -{ - struct glGetDoublev_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; - struct context *ctx; - NTSTATUS status; - GLint value; - - TRACE( "pname %d, data %p\n", pname, data ); - - if (!(ctx = context_from_handle( NtCurrentTeb()->glCurrentRC ))) return; - if (get_integer( ctx, pname, &value )) *data = value; - else if ((status = UNIX_CALL( glGetDoublev, &args ))) WARN( "glGetDoublev returned %#lx\n", status ); -} - -void WINAPI glGetFloatv( GLenum pname, GLfloat *data ) -{ - struct glGetFloatv_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; - struct context *ctx; - NTSTATUS status; - GLint value; - - TRACE( "pname %d, data %p\n", pname, data ); - - if (!(ctx = context_from_handle( NtCurrentTeb()->glCurrentRC ))) return; - if (get_integer( ctx, pname, &value )) *data = value; - else if ((status = UNIX_CALL( glGetFloatv, &args ))) WARN( "glGetFloatv returned %#lx\n", status ); -} - -void WINAPI glGetInteger64v( GLenum pname, GLint64 *data ) -{ - struct glGetInteger64v_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; - struct context *ctx; - NTSTATUS status; - GLint value; - - TRACE( "pname %d, data %p\n", pname, data ); - - if (!(ctx = context_from_handle( NtCurrentTeb()->glCurrentRC ))) return; - if (get_integer( ctx, pname, &value )) *data = value; - else if ((status = UNIX_CALL( glGetInteger64v, &args ))) WARN( "glGetInteger64v returned %#lx\n", status ); -} - -void WINAPI glGetIntegerv( GLenum pname, GLint *data ) -{ - struct glGetIntegerv_params args = { .teb = NtCurrentTeb(), .pname = pname, .data = data }; - struct context *ctx; - NTSTATUS status; - GLint value; - - TRACE( "pname %d, data %p\n", pname, data ); - - if (!(ctx = context_from_handle( NtCurrentTeb()->glCurrentRC ))) return; - if (get_integer( ctx, pname, &value )) *data = value; - else if ((status = UNIX_CALL( glGetIntegerv, &args ))) WARN( "glGetIntegerv returned %#lx\n", status ); -} - const char * WINAPI wglGetExtensionsStringARB( HDC hdc ) { TRACE( "hdc %p\n", hdc ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10763