[PATCH 0/1] MR9681: opengl32, win32u: Move GL error to wgl_context.
From: Derek Lesho <dlesho(a)codeweavers.com> Signed-off-by: Derek Lesho <dlesho(a)codeweavers.com> --- dlls/opengl32/make_opengl | 2 +- dlls/opengl32/unix_thunks.c | 5 ++-- dlls/opengl32/unix_thunks.h | 2 +- dlls/opengl32/unix_wgl.c | 51 +++++++++++++++++++----------------- dlls/win32u/opengl.c | 48 ++++++++++++++++++++++++++------- include/wine/opengl_driver.h | 1 + 6 files changed, 70 insertions(+), 39 deletions(-) diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 61eafbec33e..87bff92c310 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -200,6 +200,7 @@ my %manual_unix_thunks = "glFramebufferReadBufferEXT" => 1, "glGetBooleanv" => 1, "glGetDoublev" => 1, + "glGetError" => 1, "glGetFloatv" => 1, "glGetFramebufferParameterivEXT" => 1, "glGetInteger64v" => 1, @@ -288,7 +289,6 @@ my %manual_wow64_wrappers = "glFlushMappedNamedBufferRangeEXT" => 0, "glGetBufferPointerv" => 0, "glGetBufferPointervARB" => 0, - "glGetError" => 0, "glGetNamedBufferPointerv" => 0, "glGetNamedBufferPointervEXT" => 0, "glGetSynciv" => 0, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 7d4c00edbe9..835e7636d54 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -1019,8 +1019,7 @@ static NTSTATUS gl_glGetDoublev( void *args ) static NTSTATUS gl_glGetError( void *args ) { struct glGetError_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - params->ret = funcs->p_glGetError(); + params->ret = wrap_glGetError( params->teb ); return STATUS_SUCCESS; } @@ -32252,7 +32251,7 @@ static NTSTATUS wow64_gl_glGetError( void *args ) GLenum ret; } *params = args; TEB *teb = get_teb64( params->teb ); - params->ret = wow64_glGetError( teb ); + params->ret = wrap_glGetError( teb ); return STATUS_SUCCESS; } diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 4bf2d13c476..3f00ad63832 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -16,6 +16,7 @@ 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 GLenum wrap_glGetError( TEB *teb ); 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 ); @@ -47,7 +48,6 @@ extern BOOL wrap_wglReleaseTexImageARB( TEB *teb, HPBUFFERARB hPbuffer, int iBuf extern BOOL wrap_wglSetPbufferAttribARB( TEB *teb, HPBUFFERARB hPbuffer, const int *piAttribList ); #ifdef _WIN64 -extern GLenum wow64_glGetError( TEB *teb ); extern void wow64_glBufferStorage( TEB *teb, GLenum target, GLsizeiptr size, const void *data, GLbitfield flags ); extern GLenum wow64_glClientWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ); extern void wow64_glDeleteBuffers( TEB *teb, GLsizei n, const GLuint *buffers ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 6b00e22c0d1..72932f87bc3 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -143,7 +143,6 @@ struct context GLubyte *extensions; /* extension string */ char *wow64_version; /* wow64 GL version override */ struct buffers *buffers; /* wow64 buffers map */ - GLenum gl_error; /* wrapped GL error */ const char **extension_array; /* array of supported extensions */ size_t extension_count; /* size of supported extensions */ BOOL use_pinned_memory; /* use GL_AMD_pinned_memory to emulate persistent maps */ @@ -816,6 +815,15 @@ static BOOL is_any_extension_supported( struct context *ctx, const char *extensi return FALSE; } +static void set_gl_error( TEB *teb, GLenum error ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct context *ctx; + + if (!(ctx = get_current_context( teb, NULL, NULL )) || ctx->base.error) return; + if (!(ctx->base.error = funcs->p_glGetError())) ctx->base.error = error; +} + static BOOL get_default_fbo_integer( struct context *ctx, struct opengl_drawable *draw, struct opengl_drawable *read, GLenum pname, GLint *data ) { @@ -855,7 +863,11 @@ static BOOL get_integer( TEB *teb, GLenum pname, GLint *data ) struct opengl_drawable *draw, *read; struct context *ctx; - if (!(ctx = get_current_context( teb, &draw, &read ))) return FALSE; + if (!(ctx = get_current_context( teb, &draw, &read ))) + { + set_gl_error( teb, GL_INVALID_OPERATION ); + return FALSE; + } switch (pname) { @@ -2064,6 +2076,19 @@ void wrap_glGetFramebufferParameterivEXT( TEB *teb, GLuint fbo, GLenum pname, GL funcs->p_glGetFramebufferParameterivEXT( fbo, pname, params ); } +GLenum wrap_glGetError( TEB *teb ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLenum error, wrapped; + struct wgl_context *ctx; + + if (!(ctx = &get_current_context( teb, NULL, NULL )->base)) return GL_INVALID_OPERATION; + error = funcs->p_glGetError(); + wrapped = ctx->error; + ctx->error = GL_NO_ERROR; + return wrapped ? wrapped : error; +} + NTSTATUS process_attach( void *args ) { struct process_attach_params *params = args; @@ -2161,28 +2186,6 @@ NTSTATUS return_wow64_string( const void *str, PTR32 *wow64_str ) return STATUS_BUFFER_TOO_SMALL; } -GLenum wow64_glGetError( TEB *teb ) -{ - const struct opengl_funcs *funcs = teb->glTable; - GLenum gl_err, prev_err; - struct context *ctx; - - if (!(ctx = get_current_context( teb, NULL, NULL ))) return GL_INVALID_OPERATION; - gl_err = funcs->p_glGetError(); - prev_err = ctx->gl_error; - ctx->gl_error = GL_NO_ERROR; - return prev_err ? prev_err : gl_err; -} - -static void set_gl_error( TEB *teb, GLenum gl_error ) -{ - const struct opengl_funcs *funcs = teb->glTable; - struct context *ctx; - - if (!(ctx = get_current_context( teb, NULL, NULL )) || ctx->gl_error) return; - if (!(ctx->gl_error = funcs->p_glGetError())) ctx->gl_error = gl_error; -} - static struct wgl_handle *get_sync_ptr( TEB *teb, GLsync sync ) { struct wgl_handle *handle = get_handle_ptr( sync ); diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 08ddf87dc52..1bfde3df391 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -2347,6 +2347,16 @@ static int win32u_wglGetSwapIntervalEXT(void) return interval; } +static void set_gl_error( GLenum error ) +{ + struct wgl_context *ctx = NtCurrentTeb()->glContext; + const struct opengl_funcs *funcs = &display_funcs; + + if (!ctx || ctx->error) return; + if ((ctx->error = funcs->p_glGetError())) return; + ctx->error = error; +} + static struct egl_platform *egl_platform_from_index( GLint index ) { struct egl_platform *egl; @@ -2379,10 +2389,11 @@ static BOOL query_renderer_integer( struct egl_platform *egl, GLenum attribute, *value = egl->core_version ? WGL_CONTEXT_CORE_PROFILE_BIT_ARB : WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; return TRUE; case WGL_RENDERER_VIDEO_MEMORY_WINE: *value = egl->video_memory; return TRUE; - default: FIXME( "Unsupported attribute %#x\n", attribute ); break; + default: + FIXME( "Unsupported attribute %#x\n", attribute ); + set_gl_error( GL_INVALID_ENUM ); + return FALSE; } - - return FALSE; } static BOOL win32u_wglQueryRendererIntegerWINE( HDC hdc, GLint renderer, GLenum attribute, GLuint *value ) @@ -2391,7 +2402,11 @@ static BOOL win32u_wglQueryRendererIntegerWINE( HDC hdc, GLint renderer, GLenum TRACE( "hdc %p, renderer %u, attribute %#x, value %p\n", hdc, renderer, attribute, value ); - if (!(egl = egl_platform_from_index( renderer ))) return FALSE; + if (!(egl = egl_platform_from_index( renderer ))) + { + set_gl_error( GL_INVALID_INDEX ); + return FALSE; + } return query_renderer_integer( egl, attribute, value ); } @@ -2401,10 +2416,11 @@ static const char *query_renderer_string( struct egl_platform *egl, GLenum attri { case WGL_RENDERER_DEVICE_ID_WINE: return egl->device_name; case WGL_RENDERER_VENDOR_ID_WINE: return egl->vendor_name; - default: FIXME( "Unsupported attribute %#x\n", attribute ); + default: + FIXME( "Unsupported attribute %#x\n", attribute ); + set_gl_error( GL_INVALID_ENUM ); + return NULL; } - - return NULL; } static const char *win32u_wglQueryRendererStringWINE( HDC hdc, GLint renderer, GLenum attribute ) @@ -2413,7 +2429,11 @@ static const char *win32u_wglQueryRendererStringWINE( HDC hdc, GLint renderer, G TRACE( "hdc %p, renderer %u, attribute %#x\n", hdc, renderer, attribute ); - if (!(egl = egl_platform_from_index( renderer ))) return NULL; + if (!(egl = egl_platform_from_index( renderer ))) + { + set_gl_error( GL_INVALID_INDEX ); + return NULL; + } return query_renderer_string( egl, attribute ); } @@ -2423,7 +2443,11 @@ static BOOL win32u_wglQueryCurrentRendererIntegerWINE( GLenum attribute, GLuint TRACE( "attribute %#x, value %p\n", attribute, value ); - if (!(ptr = list_head( &devices_egl ))) return FALSE; + if (!(ptr = list_head( &devices_egl ))) + { + set_gl_error( GL_INVALID_OPERATION ); + return FALSE; + } return query_renderer_integer( LIST_ENTRY( ptr, struct egl_platform, entry ), attribute, value ); } @@ -2433,7 +2457,11 @@ static const char *win32u_wglQueryCurrentRendererStringWINE( GLenum attribute ) TRACE( "attribute %#x\n", attribute ); - if (!(ptr = list_head( &devices_egl ))) return NULL; + if (!(ptr = list_head( &devices_egl ))) + { + set_gl_error( GL_INVALID_OPERATION ); + return NULL; + } return query_renderer_string( LIST_ENTRY( ptr, struct egl_platform, entry ), attribute ); } diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 77d1c818438..ff8168bb590 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -77,6 +77,7 @@ struct wgl_context int format; /* pixel format of the context */ struct opengl_drawable *draw; /* currently bound draw surface */ struct opengl_drawable *read; /* currently bound read surface */ + GLenum error; /* wrapped GL error */ }; /* interface between opengl32 and win32u */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9681
This merge request was approved by Rémi Bernon. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9681
participants (2)
-
Derek Lesho -
Rémi Bernon