intel/genxml: Add filter_engines() to GenXml class

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24547>
This commit is contained in:
Jordan Justen 2022-12-24 01:40:30 -08:00 committed by Marge Bot
parent 5e275d8a2b
commit 493e8c4b50
3 changed files with 24 additions and 20 deletions

View file

@ -255,11 +255,6 @@ class XmlParser(object):
name = item.tag
attrs = item.attrib
if name in ('instruction', 'struct', 'register'):
if name == 'instruction' and 'engine' in attrs:
engines = set(attrs['engine'].split('|'))
if not engines & self.engines:
self.container_stack.append(None)
return
self.start_container(attrs)
for struct_item in item:
self.process_item(struct_item)
@ -320,9 +315,9 @@ def parse_args():
def main():
pargs = parse_args()
engines = pargs.engines.split(',')
engines = set(pargs.engines.split(','))
valid_engines = [ 'render', 'blitter', 'video' ]
if set(engines) - set(valid_engines):
if engines - set(valid_engines):
print("Invalid engine specified, valid engines are:\n")
for e in valid_engines:
print("\t%s" % e)
@ -333,8 +328,8 @@ def main():
for source in pargs.xml_sources:
p = XmlParser(containers)
p.engines = set(engines)
genxml = intel_genxml.GenXml(source)
genxml.filter_engines(engines)
p.emit_genxml(genxml)
included_symbols_list = pargs.include_symbols.split(',')

View file

@ -453,13 +453,6 @@ class Parser(object):
if name == "instruction":
self.instruction = safe_name(attrs["name"])
self.length_bias = int(attrs["bias"])
if "engine" in attrs:
self.instruction_engines = set(attrs["engine"].split('|'))
else:
# When an instruction doesn't have the engine specified,
# it is considered to be for all engines, so 'None' is used
# to signify that the instruction belongs to all engines.
self.instruction_engines = None
elif name == "struct":
self.struct = safe_name(attrs["name"])
self.structs[attrs["name"]] = 1
@ -549,8 +542,6 @@ class Parser(object):
def emit_instruction(self):
name = self.instruction
if self.instruction_engines and not self.instruction_engines & self.engines:
return
if not self.length is None:
print('#define %-33s %6d' %
@ -640,17 +631,17 @@ def parse_args():
def main():
pargs = parse_args()
engines = pargs.engines.split(',')
engines = set(pargs.engines.split(','))
valid_engines = [ 'render', 'blitter', 'video' ]
if set(engines) - set(valid_engines):
if engines - set(valid_engines):
print("Invalid engine specified, valid engines are:\n")
for e in valid_engines:
print("\t%s" % e)
sys.exit(1)
genxml = intel_genxml.GenXml(pargs.xml_source)
genxml.filter_engines(engines)
p = Parser()
p.engines = set(engines)
p.emit_genxml(genxml)
if __name__ == '__main__':

View file

@ -169,3 +169,21 @@ def sort_xml(xml: et.ElementTree) -> None:
class GenXml(object):
def __init__(self, filename):
self.et = et.parse(filename)
def filter_engines(self, engines):
changed = False
items = []
for item in self.et.getroot():
# When an instruction doesn't have the engine specified,
# it is considered to be for all engines. Otherwise, we
# check to see if it's tagged for the engines requested.
if item.tag == 'instruction' and 'engine' in item.attrib:
i_engines = set(item.attrib["engine"].split('|'))
if not (i_engines & engines):
# Drop this instruction because it doesn't support
# the requested engine types.
changed = True
continue
items.append(item)
if changed:
self.et.getroot()[:] = items