main: check texture target when validating layered framebuffers.
authorPaul Berry <stereotype441@gmail.com>
Wed, 20 Nov 2013 03:01:37 +0000 (19:01 -0800)
committerPaul Berry <stereotype441@gmail.com>
Fri, 10 Jan 2014 13:58:46 +0000 (05:58 -0800)
From section 4.4.4 (Framebuffer Completeness) of the GL 3.2 spec:

    If any framebuffer attachment is layered, all populated
    attachments must be layered. Additionally, all populated color
    attachments must be from textures of the same target.

We weren't checking that the attachments were from textures of the
same target.

Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
src/mesa/main/fbobject.c

index d84680868f4707a7880880cf430a03d72343c403..7ecc48ee53b00d63da2951e82dc8e5b77f313f97 100644 (file)
@@ -877,8 +877,9 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
    GLint fixedSampleLocations = -1;
    GLint i;
    GLuint j;
-   bool layer_count_valid = false;
+   bool layer_info_valid = false; /* Covers layer_count and layer_tex_target */
    GLuint layer_count = 0, att_layer_count;
+   GLenum layer_tex_target = 0;
 
    assert(_mesa_is_user_fbo(fb));
 
@@ -1062,9 +1063,14 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
       } else {
          att_layer_count = 0;
       }
-      if (!layer_count_valid) {
+      if (!layer_info_valid) {
          layer_count = att_layer_count;
-         layer_count_valid = true;
+         layer_tex_target = att_tex_target;
+         layer_info_valid = true;
+      } else if (layer_count > 0 && layer_tex_target != att_tex_target) {
+         fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS;
+         fbo_incomplete(ctx, "layered framebuffer has mismatched targets", i);
+         return;
       } else if (layer_count != att_layer_count) {
          if (layer_count == 0 || att_layer_count == 0) {
             fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS;