mesa: don't check mapped buffers in every draw call if drivers allow it
authorMarek Olšák <marek.olsak@amd.com>
Mon, 15 May 2017 14:34:06 +0000 (16:34 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 17 May 2017 18:28:44 +0000 (20:28 +0200)
Before: DrawElements (16 VBOs) w/ no state change: 4.34 million/s
After:  DrawElements (16 VBOs) w/ no state change: 8.80 million/s

This inefficiency was uncovered by Timothy Arceri's no_error work.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/main/api_validate.c

index 850dedae7a42df3a5007d7a9774904efdddb9561..7aa8f9e837f014458bf4ecaf000bd5b4d812f9ea 100644 (file)
@@ -243,7 +243,20 @@ check_valid_to_render(struct gl_context *ctx, const char *function)
       return false;
    }
 
-   if (!_mesa_all_buffers_are_unmapped(ctx->Array.VAO)) {
+   /* Section 6.3.2 from the GL 4.5:
+    * "Any GL command which attempts to read from, write to, or change
+    *  the state of a buffer object may generate an INVALID_OPERATION error if
+    *  all or part of the buffer object is mapped ... However, only commands
+    *  which explicitly describe this error are required to do so. If an error
+    *  is not generated, such commands will have undefined results and may
+    *  result in GL interruption or termination."
+    *
+    * Only some buffer API functions require INVALID_OPERATION with mapped
+    * buffers. No other functions list such an error, thus it's not required
+    * to report INVALID_OPERATION for draw calls with mapped buffers.
+    */
+   if (!ctx->Const.AllowMappedBuffersDuringExecution &&
+       !_mesa_all_buffers_are_unmapped(ctx->Array.VAO)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "%s(vertex buffers are mapped)", function);
       return false;