[Mesa-dev] [PATCH 1/9] mesa: Handle common extension checks with more compact code

Ian Romanick idr at freedesktop.org
Fri May 19 13:38:03 UTC 2017


From: Ian Romanick <ian.d.romanick at intel.com>

The previous code handled everything with the general case.  I noticed
that every time I converted an open-coded check to use a
_mesa_has_EXT_foo() function, the text size of the driver increased.

Almost all extensions only care what the current context API is, and
the version does not matter.  Handle those using more compact checks.

   text	   data	    bss	    dec	    hex	filename
7037675	 235248	  37280	7310203	 6f8b7b	32-bit i965_dri.so before
7034307	 235248	  37280	7306835	 6f7e53	32-bit i965_dri.so after
6679695	 303400	  50608	7033703	 6b5367	64-bit i965_dri.so before
6676143	 303400	  50608	7030151	 6b4587	64-bit i965_dri.so after

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/main/extensions.h | 51 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 49 insertions(+), 2 deletions(-)

diff --git a/src/mesa/main/extensions.h b/src/mesa/main/extensions.h
index efef1be..8ffc076 100644
--- a/src/mesa/main/extensions.h
+++ b/src/mesa/main/extensions.h
@@ -94,11 +94,58 @@ MESA_EXTENSION_COUNT
 
 
 /** Checks if the context supports a user-facing extension */
-#define EXT(name_str, driver_cap, ...) \
+#define CHECK_CAP(ctx, driver_cap)                                      \
+   (offsetof(struct gl_extensions, driver_cap) == offsetof(struct gl_extensions, dummy_true) || \
+    ctx->Extensions.driver_cap)
+
+#define EXT(name_str, driver_cap, gll, glc, es1, es2, ...)                     \
 static inline bool \
 _mesa_has_##name_str(const struct gl_context *ctx) \
 { \
-   return ctx->Extensions.driver_cap && (ctx->Extensions.Version >= \
+   STATIC_ASSERT(!(gll ==  0 && glc == ~0 && es1 == ~0 && es2 ==  0));/*  6 */ \
+   STATIC_ASSERT(!(gll == ~0 && glc ==  0 && es1 ==  0 && es2 ==  0));/*  8 */ \
+   STATIC_ASSERT(!(gll == ~0 && glc ==  0 && es1 ==  0 && es2 == ~0));/*  9 */ \
+   STATIC_ASSERT(!(gll == ~0 && glc ==  0 && es1 == ~0 && es2 ==  0));/* 10 */ \
+   /* 15 is also impossible, but it is used by dummy_true and dummy_false. */  \
+                                                                               \
+   if (gll == 0 && glc == 0 && es1 == 0 && es2 == 0)                  /*  0 */ \
+       /* e.g., GL_EXT_polygon_offset_clamp */                                 \
+      return CHECK_CAP(ctx, driver_cap);                                       \
+   else if (gll == 0 && glc == 0 && es1 == 0 && es2 == ~0)            /*  1 */ \
+      /* e.g., GL_OES_read_format */                                           \
+      return CHECK_CAP(ctx, driver_cap) && (uint8_t)ctx->API != API_OPENGLES2; \
+   else if (gll == 0 && glc == 0 && es1 == ~0 && es2 == 0)            /*  2 */ \
+      /* e.g., GL_KHR_robustness */                                            \
+      return CHECK_CAP(ctx, driver_cap) && (uint8_t)ctx->API != API_OPENGLES;  \
+   else if (gll == 0 && glc == 0 && es1 == ~0 && es2 == ~0)           /*  3 */ \
+      /* e.g., GL_ARB_texture_rg */                                            \
+      return CHECK_CAP(ctx, driver_cap) &&                                     \
+         ((uint8_t)ctx->API == API_OPENGL_COMPAT || (uint8_t)ctx->API == API_OPENGL_CORE); \
+   else if (gll == 0 && glc == ~0 && es1 == 0 && es2 == 0)            /*  4 */ \
+      /* e.g., GL_EXT_blend_minmax */                                          \
+      return CHECK_CAP(ctx, driver_cap) && (uint8_t)ctx->API != API_OPENGL_CORE; \
+   else if (gll == 0 && glc == ~0 && es1 == 0 && es2 == ~0)           /*  5 */ \
+      /* e.g., GL_EXT_texture_lod_bias */                                      \
+      return CHECK_CAP(ctx, driver_cap) &&                                     \
+         ((uint8_t)ctx->API == API_OPENGL_COMPAT || (uint8_t)ctx->API == API_OPENGLES); \
+   else if (gll == 0 && glc == ~0 && es1 == ~0 && es2 == ~0)          /*  7 */ \
+      /* e.g., GL_ARB_depth_texture */                                         \
+      return CHECK_CAP(ctx, driver_cap) && (uint8_t)ctx->API == API_OPENGL_COMPAT; \
+   else if (gll == ~0 && glc == 0 && es1 == ~0 && es2 == ~0)          /* 11 */ \
+      /* e.g., GL_ARB_direct_state_access */                                   \
+      return CHECK_CAP(ctx, driver_cap) && (uint8_t)ctx->API == API_OPENGL_CORE; \
+   else if (gll == ~0 && glc == ~0 && es1 == 0 && es2 == 0)           /* 12 */ \
+      /* e.g., GL_EXT_map_buffer_range */                                      \
+      return CHECK_CAP(ctx, driver_cap) &&                                     \
+         ((uint8_t)ctx->API == API_OPENGLES || (uint8_t)ctx->API == API_OPENGLES2); \
+   else if (gll == ~0 && glc == ~0 && es1 == 0 && es2 == ~0)          /* 13 */ \
+      /* e.g., GL_OES_blend_equation_separate */                               \
+      return CHECK_CAP(ctx, driver_cap) && (uint8_t)ctx->API == API_OPENGLES;  \
+   else if (gll == ~0 && glc == ~0 && es1 == ~0 && es2 == 0)          /* 14 */ \
+      /* e.g., GL_OES_depth_texture */                                         \
+      return CHECK_CAP(ctx, driver_cap) && (uint8_t)ctx->API == API_OPENGLES2; \
+   else                                                                        \
+      return CHECK_CAP(ctx, driver_cap) && (ctx->Extensions.Version >=         \
           _mesa_extension_table[MESA_EXTENSION_##name_str].version[ctx->API]); \
 }
 #include "extensions_table.h"
-- 
2.7.4



More information about the mesa-dev mailing list