Fix some issues with state updates and renderbuffers. Querying GL_RED_BITS,

etc. after calling glRenderBufferStorageEXT gave undefined results.
This commit is contained in:
Brian Paul 2005-10-08 14:41:57 +00:00
parent 23803bd5fb
commit 1faaa0090a
4 changed files with 60 additions and 25 deletions

View file

@ -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:

View file

@ -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.

View file

@ -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;

View file

@ -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"