aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/main/fbobject.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2006-03-20 18:51:57 +0000
committerBrian Paul <[email protected]>2006-03-20 18:51:57 +0000
commit519b23b21f9cd6945fd17cdb26e7a6f531cdeec0 (patch)
treecad1402052d00a0e4140454baa07746336019a75 /src/mesa/main/fbobject.c
parent4991888fa0ea8e31e3cd2a0d87bb7e205ad1dccd (diff)
Lots of changes/fixes for rendering to framebuffer objects.
- When deleting texture objects, unbind from FBOs if necessary. - Changed driver hooks for starting/ending render to texture. - Now properly handle case where gl[Copy]TexImage() is called after glFramebufferTexture[123]D(). That didn't work before.
Diffstat (limited to 'src/mesa/main/fbobject.c')
-rw-r--r--src/mesa/main/fbobject.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index a83ed56069d..53c4d27e81a 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -155,9 +155,7 @@ _mesa_remove_attachment(GLcontext *ctx, struct gl_renderbuffer_attachment *att)
else {
/* tell driver that we're done rendering to this texture. */
if (ctx->Driver.FinishRenderTexture) {
- ctx->Driver.FinishRenderTexture(ctx, att->Texture,
- att->CubeMapFace,
- att->TextureLevel);
+ ctx->Driver.FinishRenderTexture(ctx, att);
}
}
att->Texture = NULL;
@@ -182,6 +180,7 @@ _mesa_remove_attachment(GLcontext *ctx, struct gl_renderbuffer_attachment *att)
*/
void
_mesa_set_texture_attachment(GLcontext *ctx,
+ struct gl_framebuffer *fb,
struct gl_renderbuffer_attachment *att,
struct gl_texture_object *texObj,
GLenum texTarget, GLuint level, GLuint zoffset)
@@ -208,6 +207,10 @@ _mesa_set_texture_attachment(GLcontext *ctx,
}
att->Zoffset = zoffset;
att->Complete = GL_FALSE;
+
+ if (att->Texture->Image[att->CubeMapFace][att->TextureLevel]) {
+ ctx->Driver.RenderbufferTexture(ctx, fb, att);
+ }
}
@@ -903,8 +906,7 @@ check_texture_render(GLcontext *ctx, struct gl_framebuffer *fb)
struct gl_renderbuffer_attachment *att = fb->Attachment + i;
struct gl_texture_object *texObj = att->Texture;
if (texObj) {
- ctx->Driver.FinishRenderTexture(ctx, texObj, att->CubeMapFace,
- att->TextureLevel);
+ ctx->Driver.FinishRenderTexture(ctx, att);
}
}
}
@@ -1178,12 +1180,15 @@ error_check_framebuffer_texture(GLcontext *ctx, GLuint dims,
}
+/**
+ * XXX The code in _mesa_FramebufferTexture1/2/3DEXT could be probably
+ * be combined into one function.
+ */
void GLAPIENTRY
_mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level)
{
struct gl_renderbuffer_attachment *att;
- struct gl_texture_object *texObj;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
@@ -1205,7 +1210,7 @@ _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
FLUSH_VERTICES(ctx, _NEW_BUFFERS);
if (texture) {
- texObj = (struct gl_texture_object *)
+ struct gl_texture_object *texObj = (struct gl_texture_object *)
_mesa_HashLookup(ctx->Shared->TexObjects, texture);
if (!texObj) {
_mesa_error(ctx, GL_INVALID_VALUE,
@@ -1217,12 +1222,12 @@ _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
"glFramebufferTexture1DEXT(texture target)");
return;
}
+ _mesa_set_texture_attachment(ctx, ctx->DrawBuffer, att,
+ texObj, textarget, level, 0);
}
else {
- /* remove texture attachment */
- texObj = NULL;
+ _mesa_remove_attachment(ctx, att);
}
- ctx->Driver.RenderbufferTexture(ctx, att, texObj, textarget, level, 0);
}
@@ -1231,7 +1236,6 @@ _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level)
{
struct gl_renderbuffer_attachment *att;
- struct gl_texture_object *texObj;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
@@ -1254,7 +1258,7 @@ _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
FLUSH_VERTICES(ctx, _NEW_BUFFERS);
if (texture) {
- texObj = (struct gl_texture_object *)
+ struct gl_texture_object *texObj = (struct gl_texture_object *)
_mesa_HashLookup(ctx->Shared->TexObjects, texture);
if (!texObj) {
_mesa_error(ctx, GL_INVALID_VALUE,
@@ -1270,12 +1274,12 @@ _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
"glFramebufferTexture2DEXT(texture target)");
return;
}
+ _mesa_set_texture_attachment(ctx, ctx->DrawBuffer, att,
+ texObj, textarget, level, 0);
}
else {
- /* remove texture attachment */
- texObj = NULL;
+ _mesa_remove_attachment(ctx, att);
}
- ctx->Driver.RenderbufferTexture(ctx, att, texObj, textarget, level, 0);
}
@@ -1285,7 +1289,6 @@ _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
GLint level, GLint zoffset)
{
struct gl_renderbuffer_attachment *att;
- struct gl_texture_object *texObj;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
@@ -1307,7 +1310,7 @@ _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
if (texture) {
const GLint maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
- texObj = (struct gl_texture_object *)
+ struct gl_texture_object *texObj = (struct gl_texture_object *)
_mesa_HashLookup(ctx->Shared->TexObjects, texture);
if (!texObj) {
_mesa_error(ctx, GL_INVALID_VALUE,
@@ -1324,13 +1327,12 @@ _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
"glFramebufferTexture3DEXT(zoffset)");
return;
}
+ _mesa_set_texture_attachment(ctx, ctx->DrawBuffer, att,
+ texObj, textarget, level,zoffset);
}
else {
- /* remove texture attachment */
- texObj = NULL;
+ _mesa_remove_attachment(ctx, att);
}
- ctx->Driver.RenderbufferTexture(ctx, att, texObj, textarget,
- level, zoffset);
}