mesa: invalidate framebuffer if internal format of renderbuffer is changed
RenderTexture doesn't have to be called in invalidate_rb, I guess.
This commit is contained in:
@@ -384,6 +384,7 @@ _mesa_framebuffer_renderbuffer(struct gl_context *ctx,
|
|||||||
assert(att);
|
assert(att);
|
||||||
_mesa_set_renderbuffer_attachment(ctx, att, rb);
|
_mesa_set_renderbuffer_attachment(ctx, att, rb);
|
||||||
}
|
}
|
||||||
|
rb->AttachedAnytime = GL_TRUE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_mesa_remove_attachment(ctx, att);
|
_mesa_remove_attachment(ctx, att);
|
||||||
@@ -1115,6 +1116,30 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invalidate a renderbuffer attachment. Called from _mesa_HashWalk().
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
invalidate_rb(GLuint key, void *data, void *userData)
|
||||||
|
{
|
||||||
|
struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
|
||||||
|
struct gl_renderbuffer *rb = (struct gl_renderbuffer *) userData;
|
||||||
|
|
||||||
|
/* If this is a user-created FBO */
|
||||||
|
if (fb->Name) {
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < BUFFER_COUNT; i++) {
|
||||||
|
struct gl_renderbuffer_attachment *att = fb->Attachment + i;
|
||||||
|
if (att->Type == GL_RENDERBUFFER &&
|
||||||
|
att->Renderbuffer == rb) {
|
||||||
|
/* Mark fb status as indeterminate to force re-validation */
|
||||||
|
fb->_Status = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** sentinal value, see below */
|
/** sentinal value, see below */
|
||||||
#define NO_SAMPLES 1000
|
#define NO_SAMPLES 1000
|
||||||
|
|
||||||
@@ -1207,12 +1232,10 @@ renderbuffer_storage(GLenum target, GLenum internalFormat,
|
|||||||
rb->NumSamples = 0;
|
rb->NumSamples = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Invalidate the framebuffers the renderbuffer is attached in. */
|
||||||
test_framebuffer_completeness(ctx, fb);
|
if (rb->AttachedAnytime) {
|
||||||
*/
|
_mesa_HashWalk(ctx->Shared->FrameBuffers, invalidate_rb, rb);
|
||||||
/* XXX if this renderbuffer is attached anywhere, invalidate attachment
|
}
|
||||||
* points???
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -2376,6 +2376,8 @@ struct gl_renderbuffer
|
|||||||
GLenum DataType; /**< Type of values passed to the Get/Put functions */
|
GLenum DataType; /**< Type of values passed to the Get/Put functions */
|
||||||
GLvoid *Data; /**< This may not be used by some kinds of RBs */
|
GLvoid *Data; /**< This may not be used by some kinds of RBs */
|
||||||
|
|
||||||
|
GLboolean AttachedAnytime; /**< TRUE if it was attached to a framebuffer */
|
||||||
|
|
||||||
/* Used to wrap one renderbuffer around another: */
|
/* Used to wrap one renderbuffer around another: */
|
||||||
struct gl_renderbuffer *Wrapped;
|
struct gl_renderbuffer *Wrapped;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user