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 */

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to