From 474f28e57ca750ca39d7f684904a3c0e69a03f62 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sat, 8 Oct 2005 14:41:17 +0000 Subject: Fix some issues with state updates and renderbuffers. Querying GL_RED_BITS, etc. after calling glRenderBufferStorageEXT gave undefined results. --- src/mesa/main/framebuffer.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) (limited to 'src/mesa/main/framebuffer.c') diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index f6322bf4d1..479f762568 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -328,23 +328,33 @@ _mesa_update_draw_buffer_bounds(GLcontext *ctx) void _mesa_update_framebuffer_visual(struct gl_framebuffer *fb) { + GLuint i; + assert(fb->Name != 0); _mesa_bzero(&fb->Visual, sizeof(fb->Visual)); - fb->Visual.rgbMode = GL_TRUE; - - if (fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer) { - fb->Visual.redBits - = fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer->RedBits; - fb->Visual.greenBits - = fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer->GreenBits; - fb->Visual.blueBits - = fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer->BlueBits; - fb->Visual.alphaBits - = fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer->AlphaBits; - fb->Visual.rgbBits - = fb->Visual.redBits + fb->Visual.greenBits + fb->Visual.blueBits; - fb->Visual.floatMode = GL_FALSE; + fb->Visual.rgbMode = GL_TRUE; /* assume this */ + + /* find first RGB or CI renderbuffer */ + for (i = 0; i < BUFFER_COUNT; i++) { + if (fb->Attachment[i].Renderbuffer) { + const struct gl_renderbuffer *rb = fb->Attachment[i].Renderbuffer; + if (rb->_BaseFormat == GL_RGBA || rb->_BaseFormat == GL_RGB) { + fb->Visual.redBits = rb->RedBits; + fb->Visual.greenBits = rb->GreenBits; + fb->Visual.blueBits = rb->BlueBits; + fb->Visual.alphaBits = rb->AlphaBits; + fb->Visual.rgbBits = fb->Visual.redBits + + fb->Visual.greenBits + fb->Visual.blueBits; + fb->Visual.floatMode = GL_FALSE; + break; + } + else if (rb->_BaseFormat == GL_COLOR_INDEX) { + fb->Visual.indexBits = rb->IndexBits; + fb->Visual.rgbMode = GL_FALSE; + break; + } + } } if (fb->Attachment[BUFFER_DEPTH].Renderbuffer) { @@ -380,8 +390,10 @@ _mesa_update_framebuffer(GLcontext *ctx) GLuint output; /* Completeness only matters for user-created framebuffers */ - if (fb->Name != 0) + if (fb->Name != 0) { _mesa_test_framebuffer_completeness(ctx, fb); + _mesa_update_framebuffer_visual(fb); + } /* * Update the list of color drawing renderbuffer pointers. -- cgit v1.2.3