From 2f541f63ea1829040194f31c56aeb3617fd60c15 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Thu, 27 Apr 2017 13:32:43 +1000 Subject: glapi: add KHR_no_error support to dispatch table generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/mapi/glapi/gen/gl_XML.py | 6 ++++++ src/mapi/glapi/gen/gl_genexec.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'src/mapi/glapi/gen') 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()): -- cgit v1.2.3