This new feature lets us generate C enums for inline values of a field. If the type attribute on a field is an otherwise undefined type, the generator will create an enum with that type name and the inline values. The enum can be referenced further down in the XML as if it had be declared independently and will generate a C enum.
For example: <field name="Tile Mode" start="12" end="13" type="TILE_MODE"> <value name="LINEAR" value="0"/> <value name="WMAJOR" value="1"/> <value name="XMAJOR" value="2"/> <value name="YMAJOR" value="3"/> </field> will generate the TILE_MODE enum and in the C header we'll get enum GEN9_TILE_MODE { LINEAR = 0, WMAJOR = 1, XMAJOR = 2, YMAJOR = 3, }; and in struct GEN9_RENDER_SURFACE_STATE: struct GEN9_RENDER_SURFACE_STATE { ... enum GEN9_SURFACE_FORMAT SurfaceFormat; ... }; This can be combined with the prefix attribute: <field name="Color Clamp Range" start="34" end="35" type="Color Clamp" prefix="COLORCLAMP"> <value name="UNORM" value="0"/> <value name="SNORM" value="1"/> <value name="RTFORMAT" value="2"/> </field> generates enum GEN9_Color Clamp { COLORCLAMP_UNORM = 0, COLORCLAMP_SNORM = 1, COLORCLAMP_RTFORMAT = 2, }; Signed-off-by: Kristian H. Kristensen <hoegsb...@gmail.com> --- src/intel/genxml/gen_pack_header.py | 41 ++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/intel/genxml/gen_pack_header.py b/src/intel/genxml/gen_pack_header.py index 001ad17..fb70951 100644 --- a/src/intel/genxml/gen_pack_header.py +++ b/src/intel/genxml/gen_pack_header.py @@ -293,8 +293,9 @@ class Field(object): else: prefix = "" - for value in self.values: - print("#define %-40s %d" % (prefix + value.name, value.value)) + if self.is_builtin_type(): + for value in self.values: + print("#define %-40s %d" % (prefix + value.name, value.value)) class Group(object): def __init__(self, parser, parent, start, count, size): @@ -305,6 +306,18 @@ class Group(object): self.size = size self.fields = [] + + def emit_inline_enums(self): + for field in self.fields: + if type(field) is Group: + field.emit_inline_enums() + elif not (field.is_builtin_type() or + field.is_struct_type() or + field.is_enum_type()): + self.parser.enums[field.type] = 1 + self.parser.emit_enum(safe_name(field.type), + field.prefix, field.values) + def emit_template_struct(self, dim): if self.count == 0: print(" /* variable length fields follow */") @@ -574,7 +587,7 @@ class Parser(object): elif name == "field": self.group.fields[-1].values = self.values elif name == "enum": - self.emit_enum() + self.emit_enum(self.enum, self.prefix, self.values) self.enum = None elif name == "genxml": print('#endif /* %s */' % self.gen_guard()) @@ -585,6 +598,8 @@ class Parser(object): print("};\n") def emit_pack_function(self, name, group): + group.emit_inline_enums() + name = self.gen_prefix(name) print("static inline void\n%s_pack(__gen_user_data *data, void * restrict dst,\n%sconst struct %s * restrict values)\n{" % (name, ' ' * (len(name) + 6), name)) @@ -597,6 +612,8 @@ class Parser(object): print("}\n") def emit_instruction(self): + self.group.emit_inline_enums() + name = self.instruction if not self.length == None: print('#define %-33s %6d' % @@ -622,6 +639,8 @@ class Parser(object): self.emit_pack_function(self.instruction, self.group) def emit_register(self): + self.group.emit_inline_enums() + name = self.register if not self.reg_num == None: print('#define %-33s 0x%04x' % @@ -635,6 +654,8 @@ class Parser(object): self.emit_pack_function(self.register, self.group) def emit_struct(self): + self.group.emit_inline_enums() + name = self.struct if not self.length == None: print('#define %-33s %6d' % @@ -643,14 +664,14 @@ class Parser(object): self.emit_template_struct(self.struct, self.group) self.emit_pack_function(self.struct, self.group) - def emit_enum(self): - print('enum %s {' % self.gen_prefix(self.enum)) - for value in self.values: - if self.prefix: - name = self.prefix + "_" + value.name + def emit_enum(self, name, prefix, values): + print('enum %s {' % self.gen_prefix(name)) + for value in values: + if prefix: + value_name = prefix + "_" + value.name else: - name = value.name - print(' %-36s = %6d,' % (name.upper(), value.value)) + value_name = value.name + print(' %-36s = %6d,' % (value_name.upper(), value.value)) print('};\n') def parse(self, filename): -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev