[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