[Mesa-dev] [PATCH 4/9] mesa: Add indexed binding points for uniform buffer objects.

Brian Paul brianp at vmware.com
Tue Jun 19 07:09:37 PDT 2012


On 06/18/2012 07:35 PM, Eric Anholt wrote:
> ---
>   src/mesa/main/bufferobj.c |   29 +++++++++++++++++++++++++++++
>   src/mesa/main/mtypes.h    |   22 ++++++++++++++++++++++
>   2 files changed, 51 insertions(+)
>
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index b646baa..ecfa7af 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -603,6 +603,8 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
>   void
>   _mesa_init_buffer_objects( struct gl_context *ctx )
>   {
> +   int i;
> +
>      memset(&DummyBufferObject, 0, sizeof(DummyBufferObject));
>      _glthread_INIT_MUTEX(DummyBufferObject.Mutex);
>      DummyBufferObject.RefCount = 1000*1000*1000; /* never delete */
> @@ -614,16 +616,43 @@ _mesa_init_buffer_objects( struct gl_context *ctx )
>                                    ctx->Shared->NullBufferObj);
>      _mesa_reference_buffer_object(ctx,&ctx->CopyWriteBuffer,
>                                    ctx->Shared->NullBufferObj);
> +
> +   ctx->UniformBufferBindings = calloc(ctx->Const.MaxUniformBufferBindings,
> +				      sizeof(*ctx->UniformBufferBindings));
> +
> +   _mesa_reference_buffer_object(ctx,&ctx->UniformBuffer,
> +				 ctx->Shared->NullBufferObj);
> +
> +   for (i = 0; i<  ctx->Const.MaxUniformBufferBindings; i++) {

Since i is int and MaxUniformBufferBindings is GLuint this will 
generate a signed/unsigned comparison warning with MSVC.  Could you 
change 'int i' to 'GLuint i'?

Same thing below.

> +      _mesa_reference_buffer_object(ctx,
> +				&ctx->UniformBufferBindings[i].BufferObject,
> +				    ctx->Shared->NullBufferObj);
> +      ctx->UniformBufferBindings[i].Offset = -1;
> +      ctx->UniformBufferBindings[i].Size = -1;
> +   }
>   }
>
>
>   void
>   _mesa_free_buffer_objects( struct gl_context *ctx )
>   {
> +   int i;
> +
>      _mesa_reference_buffer_object(ctx,&ctx->Array.ArrayBufferObj, NULL);
>
>      _mesa_reference_buffer_object(ctx,&ctx->CopyReadBuffer, NULL);
>      _mesa_reference_buffer_object(ctx,&ctx->CopyWriteBuffer, NULL);
> +
> +   _mesa_reference_buffer_object(ctx,&ctx->UniformBuffer, NULL);
> +
> +   for (i = 0; i<  ctx->Const.MaxUniformBufferBindings; i++) {
> +      _mesa_reference_buffer_object(ctx,
> +				&ctx->UniformBufferBindings[i].BufferObject,
> +				    NULL);
> +   }
> +
> +   free(ctx->UniformBufferBindings);
> +   ctx->UniformBufferBindings = NULL;
>   }
>
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index ef72ca1..b40dea6 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3294,6 +3294,20 @@ struct gl_driver_flags
>      GLbitfield NewArray;             /**<  Vertex array state */
>   };
>
> +struct gl_uniform_buffer_binding
> +{
> +   struct gl_buffer_object *BufferObject;
> +   /** Start of uniform block data in the buffer */
> +   GLintptr Offset;
> +   /** Size of data allowed to be referenced from the buffer (in bytes) */
> +   GLsizeiptr Size;
> +   /**
> +    * glBindBufferBase() indicates that the Size should be ignored and only
> +    * limited by the current size of the BufferObject.
> +    */
> +   GLboolean AutomaticSize;
> +};
> +
>   /**
>    * Mesa rendering context.
>    *
> @@ -3436,6 +3450,14 @@ struct gl_context
>       */
>      struct gl_buffer_object *UniformBuffer;
>
> +   /**
> +    * Array of uniform buffers for GL_ARB_uniform_buffer_object and GL 3.1.
> +    * This is set up using glBindBufferRange() or glBindBufferBase().  They are
> +    * associated with uniform blocks by glUniformBlockBinding()'s state in the
> +    * shader program.
> +    */
> +   struct gl_uniform_buffer_binding *UniformBufferBindings;
> +
>      /*@}*/
>
>      struct gl_meta_state *Meta;  /**<  for "meta" operations */



More information about the mesa-dev mailing list