[Mesa-dev] [PATCH v2 2/2] aubinator/genxml: use gzipped files to store embedded genxml

Lionel Landwerlin lionel.g.landwerlin at intel.com
Fri Mar 10 18:00:13 UTC 2017


This reduces the size of the aubinator binary from ~1.4Mb to ~700Kb.
We can now also drop the checks on xxd in configure.

v2: Fix incorrect makefile dependency (Lionel)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
 configure.ac                 |  1 -
 src/intel/Makefile.genxml.am | 10 ++-----
 src/intel/tools/Makefile.am  |  4 ++-
 src/intel/tools/decoder.c    | 68 +++++++++++++++++++++++++++++++++++++++-----
 4 files changed, 66 insertions(+), 17 deletions(-)

diff --git a/configure.ac b/configure.ac
index d64ed2d3e8..11bd39bc15 100644
--- a/configure.ac
+++ b/configure.ac
@@ -126,7 +126,6 @@ LT_PREREQ([2.2])
 LT_INIT([disable-static])

 AC_CHECK_PROG(RM, rm, [rm -f])
-AC_CHECK_PROG(XXD, xxd, [xxd])

 AX_PROG_BISON([],
               AS_IF([test ! -f "$srcdir/src/compiler/glsl/glcpp/glcpp-parse.c"],
diff --git a/src/intel/Makefile.genxml.am b/src/intel/Makefile.genxml.am
index 1866d7e2df..99367a11fb 100644
--- a/src/intel/Makefile.genxml.am
+++ b/src/intel/Makefile.genxml.am
@@ -35,18 +35,12 @@ $(GENXML_GENERATED_FILES): genxml/gen_pack_header.py
 	$(MKDIR_GEN)
 	$(PYTHON_GEN) $(srcdir)/genxml/gen_pack_header.py $< > $@ || ($(RM) $@; false)

-# xxd generates variable names based on the path of the input file. We
-# prefer to generate our own name here, so it doesn't vary from
-# in/out-of-tree builds.
-
 $(GENXML_GENERATED_FILES): Makefile.am
+$(GENXML_GENERATED_FILES): genxml/gen_zipped_file.py

 .xml_xml.h:
 	$(MKDIR_GEN)
-	$(AM_V_GEN) echo -n "static const uint8_t " > $@; \
-	echo "$(@F)_xml[] = {" | sed -e 's,_xml.h,,' >> $@; \
-	cat $< | $(XXD) -i >> $@; \
-	echo "};" >> $@
+	$(AM_V_GEN) $(srcdir)/genxml/gen_zipped_file.py $< > $@ || ($(RM) $@; false)

 EXTRA_DIST += \
 	genxml/gen4.xml \
diff --git a/src/intel/tools/Makefile.am b/src/intel/tools/Makefile.am
index 5f4d78d6fd..3e2556849a 100644
--- a/src/intel/tools/Makefile.am
+++ b/src/intel/tools/Makefile.am
@@ -56,10 +56,12 @@ aubinator_SOURCES = \

 aubinator_LDADD = \
 	$(aubinator_DEPS) \
-	$(EXPAT_LIBS)
+	$(EXPAT_LIBS) \
+	$(ZLIB_LIBS)

 aubinator_CFLAGS = \
 	$(AM_CFLAGS) \
 	$(EXPAT_CFLAGS) \
+	$(ZLIB_CFLAGS) \
 	-I$(top_srcdir)/include \
 	-I$(top_srcdir)/src
diff --git a/src/intel/tools/decoder.c b/src/intel/tools/decoder.c
index defb0873da..72913601c0 100644
--- a/src/intel/tools/decoder.c
+++ b/src/intel/tools/decoder.c
@@ -28,6 +28,7 @@
 #include <string.h>
 #include <expat.h>
 #include <inttypes.h>
+#include <zlib.h>

 #include <util/macros.h>

@@ -508,13 +509,62 @@ devinfo_to_xml_data(const struct gen_device_info *devinfo,
    return NULL;
 }

+static uint32_t zlib_inflate(const void *compressed_data,
+                             uint32_t compressed_len,
+                             void **out_ptr)
+{
+   struct z_stream_s zstream;
+   void *out;
+
+   memset(&zstream, 0, sizeof(zstream));
+
+   zstream.next_in = (unsigned char *)compressed_data;
+   zstream.avail_in = compressed_len;
+
+   if (inflateInit(&zstream) != Z_OK)
+      return 0;
+
+   out = malloc(4096);
+   zstream.next_out = out;
+   zstream.avail_out = 4096;
+
+   do {
+      switch (inflate(&zstream, Z_SYNC_FLUSH)) {
+      case Z_STREAM_END:
+         goto end;
+      case Z_OK:
+         break;
+      default:
+         inflateEnd(&zstream);
+         return 0;
+      }
+
+      if (zstream.avail_out)
+         break;
+
+      out = realloc(out, 2*zstream.total_out);
+      if (out == NULL) {
+         inflateEnd(&zstream);
+         return 0;
+      }
+
+      zstream.next_out = (unsigned char *)out + zstream.total_out;
+      zstream.avail_out = zstream.total_out;
+   } while (1);
+ end:
+   inflateEnd(&zstream);
+   *out_ptr = out;
+   return zstream.total_out;
+}
+
 struct gen_spec *
 gen_spec_load(const struct gen_device_info *devinfo)
 {
    struct parser_context ctx;
    void *buf;
-   const void *data;
-   uint32_t data_length = 0;
+   const void *zlib_data;
+   void *text_data;
+   uint32_t zlib_length = 0, text_length;

    memset(&ctx, 0, sizeof ctx);
    ctx.parser = XML_ParserCreate(NULL);
@@ -529,22 +579,26 @@ gen_spec_load(const struct gen_device_info *devinfo)

    ctx.spec = xzalloc(sizeof(*ctx.spec));

-   data = devinfo_to_xml_data(devinfo, &data_length);
-   buf = XML_GetBuffer(ctx.parser, data_length);
+   zlib_data = devinfo_to_xml_data(devinfo, &zlib_length);
+   text_length = zlib_inflate(zlib_data, zlib_length, &text_data);

-   memcpy(buf, data, data_length);
+   buf = XML_GetBuffer(ctx.parser, text_length);
+   memcpy(buf, text_data, text_length);

-   if (XML_ParseBuffer(ctx.parser, data_length, true) == 0) {
+   if (XML_ParseBuffer(ctx.parser, text_length, true) == 0) {
       fprintf(stderr,
-              "Error parsing XML at line %ld col %ld: %s\n",
+              "Error parsing XML at line %ld col %ld byte %ld/%u: %s\n",
               XML_GetCurrentLineNumber(ctx.parser),
               XML_GetCurrentColumnNumber(ctx.parser),
+              XML_GetCurrentByteIndex(ctx.parser), text_length,
               XML_ErrorString(XML_GetErrorCode(ctx.parser)));
       XML_ParserFree(ctx.parser);
+      free(text_data);
       return NULL;
    }

    XML_ParserFree(ctx.parser);
+   free(text_data);

    return ctx.spec;
 }
--
2.11.0


More information about the mesa-dev mailing list