mesa: add Layered field to framebuffers
authorJordan Justen <jordan.l.justen@intel.com>
Thu, 18 Apr 2013 17:20:05 +0000 (10:20 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Wed, 1 May 2013 22:31:48 +0000 (15:31 -0700)
When checking framebuffer completeness, we test each attachment.
We verify that all attachments are consistent in terms of layers.

1. They must all be layered, or all non-layered
2. If they are layered, they must match in depth

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/main/fbobject.c
src/mesa/main/mtypes.h

index 798466163de5903152975d98af235c1a40156fd8..de0c08f6d2265eede36a49090a8007f60e9b8ceb 100644 (file)
@@ -777,6 +777,8 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
    GLint fixedSampleLocations = -1;
    GLint i;
    GLuint j;
+   bool layer_count_valid = false;
+   GLuint layer_count = 0, att_layer_count;
 
    assert(_mesa_is_user_fbo(fb));
 
@@ -949,8 +951,26 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
          fbo_incomplete("unsupported renderbuffer format", i);
          return;
       }
+
+      /* Check that layered rendering is consistent. */
+      att_layer_count = att->Layered ? att->Renderbuffer->Depth : 0;
+      if (!layer_count_valid) {
+         layer_count = att_layer_count;
+         layer_count_valid = true;
+      } else if (layer_count != att_layer_count) {
+         if (layer_count == 0 || att_layer_count == 0) {
+            fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS;
+            fbo_incomplete("framebuffer attachment layer mode is inconsistent", i);
+         } else {
+            fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB;
+            fbo_incomplete("framebuffer attachment layer count is inconsistent", i);
+         }
+         return;
+      }
    }
 
+   fb->Layered = layer_count > 0;
+
    if (_mesa_is_desktop_gl(ctx) && !ctx->Extensions.ARB_ES2_compatibility) {
       /* Check that all DrawBuffers are present */
       for (j = 0; j < ctx->Const.MaxDrawBuffers; j++) {
index 8dda8e23f8e7854b9d2b486a63cb73554fcc318a..89e00e32dc87d5692eb015217222c1d980ffc457 100644 (file)
@@ -2683,6 +2683,8 @@ struct gl_framebuffer
    struct gl_renderbuffer *_ColorDrawBuffers[MAX_DRAW_BUFFERS];
    struct gl_renderbuffer *_ColorReadBuffer;
 
+   GLboolean Layered;
+
    /** Delete this framebuffer */
    void (*Delete)(struct gl_framebuffer *fb);
 };