diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_primitive_restart.c | 81 |
1 files changed, 80 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c index d7136ed6fb9..962ff18fede 100644 --- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c +++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c @@ -32,6 +32,74 @@ #include "brw_draw.h" /** + * Check if the hardware's cut index support can handle the primitive + * restart index value. + */ +static bool +can_cut_index_handle_restart_index(struct gl_context *ctx, + const struct _mesa_index_buffer *ib) +{ + bool cut_index_will_work; + + switch (ib->type) { + case GL_UNSIGNED_BYTE: + cut_index_will_work = (ctx->Array.RestartIndex & 0xff) == 0xff; + break; + case GL_UNSIGNED_SHORT: + cut_index_will_work = (ctx->Array.RestartIndex & 0xffff) == 0xffff; + break; + case GL_UNSIGNED_INT: + cut_index_will_work = ctx->Array.RestartIndex == 0xffffffff; + break; + default: + cut_index_will_work = false; + assert(0); + } + + return cut_index_will_work; +} + +/** + * Check if the hardware's cut index support can handle the primitive + * restart case. + */ +static bool +can_cut_index_handle_prims(struct gl_context *ctx, + const struct _mesa_prim *prim, + GLuint nr_prims, + const struct _mesa_index_buffer *ib) +{ + if (!can_cut_index_handle_restart_index(ctx, ib)) { + /* The primitive restart index can't be handled, so take + * the software path + */ + return false; + } + + for ( ; nr_prims > 0; nr_prims--) { + switch(prim->mode) { + case GL_POINTS: + case GL_LINES: + case GL_LINE_STRIP: + case GL_TRIANGLES: + case GL_TRIANGLE_STRIP: + /* Cut index supports these primitive types */ + break; + default: + /* Cut index does not support these primitive types */ + //case GL_LINE_LOOP: + //case GL_TRIANGLE_FAN: + //case GL_QUADS: + //case GL_QUAD_STRIP: + //case GL_POLYGON: + return false; + } + } + + return true; +} + +/** * Check if primitive restart is enabled, and if so, handle it properly. * * In some cases the support will be handled in software. When available @@ -77,7 +145,18 @@ brw_handle_primitive_restart(struct gl_context *ctx, */ brw->prim_restart.in_progress = true; - vbo_sw_primitive_restart(ctx, prim, nr_prims, ib); + if (can_cut_index_handle_prims(ctx, prim, nr_prims, ib)) { + /* Cut index should work for primitive restart, so use it + */ + brw->prim_restart.enable_cut_index = true; + brw_draw_prims(ctx, prim, nr_prims, ib, GL_FALSE, -1, -1, NULL); + brw->prim_restart.enable_cut_index = false; + } else { + /* Not all the primitive draw modes are supported by the cut index, + * so take the software path + */ + vbo_sw_primitive_restart(ctx, prim, nr_prims, ib); + } brw->prim_restart.in_progress = false; |