-void vbo_exec_init( GLcontext *ctx )
+void vbo_exec_init( struct gl_context *ctx )
{
struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
}
-void vbo_exec_destroy( GLcontext *ctx )
+void vbo_exec_destroy( struct gl_context *ctx )
{
struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
* 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;
_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;
+}