mesa/main: fix inverted condition
[mesa.git] / src / mesa / main / transformfeedback.c
index 8eccdc20b7664b1deea624e7c0002fd144e16cdc..5826447844ab51ae51abf61f63ca75ed82c43ced 100644 (file)
@@ -43,6 +43,8 @@
 #include "program/program.h"
 #include "program/prog_parameter.h"
 
+#include "util/u_memory.h"
+
 struct using_program_tuple
 {
    struct gl_program *prog;
@@ -142,8 +144,7 @@ _mesa_init_transform_feedback(struct gl_context *ctx)
    ctx->TransformFeedback.Objects = _mesa_NewHashTable();
 
    _mesa_reference_buffer_object(ctx,
-                                 &ctx->TransformFeedback.CurrentBuffer,
-                                 ctx->Shared->NullBufferObj);
+                                 &ctx->TransformFeedback.CurrentBuffer, NULL);
 }
 
 
@@ -198,6 +199,27 @@ _mesa_init_transform_feedback_object(struct gl_transform_feedback_object *obj,
    obj->EverBound = GL_FALSE;
 }
 
+/**
+ * Delete a transform feedback object.  Called via
+ * ctx->Driver->DeleteTransformFeedback, if not overwritten by driver.  In
+ * the latter case, called from the driver after all driver-specific clean-up
+ * has been done.
+ *
+ * \param ctx GL context to wich transform feedback object belongs.
+ * \param obj Transform feedback object due to be deleted.
+ */
+void
+_mesa_delete_transform_feedback_object(struct gl_context *ctx,
+                                       struct gl_transform_feedback_object
+                                              *obj)
+{
+   for (unsigned i = 0; i < ARRAY_SIZE(obj->Buffers); i++) {
+      _mesa_reference_buffer_object(ctx, &obj->Buffers[i], NULL);
+   }
+
+   free(obj->Label);
+   free(obj);
+}
 
 /** Default fallback for ctx->Driver.NewTransformFeedback() */
 static struct gl_transform_feedback_object *
@@ -213,22 +235,6 @@ new_transform_feedback_fallback(struct gl_context *ctx, GLuint name)
    return obj;
 }
 
-/** Default fallback for ctx->Driver.DeleteTransformFeedback() */
-static void
-delete_transform_feedback_fallback(struct gl_context *ctx,
-                                   struct gl_transform_feedback_object *obj)
-{
-   GLuint i;
-
-   for (i = 0; i < ARRAY_SIZE(obj->Buffers); i++) {
-      _mesa_reference_buffer_object(ctx, &obj->Buffers[i], NULL);
-   }
-
-   free(obj->Label);
-   free(obj);
-}
-
-
 /** Default fallback for ctx->Driver.BeginTransformFeedback() */
 static void
 begin_transform_feedback_fallback(struct gl_context *ctx, GLenum mode,
@@ -270,7 +276,7 @@ void
 _mesa_init_transform_feedback_functions(struct dd_function_table *driver)
 {
    driver->NewTransformFeedback = new_transform_feedback_fallback;
-   driver->DeleteTransformFeedback = delete_transform_feedback_fallback;
+   driver->DeleteTransformFeedback = _mesa_delete_transform_feedback_object;
    driver->BeginTransformFeedback = begin_transform_feedback_fallback;
    driver->EndTransformFeedback = end_transform_feedback_fallback;
    driver->PauseTransformFeedback = pause_transform_feedback_fallback;
@@ -629,7 +635,7 @@ _mesa_validate_buffer_range_xfb(struct gl_context *ctx,
       return false;
    }
 
-   if (size <= 0 && (dsa || bufObj != ctx->Shared->NullBufferObj)) {
+   if (size <= 0 && (dsa || bufObj)) {
       /* OpenGL 4.5 core profile, 6.1, pdf page 82: "An INVALID_VALUE error is
        * generated by BindBufferRange if buffer is non-zero and size is less
        * than or equal to zero."
@@ -705,20 +711,22 @@ lookup_transform_feedback_object_err(struct gl_context *ctx,
  */
 static struct gl_buffer_object *
 lookup_transform_feedback_bufferobj_err(struct gl_context *ctx,
-                                        GLuint buffer, const char* func)
+                                        GLuint buffer, const char* func,
+                                        bool *error)
 {
-   struct gl_buffer_object *bufObj;
+   struct gl_buffer_object *bufObj = NULL;
+
+   *error = false;
 
    /* OpenGL 4.5 core profile, 13.2, pdf page 444: buffer must be zero or the
     * name of an existing buffer object.
     */
-   if (buffer == 0) {
-      bufObj = ctx->Shared->NullBufferObj;
-   } else {
+   if (buffer) {
       bufObj = _mesa_lookup_bufferobj(ctx, buffer);
       if (!bufObj) {
          _mesa_error(ctx, GL_INVALID_VALUE, "%s(invalid buffer=%u)", func,
                      buffer);
+         *error = true;
       }
    }
 
@@ -738,9 +746,11 @@ _mesa_TransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
       return;
    }
 
+   bool error;
    bufObj = lookup_transform_feedback_bufferobj_err(ctx, buffer,
-                                              "glTransformFeedbackBufferBase");
-   if (!bufObj) {
+                                              "glTransformFeedbackBufferBase",
+                                                    &error);
+   if (error) {
       return;
    }
 
@@ -761,9 +771,11 @@ _mesa_TransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer,
       return;
    }
 
+   bool error;
    bufObj = lookup_transform_feedback_bufferobj_err(ctx, buffer,
-                                              "glTransformFeedbackBufferRange");
-   if (!bufObj) {
+                                              "glTransformFeedbackBufferRange",
+                                                    &error);
+   if (error) {
       return;
    }
 
@@ -789,7 +801,7 @@ bind_buffer_offset(struct gl_context *ctx,
    struct gl_buffer_object *bufObj;
 
    if (buffer == 0) {
-      bufObj = ctx->Shared->NullBufferObj;
+      bufObj = NULL;
    } else {
       bufObj = _mesa_lookup_bufferobj(ctx, buffer);
       if (!no_error && !bufObj) {