In order to properly clear layered framebuffers, we need to know how
many layers they have.  The easiest way to do this is to record it in
the gl_framebuffer struct when we check framebuffer completeness, just
like we do for the Layered boolean.

Cc: "10.0" <mesa-sta...@lists.freedesktop.org>
---
 src/mesa/main/fbobject.c | 21 ++++++++++++++++++++-
 src/mesa/main/mtypes.h   |  6 ++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 9dd7161..3b84f6a 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -905,6 +905,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
       struct gl_renderbuffer_attachment *att;
       GLenum f;
       gl_format attFormat;
+      GLenum att_tex_target = GL_NONE;
 
       /*
        * XXX for ARB_fbo, only check color buffers that are named by
@@ -945,6 +946,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
        */
       if (att->Type == GL_TEXTURE) {
          const struct gl_texture_image *texImg = att->Renderbuffer->TexImage;
+         att_tex_target = att->Texture->Target;
          minWidth = MIN2(minWidth, texImg->Width);
          maxWidth = MAX2(maxWidth, texImg->Width);
          minHeight = MIN2(minHeight, texImg->Height);
@@ -1057,7 +1059,21 @@ _mesa_test_framebuffer_completeness(struct gl_context 
*ctx,
       }
 
       /* Check that layered rendering is consistent. */
-      att_layer_count = att->Layered ? att->Renderbuffer->Depth : 0;
+      if (att->Layered) {
+         switch (att_tex_target) {
+         case GL_TEXTURE_CUBE_MAP:
+            att_layer_count = 6;
+            break;
+         case GL_TEXTURE_CUBE_MAP_ARRAY:
+            att_layer_count = att->Renderbuffer->Depth * 6;
+            break;
+         default:
+            att_layer_count = att->Renderbuffer->Depth;
+            break;
+         }
+      } else {
+         att_layer_count = 0;
+      }
       if (!layer_count_valid) {
          layer_count = att_layer_count;
          layer_count_valid = true;
@@ -1074,6 +1090,9 @@ _mesa_test_framebuffer_completeness(struct gl_context 
*ctx,
    }
 
    fb->Layered = layer_count > 0;
+   if (layer_count > 0) {
+      fb->NumLayers = layer_count;
+   }
 
    if (_mesa_is_desktop_gl(ctx) && !ctx->Extensions.ARB_ES2_compatibility) {
       /* Check that all DrawBuffers are present */
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 8801d6f..699e6e6 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2996,6 +2996,12 @@ struct gl_framebuffer
 
    GLboolean Layered;
 
+   /**
+    * If Layered is true, the number of layers in the framebuffer.  For cube
+    * maps and cube map arrays, this includes the factor of 6.
+    */
+   GLuint NumLayers;
+
    /** Delete this framebuffer */
    void (*Delete)(struct gl_framebuffer *fb);
 };
-- 
1.8.4.2

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

Reply via email to