summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/remap.c
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2010-10-26 11:31:37 +0800
committerChia-I Wu <[email protected]>2010-11-02 14:43:35 +0800
commit16ee7a55ae269612263468195f2af998cb9ef695 (patch)
tree868970ddf003098218bb905309f6d592e6b271fc /src/mesa/main/remap.c
parentfdede1efaae32d23caf3b351cc766df12e3c5f8d (diff)
mesa: Allow contexts of different APIs to coexist.
This effectively redoes 1741ddb747ca0be284315adb4b6fe67ddf292d03 in a way that allows contexts of different APIs to coexist. First, the changes to the remap table are reverted. The remap table (driDispatchRemapTable) is always initialized in the same way regardless of the context API. es_generator.py is updated to use a local remap table, whose sole purpose is to help initialize its dispatch table. The local remap table and the global one are always different, as they use different glapidispatch.h. But the dispatch tables initialized by both remap tables are always compatible with glapi (libGL.so). Finally, the semantics of one_time_init are changed to per-api one-time initialization.
Diffstat (limited to 'src/mesa/main/remap.c')
-rw-r--r--src/mesa/main/remap.c46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/mesa/main/remap.c b/src/mesa/main/remap.c
index 2341f8488d1..c89fba45302 100644
--- a/src/mesa/main/remap.c
+++ b/src/mesa/main/remap.c
@@ -44,10 +44,15 @@
#include "imports.h"
#include "glapi/glapi.h"
-#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
#define MAX_ENTRY_POINTS 16
-static const char *_mesa_function_pool;
+#define need_MESA_remap_table
+#include "main/remap_helper.h"
+
+
+/* this is global for quick access */
+int driDispatchRemapTable[driDispatchRemapTable_size];
+
/**
* Return the spec string associated with the given function index.
@@ -60,7 +65,10 @@ static const char *_mesa_function_pool;
const char *
_mesa_get_function_spec(GLint func_index)
{
- return _mesa_function_pool + func_index;
+ if (func_index < Elements(_mesa_function_pool))
+ return _mesa_function_pool + func_index;
+ else
+ return NULL;
}
@@ -152,11 +160,31 @@ _mesa_map_function_array(const struct gl_function_remap *func_array)
/**
+ * Map the functions which are already static.
+ *
+ * When a extension function are incorporated into the ABI, the
+ * extension suffix is usually stripped. Mapping such functions
+ * makes sure the alternative names are available.
+ *
+ * Note that functions mapped by _mesa_init_remap_table() are
+ * excluded.
+ */
+void
+_mesa_map_static_functions(void)
+{
+ /* Remap static functions which have alternative names and are in the ABI.
+ * This is to be on the safe side. glapi should have defined those names.
+ */
+ _mesa_map_function_array(MESA_alt_functions);
+}
+
+
+/**
* Initialize the remap table. This is called in one_time_init().
* The remap table needs to be initialized before calling the
* CALL/GET/SET macros defined in main/dispatch.h.
*/
-void
+static void
_mesa_do_init_remap_table(const char *pool,
int size,
const struct gl_function_pool_remap *remap)
@@ -167,7 +195,6 @@ _mesa_do_init_remap_table(const char *pool,
if (initialized)
return;
initialized = GL_TRUE;
- _mesa_function_pool = pool;
/* initialize the remap table */
for (i = 0; i < size; i++) {
@@ -187,4 +214,13 @@ _mesa_do_init_remap_table(const char *pool,
}
+void
+_mesa_init_remap_table(void)
+{
+ _mesa_do_init_remap_table(_mesa_function_pool,
+ driDispatchRemapTable_size,
+ MESA_remap_table_functions);
+}
+
+
#endif /* FEATURE_remap_table */