genxml: Change 3DSTATE_DEPTH_BOUNDS bias.
[mesa.git] / src / intel / genxml / gen_bits_header.py
index faba79dcd34663b1524db841e7771b6dad878055..3b0f9ab2f3f72802d995d1c3a5060ca6ddb89de5 100644 (file)
@@ -25,7 +25,7 @@ from __future__ import (
 
 import argparse
 import os
-import sys
+import re
 import xml.parsers.expat
 
 from mako.template import Template
@@ -80,6 +80,7 @@ static inline uint32_t ATTRIBUTE_PURE
 ${item.token_name}_${prop}(const struct gen_device_info *devinfo)
 {
    switch (devinfo->gen) {
+   case 12: return ${item.get_prop(prop, 12)};
    case 11: return ${item.get_prop(prop, 11)};
    case 10: return ${item.get_prop(prop, 10)};
    case 9: return ${item.get_prop(prop, 9)};
@@ -108,13 +109,13 @@ ${item.token_name}_${prop}(const struct gen_device_info *devinfo)
 #ifdef __cplusplus
 extern "C" {
 #endif
-% for _, container in sorted(containers.iteritems(), key=itemgetter(0)):
+% for _, container in sorted(containers.items(), key=itemgetter(0)):
 
 /* ${container.name} */
 
 ${emit_per_gen_prop_func(container, 'length')}
 
-% for _, field in sorted(container.fields.iteritems(), key=itemgetter(0)):
+% for _, field in sorted(container.fields.items(), key=itemgetter(0)):
 
 /* ${container.name}::${field.name} */
 
@@ -131,33 +132,10 @@ ${emit_per_gen_prop_func(field, 'start')}
 
 #endif /* ${guard} */""", output_encoding='utf-8')
 
+alphanum_nono = re.compile(r'[ /\[\]()\-:.,=>#&*"+\\]+')
 def to_alphanum(name):
-    substitutions = {
-        ' ': '',
-        '/': '',
-        '[': '',
-        ']': '',
-        '(': '',
-        ')': '',
-        '-': '',
-        ':': '',
-        '.': '',
-        ',': '',
-        '=': '',
-        '>': '',
-        '#': '',
-        'α': 'alpha',
-        '&': '',
-        '*': '',
-        '"': '',
-        '+': '',
-        '\'': '',
-    }
-
-    for i, j in substitutions.items():
-        name = name.replace(i, j)
-
-    return name
+    global alphanum_nono
+    return alphanum_nono.sub('', name)
 
 def safe_name(name):
     name = to_alphanum(name)
@@ -205,12 +183,13 @@ class Container(object):
             self.length_by_gen[gen] = xml_attrs['length']
 
     def get_field(self, field_name, create=False):
-        if field_name not in self.fields:
+        key = to_alphanum(field_name)
+        if key not in self.fields:
             if create:
-                self.fields[field_name] = Field(self, field_name)
+                self.fields[key] = Field(self, field_name)
             else:
                 return None
-        return self.fields[field_name]
+        return self.fields[key]
 
     def has_prop(self, prop):
         if prop == 'length':
@@ -220,7 +199,7 @@ class Container(object):
 
     def iter_prop(self, prop):
         if prop == 'length':
-            return self.length_by_gen.iteritems()
+            return self.length_by_gen.items()
         else:
             raise ValueError('Invalid property: "{0}"'.format(prop))
 
@@ -253,9 +232,9 @@ class Field(object):
 
     def iter_prop(self, prop):
         if prop == 'bits':
-            return self.bits_by_gen.iteritems()
+            return self.bits_by_gen.items()
         elif prop == 'start':
-            return self.start_by_gen.iteritems()
+            return self.start_by_gen.items()
         else:
             raise ValueError('Invalid property: "{0}"'.format(prop))
 
@@ -282,13 +261,17 @@ class XmlParser(object):
         self.container = None
 
     def parse(self, filename):
-        with open(filename) as f:
+        with open(filename, 'rb') as f:
             self.parser.ParseFile(f)
 
     def start_element(self, name, attrs):
         if name == 'genxml':
             self.gen = Gen(attrs['gen'])
         elif name in ('instruction', 'struct', 'register'):
+            if name == 'instruction' and 'engine' in attrs:
+                engines = set(attrs['engine'].split('|'))
+                if not engines & self.engines:
+                    return
             self.start_container(attrs)
         elif name == 'field':
             self.start_field(attrs)
@@ -327,6 +310,8 @@ def parse_args():
                    help="If OUTPUT is unset or '-', then it defaults to '/dev/stdout'")
     p.add_argument('--cpp-guard', type=str,
                    help='If unset, then CPP_GUARD is derived from OUTPUT.')
+    p.add_argument('--engines', nargs='?', type=str, default='render',
+                   help="Comma-separated list of engines whose instructions should be parsed (default: %(default)s)")
     p.add_argument('xml_sources', metavar='XML_SOURCE', nargs='+')
 
     pargs = p.parse_args()
@@ -342,11 +327,21 @@ def parse_args():
 def main():
     pargs = parse_args()
 
+    engines = pargs.engines.split(',')
+    valid_engines = [ 'render', 'blitter', 'video' ]
+    if set(engines) - set(valid_engines):
+        print("Invalid engine specified, valid engines are:\n")
+        for e in valid_engines:
+            print("\t%s" % e)
+        sys.exit(1)
+
     # Maps name => Container
     containers = {}
 
     for source in pargs.xml_sources:
-        XmlParser(containers).parse(source)
+        p = XmlParser(containers)
+        p.engines = set(engines)
+        p.parse(source)
 
     with open(pargs.output, 'wb') as f:
         f.write(TEMPLATE.render(containers=containers, guard=pargs.cpp_guard))