Make IsTransformFeedback() return false before BindTransformFeedback()
authorMatt Turner <mattst88@gmail.com>
Wed, 19 Dec 2012 21:43:31 +0000 (13:43 -0800)
committerMatt Turner <mattst88@gmail.com>
Sat, 22 Dec 2012 04:03:07 +0000 (20:03 -0800)
The GL 4.3 an ES 3.0 specs say

   A transform feedback object is created by binding a name returned by
   GenTransformFeedbacks with the command
      void BindTransformFeedback( enum target, uint id );

Fixes arb_transform_feedback2-istransformfeedback and part of
es3conform's CoverageES30.test.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/main/mtypes.h
src/mesa/main/transformfeedback.c

index 097cdc14f58cb98328e4fd98da88a3e0573b8353..a14520fb23cff178c6057e0fb79b58e608bc86b5 100644 (file)
@@ -1807,6 +1807,7 @@ struct gl_transform_feedback_object
    GLboolean Paused;  /**< Is transform feedback paused? */
    GLboolean EndedAnytime; /**< Has EndTransformFeedback been called
                                 at least once? */
+   GLboolean EverBound; /**< Has this object been bound? */
 
    /**
     * GLES: if Active is true, remaining number of primitives which can be
index 42f38e0cc4a200930d7a1f8e3bb3cf38aa27d8d6..1bf4beaeb0802342760908f414cd0240806f4a1c 100644 (file)
@@ -80,6 +80,7 @@ reference_transform_feedback_object(struct gl_transform_feedback_object **ptr,
       }
       else {
          obj->RefCount++;
+         obj->EverBound = GL_TRUE;
          *ptr = obj;
       }
    }
@@ -178,6 +179,7 @@ new_transform_feedback(struct gl_context *ctx, GLuint name)
    if (obj) {
       obj->Name = name;
       obj->RefCount = 1;
+      obj->EverBound = GL_FALSE;
    }
    return obj;
 }
@@ -793,14 +795,19 @@ _mesa_GenTransformFeedbacks(GLsizei n, GLuint *names)
 GLboolean GLAPIENTRY
 _mesa_IsTransformFeedback(GLuint name)
 {
+   struct gl_transform_feedback_object *obj;
    GET_CURRENT_CONTEXT(ctx);
 
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
-   if (name && _mesa_lookup_transform_feedback_object(ctx, name))
-      return GL_TRUE;
-   else
+   if (name == 0)
+      return GL_FALSE;
+
+   obj = _mesa_lookup_transform_feedback_object(ctx, name);
+   if (obj == NULL)
       return GL_FALSE;
+
+   return obj->EverBound;
 }