vbo: move code after declarations to fix MSVC errors
[mesa.git] / src / mesa / vbo / vbo_exec.c
index 7d958732479f90c1c618208b94bca5e3a7f2e03a..81a4d25ff03b9400ae265b07b315d834e109814b 100644 (file)
  */
 
 
-#include "api_arrayelt.h"
-#include "glheader.h"
-#include "imports.h"
-#include "context.h"
-#include "macros.h"
-#include "mtypes.h"
-#include "dlist.h"
-#include "vtxfmt.h"
-
+#include "main/api_arrayelt.h"
+#include "main/glheader.h"
+#include "main/mtypes.h"
+#include "main/vtxfmt.h"
 #include "vbo_context.h"
 
-void vbo_exec_init( GLcontext *ctx )
+
+
+void vbo_exec_init( struct gl_context *ctx )
 {
    struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
 
@@ -58,13 +55,14 @@ void vbo_exec_init( GLcontext *ctx )
 
    ctx->Driver.NeedFlush = 0;
    ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
+   ctx->Driver.BeginVertices = vbo_exec_BeginVertices;
    ctx->Driver.FlushVertices = vbo_exec_FlushVertices;
 
    vbo_exec_invalidate_state( ctx, ~0 );
 }
 
 
-void vbo_exec_destroy( GLcontext *ctx )
+void vbo_exec_destroy( struct gl_context *ctx )
 {
    struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
 
@@ -77,21 +75,70 @@ void vbo_exec_destroy( GLcontext *ctx )
    vbo_exec_array_destroy( exec );
 }
 
-/* Really want to install these callbacks to a central facility to be
+
+/**
+ * Really want to install these callbacks to a central facility to be
  * invoked according to the state flags.  That will have to wait for a
  * mesa rework:
  */ 
-void vbo_exec_invalidate_state( GLcontext *ctx, GLuint new_state )
+void vbo_exec_invalidate_state( struct gl_context *ctx, GLuint new_state )
 {
    struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
 
-   if (new_state & (_NEW_PROGRAM|_NEW_EVAL))
+   if (new_state & (_NEW_PROGRAM|_NEW_ARRAY)) {
+      exec->array.recalculate_inputs = GL_TRUE;
+   }
+
+   if (new_state & _NEW_EVAL)
       exec->eval.recalculate_maps = 1;
 
    _ae_invalidate_state(ctx, new_state);
 }
 
 
-
-
-
+/**
+ * Figure out the number of transform feedback primitives that will be output
+ * by the given _mesa_prim command, assuming that no geometry shading is done
+ * and primitive restart is not used.
+ *
+ * This is intended for use by driver back-ends in implementing the
+ * PRIMITIVES_GENERATED and TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN queries.
+ */
+size_t
+vbo_count_tessellated_primitives(const struct _mesa_prim *prim)
+{
+   size_t num_primitives;
+   switch (prim->mode) {
+   case GL_POINTS:
+      num_primitives = prim->count;
+      break;
+   case GL_LINE_STRIP:
+      num_primitives = prim->count >= 2 ? prim->count - 1 : 0;
+      break;
+   case GL_LINE_LOOP:
+      num_primitives = prim->count >= 2 ? prim->count : 0;
+      break;
+   case GL_LINES:
+      num_primitives = prim->count / 2;
+      break;
+   case GL_TRIANGLE_STRIP:
+   case GL_TRIANGLE_FAN:
+   case GL_POLYGON:
+      num_primitives = prim->count >= 3 ? prim->count - 2 : 0;
+      break;
+   case GL_TRIANGLES:
+      num_primitives = prim->count / 3;
+      break;
+   case GL_QUAD_STRIP:
+      num_primitives = prim->count >= 4 ? ((prim->count / 2) - 1) * 2 : 0;
+      break;
+   case GL_QUADS:
+      num_primitives = (prim->count / 4) * 2;
+      break;
+   default:
+      assert(!"Unexpected primitive type in count_tessellated_primitives");
+      num_primitives = 0;
+      break;
+   }
+   return num_primitives * prim->num_instances;
+}