summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/api_validate.c
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2014-11-06 22:51:45 -0800
committerKenneth Graunke <kenneth@whitecape.org>2015-01-14 17:09:50 -0800
commit0a0d2c944372590721f5accc74d03789c1fa6098 (patch)
treec50dc730573da5a8d689a5cbaa5139d89680e869 /src/mesa/main/api_validate.c
parentead200d156c887bed77645ecba7f36ba0be14b8c (diff)
downloadexternal_mesa3d-0a0d2c944372590721f5accc74d03789c1fa6098.zip
external_mesa3d-0a0d2c944372590721f5accc74d03789c1fa6098.tar.gz
external_mesa3d-0a0d2c944372590721f5accc74d03789c1fa6098.tar.bz2
mesa: Micro-optimize _mesa_is_valid_prim_mode
You would not believe the mess GCC 4.8.3 generated for the old switch-statement. On Bay Trail-D using Fedora 20 compile flags (-m64 -O2 -mtune=generic for 64-bit and -m32 -march=i686 -mtune=atom for 32-bit), affects Gl32Batch7: 32-bit: Difference at 95.0% confidence -0.37374% +/- 0.184057% (n=40) 64-bit: Difference at 95.0% confidence 0.966722% +/- 0.338442% (n=40) The regression on 32-bit is odd. Callgrind says the caller, _mesa_is_valid_prim_mode is faster. Before it says 2,293,760 cycles, and after it says 917,504. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/main/api_validate.c')
-rw-r--r--src/mesa/main/api_validate.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c
index b882f0e..9c2e29e 100644
--- a/src/mesa/main/api_validate.c
+++ b/src/mesa/main/api_validate.c
@@ -113,27 +113,21 @@ check_valid_to_render(struct gl_context *ctx, const char *function)
bool
_mesa_is_valid_prim_mode(struct gl_context *ctx, GLenum mode)
{
- switch (mode) {
- case GL_POINTS:
- case GL_LINES:
- case GL_LINE_LOOP:
- case GL_LINE_STRIP:
- case GL_TRIANGLES:
- case GL_TRIANGLE_STRIP:
- case GL_TRIANGLE_FAN:
+ /* The overwhelmingly common case is (mode <= GL_TRIANGLE_FAN). Test that
+ * first and exit. You would think that a switch-statement would be the
+ * right approach, but at least GCC 4.7.2 generates some pretty dire code
+ * for the common case.
+ */
+ if (likely(mode <= GL_TRIANGLE_FAN))
return true;
- case GL_QUADS:
- case GL_QUAD_STRIP:
- case GL_POLYGON:
+
+ if (mode <= GL_POLYGON)
return (ctx->API == API_OPENGL_COMPAT);
- case GL_LINES_ADJACENCY:
- case GL_LINE_STRIP_ADJACENCY:
- case GL_TRIANGLES_ADJACENCY:
- case GL_TRIANGLE_STRIP_ADJACENCY:
+
+ if (mode <= GL_TRIANGLE_STRIP_ADJACENCY)
return _mesa_has_geometry_shaders(ctx);
- default:
- return false;
- }
+
+ return false;
}