[Mesa-dev] [PATCH 3/8] compiler/blob: Rework blob_reserve_bytes

Jason Ekstrand jason at jlekstrand.net
Sat Sep 16 01:39:30 UTC 2017


This commit primarily makes two changes.  First, blob_reserve_bytes now
takes an alignment parameter.  Second, we now return an offset into the
blob instead of a pointer and leave the pointer arithmetic to the
caller.  This way you can call blob_reserve_bytes, emit a bunch more
stuff, and then come back and fill in the reserved data.
---
 src/compiler/blob.c                 | 14 ++++++++------
 src/compiler/blob.h                 |  8 ++++----
 src/compiler/glsl/tests/blob_test.c |  7 ++++---
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/src/compiler/blob.c b/src/compiler/blob.c
index 3c4aed8..7324a6b 100644
--- a/src/compiler/blob.c
+++ b/src/compiler/blob.c
@@ -139,18 +139,20 @@ blob_write_bytes(struct blob *blob, const void *bytes, size_t to_write)
    return true;
 }
 
-uint8_t *
-blob_reserve_bytes(struct blob *blob, size_t to_write)
+size_t
+blob_reserve_bytes(struct blob *blob, size_t to_write, size_t align)
 {
-   uint8_t *ret;
+   size_t offset;
+
+   align_blob(blob, align);
 
    if (! grow_to_fit (blob, to_write))
-      return NULL;
+      return (size_t)-1;
 
-   ret = blob->data + blob->size;
+   offset = blob->size;
    blob->size += to_write;
 
-   return ret;
+   return offset;
 }
 
 bool
diff --git a/src/compiler/blob.h b/src/compiler/blob.h
index 940c81e..e1f7fe7 100644
--- a/src/compiler/blob.h
+++ b/src/compiler/blob.h
@@ -113,11 +113,11 @@ blob_write_bytes(struct blob *blob, const void *bytes, size_t to_write);
  * that is not aware of the blob API, (so that blob_write_bytes cannot be
  * called).
  *
- * \return A pointer to space allocated within \blob to which \to_write bytes
- * can be written, (or NULL in case of any allocation error).
+ * \return The offset into \blob at which \to_write bytes can be written, (or
+ * NULL in case of any allocation error).
  */
-uint8_t *
-blob_reserve_bytes(struct blob *blob, size_t to_write);
+size_t
+blob_reserve_bytes(struct blob *blob, size_t to_write, size_t align);
 
 /**
  * Overwrite some data previously written to the blob.
diff --git a/src/compiler/glsl/tests/blob_test.c b/src/compiler/glsl/tests/blob_test.c
index df0e91a..e82ceb1 100644
--- a/src/compiler/glsl/tests/blob_test.c
+++ b/src/compiler/glsl/tests/blob_test.c
@@ -120,7 +120,7 @@ test_write_and_read_functions (void)
 {
    struct blob *blob;
    struct blob_reader reader;
-   uint8_t *reserved;
+   size_t reserved_offset;
    size_t str_offset, uint_offset;
    uint8_t reserve_buf[sizeof(reserve_test_str)];
 
@@ -130,8 +130,9 @@ test_write_and_read_functions (void)
 
    blob_write_bytes(blob, bytes_test_str, sizeof(bytes_test_str));
 
-   reserved = blob_reserve_bytes(blob, sizeof(reserve_test_str));
-   memcpy(reserved, reserve_test_str, sizeof(reserve_test_str));
+   reserved_offset = blob_reserve_bytes(blob, sizeof(reserve_test_str), 1);
+   memcpy(blob->data + reserved_offset,
+          reserve_test_str, sizeof(reserve_test_str));
 
    /* Write a placeholder, (to be replaced later via overwrite_bytes) */
    str_offset = blob->size;
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list