v3d: do not report alpha-test as supported
[mesa.git] / src / broadcom / cle / gen_pack_header.py
index 5fde7bb07ade99f40d220aad9d158359b05150e1..cc9e4a03ec27443089dc3cf743eceda50a418716 100644 (file)
@@ -30,7 +30,7 @@ import re
 import sys
 import copy
 
-license =  """/* Generated code, see packets.xml and gen_packet_header.py */
+license =  """/* Generated code, see v3d_packet_v21.xml, v3d_packet_v33.xml and gen_pack_header.py */
 """
 
 pack_header = """%(license)s
@@ -62,7 +62,6 @@ def to_alphanum(name):
         '=': '',
         '>': '',
         '#': '',
-        'α': 'alpha',
         '&': '',
         '*': '',
         '"': '',
@@ -152,6 +151,8 @@ class Field(object):
             type = 'bool'
         elif self.type == 'float':
             type = 'float'
+        elif self.type == 'f187':
+            type = 'float'
         elif self.type == 'ufixed':
             type = 'float'
         elif self.type == 'sfixed':
@@ -192,6 +193,8 @@ class Group(object):
         self.count = count
         self.size = 0
         self.fields = []
+        self.min_ver = 0
+        self.max_ver = 0
 
     def emit_template_struct(self, dim):
         if self.count == 0:
@@ -214,7 +217,7 @@ class Group(object):
             first_byte = field.start // 8
             last_byte = field.end // 8
 
-            for b in xrange(first_byte, last_byte + 1):
+            for b in range(first_byte, last_byte + 1):
                 if not b in bytes:
                     bytes[b] = self.Byte()
 
@@ -315,6 +318,9 @@ class Group(object):
                         (value, start, end)
                 elif field.type == "float":
                     s = "#error %s float value mixed in with other fields" % name
+                elif field.type == "f187":
+                    s = "__gen_uint(fui(%s) >> 16, %d, %d)" % \
+                        (value, start, end)
                 elif field.type == "offset":
                     s = "__gen_offset(%s, %d, %d)" % \
                         (value, start, end)
@@ -368,6 +374,8 @@ class Group(object):
                     convert = "__gen_unpack_uint"
                 elif field.type == "float":
                     convert = "__gen_unpack_float"
+                elif field.type == "f187":
+                    convert = "__gen_unpack_f187"
                 elif field.type == "offset":
                     convert = "__gen_unpack_offset"
                 elif field.type == 'ufixed':
@@ -392,7 +400,7 @@ class Value(object):
         self.value = int(attrs["value"])
 
 class Parser(object):
-    def __init__(self):
+    def __init__(self, ver):
         self.parser = xml.parsers.expat.ParserCreate()
         self.parser.StartElementHandler = self.start_element
         self.parser.EndElementHandler = self.end_element
@@ -403,6 +411,7 @@ class Parser(object):
         # Set of enum names we've seen.
         self.enums = set()
         self.registers = {}
+        self.ver = ver
 
     def gen_prefix(self, name):
         if name[0] == "_":
@@ -413,10 +422,27 @@ class Parser(object):
     def gen_guard(self):
         return self.gen_prefix("PACK_H")
 
+    def attrs_version_valid(self, attrs):
+        if "min_ver" in attrs and self.ver < attrs["min_ver"]:
+            return False
+
+        if "max_ver" in attrs and self.ver > attrs["max_ver"]:
+            return False
+
+        return True
+
+    def group_enabled(self):
+        if self.group.min_ver != 0 and self.ver < self.group.min_ver:
+            return False
+
+        if self.group.max_ver != 0 and self.ver > self.group.max_ver:
+            return False
+
+        return True
+
     def start_element(self, name, attrs):
         if name == "vcxml":
-            self.platform = "V3D {}".format(attrs["gen"])
-            self.ver = attrs["gen"].replace('.', '')
+            self.platform = "V3D {}.{}".format(self.ver[0], self.ver[1])
             print(pack_header % {'license': license, 'platform': self.platform, 'guard': self.gen_guard()})
         elif name in ("packet", "struct", "register"):
             default_field = None
@@ -449,6 +475,11 @@ class Parser(object):
                 field.values = []
                 self.group.fields.append(field)
 
+            if "min_ver" in attrs:
+                self.group.min_ver = attrs["min_ver"]
+            if "max_ver" in attrs:
+                self.group.max_ver = attrs["max_ver"]
+
         elif name == "field":
             self.group.fields.append(Field(self, attrs))
             self.values = []
@@ -456,12 +487,14 @@ class Parser(object):
             self.values = []
             self.enum = safe_name(attrs["name"])
             self.enums.add(attrs["name"])
+            self.enum_enabled = self.attrs_version_valid(attrs)
             if "prefix" in attrs:
                 self.prefix = attrs["prefix"]
             else:
                 self.prefix= None
         elif name == "value":
-            self.values.append(Value(attrs))
+            if self.attrs_version_valid(attrs):
+                self.values.append(Value(attrs))
 
     def end_element(self, name):
         if name  == "packet":
@@ -480,7 +513,8 @@ class Parser(object):
         elif name  == "field":
             self.group.fields[-1].values = self.values
         elif name  == "enum":
-            self.emit_enum()
+            if self.enum_enabled:
+                self.emit_enum()
             self.enum = None
         elif name == "vcxml":
             print('#endif /* %s */' % self.gen_guard())
@@ -525,6 +559,9 @@ class Parser(object):
         print('')
 
     def emit_packet(self):
+        if not self.group_enabled():
+            return
+
         name = self.packet
 
         assert(self.group.fields[0].name == "opcode")
@@ -539,6 +576,9 @@ class Parser(object):
         print('')
 
     def emit_register(self):
+        if not self.group_enabled():
+            return
+
         name = self.register
         if not self.reg_num == None:
             print('#define %-33s 0x%04x' %
@@ -549,6 +589,9 @@ class Parser(object):
         self.emit_unpack_function(self.register, self.group)
 
     def emit_struct(self):
+        if not self.group_enabled():
+            return
+
         name = self.struct
 
         self.emit_header(name)
@@ -579,5 +622,5 @@ if len(sys.argv) < 2:
 
 input_file = sys.argv[1]
 
-p = Parser()
+p = Parser(sys.argv[2])
 p.parse(input_file)