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;