[Mesa-dev] [PATCH 12/24] mesa/st: implement memory objects as a backend for buffer objects

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Jul 26 15:20:00 UTC 2017



On 07/26/2017 01:46 PM, Timothy Arceri wrote:
> From: Andres Rodriguez <andresx7 at gmail.com>
> 
> Use a memory object instead of user memory.
> 
> Signed-off-by: Andres Rodriguez <andresx7 at gmail.com>
> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
> ---
>   src/mesa/main/dd.h                           | 12 +++++
>   src/mesa/state_tracker/st_cb_bufferobjects.c | 66 +++++++++++++++++++++-------
>   2 files changed, 61 insertions(+), 17 deletions(-)
> 
> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
> index ec7a195..27c6efc 100644
> --- a/src/mesa/main/dd.h
> +++ b/src/mesa/main/dd.h
> @@ -1096,6 +1096,18 @@ struct dd_function_table {
>                                                    struct gl_memory_object *mem_obj,
>                                                    GLsizei levels, GLsizei width, GLsizei height,
>                                                    GLsizei depth, GLuint64 offset);
> +
> +   /**
> +    * Use a memory object as the backing data for a buffer object
> +    */
> +   GLboolean (*BufferDataMem)(struct gl_context *ctx,
> +                              GLenum target,
> +                              GLsizeiptrARB size,
> +                              struct gl_memory_object *memObj,
> +                              GLuint64 offset,
> +                              GLenum usage,
> +                              struct gl_buffer_object *bufObj);
> +
>      /*@}*/
>   
>      /**
> diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
> index 68ec250..940c65d 100644
> --- a/src/mesa/state_tracker/st_cb_bufferobjects.c
> +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
> @@ -40,6 +40,7 @@
>   
>   #include "st_context.h"
>   #include "st_cb_bufferobjects.h"
> +#include "st_cb_memoryobjects.h"
>   #include "st_debug.h"
>   
>   #include "pipe/p_context.h"
> @@ -163,27 +164,22 @@ st_bufferobj_get_subdata(struct gl_context *ctx,
>                       offset, size, data);
>   }
>   
> -
> -/**
> - * Allocate space for and store data in a buffer object.  Any data that was
> - * previously stored in the buffer object is lost.  If data is NULL,
> - * memory will be allocated, but no copy will occur.
> - * Called via ctx->Driver.BufferData().
> - * \return GL_TRUE for success, GL_FALSE if out of memory
> - */
> -static GLboolean
> -st_bufferobj_data(struct gl_context *ctx,
> -                  GLenum target,
> -                  GLsizeiptrARB size,
> -                  const void * data,

Extra space.

> -                  GLenum usage,
> -                  GLbitfield storageFlags,
> -                  struct gl_buffer_object *obj)
> +static ALWAYS_INLINE GLboolean
> +bufferobj_data(struct gl_context *ctx,
> +               GLenum target,
> +               GLsizeiptrARB size,
> +               const void * data,
> +               struct gl_memory_object *memObj,
> +               GLuint64 offset,
> +               GLenum usage,
> +               GLbitfield storageFlags,
> +               struct gl_buffer_object *obj)
>   {
>      struct st_context *st = st_context(ctx);
>      struct pipe_context *pipe = st->pipe;
>      struct pipe_screen *screen = pipe->screen;
>      struct st_buffer_object *st_obj = st_buffer_object(obj);
> +   struct st_memory_object *st_mem_obj = st_memory_object(memObj);
>      unsigned bind, pipe_usage, pipe_flags = 0;
>   
>      if (target != GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD &&
> @@ -317,7 +313,12 @@ st_bufferobj_data(struct gl_context *ctx,
>         buffer.depth0 = 1;
>         buffer.array_size = 1;
>   
> -      if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {
> +      if (st_mem_obj) {
> +         st_obj->buffer = screen->resource_from_memobj(screen, &buffer,
> +                                                       st_mem_obj->memory,
> +                                                       offset);
> +      }
> +      else if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {
>            st_obj->buffer =
>               screen->resource_from_user_memory(screen, &buffer, (void*)data);
>         }
> @@ -352,6 +353,36 @@ st_bufferobj_data(struct gl_context *ctx,
>      return GL_TRUE;
>   }
>   
> +/**
> + * Allocate space for and store data in a buffer object.  Any data that was
> + * previously stored in the buffer object is lost.  If data is NULL,
> + * memory will be allocated, but no copy will occur.
> + * Called via ctx->Driver.BufferData().
> + * \return GL_TRUE for success, GL_FALSE if out of memory
> + */
> +static GLboolean
> +st_bufferobj_data(struct gl_context *ctx,
> +                  GLenum target,
> +                  GLsizeiptrARB size,
> +                  const void * data,

Extra space.

With these nitpicks fixed, patch is:

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

> +                  GLenum usage,
> +                  GLbitfield storageFlags,
> +                  struct gl_buffer_object *obj)
> +{
> +   return bufferobj_data(ctx, target, size, data, NULL, 0, usage, storageFlags, obj);
> +}
> +
> +static GLboolean
> +st_bufferobj_data_mem(struct gl_context *ctx,
> +                      GLenum target,
> +                      GLsizeiptrARB size,
> +                      struct gl_memory_object *memObj,
> +                      GLuint64 offset,
> +                      GLenum usage,
> +                      struct gl_buffer_object *bufObj)
> +{
> +   return bufferobj_data(ctx, target, size, NULL, memObj, offset, usage, 0, bufObj);
> +}
>   
>   /**
>    * Called via glInvalidateBuffer(Sub)Data.
> @@ -586,6 +617,7 @@ st_init_bufferobject_functions(struct pipe_screen *screen,
>      functions->NewBufferObject = st_bufferobj_alloc;
>      functions->DeleteBuffer = st_bufferobj_free;
>      functions->BufferData = st_bufferobj_data;
> +   functions->BufferDataMem = st_bufferobj_data_mem;
>      functions->BufferSubData = st_bufferobj_subdata;
>      functions->GetBufferSubData = st_bufferobj_get_subdata;
>      functions->MapBufferRange = st_bufferobj_map_range;
> 


More information about the mesa-dev mailing list