[Mesa-dev] [PATCH 04/21] mesa: implement sparse buffer commitment
Ian Romanick
idr at freedesktop.org
Thu Feb 9 14:07:59 UTC 2017
Patches 1, 2, and 4 are
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
I sent some comments on patch 3, and I'll leave review of the Gallium
patches to people who actually know Gallium. :)
On 02/08/2017 01:42 PM, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> ---
> src/mesa/main/bufferobj.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++
> src/mesa/main/dd.h | 10 +++++++
> 2 files changed, 76 insertions(+)
>
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index 5f23868..14b4eef 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -4057,14 +4057,80 @@ _mesa_InvalidateBufferData(GLuint buffer)
> ctx->Driver.InvalidateBufferSubData(ctx, bufObj, 0, bufObj->Size);
> }
>
> +static void
> +buffer_page_commitment(struct gl_context *ctx,
> + struct gl_buffer_object *bufferObj,
> + GLintptr offset, GLsizeiptr size,
> + GLboolean commit, const char *func)
> +{
> + if (!(bufferObj->StorageFlags & GL_SPARSE_STORAGE_BIT_ARB)) {
> + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(not a sparse buffer object)",
> + func);
> + return;
> + }
> +
> + if (size < 0 || size > bufferObj->Size ||
> + offset < 0 || offset > bufferObj->Size - size) {
> + _mesa_error(ctx, GL_INVALID_VALUE, "%s(out of bounds)",
> + func);
> + return;
> + }
> +
> + /* The GL_ARB_sparse_buffer extension specification says:
> + *
> + * "INVALID_VALUE is generated by BufferPageCommitmentARB if <offset> is
> + * not an integer multiple of SPARSE_BUFFER_PAGE_SIZE_ARB, or if <size>
> + * is not an integer multiple of SPARSE_BUFFER_PAGE_SIZE_ARB and does
> + * not extend to the end of the buffer's data store."
> + */
> + if (offset % ctx->Const.SparseBufferPageSize != 0) {
> + _mesa_error(ctx, GL_INVALID_VALUE, "%s(offset not aligned to page size)",
> + func);
> + return;
> + }
> +
> + if (size % ctx->Const.SparseBufferPageSize != 0 &&
> + offset + size != bufferObj->Size) {
> + _mesa_error(ctx, GL_INVALID_VALUE, "%s(size not aligned to page size)",
> + func);
> + return;
> + }
> +
> + ctx->Driver.BufferPageCommitment(ctx, bufferObj, offset, size, commit);
> +}
> +
> void GLAPIENTRY
> _mesa_BufferPageCommitmentARB(GLenum target, GLintptr offset, GLsizeiptr size,
> GLboolean commit)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_buffer_object *bufferObj;
> +
> + bufferObj = get_buffer(ctx, "glBufferPageCommitmentARB", target,
> + GL_INVALID_ENUM);
> + if (!bufferObj)
> + return;
> +
> + buffer_page_commitment(ctx, bufferObj, offset, size, commit,
> + "glBufferPageCommitmentARB");
> }
>
> void GLAPIENTRY
> _mesa_NamedBufferPageCommitmentARB(GLuint buffer, GLintptr offset,
> GLsizeiptr size, GLboolean commit)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_buffer_object *bufferObj;
> +
> + bufferObj = _mesa_lookup_bufferobj(ctx, buffer);
> + if (!bufferObj || bufferObj == &DummyBufferObject) {
> + /* Note: the extension spec is not clear about the excpected error value. */
> + _mesa_error(ctx, GL_INVALID_VALUE,
> + "glNamedBufferPageCommitmentARB(name = %u) invalid object",
> + buffer);
> + return;
> + }
> +
> + buffer_page_commitment(ctx, bufferObj, offset, size, commit,
> + "glNamedBufferPageCommitmentARB");
> }
> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
> index 7ebd084..4fe9d5e 100644
> --- a/src/mesa/main/dd.h
> +++ b/src/mesa/main/dd.h
> @@ -984,6 +984,16 @@ struct dd_function_table {
> */
> void (*QueryMemoryInfo)(struct gl_context *ctx,
> struct gl_memory_info *info);
> +
> + /**
> + * \name GL_ARB_sparse_buffer interface
> + */
> + /*@{*/
> + void (*BufferPageCommitment)(struct gl_context *ctx,
> + struct gl_buffer_object *bufferObj,
> + GLintptr offset, GLsizeiptr size,
> + GLboolean commit);
> + /*@}*/
> };
>
>
>
More information about the mesa-dev
mailing list