mesa: Add support for asynchronous glDraw* on GL core.
authorEric Anholt <eric@anholt.net>
Wed, 27 Feb 2013 22:28:16 +0000 (14:28 -0800)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 16 Mar 2017 03:14:19 +0000 (14:14 +1100)
Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
Acked-by: Marek Olšák <maraeo@gmail.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Tested-by: Mike Lothian <mike@fireburn.co.uk>
src/mapi/glapi/gen/gl_marshal.py
src/mapi/glapi/gen/marshal_XML.py

index 3b9868f9a1f5e0b746bfde4e3c24ce55577362f4..1a63343500169b7b74a93a1f92b7db33cc823807 100644 (file)
@@ -244,6 +244,10 @@ class PrintCode(gl_XML.gl_print_base):
                 self.print_sync_dispatch(func)
             out('}')
 
+            if func.marshal == 'draw':
+                out('/* We relied on all vertex and index data being in VBOs */')
+                out('assert(ctx->API == API_OPENGL_CORE);')
+
         out('}')
 
     def print_async_body(self, func):
index 9d5688decac186fbab901da172d6823fc52c45d7..d56e4dda4afcbea72be1623f015e6d240b7a580a 100644 (file)
@@ -64,12 +64,7 @@ class marshal_function(gl_XML.gl_function):
         client and server threads."""
         # If a "marshal" attribute was present, that overrides any
         # determination that would otherwise be made by this function.
-        if self.marshal != None:
-            if self.marshal == 'draw':
-                # TODO: as a temporary measure, do draw functions
-                # synchronously, since they may access client memory
-                # via vertex attribute pointers.
-                return 'sync'
+        if self.marshal not in (None, 'draw'):
             return self.marshal
 
         if self.exec_flavor == 'skip':
@@ -82,7 +77,7 @@ 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):
+            if p.is_pointer() and not (p.count or p.counter) and not (self.marshal == 'draw' and p.name == 'indices'):
                 return 'sync'
             if p.count_parameter_list:
                 # Parameter size is determined by enums; haven't