diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index e9c0cc0ab93..b16e13a2209 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -500,7 +500,6 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer) GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); - FLUSH_VERTICES(ctx, _NEW_BUFFERS); if (target != GL_RENDERBUFFER_EXT) { _mesa_error(ctx, GL_INVALID_ENUM, @@ -508,6 +507,8 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer) return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + if (renderbuffer) { newRb = lookup_renderbuffer(ctx, renderbuffer); if (newRb == &DummyRenderbuffer) { @@ -551,6 +552,7 @@ _mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers) GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); + FLUSH_VERTICES(ctx, _NEW_BUFFERS); for (i = 0; i < n; i++) { if (renderbuffers[i] > 0) { @@ -667,7 +669,6 @@ _mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat, GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); - FLUSH_VERTICES(ctx, _NEW_BUFFERS); if (target != GL_RENDERBUFFER_EXT) { _mesa_error(ctx, GL_INVALID_ENUM, "glRenderbufferStorageEXT(target)"); @@ -698,6 +699,8 @@ _mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat, return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + /* Now allocate the storage */ ASSERT(rb->AllocStorage); if (rb->AllocStorage(ctx, rb, internalFormat, width, height)) { @@ -743,6 +746,8 @@ _mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params) return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + switch (pname) { case GL_RENDERBUFFER_WIDTH_EXT: *params = ctx->CurrentRenderbuffer->Width; @@ -835,7 +840,6 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer) GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); - FLUSH_VERTICES(ctx, _NEW_BUFFERS); if (target != GL_FRAMEBUFFER_EXT) { _mesa_error(ctx, GL_INVALID_ENUM, @@ -843,6 +847,8 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer) return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + if (framebuffer) { /* Binding a user-created framebuffer object */ newFb = lookup_framebuffer(ctx, framebuffer); @@ -893,6 +899,7 @@ _mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers) GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); + FLUSH_VERTICES(ctx, _NEW_BUFFERS); for (i = 0; i < n; i++) { if (framebuffers[i] > 0) { @@ -974,6 +981,8 @@ _mesa_CheckFramebufferStatusEXT(GLenum target) return GL_FRAMEBUFFER_COMPLETE_EXT; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + _mesa_test_framebuffer_completeness(ctx, ctx->DrawBuffer); return ctx->DrawBuffer->_Status; } @@ -1036,7 +1045,6 @@ _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment, GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); - FLUSH_VERTICES(ctx, _NEW_BUFFERS); /* XXX check */ if (error_check_framebuffer_texture(ctx, 1, target, attachment, textarget, texture, level)) @@ -1051,6 +1059,8 @@ _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment, return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + if (texture) { texObj = (struct gl_texture_object *) _mesa_HashLookup(ctx->Shared->TexObjects, texture); @@ -1070,7 +1080,6 @@ _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment, texObj = NULL; } ctx->Driver.RenderbufferTexture(ctx, att, texObj, textarget, level, 0); - _mesa_update_framebuffer_visual(ctx->DrawBuffer); } @@ -1083,7 +1092,6 @@ _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment, GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); - FLUSH_VERTICES(ctx, _NEW_BUFFERS); /* XXX check */ if (error_check_framebuffer_texture(ctx, 2, target, attachment, textarget, texture, level)) @@ -1100,6 +1108,8 @@ _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment, return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + if (texture) { texObj = (struct gl_texture_object *) _mesa_HashLookup(ctx->Shared->TexObjects, texture); @@ -1123,7 +1133,6 @@ _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment, texObj = NULL; } ctx->Driver.RenderbufferTexture(ctx, att, texObj, textarget, level, 0); - _mesa_update_framebuffer_visual(ctx->DrawBuffer); } @@ -1137,7 +1146,6 @@ _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment, GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); - FLUSH_VERTICES(ctx, _NEW_BUFFERS); /* XXX check */ if (error_check_framebuffer_texture(ctx, 3, target, attachment, textarget, texture, level)) @@ -1152,6 +1160,8 @@ _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment, return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + if (texture) { const GLint maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); texObj = (struct gl_texture_object *) @@ -1178,7 +1188,6 @@ _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment, } ctx->Driver.RenderbufferTexture(ctx, att, texObj, textarget, level, zoffset); - _mesa_update_framebuffer_visual(ctx->DrawBuffer); } @@ -1192,7 +1201,6 @@ _mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment, GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); - FLUSH_VERTICES(ctx, _NEW_BUFFERS); if (target != GL_FRAMEBUFFER_EXT) { _mesa_error(ctx, GL_INVALID_ENUM, @@ -1231,10 +1239,10 @@ _mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment, rb = NULL; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + assert(ctx->Driver.FramebufferRenderbuffer); ctx->Driver.FramebufferRenderbuffer(ctx, att, rb); - - _mesa_update_framebuffer_visual(ctx->DrawBuffer); } @@ -1266,6 +1274,8 @@ _mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, return; } + FLUSH_VERTICES(ctx, _NEW_BUFFERS); + switch (pname) { case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: *params = att->Type; @@ -1325,6 +1335,7 @@ _mesa_GenerateMipmapEXT(GLenum target) GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); + FLUSH_VERTICES(ctx, _NEW_BUFFERS); switch (target) { case GL_TEXTURE_1D: diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index 04bb2d8dd4c..c21a6eea7e2 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -406,23 +406,31 @@ _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->ComponentSizes[0]; - fb->Visual.greenBits - = fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer->ComponentSizes[1]; - fb->Visual.blueBits - = fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer->ComponentSizes[2]; - fb->Visual.alphaBits - = fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer->ComponentSizes[3]; - fb->Visual.rgbBits - = fb->Visual.redBits + fb->Visual.greenBits + fb->Visual.blueBits; - fb->Visual.floatMode = GL_FALSE; + /* 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->ComponentSizes[0]; + fb->Visual.greenBits = rb->ComponentSizes[1]; + fb->Visual.blueBits = rb->ComponentSizes[2]; + fb->Visual.alphaBits = rb->ComponentSizes[3]; + fb->Visual.floatMode = GL_FALSE; + break; + } + else if (rb->_BaseFormat == GL_COLOR_INDEX) { + fb->Visual.indexBits = rb->ComponentSizes[0]; + fb->Visual.rgbMode = GL_FALSE; + break; + } + } } if (fb->Attachment[BUFFER_DEPTH].Renderbuffer) { @@ -470,8 +478,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 drawing renderbuffer pointers. diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index bfeb1d6d2a2..f5b98196746 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -11,6 +11,7 @@ #include "get.h" #include "macros.h" #include "mtypes.h" +#include "state.h" #include "texcompress.h" @@ -85,6 +86,9 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params ) if (!params) return; + if (ctx->NewState) + _mesa_update_state(ctx); + if (ctx->Driver.GetBooleanv && ctx->Driver.GetBooleanv(ctx, pname, params)) return; @@ -1930,6 +1934,9 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params ) if (!params) return; + if (ctx->NewState) + _mesa_update_state(ctx); + if (ctx->Driver.GetFloatv && ctx->Driver.GetFloatv(ctx, pname, params)) return; @@ -3775,6 +3782,9 @@ _mesa_GetIntegerv( GLenum pname, GLint *params ) if (!params) return; + if (ctx->NewState) + _mesa_update_state(ctx); + if (ctx->Driver.GetIntegerv && ctx->Driver.GetIntegerv(ctx, pname, params)) return; diff --git a/src/mesa/main/get_gen.py b/src/mesa/main/get_gen.py index 4eedc03c7a8..32a5a3d7713 100644 --- a/src/mesa/main/get_gen.py +++ b/src/mesa/main/get_gen.py @@ -1040,6 +1040,9 @@ def EmitGetFunction(stateVars, returnType): print " if (!params)" print " return;" print "" + print " if (ctx->NewState)" + print " _mesa_update_state(ctx);" + print "" print " if (ctx->Driver.%s &&" % function print " ctx->Driver.%s(ctx, pname, params))" % function print " return;" @@ -1090,6 +1093,7 @@ def EmitHeader(): #include "get.h" #include "macros.h" #include "mtypes.h" +#include "state.h" #include "texcompress.h"