aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2017-04-27 13:32:43 +1000
committerTimothy Arceri <[email protected]>2017-05-04 11:35:36 +1000
commit2f541f63ea1829040194f31c56aeb3617fd60c15 (patch)
treee97260a39e82f7c5daad336c582057424e18da1f /src
parent33ad6226a056e727eb44aba3126ceed6e889dc7b (diff)
glapi: add KHR_no_error support to dispatch table generation
This will allows us to create no error versions of functions noted by a _no_error suffix. We also need to set a no_error attribute equal to "true" in the xml. V3: stop the no_error attribute being overwritten when functions alias another. V2: tidy up suggested by Nicolai. Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mapi/glapi/gen/gl_XML.py6
-rw-r--r--src/mapi/glapi/gen/gl_genexec.py12
2 files changed, 16 insertions, 2 deletions
diff --git a/src/mapi/glapi/gen/gl_XML.py b/src/mapi/glapi/gen/gl_XML.py
index c688906e884..a5320e90a1d 100644
--- a/src/mapi/glapi/gen/gl_XML.py
+++ b/src/mapi/glapi/gen/gl_XML.py
@@ -606,6 +606,7 @@ class gl_function( gl_item ):
self.exec_flavor = 'mesa'
self.desktop = True
self.deprecated = None
+ self.has_no_error_variant = False
# self.entry_point_api_map[name][api] is a decimal value
# indicating the earliest version of the given API in which
@@ -676,6 +677,11 @@ class gl_function( gl_item ):
if not is_attr_true(element, 'desktop', 'true'):
self.desktop = False
+ if self.has_no_error_variant or is_attr_true(element, 'no_error'):
+ self.has_no_error_variant = True
+ else:
+ self.has_no_error_variant = False
+
if alias:
true_name = alias
else:
diff --git a/src/mapi/glapi/gen/gl_genexec.py b/src/mapi/glapi/gen/gl_genexec.py
index 3a75419a752..37b1cc6be0d 100644
--- a/src/mapi/glapi/gen/gl_genexec.py
+++ b/src/mapi/glapi/gen/gl_genexec.py
@@ -232,8 +232,16 @@ class PrintCode(gl_XML.gl_print_base):
# This function is not implemented, or is dispatched
# dynamically.
continue
- settings_by_condition[condition].append(
- 'SET_{0}(exec, {1}{0});'.format(f.name, prefix, f.name))
+ if f.has_no_error_variant:
+ no_error_condition = '_mesa_is_no_error_enabled(ctx) && ({0})'.format(condition)
+ error_condition = '!_mesa_is_no_error_enabled(ctx) && ({0})'.format(condition)
+ settings_by_condition[no_error_condition].append(
+ 'SET_{0}(exec, {1}{0}_no_error);'.format(f.name, prefix, f.name))
+ settings_by_condition[error_condition].append(
+ 'SET_{0}(exec, {1}{0});'.format(f.name, prefix, f.name))
+ else:
+ settings_by_condition[condition].append(
+ 'SET_{0}(exec, {1}{0});'.format(f.name, prefix, f.name))
# Print out an if statement for each unique condition, with
# the SET_* calls nested inside it.
for condition in sorted(settings_by_condition.keys()):