summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/util
diff options
context:
space:
mode:
authorChristian König <[email protected]>2011-06-05 00:11:41 +0200
committerChristian König <[email protected]>2011-06-05 00:11:41 +0200
commit1eb957bb4108123bea95b818e0544e3b5f255e08 (patch)
treed7febd8e6cc841ab16dca53f031322ec47d5ccd9 /src/gallium/auxiliary/util
parenta6c76c8a90dc8995feed3c61b02dbd8408149036 (diff)
parent6491e9593d5cbc5644eb02593a2f562447efdcbb (diff)
Merge remote-tracking branch 'origin/master' into pipe-video
Diffstat (limited to 'src/gallium/auxiliary/util')
-rw-r--r--src/gallium/auxiliary/util/u_math.h11
-rw-r--r--src/gallium/auxiliary/util/u_prim.h71
2 files changed, 31 insertions, 51 deletions
diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h
index 2ecade5f7e4..65a99fcb394 100644
--- a/src/gallium/auxiliary/util/u_math.h
+++ b/src/gallium/auxiliary/util/u_math.h
@@ -477,10 +477,13 @@ float_to_byte_tex(float f)
static INLINE unsigned
util_logbase2(unsigned n)
{
- unsigned log2 = 0;
- while (n >>= 1)
- ++log2;
- return log2;
+ unsigned pos = 0;
+ if (n >= 1<<16) { n >>= 16; pos += 16; }
+ if (n >= 1<< 8) { n >>= 8; pos += 8; }
+ if (n >= 1<< 4) { n >>= 4; pos += 4; }
+ if (n >= 1<< 2) { n >>= 2; pos += 2; }
+ if (n >= 1<< 1) { pos += 1; }
+ return pos;
}
diff --git a/src/gallium/auxiliary/util/u_prim.h b/src/gallium/auxiliary/util/u_prim.h
index 3c851f73401..ca7c67d7c53 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;