glthread: add GL_DRAW_INDIRECT_BUFFER tracking and generator support
authorMarek Olšák <marek.olsak@amd.com>
Wed, 19 Feb 2020 21:54:45 +0000 (16:54 -0500)
committerMarge Bot <eric+marge@anholt.net>
Fri, 6 Mar 2020 01:06:14 +0000 (01:06 +0000)
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3948>

src/mapi/glapi/gen/marshal_XML.py
src/mesa/main/glthread.h
src/mesa/main/marshal.c
src/mesa/main/marshal.h

index d761e58ce830d95ea4d1b57ac19e0f605da5b4fd..5b682c519657acd57dffd893d6d34e670ba48bb4 100644 (file)
@@ -77,7 +77,9 @@ class marshal_function(gl_XML.gl_function):
         for p in self.parameters:
             if p.is_output:
                 return 'sync'
-            if p.is_pointer() and not (p.count or p.counter) and not (self.marshal == 'draw' and p.name == 'indices'):
+            if (p.is_pointer() and not (p.count or p.counter)
+                and not (self.marshal == 'draw'
+                         and (p.name == 'indices' or p.name == 'indirect'))):
                 return 'sync'
             if p.count_parameter_list:
                 # Parameter size is determined by enums; haven't
index 021d52130841732d85e1d9f9d5a01b91148899f0..5e99602b4188aa949d88b3a57871197f6cf1ba63 100644 (file)
@@ -94,6 +94,7 @@ struct glthread_state
     * buffer) binding is in a VBO.
     */
    bool element_array_is_vbo;
+   bool draw_indirect_buffer_is_vbo;
 };
 
 void _mesa_glthread_init(struct gl_context *ctx);
index 28054d236c9b1bb3794dbeb8ae65e6059342bbec..24e419ca3375cf04668c8f09bb7f62253481eaa1 100644 (file)
@@ -252,6 +252,9 @@ track_vbo_binding(struct gl_context *ctx, GLenum target, GLuint buffer)
        */
       glthread->element_array_is_vbo = (buffer != 0);
       break;
+   case GL_DRAW_INDIRECT_BUFFER:
+      glthread->draw_indirect_buffer_is_vbo = buffer != 0;
+      break;
    }
 }
 
index c15253f397361e6a164e838788392e243aca2fce..a172ed30043e43b7a9185cc8ef64e2168d7452a6 100644 (file)
@@ -98,6 +98,25 @@ _mesa_glthread_is_non_vbo_draw_elements(const struct gl_context *ctx)
    return ctx->API != API_OPENGL_CORE && !glthread->element_array_is_vbo;
 }
 
+static inline bool
+_mesa_glthread_is_non_vbo_draw_arrays_indirect(const struct gl_context *ctx)
+{
+   struct glthread_state *glthread = ctx->GLThread;
+
+   return ctx->API != API_OPENGL_CORE &&
+          !glthread->draw_indirect_buffer_is_vbo;
+}
+
+static inline bool
+_mesa_glthread_is_non_vbo_draw_elements_indirect(const struct gl_context *ctx)
+{
+   struct glthread_state *glthread = ctx->GLThread;
+
+   return ctx->API != API_OPENGL_CORE &&
+          (!glthread->draw_indirect_buffer_is_vbo ||
+           !glthread->element_array_is_vbo);
+}
+
 #define DEBUG_MARSHAL_PRINT_CALLS 0
 
 /**