vbo: skip FlushMappedBufferRange for glBegin/End by using a persistent mapping
authorMarek Olšák <marek.olsak@amd.com>
Wed, 22 Jan 2020 21:18:16 +0000 (16:18 -0500)
committerMarge Bot <eric+marge@anholt.net>
Tue, 11 Feb 2020 00:34:57 +0000 (00:34 +0000)
This is a preparation for the next commit and just isolates the removal
of GL_MAP_FLUSH_EXPLICIT_BIT and other map flags that don't make sense with
UNSYNCHRONIZED.

Reviewed-by: Mathias Fröhlich <mathias.froehlich@web.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3766>

src/mesa/vbo/vbo_exec_draw.c

index fd55a5bbee629a9f899ae4e722a93134210cc6a4..ce13c32f95d9765afc0fa1292d4ff2a2af52d831 100644 (file)
@@ -240,7 +240,8 @@ vbo_exec_vtx_unmap(struct vbo_exec_context *exec)
    if (_mesa_is_bufferobj(exec->vtx.bufferobj)) {
       struct gl_context *ctx = exec->ctx;
 
-      if (ctx->Driver.FlushMappedBufferRange) {
+      if (ctx->Driver.FlushMappedBufferRange &&
+          !ctx->Extensions.ARB_buffer_storage) {
          GLintptr offset = exec->vtx.buffer_used -
                            exec->vtx.bufferobj->Mappings[MAP_INTERNAL].Offset;
          GLsizeiptr length = (exec->vtx.buffer_ptr - exec->vtx.buffer_map) *
@@ -273,12 +274,18 @@ void
 vbo_exec_vtx_map(struct vbo_exec_context *exec)
 {
    struct gl_context *ctx = exec->ctx;
-   const GLenum accessRange = GL_MAP_WRITE_BIT |  /* for MapBufferRange */
-                              GL_MAP_INVALIDATE_RANGE_BIT |
-                              GL_MAP_UNSYNCHRONIZED_BIT |
-                              GL_MAP_FLUSH_EXPLICIT_BIT |
-                              MESA_MAP_NOWAIT_BIT;
    const GLenum usage = GL_STREAM_DRAW_ARB;
+   GLenum accessRange = GL_MAP_WRITE_BIT |  /* for MapBufferRange */
+                        GL_MAP_UNSYNCHRONIZED_BIT;
+
+   if (ctx->Extensions.ARB_buffer_storage) {
+      accessRange |= GL_MAP_PERSISTENT_BIT |
+                     GL_MAP_COHERENT_BIT;
+   } else {
+      accessRange |= GL_MAP_INVALIDATE_RANGE_BIT |
+                     GL_MAP_FLUSH_EXPLICIT_BIT |
+                     MESA_MAP_NOWAIT_BIT;
+   }
 
    if (!_mesa_is_bufferobj(exec->vtx.bufferobj))
       return;
@@ -312,6 +319,9 @@ vbo_exec_vtx_map(struct vbo_exec_context *exec)
                                  VBO_VERT_BUFFER_SIZE,
                                  NULL, usage,
                                  GL_MAP_WRITE_BIT |
+                                 (ctx->Extensions.ARB_buffer_storage ?
+                                    GL_MAP_PERSISTENT_BIT |
+                                    GL_MAP_COHERENT_BIT : 0) |
                                  GL_DYNAMIC_STORAGE_BIT |
                                  GL_CLIENT_STORAGE_BIT,
                                  exec->vtx.bufferobj)) {