mesa: Add indexed binding points for uniform buffer objects.
[mesa.git] / src / mesa / main / bufferobj.c
index b646baa41a147c8913f318b6a28c03f8c74015e0..3fc2908620416955316a4ce7d0f4b0c8518d4252 100644 (file)
@@ -603,6 +603,8 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
 void
 _mesa_init_buffer_objects( struct gl_context *ctx )
 {
+   GLuint 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++) {
+      _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 )
 {
+   GLuint 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;
 }