mesa: rework error handling in glDrawBuffers
authorMarek Olšák <marek.olsak@amd.com>
Sat, 27 Apr 2019 02:06:20 +0000 (22:06 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 2 May 2019 01:15:33 +0000 (21:15 -0400)
It's needed by the next pbuffer fix, which changes the behavior of
draw_buffer_enum_to_bitmask, so it can't be used to help with error
checking.

Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/mesa/main/buffers.c

index d98c015bb242af9f6bbfd0b40ff6c292a57cc1dd..6e85334644294a91a898572999e97ae70cf98147 100644 (file)
@@ -437,19 +437,7 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n,
 
    /* complicated error checking... */
    for (output = 0; output < n; output++) {
-      destMask[output] = draw_buffer_enum_to_bitmask(ctx, buffers[output]);
-
       if (!no_error) {
-         /* From the OpenGL 3.0 specification, page 258:
-          * "Each buffer listed in bufs must be one of the values from tables
-          *  4.5 or 4.6.  Otherwise, an INVALID_ENUM error is generated.
-          */
-         if (destMask[output] == BAD_MASK) {
-            _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",
-                        caller, _mesa_enum_to_string(buffers[output]));
-            return;
-         }
-
          /* From the OpenGL 4.5 specification, page 493 (page 515 of the PDF)
           * "An INVALID_ENUM error is generated if any value in bufs is FRONT,
           * LEFT, RIGHT, or FRONT_AND_BACK . This restriction applies to both
@@ -457,7 +445,7 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n,
           * these constants may themselves refer to multiple buffers, as shown
           * in table 17.4."
           *
-          * And on page 492 (page 514 of the PDF):
+          * From the OpenGL 4.5 specification, page 492 (page 514 of the PDF):
           * "If the default framebuffer is affected, then each of the constants
           * must be one of the values listed in table 17.6 or the special value
           * BACK. When BACK is used, n must be 1 and color values are written
@@ -469,19 +457,38 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n,
           * For OpenGL 4.x we check that behaviour. For any previous version we
           * keep considering it wrong (as INVALID_ENUM).
           */
-         if (util_bitcount(destMask[output]) > 1) {
-            if (_mesa_is_winsys_fbo(fb) && ctx->Version >= 40 &&
-                buffers[output] == GL_BACK) {
-               if (n != 1) {
-                  _mesa_error(ctx, GL_INVALID_OPERATION, "%s(with GL_BACK n must be 1)",
-                              caller);
-                  return;
-               }
-            } else {
-               _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",
-                           caller, _mesa_enum_to_string(buffers[output]));
+         if (buffers[output] == GL_BACK &&
+             _mesa_is_winsys_fbo(fb) &&
+             _mesa_is_desktop_gl(ctx) &&
+             ctx->Version >= 40) {
+            if (n != 1) {
+               _mesa_error(ctx, GL_INVALID_OPERATION, "%s(with GL_BACK n must be 1)",
+                           caller);
                return;
             }
+         } else if (buffers[output] == GL_FRONT ||
+                    buffers[output] == GL_LEFT ||
+                    buffers[output] == GL_RIGHT ||
+                    buffers[output] == GL_FRONT_AND_BACK ||
+                    (buffers[output] == GL_BACK &&
+                     _mesa_is_desktop_gl(ctx))) {
+            _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",
+                        caller, _mesa_enum_to_string(buffers[output]));
+            return;
+         }
+      }
+
+      destMask[output] = draw_buffer_enum_to_bitmask(ctx, buffers[output]);
+
+      if (!no_error) {
+         /* From the OpenGL 3.0 specification, page 258:
+          * "Each buffer listed in bufs must be one of the values from tables
+          *  4.5 or 4.6.  Otherwise, an INVALID_ENUM error is generated.
+          */
+         if (destMask[output] == BAD_MASK) {
+            _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",
+                        caller, _mesa_enum_to_string(buffers[output]));
+            return;
          }
 
          /* Section 4.2 (Whole Framebuffer Operations) of the OpenGL ES 3.0