summaryrefslogtreecommitdiff
path: root/src/mapi
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2013-02-28 18:15:58 -0800
committerTimothy Arceri <tarceri@itsqueeze.com>2017-03-16 14:14:19 +1100
commitcd1c003b18353c220b1b81dcecc9cab2996ce608 (patch)
tree1e8adf2fc9a5e9d676316cb5a852cd5b262d8574 /src/mapi
parent43d4f7a227eaa01ea4be32e598682abc912e8e83 (diff)
mesa: Add an attribute for conditions to turn off threading.
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>
Diffstat (limited to 'src/mapi')
-rw-r--r--src/mapi/glapi/gen/gl_API.dtd7
-rw-r--r--src/mapi/glapi/gen/gl_marshal.py8
-rw-r--r--src/mapi/glapi/gen/marshal_XML.py1
3 files changed, 15 insertions, 1 deletions
diff --git a/src/mapi/glapi/gen/gl_API.dtd b/src/mapi/glapi/gen/gl_API.dtd
index 133bc042aa..dc4a199bb9 100644
--- a/src/mapi/glapi/gen/gl_API.dtd
+++ b/src/mapi/glapi/gen/gl_API.dtd
@@ -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
diff --git a/src/mapi/glapi/gen/gl_marshal.py b/src/mapi/glapi/gen/gl_marshal.py
index 1a63343500..a50d773e27 100644
--- a/src/mapi/glapi/gen/gl_marshal.py
+++ b/src/mapi/glapi/gen/gl_marshal.py
@@ -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)
diff --git a/src/mapi/glapi/gen/marshal_XML.py b/src/mapi/glapi/gen/marshal_XML.py
index d56e4dda4a..80f7f542e4 100644
--- a/src/mapi/glapi/gen/marshal_XML.py
+++ b/src/mapi/glapi/gen/marshal_XML.py
@@ -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