glthread: track instance divisor changes
[mesa.git] / src / mesa / main / transformfeedback.c
index 06719b1ce827dda23a6c777607c809abf3008534..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);
 }
 
 
@@ -634,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."
@@ -710,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;
       }
    }
 
@@ -743,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;
    }
 
@@ -766,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;
    }
 
@@ -794,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) {