[Mesa-dev] [PATCH 2/2] glsl: Add blob_overwrite_bytes and blob_overwrite_uint32
Jason Ekstrand
jason at jlekstrand.net
Thu Dec 11 21:25:21 PST 2014
On Dec 11, 2014 11:55 AM, "Carl Worth" <cworth at cworth.org> wrote:
>
> From: Tapani Pälli <tapani.palli at intel.com>
>
> These functions are useful when serializing an unknown number of items
> to a blob. The caller can first save the current offset, write a
> placeholder uint32, write out (and count) the items, then use
> blob_overwrite_uint32 with the saved offset to replace the placeholder
> value.
>
> Then, when deserializing, the reader will first read the count and
> know how many subsequent items to expect.
>
> (I wrote this code after reading a very similar patch written by
> Tapani when he wrote serialization code for IR. Since I re-used the
> idea of his code so directly, I've credited him as the author of this
> code. --Carl)
> ---
> src/glsl/blob.c | 23 +++++++++++++++++++++++
> src/glsl/blob.h | 25 +++++++++++++++++++++++++
> 2 files changed, 48 insertions(+)
>
> diff --git a/src/glsl/blob.c b/src/glsl/blob.c
> index 0af71fc..dbd698a 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 374b21e..165de13 100644
> --- a/src/glsl/blob.h
> +++ b/src/glsl/blob.h
> @@ -138,6 +138,31 @@ bool
> blob_write_uint32 (struct blob *blob, uint32_t value);
The header entry for overwrite_bytes should go in this patch rather than
the first one.
>
> /**
> + * 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
> --
> 2.1.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141211/f1042f04/attachment.html>
More information about the mesa-dev
mailing list