main: select ES3.2 version when all extensions are available
[mesa.git] / src / mesa / main / transformfeedback.c
index 642fa96477ac3c8a8b38deed6f875eadbf1033f7..c92f0ccd5a5eaf44facc0d6162fc785fa719c27f 100644 (file)
@@ -347,23 +347,25 @@ compute_transform_feedback_buffer_sizes(
  * enabled transform feedback buffers without overflowing any of them.
  */
 unsigned
-_mesa_compute_max_transform_feedback_vertices(
+_mesa_compute_max_transform_feedback_vertices(struct gl_context *ctx,
       const struct gl_transform_feedback_object *obj,
       const struct gl_transform_feedback_info *info)
 {
    unsigned max_index = 0xffffffff;
    unsigned i;
 
-   for (i = 0; i < info->NumBuffers; ++i) {
-      unsigned stride = info->BufferStride[i];
-      unsigned max_for_this_buffer;
+   for (i = 0; i < ctx->Const.MaxTransformFeedbackBuffers; i++) {
+      if ((info->ActiveBuffers >> i) & 1) {
+         unsigned stride = info->Buffers[i].Stride;
+         unsigned max_for_this_buffer;
 
-      /* Skip any inactive buffers, which have a stride of 0. */
-      if (stride == 0)
-        continue;
+         /* Skip any inactive buffers, which have a stride of 0. */
+         if (stride == 0)
+           continue;
 
-      max_for_this_buffer = obj->Size[i] / (4 * stride);
-      max_index = MIN2(max_index, max_for_this_buffer);
+         max_for_this_buffer = obj->Size[i] / (4 * stride);
+         max_index = MIN2(max_index, max_for_this_buffer);
+      }
    }
 
    return max_index;
@@ -445,12 +447,14 @@ _mesa_BeginTransformFeedback(GLenum mode)
       return;
    }
 
-   for (i = 0; i < info->NumBuffers; ++i) {
-      if (obj->BufferNames[i] == 0) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glBeginTransformFeedback(binding point %d does not have "
-                     "a buffer object bound)", i);
-         return;
+   for (i = 0; i < ctx->Const.MaxTransformFeedbackBuffers; i++) {
+      if ((info->ActiveBuffers >> i) & 1) {
+         if (obj->BufferNames[i] == 0) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glBeginTransformFeedback(binding point %d does not "
+                        "have a buffer object bound)", i);
+            return;
+         }
       }
    }
 
@@ -470,7 +474,7 @@ _mesa_BeginTransformFeedback(GLenum mode)
        * feedback.
        */
       unsigned max_vertices
-         = _mesa_compute_max_transform_feedback_vertices(obj, info);
+         = _mesa_compute_max_transform_feedback_vertices(ctx, obj, info);
       obj->GlesRemainingPrims = max_vertices / vertices_per_prim;
    }
 
@@ -706,13 +710,6 @@ _mesa_TransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer)
    struct gl_transform_feedback_object *obj;
    struct gl_buffer_object *bufObj;
 
-   if (!ctx->Extensions.ARB_direct_state_access) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glTransformFeedbackBufferBase(GL_ARB_direct_state_access "
-                  "is not supported)");
-      return;
-   }
-
    obj = lookup_transform_feedback_object_err(ctx, xfb,
                                               "glTransformFeedbackBufferBase");
    if(!obj) {
@@ -736,13 +733,6 @@ _mesa_TransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer,
    struct gl_transform_feedback_object *obj;
    struct gl_buffer_object *bufObj;
 
-   if (!ctx->Extensions.ARB_direct_state_access) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glTransformFeedbackBufferRange(GL_ARB_direct_state_access "
-                  "is not supported)");
-      return;
-   }
-
    obj = lookup_transform_feedback_object_err(ctx, xfb,
                                               "glTransformFeedbackBufferRange");
    if(!obj) {
@@ -875,7 +865,7 @@ _mesa_TransformFeedbackVaryings(GLuint program, GLsizei count,
          if (buffers > ctx->Const.MaxTransformFeedbackBuffers) {
             _mesa_error(ctx, GL_INVALID_OPERATION,
                         "glTransformFeedbackVaryings(too many gl_NextBuffer "
-                        "occurences)");
+                        "occurrences)");
             return;
          }
       } else {
@@ -1059,13 +1049,6 @@ _mesa_CreateTransformFeedbacks(GLsizei n, GLuint *names)
 {
    GET_CURRENT_CONTEXT(ctx);
 
-   if (!ctx->Extensions.ARB_direct_state_access) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glCreateTransformFeedbacks(GL_ARB_direct_state_access "
-                  "is not supported)");
-      return;
-   }
-
    create_transform_feedbacks(ctx, n, names, true);
 }
 
@@ -1157,6 +1140,11 @@ _mesa_DeleteTransformFeedbacks(GLsizei n, const GLuint *names)
             }
             _mesa_HashRemove(ctx->TransformFeedback.Objects, names[i]);
             /* unref, but object may not be deleted until later */
+            if (obj == ctx->TransformFeedback.CurrentObject) {
+               reference_transform_feedback_object(
+                     &ctx->TransformFeedback.CurrentObject,
+                     ctx->TransformFeedback.DefaultObject);
+            }
             reference_transform_feedback_object(&obj, NULL);
          }
       }
@@ -1236,13 +1224,6 @@ _mesa_GetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
     struct gl_transform_feedback_object *obj;
     GET_CURRENT_CONTEXT(ctx);
 
-    if (!ctx->Extensions.ARB_direct_state_access) {
-       _mesa_error(ctx, GL_INVALID_OPERATION,
-                   "glGetTransformFeedbackiv(GL_ARB_direct_state_access "
-                   "is not supported)");
-       return;
-    }
-
     obj = lookup_transform_feedback_object_err(ctx, xfb,
                                                "glGetTransformFeedbackiv");
     if(!obj) {
@@ -1269,13 +1250,6 @@ _mesa_GetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index,
    struct gl_transform_feedback_object *obj;
    GET_CURRENT_CONTEXT(ctx);
 
-   if (!ctx->Extensions.ARB_direct_state_access) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glGetTransformFeedbacki_v(GL_ARB_direct_state_access "
-                  "is not supported)");
-      return;
-   }
-
    obj = lookup_transform_feedback_object_err(ctx, xfb,
                                               "glGetTransformFeedbacki_v");
    if(!obj) {
@@ -1305,13 +1279,6 @@ _mesa_GetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index,
    struct gl_transform_feedback_object *obj;
    GET_CURRENT_CONTEXT(ctx);
 
-   if (!ctx->Extensions.ARB_direct_state_access) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glGetTransformFeedbacki64_v(GL_ARB_direct_state_access "
-                  "is not supported)");
-      return;
-   }
-
    obj = lookup_transform_feedback_object_err(ctx, xfb,
                                               "glGetTransformFeedbacki64_v");
    if(!obj) {