summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Justen <[email protected]>2012-05-13 00:23:23 -0700
committerJordan Justen <[email protected]>2012-05-23 15:19:09 -0700
commitdc501452534e6e004acf3206a581232971c00cd0 (patch)
treede478d72343de97db72f98c2c500ee0c2f71db07
parentf9389fbfb204995a650047949c48ab2b2703bfcf (diff)
i965: use cut index to handle primitive restart when possible
If the primitive restart index and the primitive type can be handled by the cut index feature, then use the hardware to handle the primitive restart feature. The VBO module's software handling of primitive restart is used as a fall back. Signed-off-by: Jordan Justen <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_primitive_restart.c81
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;