summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 133bc042aa9..dc4a199bb99 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 1a633435001..a50d773e27e 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 d56e4dda4af..80f7f542e43 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