From 970726dd6f9d5361cf7a4002d65ba24ac8baec20 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 3 Jun 2011 10:36:48 +1000 Subject: [PATCH] u_prim: convert u_trim_pipe_prim to table driven. This makes this function not be an always miss for the branch predictor. Noticed using cachegrind, makes a minor difference to gears numbers on r600g. Signed-off-by: Dave Airlie --- src/gallium/auxiliary/util/u_prim.h | 71 +++++++++++++------------------------ 1 file changed, 24 insertions(+), 47 deletions(-) diff --git a/src/gallium/auxiliary/util/u_prim.h b/src/gallium/auxiliary/util/u_prim.h index 3c851f7..ca7c67d 100644 --- a/src/gallium/auxiliary/util/u_prim.h +++ b/src/gallium/auxiliary/util/u_prim.h @@ -78,55 +78,32 @@ static INLINE boolean u_validate_pipe_prim( unsigned pipe_prim, unsigned nr ) static INLINE boolean u_trim_pipe_prim( unsigned pipe_prim, unsigned *nr ) { boolean ok = TRUE; - - switch (pipe_prim) { - case PIPE_PRIM_POINTS: - ok = (*nr >= 1); - break; - case PIPE_PRIM_LINES: - ok = (*nr >= 2); - *nr -= (*nr % 2); - break; - case PIPE_PRIM_LINE_STRIP: - case PIPE_PRIM_LINE_LOOP: - ok = (*nr >= 2); - break; - case PIPE_PRIM_TRIANGLES: - ok = (*nr >= 3); - *nr -= (*nr % 3); - break; - case PIPE_PRIM_TRIANGLE_STRIP: - case PIPE_PRIM_TRIANGLE_FAN: - case PIPE_PRIM_POLYGON: - ok = (*nr >= 3); - break; - case PIPE_PRIM_QUADS: - ok = (*nr >= 4); - *nr -= (*nr % 4); - break; - case PIPE_PRIM_QUAD_STRIP: - ok = (*nr >= 4); - *nr -= (*nr % 2); - break; - case PIPE_PRIM_LINES_ADJACENCY: - ok = (*nr >= 4); - *nr -= (*nr % 4); - break; - case PIPE_PRIM_LINE_STRIP_ADJACENCY: - ok = (*nr >= 4); - break; - case PIPE_PRIM_TRIANGLES_ADJACENCY: - ok = (*nr >= 6); - *nr -= (*nr % 5); - break; - case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY: - ok = (*nr >= 4); - break; - default: - ok = 0; - break; + const static int values[][2] = { + { 1, 0 }, /* PIPE_PRIM_POINTS */ + { 2, 2 }, /* PIPE_PRIM_LINES */ + { 2, 0 }, /* PIPE_PRIM_LINE_LOOP */ + { 2, 0 }, /* PIPE_PRIM_LINE_STRIP */ + { 3, 3 }, /* PIPE_PRIM_TRIANGLES */ + { 3, 0 }, /* PIPE_PRIM_TRIANGLE_STRIP */ + { 3, 0 }, /* PIPE_PRIM_TRIANGLE_FAN */ + { 4, 4 }, /* PIPE_PRIM_TRIANGLE_QUADS */ + { 4, 2 }, /* PIPE_PRIM_TRIANGLE_QUAD_STRIP */ + { 3, 0 }, /* PIPE_PRIM_TRIANGLE_POLYGON */ + { 4, 4 }, /* PIPE_PRIM_LINES_ADJACENCY */ + { 4, 0 }, /* PIPE_PRIM_LINE_STRIP_ADJACENCY */ + { 6, 5 }, /* PIPE_PRIM_TRIANGLES_ADJACENCY */ + { 4, 0 }, /* PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY */ + }; + + if (unlikely(pipe_prim >= PIPE_PRIM_MAX)) { + *nr = 0; + return FALSE; } + ok = (*nr >= values[pipe_prim][0]); + if (values[pipe_prim][1]) + *nr -= (*nr % values[pipe_prim][1]); + if (!ok) *nr = 0; -- 2.7.4