[Mesa-dev] [PATCH 1/2] glapi: add KHR_no_error support to dispatch table generation

Timothy Arceri tarceri at itsqueeze.com
Wed May 3 00:44:51 UTC 2017



On 02/05/17 20:43, Nicolai Hähnle wrote:
> On 27.04.2017 07:33, 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.
>> ---
>>  src/mapi/glapi/gen/gl_XML.py     |  5 +++++
>>  src/mapi/glapi/gen/gl_genexec.py | 19 ++++++++++++++-----
>>  2 files changed, 19 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/mapi/glapi/gen/gl_XML.py b/src/mapi/glapi/gen/gl_XML.py
>> index c688906..603ef73 100644
>> --- a/src/mapi/glapi/gen/gl_XML.py
>> +++ b/src/mapi/glapi/gen/gl_XML.py
>> @@ -669,20 +669,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 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..ba82045 100644
>> --- a/src/mapi/glapi/gen/gl_genexec.py
>> +++ b/src/mapi/glapi/gen/gl_genexec.py
>> @@ -167,21 +167,21 @@ class PrintCode(gl_XML.gl_print_base):
>>
>>      def printRealHeader(self):
>>          print header
>>
>>      def printRealFooter(self):
>>          print footer
>>
>>      def printBody(self, api):
>>          # Collect SET_* calls by the condition under which they should
>>          # be called.
>> -        settings_by_condition = collections.defaultdict(lambda: [])
>> +        settings_by_condition = collections.defaultdict(lambda: 
>> collections.defaultdict(lambda: []))
>>          for f in api.functionIterateAll():
>>              if f.exec_flavor not in exec_flavor_map:
>>                  raise Exception(
>>                      'Unrecognized exec flavor 
>> {0!r}'.format(f.exec_flavor))
>>              condition_parts = []
>>              if f.name in apiexec.functions:
>>                  ex = apiexec.functions[f.name]
>>                  unconditional_count = 0
>>
>>                  if ex.compatibility is not None:
>> @@ -225,28 +225,37 @@ 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:
>> +                
>> settings_by_condition[condition]['_mesa_is_no_error_enabled(ctx)'].append( 
>>
>> +                    'SET_{0}(exec, {1}{0}_no_error);'.format(f.name, 
>> prefix, f.name))
>> +                
>> settings_by_condition[condition]['!_mesa_is_no_error_enabled(ctx)'].append( 
>>
>> +                    'SET_{0}(exec, {1}{0});'.format(f.name, prefix, 
>> f.name))
>> +            else:
>> +                settings_by_condition[condition]['true'].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)
>> +            for khr_no_error in 
>> sorted(settings_by_condition[condition].keys()):
>> +                print '      if ({0}) {{'.format(khr_no_error)
>> +                for setting in 
>> sorted(settings_by_condition[condition][khr_no_error]):
>> +                    print '         {0}'.format(setting)
>> +                print '      }'
>>              print '   }'
> 
> I think this could be kept a bit simpler by saying
> 
>     no_error_condition = '({0}) && 
> _mesa_is_no_error_enabled(ctx)'.format(condition)
>     error_condition = '({0}) && 
> !_mesa_is_no_error_enabled(ctx)'.format(condition)
>     settings_by_condition[no_error_condition].append(...)
>     settings_by_condition[error_condition].append(...)
> 
> Though I don't feel too strongly about it.

The down side is that the variant setting calls end up separated in the 
generated file. This can make visual inspection of the file a little 
more difficult.

Anyway I've sent a version 2 with your suggestion. I'm not to worried 
either way.

> 
> Cheers,
> Nicolai
> 
>>
>>
>>  def _parser():
>>      """Parse arguments and return namespace."""
>>      parser = argparse.ArgumentParser()
>>      parser.add_argument('-f',
>>                          dest='filename',
>>                          default='gl_and_es_API.xml',
>>                          help='an xml file describing an API')
>>
> 
> 


More information about the mesa-dev mailing list