[Mesa-dev] [PATCH V3] glapi: add KHR_no_error support to dispatch table generation

Nicolai Hähnle nhaehnle at gmail.com
Wed May 3 12:46:13 UTC 2017


On 03.05.2017 06:25, Timothy Arceri wrote:
> 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.

Thanks, I do like it better this way.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> ---
>  src/mapi/glapi/gen/gl_XML.py     |  6 ++++++
>  src/mapi/glapi/gen/gl_genexec.py | 12 ++++++++++--
>  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 c688906..a5320e9 100644
> --- a/src/mapi/glapi/gen/gl_XML.py
> +++ b/src/mapi/glapi/gen/gl_XML.py
> @@ -599,20 +599,21 @@ class gl_function( gl_item ):
>
>          self.entry_points = []
>          self.return_type = "void"
>          self.parameters = []
>          self.offset = -1
>          self.initialized = 0
>          self.images = []
>          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
>          # each entry point exists.  Every entry point is included in
>          # the first level of the map; the second level of the map only
>          # lists APIs which contain the entry point in at least one
>          # version.  For example,
>          # self.entry_point_api_map['ClipPlanex'] == { 'es1':
>          # Decimal('1.1') }.
>          self.entry_point_api_map = {}
> @@ -669,20 +670,25 @@ class gl_function( gl_item ):
>          if exec_flavor:
>              self.exec_flavor = exec_flavor
>
>          deprecated = element.get('deprecated', 'none')
>          if deprecated != 'none':
>              self.deprecated = Decimal(deprecated)
>
>          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:
>              true_name = name
>
>              # Only try to set the offset when a non-alias entry-point
>              # is being processed.
>
>              if name in static_data.offsets:
>                  self.offset = static_data.offsets[name]
> diff --git a/src/mapi/glapi/gen/gl_genexec.py b/src/mapi/glapi/gen/gl_genexec.py
> index 3a75419..37b1cc6 100644
> --- a/src/mapi/glapi/gen/gl_genexec.py
> +++ b/src/mapi/glapi/gen/gl_genexec.py
> @@ -225,22 +225,30 @@ class PrintCode(gl_XML.gl_print_base):
>
>              if not condition_parts:
>                  # This function does not exist in any API.
>                  continue
>              condition = ' || '.join(condition_parts)
>              prefix = exec_flavor_map[f.exec_flavor]
>              if prefix is None:
>                  # 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()):
>              print '   if ({0}) {{'.format(condition)
>              for setting in sorted(settings_by_condition[condition]):
>                  print '      {0}'.format(setting)
>              print '   }'
>
>
>  def _parser():
>


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list