gallivm: Add a lp_build_const_func_pointer() helper.
[mesa.git] / src / mesa / vbo / vbo_exec.c
index 1efa74945dd73afd9f5bcc8072cfd83773fb6c51..fd5e0f8911b40b86644bd69286d5c410018fd724 100644 (file)
 
 #include "main/api_arrayelt.h"
 #include "main/glheader.h"
-#include "main/imports.h"
-#include "main/context.h"
-#include "main/macros.h"
 #include "main/mtypes.h"
-#include "main/dlist.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,14 +75,20 @@ 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_ARRAY)) {
+      exec->array.recalculate_inputs = GL_TRUE;
+   }
+
    if (new_state & (_NEW_PROGRAM|_NEW_EVAL))
       exec->eval.recalculate_maps = 1;
 
@@ -92,6 +96,49 @@ void vbo_exec_invalidate_state( GLcontext *ctx, GLuint 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
+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;
+}