From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 9 ++ dlls/opengl32/unix_thunks.c | 54 ++++-------- dlls/opengl32/unix_thunks.h | 9 ++ dlls/opengl32/unix_wgl.c | 169 ++++++++++++++++++++++++++++++++++++ 4 files changed, 205 insertions(+), 36 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 7a8c294d9ea..5ab4624cff0 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -201,9 +201,14 @@ my %manual_unix_thunks = "glDebugMessageCallback" => 1, "glDebugMessageCallbackAMD" => 1, "glDebugMessageCallbackARB" => 1, + "glDrawBuffer" => 1, + "glDrawBuffers" => 1, "glDrawPixels" => 1, "glFinish" => 1, "glFlush" => 1, + "glFramebufferDrawBufferEXT" => 1, + "glFramebufferDrawBuffersEXT" => 1, + "glFramebufferReadBufferEXT" => 1, "glGetBooleanv" => 1, "glGetDoublev" => 1, "glGetFloatv" => 1, @@ -211,6 +216,10 @@ my %manual_unix_thunks = "glGetIntegerv" => 1, "glGetString" => 1, "glGetStringi" => 1, + "glNamedFramebufferDrawBuffer" => 1, + "glNamedFramebufferDrawBuffers" => 1, + "glNamedFramebufferReadBuffer" => 1, + "glReadBuffer" => 1, "glReadPixels" => 1, "glViewport" => 1, "wglGetProcAddress" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 23ba4e01854..4c1b1b0b99d 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -699,8 +699,7 @@ static NTSTATUS gl_glDrawArrays( void *args ) static NTSTATUS gl_glDrawBuffer( void *args ) { struct glDrawBuffer_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glDrawBuffer( params->buf ); + wrap_glDrawBuffer( params->teb, params->buf ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -2189,8 +2188,7 @@ static NTSTATUS gl_glRasterPos4sv( void *args ) static NTSTATUS gl_glReadBuffer( void *args ) { struct glReadBuffer_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glReadBuffer( params->src ); + wrap_glReadBuffer( params->teb, params->src ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -6864,8 +6862,7 @@ static NTSTATUS ext_glDrawBufferRegion( void *args ) static NTSTATUS ext_glDrawBuffers( void *args ) { struct glDrawBuffers_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glDrawBuffers( params->n, params->bufs ); + wrap_glDrawBuffers( params->teb, params->n, params->bufs ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -7971,8 +7968,7 @@ static NTSTATUS ext_glFrameZoomSGIX( void *args ) static NTSTATUS ext_glFramebufferDrawBufferEXT( void *args ) { struct glFramebufferDrawBufferEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glFramebufferDrawBufferEXT( params->framebuffer, params->mode ); + wrap_glFramebufferDrawBufferEXT( params->teb, params->framebuffer, params->mode ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -7980,8 +7976,7 @@ static NTSTATUS ext_glFramebufferDrawBufferEXT( void *args ) static NTSTATUS ext_glFramebufferDrawBuffersEXT( void *args ) { struct glFramebufferDrawBuffersEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glFramebufferDrawBuffersEXT( params->framebuffer, params->n, params->bufs ); + wrap_glFramebufferDrawBuffersEXT( params->teb, params->framebuffer, params->n, params->bufs ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8016,8 +8011,7 @@ static NTSTATUS ext_glFramebufferParameteriMESA( void *args ) static NTSTATUS ext_glFramebufferReadBufferEXT( void *args ) { struct glFramebufferReadBufferEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glFramebufferReadBufferEXT( params->framebuffer, params->mode ); + wrap_glFramebufferReadBufferEXT( params->teb, params->framebuffer, params->mode ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -15464,8 +15458,7 @@ static NTSTATUS ext_glNamedCopyBufferSubDataEXT( void *args ) static NTSTATUS ext_glNamedFramebufferDrawBuffer( void *args ) { struct glNamedFramebufferDrawBuffer_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glNamedFramebufferDrawBuffer( params->framebuffer, params->buf ); + wrap_glNamedFramebufferDrawBuffer( params->teb, params->framebuffer, params->buf ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -15473,8 +15466,7 @@ static NTSTATUS ext_glNamedFramebufferDrawBuffer( void *args ) static NTSTATUS ext_glNamedFramebufferDrawBuffers( void *args ) { struct glNamedFramebufferDrawBuffers_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glNamedFramebufferDrawBuffers( params->framebuffer, params->n, params->bufs ); + wrap_glNamedFramebufferDrawBuffers( params->teb, params->framebuffer, params->n, params->bufs ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -15500,8 +15492,7 @@ static NTSTATUS ext_glNamedFramebufferParameteriEXT( void *args ) static NTSTATUS ext_glNamedFramebufferReadBuffer( void *args ) { struct glNamedFramebufferReadBuffer_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glNamedFramebufferReadBuffer( params->framebuffer, params->src ); + wrap_glNamedFramebufferReadBuffer( params->teb, params->framebuffer, params->src ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -31069,8 +31060,7 @@ static NTSTATUS wow64_gl_glDrawBuffer( void *args ) GLenum buf; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glDrawBuffer( params->buf ); + wrap_glDrawBuffer( teb, params->buf ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -33607,8 +33597,7 @@ static NTSTATUS wow64_gl_glReadBuffer( void *args ) GLenum src; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glReadBuffer( params->src ); + wrap_glReadBuffer( teb, params->src ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -42248,8 +42237,7 @@ static NTSTATUS wow64_ext_glDrawBuffers( void *args ) PTR32 bufs; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glDrawBuffers( params->n, ULongToPtr(params->bufs) ); + wrap_glDrawBuffers( teb, params->n, ULongToPtr(params->bufs) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44140,8 +44128,7 @@ static NTSTATUS wow64_ext_glFramebufferDrawBufferEXT( void *args ) GLenum mode; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glFramebufferDrawBufferEXT( params->framebuffer, params->mode ); + wrap_glFramebufferDrawBufferEXT( teb, params->framebuffer, params->mode ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44156,8 +44143,7 @@ static NTSTATUS wow64_ext_glFramebufferDrawBuffersEXT( void *args ) PTR32 bufs; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glFramebufferDrawBuffersEXT( params->framebuffer, params->n, ULongToPtr(params->bufs) ); + wrap_glFramebufferDrawBuffersEXT( teb, params->framebuffer, params->n, ULongToPtr(params->bufs) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44216,8 +44202,7 @@ static NTSTATUS wow64_ext_glFramebufferReadBufferEXT( void *args ) GLenum mode; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glFramebufferReadBufferEXT( params->framebuffer, params->mode ); + wrap_glFramebufferReadBufferEXT( teb, params->framebuffer, params->mode ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -58189,8 +58174,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferDrawBuffer( void *args ) GLenum buf; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glNamedFramebufferDrawBuffer( params->framebuffer, params->buf ); + wrap_glNamedFramebufferDrawBuffer( teb, params->framebuffer, params->buf ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -58205,8 +58189,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferDrawBuffers( void *args ) PTR32 bufs; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glNamedFramebufferDrawBuffers( params->framebuffer, params->n, ULongToPtr(params->bufs) ); + wrap_glNamedFramebufferDrawBuffers( teb, params->framebuffer, params->n, ULongToPtr(params->bufs) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -58252,8 +58235,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferReadBuffer( void *args ) GLenum src; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glNamedFramebufferReadBuffer( params->framebuffer, params->src ); + wrap_glNamedFramebufferReadBuffer( teb, params->framebuffer, params->src ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 7a2074312b0..90b6a43999f 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -8,6 +8,7 @@ extern BOOL wrap_wglMakeCurrent( TEB *teb, HDC hDc, HGLRC newContext ); extern BOOL wrap_wglShareLists( TEB *teb, HGLRC hrcSrvShare, HGLRC hrcSrvSource ); extern BOOL wrap_wglSwapBuffers( TEB *teb, HDC hdc ); extern void wrap_glClear( TEB *teb, GLbitfield mask ); +extern void wrap_glDrawBuffer( TEB *teb, GLenum buf ); 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 ); @@ -16,13 +17,21 @@ 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_glReadBuffer( TEB *teb, GLenum src ); extern void wrap_glReadPixels( TEB *teb, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels ); extern void wrap_glViewport( TEB *teb, GLint x, GLint y, GLsizei width, GLsizei height ); 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_glDrawBuffers( TEB *teb, GLsizei n, const GLenum *bufs ); +extern void wrap_glFramebufferDrawBufferEXT( TEB *teb, GLuint framebuffer, GLenum mode ); +extern void wrap_glFramebufferDrawBuffersEXT( TEB *teb, GLuint framebuffer, GLsizei n, const GLenum *bufs ); +extern void wrap_glFramebufferReadBufferEXT( TEB *teb, GLuint framebuffer, GLenum mode ); extern void wrap_glGetInteger64v( TEB *teb, GLenum pname, GLint64 *data ); extern const GLubyte * wrap_glGetStringi( TEB *teb, GLenum name, GLuint index ); +extern void wrap_glNamedFramebufferDrawBuffer( TEB *teb, GLuint framebuffer, GLenum buf ); +extern void wrap_glNamedFramebufferDrawBuffers( TEB *teb, GLuint framebuffer, GLsizei n, const GLenum *bufs ); +extern void wrap_glNamedFramebufferReadBuffer( TEB *teb, GLuint framebuffer, GLenum src ); extern BOOL wrap_wglBindTexImageARB( TEB *teb, HPBUFFERARB hPbuffer, int iBuffer ); extern HGLRC wrap_wglCreateContextAttribsARB( TEB *teb, HDC hDC, HGLRC hShareContext, const int *attribList ); extern HPBUFFERARB wrap_wglCreatePbufferARB( TEB *teb, HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index ea3c46e98bc..a74deefeb51 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -65,6 +65,11 @@ enum wgl_handle_type
/* context state management */
+struct pixel_mode_state +{ + GLenum read_buffer; +}; + struct light_model_state { GLfloat ambient[4]; @@ -100,9 +105,12 @@ struct enable_state GLboolean normalize; };
+#define MAX_DRAW_BUFFERS 16 + struct color_buffer_state { GLfloat clear_color[4]; + GLenum draw_buffers[MAX_DRAW_BUFFERS]; };
struct hint_state @@ -126,6 +134,7 @@ struct context
/* semi-stub state tracker for wglCopyContext */ GLbitfield used; /* context state used bits */ + struct pixel_mode_state pixel_mode; /* GL_PIXEL_MODE_BIT */ struct lighting_state lighting; /* GL_LIGHTING_BIT */ struct depth_buffer_state depth_buffer; /* GL_DEPTH_BUFFER_BIT */ struct viewport_state viewport; /* GL_VIEWPORT_BIT */ @@ -1404,6 +1413,166 @@ void set_current_fbo( TEB *teb, GLenum target, GLuint fbo ) if (target == GL_READ_FRAMEBUFFER) ctx->read_fbo = fbo; }
+static void set_default_fbo_draw_buffers( struct context *ctx, struct opengl_drawable *draw, + GLsizei count, const GLenum *buffers ) +{ + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + + for (GLsizei i = 0; i < count; i++) + { + if (i >= MAX_DRAW_BUFFERS) FIXME( "Needs %u draw buffers\n", i ); + else ctx->color_buffer.draw_buffers[i] = buffers[i]; + } +} + +void wrap_glDrawBuffers( TEB *teb, GLsizei n, const GLenum *bufs ) +{ + struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw; + struct context *ctx; + + if ((ctx = get_current_context( teb, &draw, NULL )) && !ctx->draw_fbo && draw->fbo) + set_default_fbo_draw_buffers( ctx, draw, n, bufs ); + + funcs->p_glDrawBuffers( n, bufs ); +} + +void wrap_glFramebufferDrawBuffersEXT( TEB *teb, GLuint fbo, GLsizei n, const GLenum *bufs ) +{ + struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw; + struct context *ctx; + + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) + set_default_fbo_draw_buffers( ctx, draw, n, bufs ); + + funcs->p_glFramebufferDrawBuffersEXT( fbo, n, bufs ); +} + +void wrap_glNamedFramebufferDrawBuffers( TEB *teb, GLuint fbo, GLsizei n, const GLenum *bufs ) +{ + struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw; + struct context *ctx; + + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) + set_default_fbo_draw_buffers( ctx, draw, n, bufs ); + + funcs->p_glNamedFramebufferDrawBuffers( fbo, n, bufs ); +} + +static void set_default_fbo_draw_buffer( struct context *ctx, struct opengl_drawable *draw, GLint buffer ) +{ + switch (buffer) + { + case GL_LEFT: + case GL_RIGHT: + case GL_FRONT: + case GL_BACK: + case GL_FRONT_AND_BACK: + case GL_FRONT_LEFT: + case GL_FRONT_RIGHT: + case GL_BACK_LEFT: + case GL_BACK_RIGHT: + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return; + } + + WARN( "Invalid draw buffer %#x for context %p\n", buffer, ctx ); +} + +void wrap_glDrawBuffer( TEB *teb, GLenum buf ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw; + struct context *ctx; + + if ((ctx = get_current_context( teb, &draw, NULL )) && !ctx->draw_fbo && draw->fbo) + set_default_fbo_draw_buffer( ctx, draw, buf ); + + funcs->p_glDrawBuffer( buf ); +} + +void wrap_glFramebufferDrawBufferEXT( TEB *teb, GLuint fbo, GLenum mode ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw; + struct context *ctx; + + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) + set_default_fbo_draw_buffer( ctx, draw, mode ); + + funcs->p_glFramebufferDrawBufferEXT( fbo, mode ); +} + +void wrap_glNamedFramebufferDrawBuffer( TEB *teb, GLuint fbo, GLenum buf ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw; + struct context *ctx; + + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) + set_default_fbo_draw_buffer( ctx, draw, buf ); + + funcs->p_glNamedFramebufferDrawBuffer( fbo, buf ); +} + +static void set_default_fbo_read_buffer( struct context *ctx, struct opengl_drawable *read, GLint buffer ) +{ + switch (buffer) + { + case GL_FRONT: + case GL_LEFT: + case GL_FRONT_LEFT: + case GL_RIGHT: + case GL_FRONT_RIGHT: + case GL_BACK: + case GL_BACK_LEFT: + case GL_BACK_RIGHT: + ctx->pixel_mode.read_buffer = buffer; + return; + } + + WARN( "Invalid read buffer %#x for context %p\n", buffer, ctx ); +} + +void wrap_glReadBuffer( TEB *teb, GLenum src ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *read; + struct context *ctx; + + if ((ctx = get_current_context( teb, NULL, &read )) && !ctx->read_fbo && read->fbo) + set_default_fbo_read_buffer( ctx, read, src ); + + funcs->p_glReadBuffer( src ); +} + +void wrap_glFramebufferReadBufferEXT( TEB *teb, GLuint fbo, GLenum mode ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *read; + struct context *ctx; + + if ((ctx = get_current_context( teb, NULL, &read )) && !fbo && read->fbo) + set_default_fbo_read_buffer( ctx, read, mode ); + + funcs->p_glFramebufferReadBufferEXT( fbo, mode ); +} + +void wrap_glNamedFramebufferReadBuffer( TEB *teb, GLuint fbo, GLenum src ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *read; + struct context *ctx; + + if ((ctx = get_current_context( teb, NULL, &read )) && !fbo && read->fbo) + set_default_fbo_read_buffer( ctx, read, src ); + + funcs->p_glNamedFramebufferReadBuffer( fbo, src ); +} + void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data ) { const struct opengl_funcs *funcs = teb->glTable;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 1 + dlls/opengl32/unix_thunks.c | 6 ++---- dlls/opengl32/unix_thunks.h | 1 + dlls/opengl32/unix_wgl.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 5ab4624cff0..28d480a0c2d 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -212,6 +212,7 @@ my %manual_unix_thunks = "glGetBooleanv" => 1, "glGetDoublev" => 1, "glGetFloatv" => 1, + "glGetFramebufferParameterivEXT" => 1, "glGetInteger64v" => 1, "glGetIntegerv" => 1, "glGetString" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 4c1b1b0b99d..acd478cf9a0 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -9228,8 +9228,7 @@ static NTSTATUS ext_glGetFramebufferParameteriv( void *args ) static NTSTATUS ext_glGetFramebufferParameterivEXT( void *args ) { struct glGetFramebufferParameterivEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glGetFramebufferParameterivEXT( params->framebuffer, params->pname, params->params ); + wrap_glGetFramebufferParameterivEXT( params->teb, params->framebuffer, params->pname, params->params ); return STATUS_SUCCESS; }
@@ -46512,8 +46511,7 @@ static NTSTATUS wow64_ext_glGetFramebufferParameterivEXT( void *args ) PTR32 params; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glGetFramebufferParameterivEXT( params->framebuffer, params->pname, ULongToPtr(params->params) ); + wrap_glGetFramebufferParameterivEXT( teb, params->framebuffer, params->pname, ULongToPtr(params->params) ); return STATUS_SUCCESS; }
diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 90b6a43999f..4cb48b7aa7b 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -27,6 +27,7 @@ extern void wrap_glDrawBuffers( TEB *teb, GLsizei n, const GLenum *bufs ); extern void wrap_glFramebufferDrawBufferEXT( TEB *teb, GLuint framebuffer, GLenum mode ); extern void wrap_glFramebufferDrawBuffersEXT( TEB *teb, GLuint framebuffer, GLsizei n, const GLenum *bufs ); extern void wrap_glFramebufferReadBufferEXT( TEB *teb, GLuint framebuffer, GLenum mode ); +extern void wrap_glGetFramebufferParameterivEXT( TEB *teb, GLuint framebuffer, GLenum pname, GLint *params ); extern void wrap_glGetInteger64v( TEB *teb, GLenum pname, GLint64 *data ); extern const GLubyte * wrap_glGetStringi( TEB *teb, GLenum name, GLuint index ); extern void wrap_glNamedFramebufferDrawBuffer( TEB *teb, GLuint framebuffer, GLenum buf ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index a74deefeb51..c8096590841 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -785,6 +785,30 @@ static BOOL check_extension_support( TEB *teb, const char *extension, const char return FALSE; }
+static BOOL get_default_fbo_integer( struct context *ctx, struct opengl_drawable *draw, struct opengl_drawable *read, + GLenum pname, GLint *data ) +{ + if (pname == GL_READ_BUFFER && !ctx->read_fbo && read->fbo) + { + if (ctx->pixel_mode.read_buffer) *data = ctx->pixel_mode.read_buffer; + else *data = read->doublebuffer ? GL_BACK : GL_FRONT; + return TRUE; + } + if ((pname == GL_DRAW_BUFFER || pname == GL_DRAW_BUFFER0) && !ctx->draw_fbo && draw->fbo) + { + if (ctx->color_buffer.draw_buffers[0]) *data = ctx->color_buffer.draw_buffers[0]; + else *data = draw->doublebuffer ? GL_BACK : GL_FRONT; + return TRUE; + } + if (pname >= GL_DRAW_BUFFER1 && pname <= GL_DRAW_BUFFER15 && !ctx->draw_fbo && draw->fbo) + { + *data = ctx->color_buffer.draw_buffers[pname - GL_DRAW_BUFFER0]; + return TRUE; + } + + return FALSE; +} + static BOOL get_integer( TEB *teb, GLenum pname, GLint *data ) { const struct opengl_funcs *funcs = teb->glTable; @@ -832,6 +856,7 @@ static BOOL get_integer( TEB *teb, GLenum pname, GLint *data ) *data = ctx->read_fbo; return TRUE; } + if (get_default_fbo_integer( ctx, draw, read, pname, data )) return TRUE; }
return FALSE; @@ -1612,6 +1637,18 @@ void wrap_glGetInteger64v( TEB *teb, GLenum pname, GLint64 *data ) else funcs->p_glGetInteger64v( pname, data ); }
+void wrap_glGetFramebufferParameterivEXT( TEB *teb, GLuint fbo, GLenum pname, GLint *params ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw, *read; + struct context *ctx; + + if ((ctx = get_current_context( teb, &draw, &read )) && !fbo && (fbo = draw->fbo)) + if (get_default_fbo_integer( ctx, draw, read, pname, params )) return; + + funcs->p_glGetFramebufferParameterivEXT( fbo, pname, params ); +} + NTSTATUS process_attach( void *args ) { struct process_attach_params *params = args;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/unix_wgl.c | 119 ++++++++++++++++++++++++++++++++------- 1 file changed, 99 insertions(+), 20 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index c8096590841..26cf8ca215f 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1438,26 +1438,45 @@ void set_current_fbo( TEB *teb, GLenum target, GLuint fbo ) if (target == GL_READ_FRAMEBUFFER) ctx->read_fbo = fbo; }
-static void set_default_fbo_draw_buffers( struct context *ctx, struct opengl_drawable *draw, - GLsizei count, const GLenum *buffers ) +static GLenum *set_default_fbo_draw_buffers( struct context *ctx, struct opengl_drawable *draw, + GLsizei count, const GLenum *src, GLenum *dst ) { memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) );
for (GLsizei i = 0; i < count; i++) { + if (src[i] == GL_NONE) + dst[i] = GL_NONE; + else if (src[i] == GL_FRONT_LEFT) + dst[i] = GL_COLOR_ATTACHMENT0; + else if (src[i] == GL_FRONT_RIGHT && draw->stereo) + dst[i] = draw->doublebuffer ? GL_COLOR_ATTACHMENT2 : GL_COLOR_ATTACHMENT1; + else if (src[i] == GL_BACK_LEFT && draw->doublebuffer) + dst[i] = GL_COLOR_ATTACHMENT1; + else if (src[i] == GL_BACK_RIGHT && draw->stereo && draw->doublebuffer) + dst[i] = GL_COLOR_ATTACHMENT3; + else + { + WARN( "Invalid draw buffer #%d %#x for context %p\n", i, src[i], ctx ); + dst[i] = src[i]; + } + if (i >= MAX_DRAW_BUFFERS) FIXME( "Needs %u draw buffers\n", i ); - else ctx->color_buffer.draw_buffers[i] = buffers[i]; + else ctx->color_buffer.draw_buffers[i] = src[i]; } + + return dst; }
void wrap_glDrawBuffers( TEB *teb, GLsizei n, const GLenum *bufs ) { struct opengl_funcs *funcs = teb->glTable; + GLenum buffer[MAX_DRAW_BUFFERS]; struct opengl_drawable *draw; struct context *ctx;
if ((ctx = get_current_context( teb, &draw, NULL )) && !ctx->draw_fbo && draw->fbo) - set_default_fbo_draw_buffers( ctx, draw, n, bufs ); + set_default_fbo_draw_buffers( ctx, draw, n, bufs, buffer );
funcs->p_glDrawBuffers( n, bufs ); } @@ -1465,11 +1484,12 @@ void wrap_glDrawBuffers( TEB *teb, GLsizei n, const GLenum *bufs ) void wrap_glFramebufferDrawBuffersEXT( TEB *teb, GLuint fbo, GLsizei n, const GLenum *bufs ) { struct opengl_funcs *funcs = teb->glTable; + GLenum buffer[MAX_DRAW_BUFFERS]; struct opengl_drawable *draw; struct context *ctx;
- if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) - set_default_fbo_draw_buffers( ctx, draw, n, bufs ); + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && (fbo = draw->fbo)) + bufs = set_default_fbo_draw_buffers( ctx, draw, n, bufs, buffer );
funcs->p_glFramebufferDrawBuffersEXT( fbo, n, bufs ); } @@ -1477,34 +1497,79 @@ void wrap_glFramebufferDrawBuffersEXT( TEB *teb, GLuint fbo, GLsizei n, const GL void wrap_glNamedFramebufferDrawBuffers( TEB *teb, GLuint fbo, GLsizei n, const GLenum *bufs ) { struct opengl_funcs *funcs = teb->glTable; + GLenum buffer[MAX_DRAW_BUFFERS]; struct opengl_drawable *draw; struct context *ctx;
- if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) - set_default_fbo_draw_buffers( ctx, draw, n, bufs ); + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && (fbo = draw->fbo)) + bufs = set_default_fbo_draw_buffers( ctx, draw, n, bufs, buffer );
funcs->p_glNamedFramebufferDrawBuffers( fbo, n, bufs ); }
-static void set_default_fbo_draw_buffer( struct context *ctx, struct opengl_drawable *draw, GLint buffer ) +static GLenum set_default_fbo_draw_buffer( struct context *ctx, struct opengl_drawable *draw, GLint buffer ) { switch (buffer) { case GL_LEFT: + if (draw->doublebuffer) FIXME( "Not implemented\n" ); /* only front left */ + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return GL_COLOR_ATTACHMENT0; + case GL_RIGHT: + if (!draw->stereo) break; + if (draw->doublebuffer) FIXME( "Not implemented\n" ); /* only front right */ + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return draw->doublebuffer ? GL_COLOR_ATTACHMENT2 : GL_COLOR_ATTACHMENT1; + case GL_FRONT: + if (draw->stereo) FIXME( "Not implemented\n" ); /* only front left */ + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return GL_COLOR_ATTACHMENT0; + case GL_BACK: + if (!draw->doublebuffer) break; + if (draw->stereo) FIXME( "Not implemented\n" ); /* only back left */ + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return GL_COLOR_ATTACHMENT1; + case GL_FRONT_AND_BACK: + FIXME( "Not implemented\n" ); /* only front left */ + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return GL_COLOR_ATTACHMENT0; + case GL_FRONT_LEFT: + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return GL_COLOR_ATTACHMENT0; + case GL_FRONT_RIGHT: + if (!draw->stereo) break; + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return draw->doublebuffer ? GL_COLOR_ATTACHMENT2 : GL_COLOR_ATTACHMENT1; + case GL_BACK_LEFT: + if (!draw->doublebuffer) break; + memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); + ctx->color_buffer.draw_buffers[0] = buffer; + return GL_COLOR_ATTACHMENT1; + case GL_BACK_RIGHT: + if (!draw->stereo || !draw->doublebuffer) break; memset( ctx->color_buffer.draw_buffers, 0, sizeof(ctx->color_buffer.draw_buffers) ); ctx->color_buffer.draw_buffers[0] = buffer; - return; + return GL_COLOR_ATTACHMENT3; + }
WARN( "Invalid draw buffer %#x for context %p\n", buffer, ctx ); + return buffer; }
void wrap_glDrawBuffer( TEB *teb, GLenum buf ) @@ -1525,8 +1590,8 @@ void wrap_glFramebufferDrawBufferEXT( TEB *teb, GLuint fbo, GLenum mode ) struct opengl_drawable *draw; struct context *ctx;
- if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) - set_default_fbo_draw_buffer( ctx, draw, mode ); + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && (fbo = draw->fbo)) + mode = set_default_fbo_draw_buffer( ctx, draw, mode );
funcs->p_glFramebufferDrawBufferEXT( fbo, mode ); } @@ -1537,29 +1602,43 @@ void wrap_glNamedFramebufferDrawBuffer( TEB *teb, GLuint fbo, GLenum buf ) struct opengl_drawable *draw; struct context *ctx;
- if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && draw->fbo) - set_default_fbo_draw_buffer( ctx, draw, buf ); + if ((ctx = get_current_context( teb, &draw, NULL )) && !fbo && (fbo = draw->fbo)) + buf = set_default_fbo_draw_buffer( ctx, draw, buf );
funcs->p_glNamedFramebufferDrawBuffer( fbo, buf ); }
-static void set_default_fbo_read_buffer( struct context *ctx, struct opengl_drawable *read, GLint buffer ) +static GLenum set_default_fbo_read_buffer( struct context *ctx, struct opengl_drawable *read, GLint buffer ) { switch (buffer) { case GL_FRONT: case GL_LEFT: + FIXME( "Partial implementation\n" ); /* only front left */ case GL_FRONT_LEFT: + ctx->pixel_mode.read_buffer = buffer; + return GL_COLOR_ATTACHMENT0; + case GL_RIGHT: case GL_FRONT_RIGHT: + if (!read->stereo) break; + ctx->pixel_mode.read_buffer = buffer; + return read->doublebuffer ? GL_COLOR_ATTACHMENT2 : GL_COLOR_ATTACHMENT1; + case GL_BACK: case GL_BACK_LEFT: + if (!read->doublebuffer) break; + ctx->pixel_mode.read_buffer = buffer; + return GL_COLOR_ATTACHMENT1; + case GL_BACK_RIGHT: + if (!read->stereo) break; ctx->pixel_mode.read_buffer = buffer; - return; + return GL_COLOR_ATTACHMENT3; }
WARN( "Invalid read buffer %#x for context %p\n", buffer, ctx ); + return buffer; }
void wrap_glReadBuffer( TEB *teb, GLenum src ) @@ -1580,8 +1659,8 @@ void wrap_glFramebufferReadBufferEXT( TEB *teb, GLuint fbo, GLenum mode ) struct opengl_drawable *read; struct context *ctx;
- if ((ctx = get_current_context( teb, NULL, &read )) && !fbo && read->fbo) - set_default_fbo_read_buffer( ctx, read, mode ); + if ((ctx = get_current_context( teb, NULL, &read )) && !fbo && (fbo = read->fbo)) + mode = set_default_fbo_read_buffer( ctx, read, mode );
funcs->p_glFramebufferReadBufferEXT( fbo, mode ); } @@ -1592,8 +1671,8 @@ void wrap_glNamedFramebufferReadBuffer( TEB *teb, GLuint fbo, GLenum src ) struct opengl_drawable *read; struct context *ctx;
- if ((ctx = get_current_context( teb, NULL, &read )) && !fbo && read->fbo) - set_default_fbo_read_buffer( ctx, read, src ); + if ((ctx = get_current_context( teb, NULL, &read )) && !fbo && (fbo = read->fbo)) + src = set_default_fbo_read_buffer( ctx, read, src );
funcs->p_glNamedFramebufferReadBuffer( fbo, src ); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 55 ++++++++++++++++ dlls/opengl32/unix_private.h | 3 + dlls/opengl32/unix_thunks.c | 120 +++++++++++++++++++++++++++++++++++ dlls/opengl32/unix_wgl.c | 62 +++++++++++++++++- dlls/win32u/opengl.c | 1 + 5 files changed, 238 insertions(+), 3 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 28d480a0c2d..ef6b32dca89 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -226,6 +226,52 @@ my %manual_unix_thunks = "wglGetProcAddress" => 1, "wglSwapBuffers" => 1, ); +my %hide_default_fbo_thunks = + ( + "glFramebufferRenderbuffer" => 1, + "glFramebufferRenderbufferEXT" => 1, + "glFramebufferTexture" => 1, + "glFramebufferTexture1D" => 1, + "glFramebufferTexture1DEXT" => 1, + "glFramebufferTexture2D" => 1, + "glFramebufferTexture2DEXT" => 1, + "glFramebufferTexture3D" => 1, + "glFramebufferTexture3DEXT" => 1, + "glFramebufferTextureARB" => 1, + "glFramebufferTextureEXT" => 1, + "glFramebufferTextureFaceARB" => 1, + "glFramebufferTextureFaceEXT" => 1, + "glFramebufferTextureLayer" => 1, + "glFramebufferTextureLayerARB" => 1, + "glFramebufferTextureLayerEXT" => 1, + "glFramebufferTextureMultiviewOVR" => 1, + "glGetFramebufferAttachmentParameteriv" => 1, + "glGetFramebufferAttachmentParameterivEXT" => 1, + ); +my %map_default_fbo_thunks = + ( + "glBindFramebuffer" => [ "framebuffer" ], + "glBindFramebufferEXT" => [ "framebuffer" ], + "glBlitNamedFramebuffer" => [ "readFramebuffer", "drawFramebuffer" ], + "glCheckNamedFramebufferStatus" => [ "framebuffer" ], + "glCheckNamedFramebufferStatusEXT" => [ "framebuffer" ], + "glClearNamedFramebufferfi" => [ "framebuffer" ], + "glClearNamedFramebufferfv" => [ "framebuffer" ], + "glClearNamedFramebufferiv" => [ "framebuffer" ], + "glClearNamedFramebufferuiv" => [ "framebuffer" ], + "glGetNamedFramebufferAttachmentParameteriv" => [ "framebuffer" ], + "glGetNamedFramebufferAttachmentParameterivEXT" => [ "framebuffer" ], + "glGetNamedFramebufferParameterfvAMD" => [ "framebuffer" ], + "glGetNamedFramebufferParameteriv" => [ "framebuffer" ], + "glGetNamedFramebufferParameterivEXT" => [ "framebuffer" ], + "glInvalidateNamedFramebufferData" => [ "framebuffer" ], + "glInvalidateNamedFramebufferSubData" => [ "framebuffer" ], + "glNamedFramebufferParameteri" => [ "framebuffer" ], + "glNamedFramebufferParameteriEXT" => [ "framebuffer" ], + "glNamedFramebufferSampleLocationsfvARB" => [ "framebuffer" ], + "glNamedFramebufferSampleLocationsfvNV" => [ "framebuffer" ], + "glNamedFramebufferSamplePositionsfvAMD" => [ "framebuffer" ], + ); my %manual_wow64_wrappers = ( "glClientWaitSync" => 0, @@ -502,6 +548,14 @@ sub generate_unix_thunk($$$$) { $ret .= " const struct opengl_funcs *funcs = $teb->glTable;\n"; } + foreach my $arg (@{$map_default_fbo_thunks{$name}}) + { + my $target = "GL_DRAW_FRAMEBUFFER"; + $target = "GL_READ_FRAMEBUFFER" if $arg =~ "readFramebuffer"; + $target = "params->target" if $call_args =~ "params->target"; + $ret .= " if (!params->$arg) params->$arg = get_default_fbo( $teb, $target );\n"; + } + $ret .= " push_default_fbo( $teb );\n" if defined $hide_default_fbo_thunks{$name}; $ret .= " pthread_mutex_lock( &wgl_lock );\n" if $need_lock; $ret .= " $ret_expr"; $call_args =~ s/,$/ /; @@ -520,6 +574,7 @@ sub generate_unix_thunk($$$$) } $ret .= " pthread_mutex_unlock( &wgl_lock );\n" if $need_lock; $ret .= " set_current_fbo( $teb, params->target, params->framebuffer );\n" if $name =~ /glBindFramebuffer/; + $ret .= " pop_default_fbo( $teb );\n" if defined $hide_default_fbo_thunks{$name}; 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 258019fb34c..9caad96ebda 100644 --- a/dlls/opengl32/unix_private.h +++ b/dlls/opengl32/unix_private.h @@ -83,5 +83,8 @@ 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 ); +extern GLuint get_default_fbo( TEB *teb, GLenum target ); +extern void push_default_fbo( TEB *teb ); +extern void pop_default_fbo( TEB *teb );
#endif /* __WINE_OPENGL32_UNIX_PRIVATE_H */ diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index acd478cf9a0..98d2a018e78 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -3597,6 +3597,7 @@ static NTSTATUS ext_glBindFramebuffer( void *args ) { struct glBindFramebuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, params->target ); 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 ); @@ -3607,6 +3608,7 @@ static NTSTATUS ext_glBindFramebufferEXT( void *args ) { struct glBindFramebufferEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, params->target ); 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 ); @@ -4229,6 +4231,8 @@ static NTSTATUS ext_glBlitNamedFramebuffer( void *args ) { struct glBlitNamedFramebuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->readFramebuffer) params->readFramebuffer = get_default_fbo( params->teb, GL_READ_FRAMEBUFFER ); + if (!params->drawFramebuffer) params->drawFramebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glBlitNamedFramebuffer( params->readFramebuffer, params->drawFramebuffer, params->srcX0, params->srcY0, params->srcX1, params->srcY1, params->dstX0, params->dstY0, params->dstX1, params->dstY1, params->mask, params->filter ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -4373,6 +4377,7 @@ static NTSTATUS ext_glCheckNamedFramebufferStatus( void *args ) { struct glCheckNamedFramebufferStatus_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, params->target ); params->ret = funcs->p_glCheckNamedFramebufferStatus( params->framebuffer, params->target ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -4382,6 +4387,7 @@ static NTSTATUS ext_glCheckNamedFramebufferStatusEXT( void *args ) { struct glCheckNamedFramebufferStatusEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, params->target ); params->ret = funcs->p_glCheckNamedFramebufferStatusEXT( params->framebuffer, params->target ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -4571,6 +4577,7 @@ static NTSTATUS ext_glClearNamedFramebufferfi( void *args ) { struct glClearNamedFramebufferfi_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferfi( params->framebuffer, params->buffer, params->drawbuffer, params->depth, params->stencil ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -4580,6 +4587,7 @@ static NTSTATUS ext_glClearNamedFramebufferfv( void *args ) { struct glClearNamedFramebufferfv_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferfv( params->framebuffer, params->buffer, params->drawbuffer, params->value ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -4589,6 +4597,7 @@ static NTSTATUS ext_glClearNamedFramebufferiv( void *args ) { struct glClearNamedFramebufferiv_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferiv( params->framebuffer, params->buffer, params->drawbuffer, params->value ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -4598,6 +4607,7 @@ static NTSTATUS ext_glClearNamedFramebufferuiv( void *args ) { struct glClearNamedFramebufferuiv_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferuiv( params->framebuffer, params->buffer, params->drawbuffer, params->value ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -8020,7 +8030,9 @@ static NTSTATUS ext_glFramebufferRenderbuffer( void *args ) { struct glFramebufferRenderbuffer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferRenderbuffer( params->target, params->attachment, params->renderbuffertarget, params->renderbuffer ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8029,7 +8041,9 @@ static NTSTATUS ext_glFramebufferRenderbufferEXT( void *args ) { struct glFramebufferRenderbufferEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferRenderbufferEXT( params->target, params->attachment, params->renderbuffertarget, params->renderbuffer ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8065,7 +8079,9 @@ static NTSTATUS ext_glFramebufferTexture( void *args ) { struct glFramebufferTexture_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTexture( params->target, params->attachment, params->texture, params->level ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8074,7 +8090,9 @@ static NTSTATUS ext_glFramebufferTexture1D( void *args ) { struct glFramebufferTexture1D_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTexture1D( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8083,7 +8101,9 @@ static NTSTATUS ext_glFramebufferTexture1DEXT( void *args ) { struct glFramebufferTexture1DEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTexture1DEXT( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8092,7 +8112,9 @@ static NTSTATUS ext_glFramebufferTexture2D( void *args ) { struct glFramebufferTexture2D_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTexture2D( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8101,7 +8123,9 @@ static NTSTATUS ext_glFramebufferTexture2DEXT( void *args ) { struct glFramebufferTexture2DEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTexture2DEXT( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8110,7 +8134,9 @@ static NTSTATUS ext_glFramebufferTexture3D( void *args ) { struct glFramebufferTexture3D_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTexture3D( params->target, params->attachment, params->textarget, params->texture, params->level, params->zoffset ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8119,7 +8145,9 @@ static NTSTATUS ext_glFramebufferTexture3DEXT( void *args ) { struct glFramebufferTexture3DEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTexture3DEXT( params->target, params->attachment, params->textarget, params->texture, params->level, params->zoffset ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8128,7 +8156,9 @@ static NTSTATUS ext_glFramebufferTextureARB( void *args ) { struct glFramebufferTextureARB_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureARB( params->target, params->attachment, params->texture, params->level ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8137,7 +8167,9 @@ static NTSTATUS ext_glFramebufferTextureEXT( void *args ) { struct glFramebufferTextureEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureEXT( params->target, params->attachment, params->texture, params->level ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8146,7 +8178,9 @@ static NTSTATUS ext_glFramebufferTextureFaceARB( void *args ) { struct glFramebufferTextureFaceARB_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureFaceARB( params->target, params->attachment, params->texture, params->level, params->face ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8155,7 +8189,9 @@ static NTSTATUS ext_glFramebufferTextureFaceEXT( void *args ) { struct glFramebufferTextureFaceEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureFaceEXT( params->target, params->attachment, params->texture, params->level, params->face ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8164,7 +8200,9 @@ static NTSTATUS ext_glFramebufferTextureLayer( void *args ) { struct glFramebufferTextureLayer_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureLayer( params->target, params->attachment, params->texture, params->level, params->layer ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8173,7 +8211,9 @@ static NTSTATUS ext_glFramebufferTextureLayerARB( void *args ) { struct glFramebufferTextureLayerARB_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureLayerARB( params->target, params->attachment, params->texture, params->level, params->layer ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8182,7 +8222,9 @@ static NTSTATUS ext_glFramebufferTextureLayerEXT( void *args ) { struct glFramebufferTextureLayerEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureLayerEXT( params->target, params->attachment, params->texture, params->level, params->layer ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -8191,7 +8233,9 @@ static NTSTATUS ext_glFramebufferTextureMultiviewOVR( void *args ) { struct glFramebufferTextureMultiviewOVR_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glFramebufferTextureMultiviewOVR( params->target, params->attachment, params->texture, params->level, params->baseViewIndex, params->numViews ); + pop_default_fbo( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -9197,7 +9241,9 @@ static NTSTATUS ext_glGetFramebufferAttachmentParameteriv( void *args ) { struct glGetFramebufferAttachmentParameteriv_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glGetFramebufferAttachmentParameteriv( params->target, params->attachment, params->pname, params->params ); + pop_default_fbo( params->teb ); return STATUS_SUCCESS; }
@@ -9205,7 +9251,9 @@ static NTSTATUS ext_glGetFramebufferAttachmentParameterivEXT( void *args ) { struct glGetFramebufferAttachmentParameterivEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + push_default_fbo( params->teb ); funcs->p_glGetFramebufferAttachmentParameterivEXT( params->target, params->attachment, params->pname, params->params ); + pop_default_fbo( params->teb ); return STATUS_SUCCESS; }
@@ -9811,6 +9859,7 @@ static NTSTATUS ext_glGetNamedFramebufferAttachmentParameteriv( void *args ) { struct glGetNamedFramebufferAttachmentParameteriv_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferAttachmentParameteriv( params->framebuffer, params->attachment, params->pname, params->params ); return STATUS_SUCCESS; } @@ -9819,6 +9868,7 @@ static NTSTATUS ext_glGetNamedFramebufferAttachmentParameterivEXT( void *args ) { struct glGetNamedFramebufferAttachmentParameterivEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferAttachmentParameterivEXT( params->framebuffer, params->attachment, params->pname, params->params ); return STATUS_SUCCESS; } @@ -9827,6 +9877,7 @@ static NTSTATUS ext_glGetNamedFramebufferParameterfvAMD( void *args ) { struct glGetNamedFramebufferParameterfvAMD_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferParameterfvAMD( params->framebuffer, params->pname, params->numsamples, params->pixelindex, params->size, params->values ); return STATUS_SUCCESS; } @@ -9835,6 +9886,7 @@ static NTSTATUS ext_glGetNamedFramebufferParameteriv( void *args ) { struct glGetNamedFramebufferParameteriv_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferParameteriv( params->framebuffer, params->pname, params->param ); return STATUS_SUCCESS; } @@ -9843,6 +9895,7 @@ static NTSTATUS ext_glGetNamedFramebufferParameterivEXT( void *args ) { struct glGetNamedFramebufferParameterivEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferParameterivEXT( params->framebuffer, params->pname, params->params ); return STATUS_SUCCESS; } @@ -12271,6 +12324,7 @@ static NTSTATUS ext_glInvalidateNamedFramebufferData( void *args ) { struct glInvalidateNamedFramebufferData_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glInvalidateNamedFramebufferData( params->framebuffer, params->numAttachments, params->attachments ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -12280,6 +12334,7 @@ static NTSTATUS ext_glInvalidateNamedFramebufferSubData( void *args ) { struct glInvalidateNamedFramebufferSubData_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glInvalidateNamedFramebufferSubData( params->framebuffer, params->numAttachments, params->attachments, params->x, params->y, params->width, params->height ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -15474,6 +15529,7 @@ static NTSTATUS ext_glNamedFramebufferParameteri( void *args ) { struct glNamedFramebufferParameteri_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferParameteri( params->framebuffer, params->pname, params->param ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -15483,6 +15539,7 @@ static NTSTATUS ext_glNamedFramebufferParameteriEXT( void *args ) { struct glNamedFramebufferParameteriEXT_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferParameteriEXT( params->framebuffer, params->pname, params->param ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -15518,6 +15575,7 @@ static NTSTATUS ext_glNamedFramebufferSampleLocationsfvARB( void *args ) { struct glNamedFramebufferSampleLocationsfvARB_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferSampleLocationsfvARB( params->framebuffer, params->start, params->count, params->v ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -15527,6 +15585,7 @@ static NTSTATUS ext_glNamedFramebufferSampleLocationsfvNV( void *args ) { struct glNamedFramebufferSampleLocationsfvNV_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferSampleLocationsfvNV( params->framebuffer, params->start, params->count, params->v ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -15536,6 +15595,7 @@ static NTSTATUS ext_glNamedFramebufferSamplePositionsfvAMD( void *args ) { struct glNamedFramebufferSamplePositionsfvAMD_params *params = args; const struct opengl_funcs *funcs = params->teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( params->teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferSamplePositionsfvAMD( params->framebuffer, params->numsamples, params->pixelindex, params->values ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -36082,6 +36142,7 @@ static NTSTATUS wow64_ext_glBindFramebuffer( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, params->target ); funcs->p_glBindFramebuffer( params->target, params->framebuffer ); set_current_fbo( teb, params->target, params->framebuffer ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); @@ -36098,6 +36159,7 @@ static NTSTATUS wow64_ext_glBindFramebufferEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, params->target ); funcs->p_glBindFramebufferEXT( params->target, params->framebuffer ); set_current_fbo( teb, params->target, params->framebuffer ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); @@ -37213,6 +37275,8 @@ static NTSTATUS wow64_ext_glBlitNamedFramebuffer( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->readFramebuffer) params->readFramebuffer = get_default_fbo( teb, GL_READ_FRAMEBUFFER ); + if (!params->drawFramebuffer) params->drawFramebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glBlitNamedFramebuffer( params->readFramebuffer, params->drawFramebuffer, params->srcX0, params->srcY0, params->srcX1, params->srcY1, params->dstX0, params->dstY0, params->dstX1, params->dstY1, params->mask, params->filter ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -37473,6 +37537,7 @@ static NTSTATUS wow64_ext_glCheckNamedFramebufferStatus( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, params->target ); params->ret = funcs->p_glCheckNamedFramebufferStatus( params->framebuffer, params->target ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -37489,6 +37554,7 @@ static NTSTATUS wow64_ext_glCheckNamedFramebufferStatusEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, params->target ); params->ret = funcs->p_glCheckNamedFramebufferStatusEXT( params->framebuffer, params->target ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -37840,6 +37906,7 @@ static NTSTATUS wow64_ext_glClearNamedFramebufferfi( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferfi( params->framebuffer, params->buffer, params->drawbuffer, params->depth, params->stencil ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -37857,6 +37924,7 @@ static NTSTATUS wow64_ext_glClearNamedFramebufferfv( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferfv( params->framebuffer, params->buffer, params->drawbuffer, ULongToPtr(params->value) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -37874,6 +37942,7 @@ static NTSTATUS wow64_ext_glClearNamedFramebufferiv( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferiv( params->framebuffer, params->buffer, params->drawbuffer, ULongToPtr(params->value) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -37891,6 +37960,7 @@ static NTSTATUS wow64_ext_glClearNamedFramebufferuiv( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glClearNamedFramebufferuiv( params->framebuffer, params->buffer, params->drawbuffer, ULongToPtr(params->value) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -44218,7 +44288,9 @@ static NTSTATUS wow64_ext_glFramebufferRenderbuffer( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferRenderbuffer( params->target, params->attachment, params->renderbuffertarget, params->renderbuffer ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44235,7 +44307,9 @@ static NTSTATUS wow64_ext_glFramebufferRenderbufferEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferRenderbufferEXT( params->target, params->attachment, params->renderbuffertarget, params->renderbuffer ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44303,7 +44377,9 @@ static NTSTATUS wow64_ext_glFramebufferTexture( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTexture( params->target, params->attachment, params->texture, params->level ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44321,7 +44397,9 @@ static NTSTATUS wow64_ext_glFramebufferTexture1D( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTexture1D( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44339,7 +44417,9 @@ static NTSTATUS wow64_ext_glFramebufferTexture1DEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTexture1DEXT( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44357,7 +44437,9 @@ static NTSTATUS wow64_ext_glFramebufferTexture2D( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTexture2D( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44375,7 +44457,9 @@ static NTSTATUS wow64_ext_glFramebufferTexture2DEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTexture2DEXT( params->target, params->attachment, params->textarget, params->texture, params->level ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44394,7 +44478,9 @@ static NTSTATUS wow64_ext_glFramebufferTexture3D( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTexture3D( params->target, params->attachment, params->textarget, params->texture, params->level, params->zoffset ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44413,7 +44499,9 @@ static NTSTATUS wow64_ext_glFramebufferTexture3DEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTexture3DEXT( params->target, params->attachment, params->textarget, params->texture, params->level, params->zoffset ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44430,7 +44518,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureARB( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureARB( params->target, params->attachment, params->texture, params->level ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44447,7 +44537,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureEXT( params->target, params->attachment, params->texture, params->level ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44465,7 +44557,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureFaceARB( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureFaceARB( params->target, params->attachment, params->texture, params->level, params->face ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44483,7 +44577,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureFaceEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureFaceEXT( params->target, params->attachment, params->texture, params->level, params->face ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44501,7 +44597,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureLayer( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureLayer( params->target, params->attachment, params->texture, params->level, params->layer ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44519,7 +44617,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureLayerARB( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureLayerARB( params->target, params->attachment, params->texture, params->level, params->layer ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44537,7 +44637,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureLayerEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureLayerEXT( params->target, params->attachment, params->texture, params->level, params->layer ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -44556,7 +44658,9 @@ static NTSTATUS wow64_ext_glFramebufferTextureMultiviewOVR( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glFramebufferTextureMultiviewOVR( params->target, params->attachment, params->texture, params->level, params->baseViewIndex, params->numViews ); + pop_default_fbo( teb ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -46448,7 +46552,9 @@ static NTSTATUS wow64_ext_glGetFramebufferAttachmentParameteriv( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glGetFramebufferAttachmentParameteriv( params->target, params->attachment, params->pname, ULongToPtr(params->params) ); + pop_default_fbo( teb ); return STATUS_SUCCESS; }
@@ -46464,7 +46570,9 @@ static NTSTATUS wow64_ext_glGetFramebufferAttachmentParameterivEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + push_default_fbo( teb ); funcs->p_glGetFramebufferAttachmentParameterivEXT( params->target, params->attachment, params->pname, ULongToPtr(params->params) ); + pop_default_fbo( teb ); return STATUS_SUCCESS; }
@@ -47643,6 +47751,7 @@ static NTSTATUS wow64_ext_glGetNamedFramebufferAttachmentParameteriv( void *args } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferAttachmentParameteriv( params->framebuffer, params->attachment, params->pname, ULongToPtr(params->params) ); return STATUS_SUCCESS; } @@ -47659,6 +47768,7 @@ static NTSTATUS wow64_ext_glGetNamedFramebufferAttachmentParameterivEXT( void *a } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferAttachmentParameterivEXT( params->framebuffer, params->attachment, params->pname, ULongToPtr(params->params) ); return STATUS_SUCCESS; } @@ -47677,6 +47787,7 @@ static NTSTATUS wow64_ext_glGetNamedFramebufferParameterfvAMD( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferParameterfvAMD( params->framebuffer, params->pname, params->numsamples, params->pixelindex, params->size, ULongToPtr(params->values) ); return STATUS_SUCCESS; } @@ -47692,6 +47803,7 @@ static NTSTATUS wow64_ext_glGetNamedFramebufferParameteriv( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferParameteriv( params->framebuffer, params->pname, ULongToPtr(params->param) ); return STATUS_SUCCESS; } @@ -47707,6 +47819,7 @@ static NTSTATUS wow64_ext_glGetNamedFramebufferParameterivEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glGetNamedFramebufferParameterivEXT( params->framebuffer, params->pname, ULongToPtr(params->params) ); return STATUS_SUCCESS; } @@ -52371,6 +52484,7 @@ static NTSTATUS wow64_ext_glInvalidateNamedFramebufferData( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glInvalidateNamedFramebufferData( params->framebuffer, params->numAttachments, ULongToPtr(params->attachments) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -52391,6 +52505,7 @@ static NTSTATUS wow64_ext_glInvalidateNamedFramebufferSubData( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glInvalidateNamedFramebufferSubData( params->framebuffer, params->numAttachments, ULongToPtr(params->attachments), params->x, params->y, params->width, params->height ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -58203,6 +58318,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferParameteri( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferParameteri( params->framebuffer, params->pname, params->param ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -58219,6 +58335,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferParameteriEXT( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferParameteriEXT( params->framebuffer, params->pname, params->param ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -58284,6 +58401,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferSampleLocationsfvARB( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferSampleLocationsfvARB( params->framebuffer, params->start, params->count, ULongToPtr(params->v) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -58301,6 +58419,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferSampleLocationsfvNV( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferSampleLocationsfvNV( params->framebuffer, params->start, params->count, ULongToPtr(params->v) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; @@ -58318,6 +58437,7 @@ static NTSTATUS wow64_ext_glNamedFramebufferSamplePositionsfvAMD( void *args ) } *params = args; TEB *teb = get_teb64( params->teb ); const struct opengl_funcs *funcs = teb->glTable; + if (!params->framebuffer) params->framebuffer = get_default_fbo( teb, GL_DRAW_FRAMEBUFFER ); funcs->p_glNamedFramebufferSamplePositionsfvAMD( params->framebuffer, params->numsamples, params->pixelindex, ULongToPtr(params->values) ); 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 26cf8ca215f..1421042aae4 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -805,6 +805,16 @@ static BOOL get_default_fbo_integer( struct context *ctx, struct opengl_drawable *data = ctx->color_buffer.draw_buffers[pname - GL_DRAW_BUFFER0]; return TRUE; } + if (pname == GL_DOUBLEBUFFER && draw->draw_fbo) + { + *data = draw->doublebuffer; + return TRUE; + } + if (pname == GL_STEREO && draw->draw_fbo) + { + *data = draw->stereo; + return TRUE; + }
return FALSE; } @@ -1078,6 +1088,7 @@ BOOL wrap_wglMakeCurrent( TEB *teb, HDC hdc, HGLRC hglrc ) DWORD tid = HandleToULong(teb->ClientId.UniqueThread); struct context *ctx, *prev = get_current_context( teb, NULL, NULL ); const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw, *read;
if (hglrc) { @@ -1095,6 +1106,11 @@ BOOL wrap_wglMakeCurrent( TEB *teb, HDC hdc, HGLRC hglrc ) teb->glReserved1[1] = hdc; teb->glCurrentRC = hglrc; teb->glTable = (void *)funcs; + + if ((draw = ctx->base.draw) && !ctx->draw_fbo && draw->fbo) + funcs->p_glBindFramebuffer( GL_DRAW_FRAMEBUFFER, draw->fbo ); + if ((read = ctx->base.read) && !ctx->read_fbo && read->fbo) + funcs->p_glBindFramebuffer( GL_READ_FRAMEBUFFER, read->fbo ); } else if (prev) { @@ -1294,6 +1310,7 @@ BOOL wrap_wglMakeContextCurrentARB( TEB *teb, HDC draw_hdc, HDC read_hdc, HGLRC DWORD tid = HandleToULong(teb->ClientId.UniqueThread); struct context *ctx, *prev = get_current_context( teb, NULL, NULL ); const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw, *read;
if (hglrc) { @@ -1312,6 +1329,11 @@ BOOL wrap_wglMakeContextCurrentARB( TEB *teb, HDC draw_hdc, HDC read_hdc, HGLRC teb->glReserved1[1] = read_hdc; teb->glCurrentRC = hglrc; teb->glTable = (void *)funcs; + + if ((draw = ctx->base.draw) && !ctx->draw_fbo && draw->fbo) + funcs->p_glBindFramebuffer( GL_DRAW_FRAMEBUFFER, draw->fbo ); + if ((read = ctx->base.read) && !ctx->read_fbo && read->fbo) + funcs->p_glBindFramebuffer( GL_READ_FRAMEBUFFER, read->fbo ); } else if (prev) { @@ -1438,6 +1460,40 @@ void set_current_fbo( TEB *teb, GLenum target, GLuint fbo ) if (target == GL_READ_FRAMEBUFFER) ctx->read_fbo = fbo; }
+GLuint get_default_fbo( TEB *teb, GLenum target ) +{ + struct opengl_drawable *draw, *read; + struct context *ctx; + + if (!(ctx = get_current_context( teb, &draw, &read ))) return 0; + if (target == GL_FRAMEBUFFER) return draw->fbo; + if (target == GL_DRAW_FRAMEBUFFER) return draw->fbo; + if (target == GL_READ_FRAMEBUFFER) return read->fbo; + return 0; +} + +void push_default_fbo( TEB *teb ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw, *read; + struct context *ctx; + + if (!(ctx = get_current_context( teb, &draw, &read ))) return; + if (!ctx->draw_fbo && draw->fbo) funcs->p_glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); + if (!ctx->read_fbo && read->fbo) funcs->p_glBindFramebuffer( GL_READ_FRAMEBUFFER, 0 ); +} + +void pop_default_fbo( TEB *teb ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct opengl_drawable *draw, *read; + struct context *ctx; + + if (!(ctx = get_current_context( teb, &draw, &read ))) return; + if (!ctx->draw_fbo && draw->fbo) funcs->p_glBindFramebuffer( GL_DRAW_FRAMEBUFFER, draw->fbo ); + if (!ctx->read_fbo && read->fbo) funcs->p_glBindFramebuffer( GL_READ_FRAMEBUFFER, read->fbo ); +} + static GLenum *set_default_fbo_draw_buffers( struct context *ctx, struct opengl_drawable *draw, GLsizei count, const GLenum *src, GLenum *dst ) { @@ -1476,7 +1532,7 @@ void wrap_glDrawBuffers( TEB *teb, GLsizei n, const GLenum *bufs ) struct context *ctx;
if ((ctx = get_current_context( teb, &draw, NULL )) && !ctx->draw_fbo && draw->fbo) - set_default_fbo_draw_buffers( ctx, draw, n, bufs, buffer ); + bufs = set_default_fbo_draw_buffers( ctx, draw, n, bufs, buffer );
funcs->p_glDrawBuffers( n, bufs ); } @@ -1579,7 +1635,7 @@ void wrap_glDrawBuffer( TEB *teb, GLenum buf ) struct context *ctx;
if ((ctx = get_current_context( teb, &draw, NULL )) && !ctx->draw_fbo && draw->fbo) - set_default_fbo_draw_buffer( ctx, draw, buf ); + buf = set_default_fbo_draw_buffer( ctx, draw, buf );
funcs->p_glDrawBuffer( buf ); } @@ -1648,7 +1704,7 @@ void wrap_glReadBuffer( TEB *teb, GLenum src ) struct context *ctx;
if ((ctx = get_current_context( teb, NULL, &read )) && !ctx->read_fbo && read->fbo) - set_default_fbo_read_buffer( ctx, read, src ); + src = set_default_fbo_read_buffer( ctx, read, src );
funcs->p_glReadBuffer( src ); } diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 338fc4cfe73..3d28fcd7c3d 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -1998,6 +1998,7 @@ static void display_funcs_init(void) display_funcs.p_##func = default_funcs->p_##func; \ } ALL_GL_FUNCS + USE_GL_FUNC(glBindFramebuffer) USE_GL_FUNC(glCheckNamedFramebufferStatus) USE_GL_FUNC(glCreateFramebuffers) USE_GL_FUNC(glCreateRenderbuffers)