Mesa attached the texture only to the depth attachment point
    gl_framebuffer::Attachment[BUFFER_DEPTH]
and failed to attach it to the stencil attachment point
    gl_framebuffer::Attachment[BUFFER_STENCIL]

Fixes Piglit test 
ARB_framebuffer_object/same-attachment-glFramebufferTexture2D-GL_DEPTH_STENCIL

Signed-off-by: Chad Versace <c...@chad-versace.us>
---
 src/mesa/main/fbobject.c |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index c56062a..8d69fdf 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -2043,6 +2043,25 @@ framebuffer_texture(struct gl_context *ctx, const char 
*caller, GLenum target,
    if (texObj) {
       _mesa_set_texture_attachment(ctx, fb, att, texObj, textarget,
                                    level, zoffset);
+
+      if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
+        /* Above we attached the texture to the depth attachment; now attach
+         * to the stencil attachment. Don't use  
_mesa_set_texture_attachment(),
+         * because it creates a new renderbuffer.
+         */
+        struct gl_renderbuffer_attachment *s_att =
+           &fb->Attachment[BUFFER_STENCIL];
+        assert(att == &fb->Attachment[BUFFER_DEPTH]);
+        s_att = &fb->Attachment[BUFFER_STENCIL];
+        _mesa_remove_attachment(ctx, s_att);
+        _mesa_reference_texobj(&s_att->Texture, att->Texture);
+        _mesa_reference_renderbuffer(&s_att->Renderbuffer, att->Renderbuffer);
+        s_att->Type = att->Type;
+        s_att->Complete = att->Complete;
+        s_att->TextureLevel = att->TextureLevel;
+        s_att->Zoffset = att->Zoffset;
+      }
+
       /* Set the render-to-texture flag.  We'll check this flag in
        * glTexImage() and friends to determine if we need to revalidate
        * any FBOs that might be rendering into this texture.
@@ -2055,6 +2074,10 @@ framebuffer_texture(struct gl_context *ctx, const char 
*caller, GLenum target,
    }
    else {
       _mesa_remove_attachment(ctx, att);
+      if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
+        assert(att == &fb->Attachment[BUFFER_DEPTH]);
+        _mesa_remove_attachment(ctx, &fb->Attachment[BUFFER_STENCIL]);
+      }
    }
 
    invalidate_framebuffer(fb);
-- 
1.7.7

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to