Module: Mesa
Branch: main
Commit: 493e8c4b5034130ce377062f5ad8fea39d126496
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=493e8c4b5034130ce377062f5ad8fea39d126496

Author: Jordan Justen <[email protected]>
Date:   Sat Dec 24 01:40:30 2022 -0800

intel/genxml: Add filter_engines() to GenXml class

Signed-off-by: Jordan Justen <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24547>

---

 src/intel/genxml/gen_bits_header.py | 11 +++--------
 src/intel/genxml/gen_pack_header.py | 15 +++------------
 src/intel/genxml/intel_genxml.py    | 18 ++++++++++++++++++
 3 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/src/intel/genxml/gen_bits_header.py 
b/src/intel/genxml/gen_bits_header.py
index 364fb7fd11e..f6b485e497e 100644
--- a/src/intel/genxml/gen_bits_header.py
+++ b/src/intel/genxml/gen_bits_header.py
@@ -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(',')
diff --git a/src/intel/genxml/gen_pack_header.py 
b/src/intel/genxml/gen_pack_header.py
index 8d49a74e824..19ff2794b56 100644
--- a/src/intel/genxml/gen_pack_header.py
+++ b/src/intel/genxml/gen_pack_header.py
@@ -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__':
diff --git a/src/intel/genxml/intel_genxml.py b/src/intel/genxml/intel_genxml.py
index 8534a07380b..cd07828beef 100755
--- a/src/intel/genxml/intel_genxml.py
+++ b/src/intel/genxml/intel_genxml.py
@@ -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

Reply via email to