From: Rémi Bernon rbernon@codeweavers.com
They can in theory be used to retrieve the same parameter than glGetIntegerv, with a different result type. --- dlls/opengl32/make_opengl | 4 +++ dlls/opengl32/unix_thunks.c | 24 +++++--------- dlls/opengl32/unix_thunks.h | 4 +++ dlls/opengl32/unix_wgl.c | 65 +++++++++++++++++++++++++++++++------ 4 files changed, 71 insertions(+), 26 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 821441361ee..c47e1ddce8d 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -204,6 +204,10 @@ my %manual_unix_thunks = "glDrawPixels" => 1, "glFinish" => 1, "glFlush" => 1, + "glGetBooleanv" => 1, + "glGetDoublev" => 1, + "glGetFloatv" => 1, + "glGetInteger64v" => 1, "glGetIntegerv" => 1, "glGetString" => 1, "glGetStringi" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 5ed52f35655..3504bd088d5 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -993,8 +993,7 @@ static NTSTATUS gl_glGenTextures( void *args ) static NTSTATUS gl_glGetBooleanv( void *args ) { struct glGetBooleanv_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glGetBooleanv( params->pname, params->data ); + wrap_glGetBooleanv( params->teb, params->pname, params->data ); return STATUS_SUCCESS; }
@@ -1009,8 +1008,7 @@ static NTSTATUS gl_glGetClipPlane( void *args ) static NTSTATUS gl_glGetDoublev( void *args ) { struct glGetDoublev_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glGetDoublev( params->pname, params->data ); + wrap_glGetDoublev( params->teb, params->pname, params->data ); return STATUS_SUCCESS; }
@@ -1025,8 +1023,7 @@ static NTSTATUS gl_glGetError( void *args ) static NTSTATUS gl_glGetFloatv( void *args ) { struct glGetFloatv_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glGetFloatv( params->pname, params->data ); + wrap_glGetFloatv( params->teb, params->pname, params->data ); return STATUS_SUCCESS; }
@@ -9387,8 +9384,7 @@ static NTSTATUS ext_glGetInteger64i_v( void *args ) static NTSTATUS ext_glGetInteger64v( void *args ) { struct glGetInteger64v_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glGetInteger64v( params->pname, params->data ); + wrap_glGetInteger64v( params->teb, params->pname, params->data ); return STATUS_SUCCESS; }
@@ -31557,8 +31553,7 @@ static NTSTATUS wow64_gl_glGetBooleanv( void *args ) PTR32 data; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glGetBooleanv( params->pname, ULongToPtr(params->data) ); + wrap_glGetBooleanv( teb, params->pname, ULongToPtr(params->data) ); return STATUS_SUCCESS; }
@@ -31585,8 +31580,7 @@ static NTSTATUS wow64_gl_glGetDoublev( void *args ) PTR32 data; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glGetDoublev( params->pname, ULongToPtr(params->data) ); + wrap_glGetDoublev( teb, params->pname, ULongToPtr(params->data) ); return STATUS_SUCCESS; }
@@ -31612,8 +31606,7 @@ static NTSTATUS wow64_gl_glGetFloatv( void *args ) PTR32 data; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glGetFloatv( params->pname, ULongToPtr(params->data) ); + wrap_glGetFloatv( teb, params->pname, ULongToPtr(params->data) ); return STATUS_SUCCESS; }
@@ -46818,8 +46811,7 @@ static NTSTATUS wow64_ext_glGetInteger64v( void *args ) PTR32 data; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glGetInteger64v( params->pname, ULongToPtr(params->data) ); + wrap_glGetInteger64v( teb, params->pname, ULongToPtr(params->data) ); return STATUS_SUCCESS; }
diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 66db65cd155..7a2074312b0 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -11,6 +11,9 @@ 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_glGetBooleanv( TEB *teb, GLenum pname, GLboolean *data ); +extern void wrap_glGetDoublev( TEB *teb, GLenum pname, GLdouble *data ); +extern void wrap_glGetFloatv( TEB *teb, GLenum pname, GLfloat *data ); 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 ); @@ -18,6 +21,7 @@ extern void wrap_glViewport( TEB *teb, GLint x, GLint y, GLsizei width, GLsizei 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 void wrap_glGetInteger64v( TEB *teb, GLenum pname, GLint64 *data ); 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 ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 8d6be13eb1e..0dc9efef704 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -770,34 +770,40 @@ static BOOL check_extension_support( TEB *teb, const char *extension, const char return FALSE; }
-void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data ) +static BOOL get_integer( TEB *teb, GLenum pname, GLint *data ) { const struct opengl_funcs *funcs = teb->glTable; const GLuint *disabled;
- funcs->p_glGetIntegerv( pname, data ); - if (pname == GL_NUM_EXTENSIONS) { + funcs->p_glGetIntegerv( pname, data ); if ((disabled = disabled_extensions_index( teb ))) while (*disabled++ != ~0u) (*data)--; *data += ARRAY_SIZE(legacy_extensions) - 1; + return TRUE; }
if (is_win64 && is_wow64()) { /* 4.4 depends on ARB_buffer_storage, which we don't support on wow64. */ - if (pname == GL_MAJOR_VERSION && *data > 4) - *data = 4; - else if (pname == GL_MINOR_VERSION) + if (pname == GL_MAJOR_VERSION) + { + funcs->p_glGetIntegerv( pname, data ); + if (*data > 4) *data = 4; + return TRUE; + } + if (pname == GL_MINOR_VERSION) { GLint major; - funcs->p_glGetIntegerv( GL_MAJOR_VERSION, &major ); - if (major == 4 && *data > 3) - *data = 3; + funcs->p_glGetIntegerv( pname, data ); + if (major == 4 && *data > 3) *data = 3; + return TRUE; } } + + return FALSE; }
const GLubyte *wrap_glGetString( TEB *teb, GLenum name ) @@ -866,7 +872,7 @@ static char *build_extension_list( TEB *teb ) GLint len = 0, capacity, i, extensions_count; char *extension, *tmp, *available_extensions;
- wrap_glGetIntegerv( teb, GL_NUM_EXTENSIONS, &extensions_count ); + get_integer( teb, GL_NUM_EXTENSIONS, &extensions_count ); capacity = 128 * extensions_count;
if (!(available_extensions = malloc( capacity ))) return NULL; @@ -1370,6 +1376,45 @@ void wrap_glDebugMessageCallbackARB( TEB *teb, GLDEBUGPROCARB callback, const vo set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); }
+void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data ) +{ + const struct opengl_funcs *funcs = teb->glTable; + if (get_integer( teb, pname, data )) return; + funcs->p_glGetIntegerv( pname, data ); +} + +void wrap_glGetBooleanv( TEB *teb, GLenum pname, GLboolean *data ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLint value; + if (get_integer( teb, pname, &value )) *data = !!value; + else funcs->p_glGetBooleanv( pname, data ); +} + +void wrap_glGetDoublev( TEB *teb, GLenum pname, GLdouble *data ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLint value; + if (get_integer( teb, pname, &value )) *data = value; + funcs->p_glGetDoublev( pname, data ); +} + +void wrap_glGetFloatv( TEB *teb, GLenum pname, GLfloat *data ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLint value; + if (get_integer( teb, pname, &value )) *data = value; + else funcs->p_glGetFloatv( pname, data ); +} + +void wrap_glGetInteger64v( TEB *teb, GLenum pname, GLint64 *data ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLint value; + if (get_integer( teb, pname, &value )) *data = value; + else funcs->p_glGetInteger64v( pname, data ); +} + NTSTATUS process_attach( void *args ) { struct process_attach_params *params = args;