intel: genxml: compress all gen files into one
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Sat, 25 Mar 2017 02:52:33 +0000 (02:52 +0000)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Fri, 31 Mar 2017 00:24:56 +0000 (01:24 +0100)
Combining all the files into a single string didn't make any
difference in the size of the aubinator binary.

With this change we now also embed gen4/4.5/5 descriptions, which
increases the aubinator size by ~16Kb.

v2 (Lionel): rebase makefiles

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/intel/Makefile.genxml.am
src/intel/Makefile.sources
src/intel/common/gen_decoder.c
src/intel/genxml/.gitignore
src/intel/genxml/gen_zipped_file.py

index 474b751f5fddf755c49086a273f33f943ac1a8a2..05a12f8f77d51727bd0c7fd25a0d2c831cf2005a 100644 (file)
 # IN THE SOFTWARE.
 
 BUILT_SOURCES += \
-       $(GENXML_GENERATED_FILES) \
-       $(AUBINATOR_GENERATED_FILES)
+       $(GENXML_GENERATED_FILES)
 
 EXTRA_DIST += \
        $(GENXML_XML_FILES) \
-       $(GENXML_GENERATED_FILES) \
-       $(AUBINATOR_GENERATED_FILES)
+       $(GENXML_GENERATED_FILES)
 
 SUFFIXES = _pack.h _xml.h .xml
 
@@ -36,11 +34,9 @@ $(GENXML_GENERATED_PACK_FILES): genxml/gen_pack_header.py
        $(MKDIR_GEN)
        $(PYTHON_GEN) $(srcdir)/genxml/gen_pack_header.py $< > $@ || ($(RM) $@; false)
 
-$(AUBINATOR_GENERATED_FILES): genxml/gen_zipped_file.py
-
-.xml_xml.h:
+genxml/genX_xml.h: $(GENXML_XML_FILES) genxml/gen_zipped_file.py
        $(MKDIR_GEN)
-       $(AM_V_GEN) $(PYTHON2) $(srcdir)/genxml/gen_zipped_file.py $< > $@ || ($(RM) $@; false)
+       $(AM_V_GEN) $(PYTHON2) $(srcdir)/genxml/gen_zipped_file.py $(GENXML_XML_FILES) > $@ || ($(RM) $@; false)
 
 genxml/genX_bits.h: genxml/gen_bits_header.py $(GENXML_XML_FILES)
        $(MKDIR_GEN)
index c56891643cef3148c3aed42cd59acc4ce60a6993..aa04c0789856abe080337f0f09f45d45c755e9b9 100644 (file)
@@ -131,14 +131,8 @@ GENXML_GENERATED_PACK_FILES = \
 
 GENXML_GENERATED_FILES = \
        $(GENXML_GENERATED_PACK_FILES) \
-       genxml/genX_bits.h
-
-AUBINATOR_GENERATED_FILES = \
-       genxml/gen6_xml.h \
-       genxml/gen7_xml.h \
-       genxml/gen75_xml.h \
-       genxml/gen8_xml.h \
-       genxml/gen9_xml.h
+       genxml/genX_bits.h \
+       genxml/genX_xml.h
 
 ISL_FILES = \
        isl/isl.c \
index 1c3246f265e565fdc2b2eb5ac2312979aaff00c9..7b04ac051b600f18b3a292c3c5ce1aa446cda69d 100644 (file)
 
 #include "gen_decoder.h"
 
-#include "genxml/gen6_xml.h"
-#include "genxml/gen7_xml.h"
-#include "genxml/gen75_xml.h"
-#include "genxml/gen8_xml.h"
-#include "genxml/gen9_xml.h"
+#include "genxml/genX_xml.h"
 
 #define XML_BUFFER_SIZE 4096
 
@@ -481,35 +477,6 @@ devinfo_to_gen(const struct gen_device_info *devinfo)
    return value;
 }
 
-static const struct {
-   int gen;
-   const uint8_t *data;
-   size_t data_length;
-} gen_data[] = {
-   { .gen = 60, .data = gen6_xml, .data_length = sizeof(gen6_xml) },
-   { .gen = 70, .data = gen7_xml, .data_length = sizeof(gen7_xml) },
-   { .gen = 75, .data = gen75_xml, .data_length = sizeof(gen75_xml) },
-   { .gen = 80, .data = gen8_xml, .data_length = sizeof(gen8_xml) },
-   { .gen = 90, .data = gen9_xml, .data_length = sizeof(gen9_xml) }
-};
-
-static const uint8_t *
-devinfo_to_xml_data(const struct gen_device_info *devinfo,
-                    uint32_t *data_length)
-{
-   int i, gen = devinfo_to_gen(devinfo);
-
-   for (i = 0; i < ARRAY_SIZE(gen_data); i++) {
-      if (gen_data[i].gen == gen) {
-         *data_length = gen_data[i].data_length;
-         return gen_data[i].data;
-      }
-   }
-
-   unreachable("Unknown generation");
-   return NULL;
-}
-
 static uint32_t zlib_inflate(const void *compressed_data,
                              uint32_t compressed_len,
                              void **out_ptr)
@@ -563,9 +530,22 @@ gen_spec_load(const struct gen_device_info *devinfo)
 {
    struct parser_context ctx;
    void *buf;
-   const void *zlib_data;
-   void *text_data;
-   uint32_t zlib_length = 0, text_length;
+   uint8_t *text_data;
+   uint32_t text_offset = 0, text_length = 0, total_length;
+   uint32_t gen_10 = devinfo_to_gen(devinfo);
+
+   for (int i = 0; i < ARRAY_SIZE(genxml_files_table); i++) {
+      if (genxml_files_table[i].gen_10 == gen_10) {
+         text_offset = genxml_files_table[i].offset;
+         text_length = genxml_files_table[i].length;
+         break;
+      }
+   }
+
+   if (text_length == 0) {
+      fprintf(stderr, "unable to find gen (%u) data\n", gen_10);
+      return NULL;
+   }
 
    memset(&ctx, 0, sizeof ctx);
    ctx.parser = XML_ParserCreate(NULL);
@@ -580,11 +560,13 @@ gen_spec_load(const struct gen_device_info *devinfo)
 
    ctx.spec = xzalloc(sizeof(*ctx.spec));
 
-   zlib_data = devinfo_to_xml_data(devinfo, &zlib_length);
-   text_length = zlib_inflate(zlib_data, zlib_length, &text_data);
+   total_length = zlib_inflate(compress_genxmls,
+                               sizeof(compress_genxmls),
+                               (void **) &text_data);
+   assert(text_offset + text_length <= total_length);
 
    buf = XML_GetBuffer(ctx.parser, text_length);
-   memcpy(buf, text_data, text_length);
+   memcpy(buf, &text_data[text_offset], text_length);
 
    if (XML_ParseBuffer(ctx.parser, text_length, true) == 0) {
       fprintf(stderr,
index 3e2f1cfa9f0e8168689330d7f8a8f612c549863b..f2db03b4a1637adfe2c64595ad51282d7be31af0 100644 (file)
@@ -1,3 +1,3 @@
 gen*_bits.h
 gen*_pack.h
-gen*_xml.h
+genX_xml.h
index 66222cabe71ea71410edc3e91923dd5575b47035..af2008bea0399aea5c163dd3a1c52b25b846ba3e 100644 (file)
@@ -26,22 +26,46 @@ from __future__ import print_function
 import os
 import sys
 import zlib
+import xml.etree.cElementTree as et
 
 def main():
     if len(sys.argv) < 2:
         print("No input xml file specified")
         sys.exit(1)
 
-    with open(sys.argv[1]) as f:
-        compressed_data = zlib.compress(f.read())
+    compress = zlib.compressobj()
 
-    gen_name = os.path.splitext(os.path.basename(sys.argv[1]))[0]
-    print("static const uint8_t %s_xml[] = {" % gen_name)
-    print("   ", end='')
+    print("static const struct {")
+    print("   uint32_t gen_10;")
+    print("   uint32_t offset;")
+    print("   uint32_t length;")
+    print("} genxml_files_table[] = {")
+
+    xml_offset = 0
+    compressed_data = ''
+    for i in range(1, len(sys.argv)):
+        filename = sys.argv[i]
+        xml = open(filename).read()
+        xml_length = len(xml)
+        root = et.fromstring(xml)
+
+        print("   { %i, %i, %i }," %
+              (int(float(root.attrib['gen']) * 10), xml_offset, xml_length))
+
+        compressed_data += compress.compress(xml)
+        xml_offset += xml_length
 
+    print("};")
+
+    compressed_data += compress.flush()
+
+    print("")
+    print("static const uint8_t compress_genxmls[] = {")
+    print("   ", end='')
     for i, c in enumerate(compressed_data, start=1):
         print("0x%.2x, " % ord(c), end='\n   ' if not i % 12 else '')
     print('\n};')
 
+
 if __name__ == '__main__':
     main()