mesa: Always initialize transform feedback state.
authorChia-I Wu <olv@lunarg.com>
Tue, 6 Jul 2010 08:27:20 +0000 (16:27 +0800)
committerChia-I Wu <olv@lunarg.com>
Tue, 6 Jul 2010 09:03:32 +0000 (17:03 +0800)
Assert ctx->Driver.NewTransformFeedback if the feature is enabled;  Use
the default callbacks otherwise.  The rest of core mesa expects the
state to be initialized.

src/mesa/main/transformfeedback.c
src/mesa/main/transformfeedback.h

index 26a3a4b3d0d3d48b1fe5923a879fc77529562fd4..f86f1911d1daea8702d7eb61649f1c4d33210698 100644 (file)
@@ -134,10 +134,8 @@ _mesa_validate_transform_feedback_buffers(GLcontext *ctx)
 void
 _mesa_init_transform_feedback(GLcontext *ctx)
 {
-   if (!ctx->Driver.NewTransformFeedback) {
-      /* this feature/extension may not be supported by the driver */
-      return;
-   }
+   /* core mesa expects this, even a dummy one, to be available */
+   ASSERT(ctx->Driver.NewTransformFeedback);
 
    ctx->TransformFeedback.DefaultObject =
       ctx->Driver.NewTransformFeedback(ctx, 0);
@@ -178,10 +176,8 @@ delete_cb(GLuint key, void *data, void *userData)
 void
 _mesa_free_transform_feedback(GLcontext *ctx)
 {
-   if (!ctx->Driver.NewTransformFeedback) {
-      /* this feature/extension may not be supported by the driver */
-      return;
-   }
+   /* core mesa expects this, even a dummy one, to be available */
+   ASSERT(ctx->Driver.NewTransformFeedback);
 
    _mesa_reference_buffer_object(ctx,
                                  &ctx->TransformFeedback.CurrentBuffer,
@@ -200,6 +196,40 @@ _mesa_free_transform_feedback(GLcontext *ctx)
 }
 
 
+#else /* FEATURE_EXT_transform_feedback */
+
+/* forward declarations */
+static struct gl_transform_feedback_object *
+new_transform_feedback(GLcontext *ctx, GLuint name);
+
+static void
+delete_transform_feedback(GLcontext *ctx,
+                          struct gl_transform_feedback_object *obj);
+
+/* dummy per-context init/clean-up for transform feedback */
+void
+_mesa_init_transform_feedback(GLcontext *ctx)
+{
+   ctx->TransformFeedback.DefaultObject = new_transform_feedback(ctx, 0);
+   ctx->TransformFeedback.CurrentObject = ctx->TransformFeedback.DefaultObject;
+   _mesa_reference_buffer_object(ctx,
+                                 &ctx->TransformFeedback.CurrentBuffer,
+                                 ctx->Shared->NullBufferObj);
+}
+
+void
+_mesa_free_transform_feedback(GLcontext *ctx)
+{
+   _mesa_reference_buffer_object(ctx,
+                                 &ctx->TransformFeedback.CurrentBuffer,
+                                 NULL);
+   ctx->TransformFeedback.CurrentObject = NULL;
+   delete_transform_feedback(ctx, ctx->TransformFeedback.DefaultObject);
+}
+
+#endif /* FEATURE_EXT_transform_feedback */
+
+
 /** Default fallback for ctx->Driver.NewTransformFeedback() */
 static struct gl_transform_feedback_object *
 new_transform_feedback(GLcontext *ctx, GLuint name)
@@ -227,6 +257,10 @@ delete_transform_feedback(GLcontext *ctx,
    free(obj);
 }
 
+
+#if FEATURE_EXT_transform_feedback
+
+
 /** Default fallback for ctx->Driver.BeginTransformFeedback() */
 static void
 begin_transform_feedback(GLcontext *ctx, GLenum mode,
index b806488abdd653d4628eb24443d9c7aa73710cc9..4d38522d6d96bc331f715a48e889aa5041b76679 100644 (file)
 #include "main/mtypes.h"
 
 
+extern void
+_mesa_init_transform_feedback(GLcontext *ctx);
+
+extern void
+_mesa_free_transform_feedback(GLcontext *ctx);
+
 #if FEATURE_EXT_transform_feedback
 
 extern GLboolean
@@ -36,12 +42,6 @@ _mesa_validate_primitive_mode(GLcontext *ctx, GLenum mode);
 extern GLboolean
 _mesa_validate_transform_feedback_buffers(GLcontext *ctx);
 
-extern void
-_mesa_init_transform_feedback(GLcontext *ctx);
-
-extern void
-_mesa_free_transform_feedback(GLcontext *ctx);
-
 
 extern void
 _mesa_init_transform_feedback_functions(struct dd_function_table *driver);
@@ -117,16 +117,6 @@ _mesa_validate_transform_feedback_buffers(GLcontext *ctx)
    return GL_TRUE;
 }
 
-static INLINE void
-_mesa_init_transform_feedback(GLcontext *ctx)
-{
-}
-
-static INLINE void
-_mesa_free_transform_feedback(GLcontext *ctx)
-{
-}
-
 static INLINE void
 _mesa_init_transform_feedback_functions(struct dd_function_table *driver)
 {