mesa: Make ES3 glDrawBuffers() only accept BACK/NONE for the winsys fbo.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 18 Dec 2012 21:26:04 +0000 (13:26 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 15 Jan 2013 23:04:50 +0000 (15:04 -0800)
Nothing was explicitly checking this.

v2: Update GL3 spec reference.

Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> [v2]
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> [v1]
src/mesa/main/buffers.c

index b4f324c6c91eb39f499c2bf60277d2b7c79a1501..87848fb93796be2424dd8b1c16b0a3b0ffc5fcb2 100644 (file)
@@ -318,17 +318,29 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
    supportedMask = supported_buffer_bitmask(ctx, ctx->DrawBuffer);
    usedBufferMask = 0x0;
 
+   /* From the ES 3.0 specification, page 180:
+    * "If the GL is bound to the default framebuffer, then n must be 1
+    *  and the constant must be BACK or NONE."
+    */
+   if (_mesa_is_gles3(ctx) && _mesa_is_winsys_fbo(ctx->DrawBuffer) &&
+       (n != 1 || (buffers[0] != GL_NONE && buffers[0] != GL_BACK))) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffers(buffer)");
+      return;
+   }
+
    /* complicated error checking... */
    for (output = 0; output < n; output++) {
       if (buffers[output] == GL_NONE) {
          destMask[output] = 0x0;
       }
       else {
-         /* From the OpenGL 3.0 specification, page 258:
-          * "If the GL is bound to a framebuffer object and DrawBuffers is
-          *  supplied with [...] COLOR_ATTACHMENTm where m is greater than or
-          *  equal to the value of MAX_COLOR_ATTACHMENTS, then the error
-          *  INVALID_OPERATION results."
+         /* Page 259 (page 275 of the PDF) in section 4.2.1 of the OpenGL 3.0
+          * spec (20080923) says:
+          *
+          *     "If the GL is bound to a framebuffer object and DrawBuffers is
+          *     supplied with [...] COLOR_ATTACHMENTm where m is greater than
+          *     or equal to the value of MAX_COLOR_ATTACHMENTS, then the error
+          *     INVALID_OPERATION results."
           */
          if (_mesa_is_user_fbo(ctx->DrawBuffer) && buffers[output] >=
              GL_COLOR_ATTACHMENT0 + ctx->Const.MaxDrawBuffers) {