mesa: Add an attribute for conditions to turn off threading.
authorEric Anholt <eric@anholt.net>
Fri, 1 Mar 2013 02:15:58 +0000 (18:15 -0800)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 16 Mar 2017 03:14:19 +0000 (14:14 +1100)
The threading for GL core is in place, but there are so few applications
actually using a core GL context that it would be nice to extend support
back.  However, some of the features of compat GL (particularly user
vertex arrays) would be so expensive to track state for that we want to be
able to disable threading when we discover that the app is using them.

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_API.dtd
src/mapi/glapi/gen/gl_marshal.py
src/mapi/glapi/gen/marshal_XML.py

index 133bc042aa9ea441afee484b06ff8ab45092621d..dc4a199bb99fddfbd44f403d57af81e80ff675e7 100644 (file)
@@ -39,7 +39,8 @@
                    deprecated          CDATA   "none"
                    exec                NMTOKEN #IMPLIED
                    desktop             (true | false) "true"
-                   marshal             NMTOKEN #IMPLIED>
+                   marshal             NMTOKEN #IMPLIED
+                   marshal_fail        CDATA #IMPLIED>
 <!ATTLIST size     name                NMTOKEN #REQUIRED
                    count               NMTOKEN #IMPLIED
                    mode                (get | set) "set">
@@ -129,6 +130,10 @@ param:
         generated but a custom implementation will be present in marshal.c.
         If "draw", it will follow the "async" rules except that "indices" are
         ignored (since they may come from a VBO).
+     marshal_fail - an expression that, if it evaluates true, causes glthread
+        to finish and tear down before the Mesa implementation is called
+        directly.  Used to disable glthread for GL compatibility interactions
+        that we don't want to track state for.
 
 glx:
      rop - Opcode value for "render" commands
index 1a63343500169b7b74a93a1f92b7db33cc823807..a50d773e27e69c9647110347e1e062d325cb763e 100644 (file)
@@ -236,6 +236,14 @@ class PrintCode(gl_XML.gl_print_base):
 
             self.validate_count_or_return(func)
 
+            if func.marshal_fail:
+                out('if ({0}) {{'.format(func.marshal_fail))
+                with indent():
+                    out('_mesa_glthread_destroy(ctx);')
+                    self.print_sync_dispatch(func)
+                    out('return;')
+                out('}')
+
             out('if (cmd_size <= MARSHAL_MAX_CMD_SIZE) {')
             with indent():
                 self.print_async_dispatch(func)
index d56e4dda4afcbea72be1623f015e6d240b7a580a..80f7f542e43da54770c50fc06f8758707e121a45 100644 (file)
@@ -58,6 +58,7 @@ class marshal_function(gl_XML.gl_function):
 
         # Store the "marshal" attribute, if present.
         self.marshal = element.get('marshal')
+        self.marshal_fail = element.get('marshal_fail')
 
     def marshal_flavor(self):
         """Find out how this function should be marshalled between