summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/blob.c23
-rw-r--r--src/glsl/blob.h43
2 files changed, 66 insertions, 0 deletions
diff --git a/src/glsl/blob.c b/src/glsl/blob.c
index a4003cf7178..dd4341be961 100644
--- a/src/glsl/blob.c
+++ b/src/glsl/blob.c
@@ -101,6 +101,21 @@ blob_create(void *mem_ctx)
}
bool
+blob_overwrite_bytes(struct blob *blob,
+ size_t offset,
+ const void *bytes,
+ size_t to_write)
+{
+ /* Detect an attempt to overwrite data out of bounds. */
+ if (offset < 0 || blob->size - offset < to_write)
+ return false;
+
+ memcpy(blob->data + offset, bytes, to_write);
+
+ return true;
+}
+
+bool
blob_write_bytes(struct blob *blob, const void *bytes, size_t to_write)
{
if (! grow_to_fit(blob, to_write))
@@ -135,6 +150,14 @@ blob_write_uint32(struct blob *blob, uint32_t value)
}
bool
+blob_overwrite_uint32 (struct blob *blob,
+ size_t offset,
+ uint32_t value)
+{
+ return blob_overwrite_bytes(blob, offset, &value, sizeof(value));
+}
+
+bool
blob_write_uint64(struct blob *blob, uint64_t value)
{
align_blob(blob, sizeof(value));
diff --git a/src/glsl/blob.h b/src/glsl/blob.h
index af32d22e498..ec903ec140f 100644
--- a/src/glsl/blob.h
+++ b/src/glsl/blob.h
@@ -108,6 +108,24 @@ uint8_t *
blob_reserve_bytes (struct blob *blob, size_t to_write);
/**
+ * Overwrite some data previously written to the blob.
+ *
+ * Writes data to an existing portion of the blob at an offset of \offset.
+ * This data range must have previously been written to the blob by one of the
+ * blob_write_* calls.
+ *
+ * For example usage, see blob_overwrite_uint32
+ *
+ * \return True unless the requested offset or offset+to_write lie outside
+ * the current blob's size.
+ */
+bool
+blob_overwrite_bytes (struct blob *blob,
+ size_t offset,
+ const void *bytes,
+ size_t to_write);
+
+/**
* Add a uint32_t to a blob.
*
* \note This function will only write to a uint32_t-aligned offset from the
@@ -121,6 +139,31 @@ bool
blob_write_uint32 (struct blob *blob, uint32_t value);
/**
+ * Overwrite a uint32_t previously written to the blob.
+ *
+ * Writes a uint32_t value to an existing portion of the blob at an offset of
+ * \offset. This data range must have previously been written to the blob by
+ * one of the blob_write_* calls.
+ *
+ *
+ * The expected usage is something like the following pattern:
+ *
+ * size_t offset;
+ *
+ * offset = blob->size;
+ * blob_write_uint32 (blob, 0); // placeholder
+ * ... various blob write calls, writing N items ...
+ * blob_overwrite_uint32 (blob, offset, N);
+ *
+ * \return True unless the requested position or position+to_write lie outside
+ * the current blob's size.
+ */
+bool
+blob_overwrite_uint32 (struct blob *blob,
+ size_t offset,
+ uint32_t value);
+
+/**
* Add a uint64_t to a blob.
*
* \note This function will only write to a uint64_t-aligned offset from the