On 09.11.2017 07:42, Jordan Justen wrote:
Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com>
---
  src/util/Makefile.sources |   2 +
  src/util/meson.build      |   2 +
  src/util/program_binary.c | 322 ++++++++++++++++++++++++++++++++++++++++++++++
  src/util/program_binary.h |  91 +++++++++++++
  4 files changed, 417 insertions(+)
  create mode 100644 src/util/program_binary.c
  create mode 100644 src/util/program_binary.h

diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
index c7f6516a992..d9048bbd182 100644
--- a/src/util/Makefile.sources
+++ b/src/util/Makefile.sources
@@ -21,6 +21,8 @@ MESA_UTIL_FILES := \
        macros.h \
        mesa-sha1.c \
        mesa-sha1.h \
+       program_binary.c \
+       program_binary.h \
        sha1/sha1.c \
        sha1/sha1.h \
        ralloc.c \
diff --git a/src/util/meson.build b/src/util/meson.build
index c9cb3e861e9..9bc10222a72 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -45,6 +45,8 @@ files_mesa_util = files(
    'macros.h',
    'mesa-sha1.c',
    'mesa-sha1.h',
+  'program_binary.c',
+  'program_binary.h',
    'sha1/sha1.c',
    'sha1/sha1.h',
    'ralloc.c',
diff --git a/src/util/program_binary.c b/src/util/program_binary.c
new file mode 100644
index 00000000000..4447dd632d9
--- /dev/null
+++ b/src/util/program_binary.c
@@ -0,0 +1,322 @@
+/*
+ * Mesa 3-D graphics library
+ *
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file program_binary.c
+ *
+ * Helper functions for serializing a binary program.
+ */
+
+
+#include "main/mtypes.h"
+#include "crc32.h"
+#include "program_binary.h"
+#include "zlib.h"
+
+/**
+ * Mesa supports one binary format, but it must differentiate between formats
+ * produced by different drivers and different Mesa versions.
+ *
+ * Mesa uses a uint32_t value to specify an internal format. The only format
+ * defined has one uint32_t value of 0, followed by 20 bytes specifying a sha1
+ * that uniquely identifies the Mesa driver type and version.
+ */
+
+struct program_binary_header {
+   /* If internal_format is 0, it must be followed by the 20 byte sha1 that
+    * identifies the Mesa driver and version supported. If we want to support
+    * something besides a sha1, then a new internal_format value can be added.
+    */
+   uint32_t internal_format;
+   uint8_t sha1[20];
+   /* Fields following sha1 can be changed since the sha1 will guarantee that
+    * the binary only works with the same Mesa version.
+    */
+   uint32_t deflated_size;
+   uint32_t inflated_size;
+   uint32_t crc32;
+};
+
+unsigned
+get_program_binary_max_size(unsigned payload_size)
+{
+   return sizeof(struct program_binary_header) + payload_size;

What about arithmetic overflows?


[snip]
+/**
+ * Performs basic checks on a binary to see if it is valid.
+ *
+ * The contents of the payload are not checked.
+ */
+extern bool
+is_program_binary_valid(GLenum binary_format, const void *sha1,
+                        const void *binary, unsigned length);
+
+/**
+ * Finds the offset of the payload within the binary if the payload is
+ * uncompressed.
+ *
+ * If -1 is returned, then the payload was compressed, and
+ * extract_program_binary_payload must be used.
+ */
+extern int
+program_binary_payload_offset(const void *binary, unsigned length);
+
+/**
+ * Decompresses the compressed payload within a binary.
+ *
+ * Before using this function, call program_binary_payload_offset to see if
+ * the payload data is uncompressed in the binary.
+ *
+ * If the data is decompressed, then the returned buffer is must be freed by
+ * the caller with ralloc_free.
+ */
+extern void
+extract_program_binary_payload(const void *binary, unsigned length,
+                               void **payload, unsigned *payload_length);

I think it would be cleaner if these three functions were integrated into one:

bool
extract_program_binary_payload(const void *binary, unsigned length,
                               const void *sha1,
                               void **payload, unsigned *payload_length,
                               void **tempmem);
// caller is supposed to call ralloc_free(*tempmem) unconditionally (though it may be NULL)

This would allow inlining the IMHO awkward simple_header_checks functions and would save all callers from having to duplicate the call sequence for these three functions.

Though checking the binary_format enum would be up to the caller, which also makes more sense since we don't usually deal with GL stuff in src/util.

Cheers,
Nicolai

+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PROGRAM_BINARY_H */



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to