From 0f83c0514929577a824877870a98f945d90a689e Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Sat, 25 Mar 2017 02:52:33 +0000 Subject: [PATCH] intel: genxml: compress all gen files into one 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 Reviewed-by: Jordan Justen --- src/intel/Makefile.genxml.am | 12 +++---- src/intel/Makefile.sources | 10 ++---- src/intel/common/gen_decoder.c | 62 +++++++++++++------------------------ src/intel/genxml/.gitignore | 2 +- src/intel/genxml/gen_zipped_file.py | 34 +++++++++++++++++--- 5 files changed, 58 insertions(+), 62 deletions(-) diff --git a/src/intel/Makefile.genxml.am b/src/intel/Makefile.genxml.am index 474b751f5fd..05a12f8f77d 100644 --- a/src/intel/Makefile.genxml.am +++ b/src/intel/Makefile.genxml.am @@ -20,13 +20,11 @@ # 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) diff --git a/src/intel/Makefile.sources b/src/intel/Makefile.sources index c56891643ce..aa04c078985 100644 --- a/src/intel/Makefile.sources +++ b/src/intel/Makefile.sources @@ -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 \ diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index 1c3246f265e..7b04ac051b6 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -34,11 +34,7 @@ #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, diff --git a/src/intel/genxml/.gitignore b/src/intel/genxml/.gitignore index 3e2f1cfa9f0..f2db03b4a16 100644 --- a/src/intel/genxml/.gitignore +++ b/src/intel/genxml/.gitignore @@ -1,3 +1,3 @@ gen*_bits.h gen*_pack.h -gen*_xml.h +genX_xml.h diff --git a/src/intel/genxml/gen_zipped_file.py b/src/intel/genxml/gen_zipped_file.py index 66222cabe71..af2008bea03 100644 --- a/src/intel/genxml/gen_zipped_file.py +++ b/src/intel/genxml/gen_zipped_file.py @@ -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() -- 2.11.0