diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/vbo/vbo.h | 3 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_exec.c | 48 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h index f357657afa7..7384790e3ca 100644 --- a/src/mesa/vbo/vbo.h +++ b/src/mesa/vbo/vbo.h @@ -137,6 +137,9 @@ void vbo_check_buffers_are_unmapped(struct gl_context *ctx); void vbo_bind_arrays(struct gl_context *ctx); +size_t +count_tessellated_primitives(const struct _mesa_prim *prim); + void GLAPIENTRY _es_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a); diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c index e8d5b39b3f4..05c3ec1ae9d 100644 --- a/src/mesa/vbo/vbo_exec.c +++ b/src/mesa/vbo/vbo_exec.c @@ -90,3 +90,51 @@ void vbo_exec_invalidate_state( struct gl_context *ctx, GLuint new_state ) _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 +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; +} |