From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 1 + dlls/opengl32/unix_private.h | 1 + dlls/opengl32/unix_thunks.c | 4 ++++ dlls/opengl32/unix_wgl.c | 12 ++++++++++++ 4 files changed, 18 insertions(+)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index c47e1ddce8d..7a8c294d9ea 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -509,6 +509,7 @@ sub generate_unix_thunk($$$$) $ret .= "funcs->p_$name($call_args);\n"; } $ret .= " pthread_mutex_unlock( &wgl_lock );\n" if $need_lock; + $ret .= " set_current_fbo( $teb, params->target, params->framebuffer );\n" if $name =~ /glBindFramebuffer/; if (defined $state_attrib_funcs{$name}) { my $state_args = $state_attrib_funcs{$name}; diff --git a/dlls/opengl32/unix_private.h b/dlls/opengl32/unix_private.h index 26f21d6843a..258019fb34c 100644 --- a/dlls/opengl32/unix_private.h +++ b/dlls/opengl32/unix_private.h @@ -82,5 +82,6 @@ extern NTSTATUS thread_attach( void *args ); extern NTSTATUS process_detach( void *args ); extern NTSTATUS get_pixel_formats( void *args ); extern void set_context_attribute( TEB *teb, GLenum name, const void *value, size_t size ); +extern void set_current_fbo( TEB *teb, GLenum target, GLuint framebuffer );
#endif /* __WINE_OPENGL32_UNIX_PRIVATE_H */ diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 3504bd088d5..23ba4e01854 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -3600,6 +3600,7 @@ static NTSTATUS ext_glBindFramebuffer( void *args ) struct glBindFramebuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; funcs->p_glBindFramebuffer( params->target, params->framebuffer ); + set_current_fbo( params->teb, params->target, params->framebuffer ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -3609,6 +3610,7 @@ static NTSTATUS ext_glBindFramebufferEXT( void *args ) struct glBindFramebufferEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; funcs->p_glBindFramebufferEXT( params->target, params->framebuffer ); + set_current_fbo( params->teb, params->target, params->framebuffer ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -36093,6 +36095,7 @@ static NTSTATUS wow64_ext_glBindFramebuffer( void *args ) TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; funcs->p_glBindFramebuffer( params->target, params->framebuffer ); + set_current_fbo( teb, params->target, params->framebuffer ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -36108,6 +36111,7 @@ static NTSTATUS wow64_ext_glBindFramebufferEXT( void *args ) TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; funcs->p_glBindFramebufferEXT( params->target, params->framebuffer ); + set_current_fbo( teb, params->target, params->framebuffer ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 5994202f935..726f0cd0019 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -132,6 +132,8 @@ struct context struct enable_state enable; /* GL_ENABLE_BIT */ struct color_buffer_state color_buffer; /* GL_COLOR_BUFFER_BIT */ struct hint_state hint; /* GL_HINT_BIT */ + GLuint draw_fbo; /* currently bound draw FBO name */ + GLuint read_fbo; /* currently bound read FBO name */ };
struct wgl_handle @@ -1372,6 +1374,16 @@ void wrap_glDebugMessageCallbackARB( TEB *teb, GLDEBUGPROCARB callback, const vo set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); }
+void set_current_fbo( TEB *teb, GLenum target, GLuint fbo ) +{ + struct context *ctx; + + if (!(ctx = get_current_context( teb ))) return; + if (target == GL_FRAMEBUFFER) ctx->draw_fbo = ctx->read_fbo = fbo; + if (target == GL_DRAW_FRAMEBUFFER) ctx->draw_fbo = fbo; + if (target == GL_READ_FRAMEBUFFER) ctx->read_fbo = fbo; +} + void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data ) { const struct opengl_funcs *funcs = teb->glTable;