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 ); }