diff options
author | Dave Airlie <airlied@redhat.com> | 2011-06-03 10:36:48 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-06-03 15:26:59 +1000 |
commit | 970726dd6f9d5361cf7a4002d65ba24ac8baec20 (patch) | |
tree | b57ff8be74c1e8c380a3a498527036c1aef09d72 | |
parent | de0adb691feb2ae7f64dd74ed6bc5a9e0f493631 (diff) |
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 <airlied@redhat.com>
-rw-r--r-- | src/gallium/auxiliary/util/u_prim.h | 71 |
1 files changed, 24 insertions, 47 deletions
diff --git a/src/gallium/auxiliary/util/u_prim.h b/src/gallium/auxiliary/util/u_prim.h index 3c851f7340..ca7c67d7c5 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; |