[Mesa-dev] [PATCH 08/18] build: Move src/mapi/mapi/* to src/mapi/

legend zelda_ok at 163.com
Sun Mar 10 23:43:39 PDT 2013


hot to build mesa 
in
windows
use
mingw scons ?

if use `scons platform=windows toolchain=crossmingw machine=x86 build=release mesagdi libgl-gdi`

will happan

[build\windows-x86\mesa\libmesa.a] Error 1 

without any tips
At 2013-03-11 11:24:49,"Matt Turner" <mattst88 at gmail.com> wrote:
>---
> src/mapi/Android.mk               |   16 +-
> src/mapi/Makefile.sources         |   36 ++
> src/mapi/entry.c                  |   98 +++++
> src/mapi/entry.h                  |   48 ++
> src/mapi/entry_x86-64_tls.h       |  126 ++++++
> src/mapi/entry_x86_tls.h          |  146 ++++++
> src/mapi/entry_x86_tsd.h          |  104 +++++
> src/mapi/es1api/Makefile.am       |    2 +-
> src/mapi/es2api/Makefile.am       |    2 +-
> src/mapi/glapi/Makefile.am        |    2 +-
> src/mapi/glapi/SConscript         |    2 +-
> src/mapi/glapi/gen/Makefile.am    |    2 +-
> src/mapi/glapi/gen/glapi_gen.mk   |    2 +-
> src/mapi/glapi/glapi.c            |    2 +-
> src/mapi/glapi/glapi_entrypoint.c |    2 +-
> src/mapi/glapi/glthread.h         |    2 +-
> src/mapi/mapi.c                   |  191 ++++++++
> src/mapi/mapi.h                   |   66 +++
> src/mapi/mapi/Makefile.sources    |   36 --
> src/mapi/mapi/entry.c             |   98 -----
> src/mapi/mapi/entry.h             |   48 --
> src/mapi/mapi/entry_x86-64_tls.h  |  126 ------
> src/mapi/mapi/entry_x86_tls.h     |  146 ------
> src/mapi/mapi/entry_x86_tsd.h     |  104 -----
> src/mapi/mapi/mapi.c              |  191 --------
> src/mapi/mapi/mapi.h              |   66 ---
> src/mapi/mapi/mapi_abi.py         |  873 -------------------------------------
> src/mapi/mapi/mapi_glapi.c        |  240 ----------
> src/mapi/mapi/mapi_tmp.h          |   48 --
> src/mapi/mapi/stub.c              |  229 ----------
> src/mapi/mapi/stub.h              |   60 ---
> src/mapi/mapi/table.c             |   56 ---
> src/mapi/mapi/table.h             |   72 ---
> src/mapi/mapi/u_compiler.h        |   51 ---
> src/mapi/mapi/u_current.c         |  266 -----------
> src/mapi/mapi/u_current.h         |   87 ----
> src/mapi/mapi/u_execmem.c         |  145 ------
> src/mapi/mapi/u_execmem.h         |    7 -
> src/mapi/mapi/u_macros.h          |   12 -
> src/mapi/mapi/u_thread.h          |  287 ------------
> src/mapi/mapi_abi.py              |  873 +++++++++++++++++++++++++++++++++++++
> src/mapi/mapi_glapi.c             |  240 ++++++++++
> src/mapi/mapi_tmp.h               |   48 ++
> src/mapi/shared-glapi/Makefile.am |    2 +-
> src/mapi/shared-glapi/SConscript  |    4 +-
> src/mapi/stub.c                   |  229 ++++++++++
> src/mapi/stub.h                   |   60 +++
> src/mapi/table.c                  |   56 +++
> src/mapi/table.h                  |   72 +++
> src/mapi/u_compiler.h             |   51 +++
> src/mapi/u_current.c              |  266 +++++++++++
> src/mapi/u_current.h              |   87 ++++
> src/mapi/u_execmem.c              |  145 ++++++
> src/mapi/u_execmem.h              |    7 +
> src/mapi/u_macros.h               |   12 +
> src/mapi/u_thread.h               |  287 ++++++++++++
> src/mapi/vgapi/Makefile.am        |    6 +-
> src/mapi/vgapi/SConscript         |    4 +-
> 58 files changed, 3273 insertions(+), 3273 deletions(-)
> create mode 100644 src/mapi/Makefile.sources
> create mode 100644 src/mapi/entry.c
> create mode 100644 src/mapi/entry.h
> create mode 100644 src/mapi/entry_x86-64_tls.h
> create mode 100644 src/mapi/entry_x86_tls.h
> create mode 100644 src/mapi/entry_x86_tsd.h
> create mode 100644 src/mapi/mapi.c
> create mode 100644 src/mapi/mapi.h
> delete mode 100644 src/mapi/mapi/Makefile.sources
> delete mode 100644 src/mapi/mapi/entry.c
> delete mode 100644 src/mapi/mapi/entry.h
> delete mode 100644 src/mapi/mapi/entry_x86-64_tls.h
> delete mode 100644 src/mapi/mapi/entry_x86_tls.h
> delete mode 100644 src/mapi/mapi/entry_x86_tsd.h
> delete mode 100644 src/mapi/mapi/mapi.c
> delete mode 100644 src/mapi/mapi/mapi.h
> delete mode 100644 src/mapi/mapi/mapi_abi.py
> delete mode 100644 src/mapi/mapi/mapi_glapi.c
> delete mode 100644 src/mapi/mapi/mapi_tmp.h
> delete mode 100644 src/mapi/mapi/stub.c
> delete mode 100644 src/mapi/mapi/stub.h
> delete mode 100644 src/mapi/mapi/table.c
> delete mode 100644 src/mapi/mapi/table.h
> delete mode 100644 src/mapi/mapi/u_compiler.h
> delete mode 100644 src/mapi/mapi/u_current.c
> delete mode 100644 src/mapi/mapi/u_current.h
> delete mode 100644 src/mapi/mapi/u_execmem.c
> delete mode 100644 src/mapi/mapi/u_execmem.h
> delete mode 100644 src/mapi/mapi/u_macros.h
> delete mode 100644 src/mapi/mapi/u_thread.h
> create mode 100644 src/mapi/mapi_abi.py
> create mode 100644 src/mapi/mapi_glapi.c
> create mode 100644 src/mapi/mapi_tmp.h
> create mode 100644 src/mapi/stub.c
> create mode 100644 src/mapi/stub.h
> create mode 100644 src/mapi/table.c
> create mode 100644 src/mapi/table.h
> create mode 100644 src/mapi/u_compiler.h
> create mode 100644 src/mapi/u_current.c
> create mode 100644 src/mapi/u_current.h
> create mode 100644 src/mapi/u_execmem.c
> create mode 100644 src/mapi/u_execmem.h
> create mode 100644 src/mapi/u_macros.h
> create mode 100644 src/mapi/u_thread.h
>
>diff --git a/src/mapi/Android.mk b/src/mapi/Android.mk
>index d1749a2..f104378 100644
>--- a/src/mapi/Android.mk
>+++ b/src/mapi/Android.mk
>@@ -36,12 +36,12 @@ include $(CLEAR_VARS)
> abi_header := shared-glapi/glapi_mapi_tmp.h
> 
> LOCAL_SRC_FILES := \
>-	mapi/entry.c \
>-	mapi/mapi_glapi.c \
>-	mapi/stub.c \
>-	mapi/table.c \
>-	mapi/u_current.c \
>-	mapi/u_execmem.c
>+	entry.c \
>+	mapi_glapi.c \
>+	stub.c \
>+	table.c \
>+	u_current.c \
>+	u_execmem.c
> 
> LOCAL_CFLAGS := \
> 	-DMAPI_MODE_GLAPI \
>@@ -68,9 +68,9 @@ include $(BUILD_SHARED_LIBRARY)
> mapi_abi_deps := \
> 	$(wildcard $(LOCAL_PATH)/glapi/gen/*.py) \
> 	$(wildcard $(LOCAL_PATH)/glapi/gen/*.xml) \
>-	$(LOCAL_PATH)/mapi/mapi_abi.py
>+	$(LOCAL_PATH)/mapi_abi.py
> 
>-$(mapi_abi_headers): PRIVATE_SCRIPT := $(MESA_PYTHON2) $(LOCAL_PATH)/mapi/mapi_abi.py
>+$(mapi_abi_headers): PRIVATE_SCRIPT := $(MESA_PYTHON2) $(LOCAL_PATH)/mapi_abi.py
> $(mapi_abi_headers): PRIVATE_APIXML := $(LOCAL_PATH)/glapi/gen/gl_and_es_API.xml
> $(mapi_abi_headers): $(mapi_abi_deps)
> 	@mkdir -p $(dir $@)
>diff --git a/src/mapi/Makefile.sources b/src/mapi/Makefile.sources
>new file mode 100644
>index 0000000..aff465a
>--- /dev/null
>+++ b/src/mapi/Makefile.sources
>@@ -0,0 +1,36 @@
>+# src/mapi/Makefile.sources
>+#
>+# mapi may be used in several ways
>+#
>+#  - In default mode, mapi implements the interface defined by mapi.h.  To use
>+#    this mode, compile MAPI_FILES.
>+#
>+#  - In util mode, mapi provides utility functions for use with glapi.  To use
>+#    this mode, compile MAPI_UTIL_FILES with MAPI_MODE_UTIL defined.
>+#
>+#  - In glapi mode, mapi implements the interface defined by glapi.h.  To use
>+#    this mode, compile MAPI_GLAPI_FILES with MAPI_MODE_GLAPI defined.
>+#
>+#  - In bridge mode, mapi provides entry points calling into glapi.  To use
>+#    this mode, compile MAPI_BRIDGE_FILES with MAPI_MODE_BRIDGE defined.
>+
>+MAPI_UTIL_FILES = \
>+	$(TOP)/src/mapi/u_current.c \
>+	$(TOP)/src/mapi/u_execmem.c
>+
>+MAPI_FILES = \
>+	$(TOP)/src/mapi/entry.c \
>+	$(TOP)/src/mapi/mapi.c \
>+	$(TOP)/src/mapi/stub.c \
>+	$(TOP)/src/mapi/table.c \
>+	$(MAPI_UTIL_FILES)
>+
>+MAPI_GLAPI_FILES = \
>+	$(TOP)/src/mapi/entry.c \
>+	$(TOP)/src/mapi/mapi_glapi.c \
>+	$(TOP)/src/mapi/stub.c \
>+	$(TOP)/src/mapi/table.c \
>+	$(MAPI_UTIL_FILES)
>+
>+MAPI_BRIDGE_FILES = \
>+	$(TOP)/src/mapi/entry.c
>diff --git a/src/mapi/entry.c b/src/mapi/entry.c
>new file mode 100644
>index 0000000..3d9168a
>--- /dev/null
>+++ b/src/mapi/entry.c
>@@ -0,0 +1,98 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include "entry.h"
>+#include "u_current.h"
>+#include "u_macros.h"
>+
>+/* define macros for use by assembly dispatchers */
>+#define ENTRY_CURRENT_TABLE U_STRINGIFY(u_current_table)
>+
>+/* in bridge mode, mapi is a user of glapi */
>+#ifdef MAPI_MODE_BRIDGE
>+#define ENTRY_CURRENT_TABLE_GET "_glapi_get_dispatch"
>+#else
>+#define ENTRY_CURRENT_TABLE_GET U_STRINGIFY(u_current_get_internal)
>+#endif
>+
>+#if defined(USE_X86_ASM) && defined(__GNUC__)
>+#   ifdef GLX_USE_TLS
>+#      include "entry_x86_tls.h"
>+#   else                 
>+#      include "entry_x86_tsd.h"
>+#   endif
>+#elif defined(USE_X86_64_ASM) && defined(__GNUC__) && defined(GLX_USE_TLS)
>+#   include "entry_x86-64_tls.h"
>+#else
>+
>+#include <stdlib.h>
>+
>+static INLINE const struct mapi_table *
>+entry_current_get(void)
>+{
>+#ifdef MAPI_MODE_BRIDGE
>+   return GET_DISPATCH();
>+#else
>+   return u_current_get();
>+#endif
>+}
>+
>+/* C version of the public entries */
>+#define MAPI_TMP_DEFINES
>+#define MAPI_TMP_PUBLIC_DECLARES
>+#define MAPI_TMP_PUBLIC_ENTRIES
>+#include "mapi_tmp.h"
>+
>+#ifndef MAPI_MODE_BRIDGE
>+
>+void
>+entry_patch_public(void)
>+{
>+}
>+
>+mapi_func
>+entry_get_public(int slot)
>+{
>+   /* pubic_entries are defined by MAPI_TMP_PUBLIC_ENTRIES */
>+   return public_entries[slot];
>+}
>+
>+mapi_func
>+entry_generate(int slot)
>+{
>+   return NULL;
>+}
>+
>+void
>+entry_patch(mapi_func entry, int slot)
>+{
>+}
>+
>+#endif /* MAPI_MODE_BRIDGE */
>+
>+#endif /* asm */
>diff --git a/src/mapi/entry.h b/src/mapi/entry.h
>new file mode 100644
>index 0000000..9df8100
>--- /dev/null
>+++ b/src/mapi/entry.h
>@@ -0,0 +1,48 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#ifndef _ENTRY_H_
>+#define _ENTRY_H_
>+
>+#include "u_compiler.h"
>+
>+typedef void (*mapi_func)(void);
>+
>+void
>+entry_patch_public(void);
>+
>+mapi_func
>+entry_get_public(int slot);
>+
>+mapi_func
>+entry_generate(int slot);
>+
>+void
>+entry_patch(mapi_func entry, int slot);
>+
>+#endif /* _ENTRY_H_ */
>diff --git a/src/mapi/entry_x86-64_tls.h b/src/mapi/entry_x86-64_tls.h
>new file mode 100644
>index 0000000..72d4125
>--- /dev/null
>+++ b/src/mapi/entry_x86-64_tls.h
>@@ -0,0 +1,126 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include "u_macros.h"
>+
>+#ifdef __linux__
>+__asm__(".section .note.ABI-tag, \"a\"\n\t"
>+        ".p2align 2\n\t"
>+        ".long 1f - 0f\n\t"      /* name length */
>+        ".long 3f - 2f\n\t"      /* data length */
>+        ".long 1\n\t"            /* note length */
>+        "0: .asciz \"GNU\"\n\t"  /* vendor name */
>+        "1: .p2align 2\n\t"
>+        "2: .long 0\n\t"         /* note data: the ABI tag */
>+        ".long 2,4,20\n\t"       /* Minimum kernel version w/TLS */
>+        "3: .p2align 2\n\t");    /* pad out section */
>+#endif /* __linux__ */
>+
>+__asm__(".text\n"
>+        ".balign 32\n"
>+        "x86_64_entry_start:");
>+
>+#define STUB_ASM_ENTRY(func)                             \
>+   ".globl " func "\n"                                   \
>+   ".type " func ", @function\n"                         \
>+   ".balign 32\n"                                        \
>+   func ":"
>+
>+#define STUB_ASM_CODE(slot)                              \
>+   "movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t"  \
>+   "movq %fs:(%rax), %r11\n\t"                           \
>+   "jmp *(8 * " slot ")(%r11)"
>+
>+#define MAPI_TMP_STUB_ASM_GCC
>+#include "mapi_tmp.h"
>+
>+#ifndef MAPI_MODE_BRIDGE
>+
>+__asm__("x86_64_current_tls:\n\t"
>+	"movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t"
>+	"ret");
>+
>+extern unsigned long
>+x86_64_current_tls();
>+
>+#include <string.h>
>+#include "u_execmem.h"
>+
>+void
>+entry_patch_public(void)
>+{
>+}
>+
>+static char
>+x86_64_entry_start[];
>+
>+mapi_func
>+entry_get_public(int slot)
>+{
>+   return (mapi_func) (x86_64_entry_start + slot * 32);
>+}
>+
>+void
>+entry_patch(mapi_func entry, int slot)
>+{
>+   char *code = (char *) entry;
>+   *((unsigned int *) (code + 12)) = slot * sizeof(mapi_func);
>+}
>+
>+mapi_func
>+entry_generate(int slot)
>+{
>+   const char code_templ[16] = {
>+      /* movq %fs:0, %r11 */
>+      0x64, 0x4c, 0x8b, 0x1c, 0x25, 0x00, 0x00, 0x00, 0x00,
>+      /* jmp *0x1234(%r11) */
>+      0x41, 0xff, 0xa3, 0x34, 0x12, 0x00, 0x00,
>+   };
>+   unsigned long addr;
>+   void *code;
>+   mapi_func entry;
>+
>+   addr = x86_64_current_tls();
>+   if ((addr >> 32) != 0xffffffff)
>+      return NULL;
>+   addr &= 0xffffffff;
>+
>+   code = u_execmem_alloc(sizeof(code_templ));
>+   if (!code)
>+      return NULL;
>+
>+   memcpy(code, code_templ, sizeof(code_templ));
>+
>+   *((unsigned int *) (code + 5)) = addr;
>+   entry = (mapi_func) code;
>+   entry_patch(entry, slot);
>+
>+   return entry;
>+}
>+
>+#endif /* MAPI_MODE_BRIDGE */
>diff --git a/src/mapi/entry_x86_tls.h b/src/mapi/entry_x86_tls.h
>new file mode 100644
>index 0000000..de91812
>--- /dev/null
>+++ b/src/mapi/entry_x86_tls.h
>@@ -0,0 +1,146 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include <string.h>
>+#include "u_macros.h"
>+
>+#ifdef __linux__
>+__asm__(".section .note.ABI-tag, \"a\"\n\t"
>+        ".p2align 2\n\t"
>+        ".long 1f - 0f\n\t"      /* name length */
>+        ".long 3f - 2f\n\t"      /* data length */
>+        ".long 1\n\t"            /* note length */
>+        "0: .asciz \"GNU\"\n\t"  /* vendor name */
>+        "1: .p2align 2\n\t"
>+        "2: .long 0\n\t"         /* note data: the ABI tag */
>+        ".long 2,4,20\n\t"       /* Minimum kernel version w/TLS */
>+        "3: .p2align 2\n\t");    /* pad out section */
>+#endif /* __linux__ */
>+
>+__asm__(".text");
>+
>+__asm__("x86_current_tls:\n\t"
>+	"call 1f\n"
>+        "1:\n\t"
>+        "popl %eax\n\t"
>+	"addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax\n\t"
>+	"movl " ENTRY_CURRENT_TABLE "@GOTNTPOFF(%eax), %eax\n\t"
>+	"ret");
>+
>+#ifndef GLX_X86_READONLY_TEXT
>+__asm__(".section wtext, \"awx\", @progbits");
>+#endif /* GLX_X86_READONLY_TEXT */
>+
>+__asm__(".balign 16\n"
>+        "x86_entry_start:");
>+
>+#define STUB_ASM_ENTRY(func)     \
>+   ".globl " func "\n"           \
>+   ".type " func ", @function\n" \
>+   ".balign 16\n"                \
>+   func ":"
>+
>+#define STUB_ASM_CODE(slot)      \
>+   "call x86_current_tls\n\t"    \
>+   "movl %gs:(%eax), %eax\n\t"   \
>+   "jmp *(4 * " slot ")(%eax)"
>+
>+#define MAPI_TMP_STUB_ASM_GCC
>+#include "mapi_tmp.h"
>+
>+#ifndef GLX_X86_READONLY_TEXT
>+__asm__(".balign 16\n"
>+        "x86_entry_end:");
>+__asm__(".text");
>+#endif /* GLX_X86_READONLY_TEXT */
>+
>+#ifndef MAPI_MODE_BRIDGE
>+
>+#include "u_execmem.h"
>+
>+extern unsigned long
>+x86_current_tls();
>+
>+static char x86_entry_start[];
>+static char x86_entry_end[];
>+
>+void
>+entry_patch_public(void)
>+{
>+#ifndef GLX_X86_READONLY_TEXT
>+   char patch[8] = {
>+      0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, /* movl %gs:0x0, %eax */
>+      0x90, 0x90                          /* nop's */
>+   };
>+   char *entry;
>+
>+   *((unsigned long *) (patch + 2)) = x86_current_tls();
>+
>+   for (entry = x86_entry_start; entry < x86_entry_end; entry += 16)
>+      memcpy(entry, patch, sizeof(patch));
>+#endif
>+}
>+
>+mapi_func
>+entry_get_public(int slot)
>+{
>+   return (mapi_func) (x86_entry_start + slot * 16);
>+}
>+
>+void
>+entry_patch(mapi_func entry, int slot)
>+{
>+   char *code = (char *) entry;
>+   *((unsigned long *) (code + 8)) = slot * sizeof(mapi_func);
>+}
>+
>+mapi_func
>+entry_generate(int slot)
>+{
>+   const char code_templ[16] = {
>+      0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, /* movl %gs:0x0, %eax */
>+      0xff, 0xa0, 0x34, 0x12, 0x00, 0x00, /* jmp *0x1234(%eax) */
>+      0x90, 0x90, 0x90, 0x90              /* nop's */
>+   };
>+   void *code;
>+   mapi_func entry;
>+
>+   code = u_execmem_alloc(sizeof(code_templ));
>+   if (!code)
>+      return NULL;
>+
>+   memcpy(code, code_templ, sizeof(code_templ));
>+
>+   *((unsigned long *) (code + 2)) = x86_current_tls();
>+   entry = (mapi_func) code;
>+   entry_patch(entry, slot);
>+
>+   return entry;
>+}
>+
>+#endif /* MAPI_MODE_BRIDGE */
>diff --git a/src/mapi/entry_x86_tsd.h b/src/mapi/entry_x86_tsd.h
>new file mode 100644
>index 0000000..c479c19
>--- /dev/null
>+++ b/src/mapi/entry_x86_tsd.h
>@@ -0,0 +1,104 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include "u_macros.h"
>+
>+#define X86_ENTRY_SIZE 32
>+
>+__asm__(".text\n"
>+        ".balign 32\n"
>+        "x86_entry_start:");
>+
>+#define STUB_ASM_ENTRY(func)        \
>+   ".globl " func "\n"              \
>+   ".type " func ", @function\n"    \
>+   ".balign 32\n"                   \
>+   func ":"
>+
>+#define STUB_ASM_CODE(slot)         \
>+   "movl " ENTRY_CURRENT_TABLE ", %eax\n\t" \
>+   "testl %eax, %eax\n\t"           \
>+   "je 1f\n\t"                      \
>+   "jmp *(4 * " slot ")(%eax)\n"    \
>+   "1:\n\t"                         \
>+   "call " ENTRY_CURRENT_TABLE_GET "\n\t" \
>+   "jmp *(4 * " slot ")(%eax)"
>+
>+#define MAPI_TMP_STUB_ASM_GCC
>+#include "mapi_tmp.h"
>+
>+#ifndef MAPI_MODE_BRIDGE
>+
>+__asm__(".balign 32\n"
>+        "x86_entry_end:");
>+
>+#include <string.h>
>+#include "u_execmem.h"
>+
>+static const char x86_entry_start[];
>+static const char x86_entry_end[];
>+
>+void
>+entry_patch_public(void)
>+{
>+}
>+
>+mapi_func
>+entry_get_public(int slot)
>+{
>+   return (mapi_func) (x86_entry_start + slot * X86_ENTRY_SIZE);
>+}
>+
>+void
>+entry_patch(mapi_func entry, int slot)
>+{
>+   char *code = (char *) entry;
>+
>+   *((unsigned long *) (code + 11)) = slot * sizeof(mapi_func);
>+   *((unsigned long *) (code + 22)) = slot * sizeof(mapi_func);
>+}
>+
>+mapi_func
>+entry_generate(int slot)
>+{
>+   const char *code_templ = x86_entry_end - X86_ENTRY_SIZE;
>+   void *code;
>+   mapi_func entry;
>+
>+   code = u_execmem_alloc(X86_ENTRY_SIZE);
>+   if (!code)
>+      return NULL;
>+
>+   memcpy(code, code_templ, X86_ENTRY_SIZE);
>+   entry = (mapi_func) code;
>+   entry_patch(entry, slot);
>+
>+   return entry;
>+}
>+
>+#endif /* MAPI_MODE_BRIDGE */
>diff --git a/src/mapi/es1api/Makefile.am b/src/mapi/es1api/Makefile.am
>index c163a39..8dab204 100644
>--- a/src/mapi/es1api/Makefile.am
>+++ b/src/mapi/es1api/Makefile.am
>@@ -40,7 +40,7 @@ GLES_include_HEADERS = \
> 
> lib_LTLIBRARIES = libGLESv1_CM.la
> 
>-libGLESv1_CM_la_SOURCES = ../mapi/entry.c glapi_mapi_tmp.h
>+libGLESv1_CM_la_SOURCES = ../entry.c glapi_mapi_tmp.h
> libGLESv1_CM_la_LIBADD = $(GLESv1_CM_LIB_DEPS)
> libGLESv1_CM_la_LDFLAGS = -version-number 1:1 -no-undefined
> 
>diff --git a/src/mapi/es2api/Makefile.am b/src/mapi/es2api/Makefile.am
>index 0538f73..65ef4bd 100644
>--- a/src/mapi/es2api/Makefile.am
>+++ b/src/mapi/es2api/Makefile.am
>@@ -44,7 +44,7 @@ GLES3_include_HEADERS = \
> 
> lib_LTLIBRARIES = libGLESv2.la
> 
>-libGLESv2_la_SOURCES = ../mapi/entry.c glapi_mapi_tmp.h
>+libGLESv2_la_SOURCES = ../entry.c glapi_mapi_tmp.h
> libGLESv2_la_LIBADD = $(GLESv2_LIB_DEPS)
> libGLESv2_la_LDFLAGS = -version-number 2 -no-undefined
> 
>diff --git a/src/mapi/glapi/Makefile.am b/src/mapi/glapi/Makefile.am
>index cf2602a..1698d14 100644
>--- a/src/mapi/glapi/Makefile.am
>+++ b/src/mapi/glapi/Makefile.am
>@@ -21,7 +21,7 @@
> 
> TOP = $(top_srcdir)
> include Makefile.sources
>-include ../mapi/Makefile.sources
>+include ../Makefile.sources
> 
> AM_CPPFLAGS = \
>         $(DEFINES) \
>diff --git a/src/mapi/glapi/SConscript b/src/mapi/glapi/SConscript
>index 00cce3e..79cbb6a 100644
>--- a/src/mapi/glapi/SConscript
>+++ b/src/mapi/glapi/SConscript
>@@ -43,7 +43,7 @@ mapi_sources = [
>     'u_execmem.c',
> ]
> for s in mapi_sources:
>-    o = env.SharedObject(s[:-2], '../mapi/' + s)
>+    o = env.SharedObject(s[:-2], '../' + s)
>     glapi_sources.append(o)
> 
> #
>diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am
>index 4d51bbc..e9a1ff6 100644
>--- a/src/mapi/glapi/gen/Makefile.am
>+++ b/src/mapi/glapi/gen/Makefile.am
>@@ -20,7 +20,7 @@ XORG_INDENT_FLAGS = -linux -bad -bap -blf -bli0 -cbi0 -cdw -nce -cs -i4 -lc80 -p
> 
> MESA_DIR = $(top_srcdir)/src/mesa
> MESA_GLAPI_DIR = $(top_srcdir)/src/mapi/glapi
>-MESA_MAPI_DIR = $(top_srcdir)/src/mapi/mapi
>+MESA_MAPI_DIR = $(top_srcdir)/src/mapi
> MESA_GLX_DIR = $(top_srcdir)/src/glx
> 
> MESA_GLAPI_OUTPUTS = \
>diff --git a/src/mapi/glapi/gen/glapi_gen.mk b/src/mapi/glapi/gen/glapi_gen.mk
>index f65286f..242ae5f 100644
>--- a/src/mapi/glapi/gen/glapi_gen.mk
>+++ b/src/mapi/glapi/gen/glapi_gen.mk
>@@ -4,7 +4,7 @@ glapi_gen_common_deps := \
> 	$(wildcard $(top_srcdir)/src/mapi/glapi/gen/*.xml) \
> 	$(wildcard $(top_srcdir)/src/mapi/glapi/gen/*.py)
> 
>-glapi_gen_mapi_script := $(top_srcdir)/src/mapi/mapi/mapi_abi.py
>+glapi_gen_mapi_script := $(top_srcdir)/src/mapi/mapi_abi.py
> glapi_gen_mapi_deps := \
> 	$(glapi_gen_mapi_script) \
> 	$(glapi_gen_common_deps)
>diff --git a/src/mapi/glapi/glapi.c b/src/mapi/glapi/glapi.c
>index f7655c5..18a7d31 100644
>--- a/src/mapi/glapi/glapi.c
>+++ b/src/mapi/glapi/glapi.c
>@@ -27,7 +27,7 @@
>  */
> 
> #include "glapi/glapi.h"
>-#include "mapi/u_current.h"
>+#include "u_current.h"
> 
> /*
>  * Global variables, _glapi_get_context, and _glapi_get_dispatch are defined in
>diff --git a/src/mapi/glapi/glapi_entrypoint.c b/src/mapi/glapi/glapi_entrypoint.c
>index 7a0eb35..791bd42 100644
>--- a/src/mapi/glapi/glapi_entrypoint.c
>+++ b/src/mapi/glapi/glapi_entrypoint.c
>@@ -30,7 +30,7 @@
> 
> 
> #include "glapi/glapi_priv.h"
>-#include "mapi/u_execmem.h"
>+#include "u_execmem.h"
> 
> 
> #ifdef USE_X86_ASM
>diff --git a/src/mapi/glapi/glthread.h b/src/mapi/glapi/glthread.h
>index 1c3f4e2..2399abb 100644
>--- a/src/mapi/glapi/glthread.h
>+++ b/src/mapi/glapi/glthread.h
>@@ -1,7 +1,7 @@
> #ifndef GLTHREAD_H
> #define GLTHREAD_H
> 
>-#include "mapi/u_thread.h"
>+#include "u_thread.h"
> 
> #ifdef __cplusplus
> extern "C" {
>diff --git a/src/mapi/mapi.c b/src/mapi/mapi.c
>new file mode 100644
>index 0000000..b471c40
>--- /dev/null
>+++ b/src/mapi/mapi.c
>@@ -0,0 +1,191 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include <stdlib.h>
>+#include <string.h>
>+
>+#include "u_current.h"
>+#include "u_thread.h"
>+#include "mapi.h"
>+#include "stub.h"
>+#include "table.h"
>+
>+/* dynamic stubs will run out before this array */
>+static const struct mapi_stub *mapi_stub_map[MAPI_TABLE_NUM_SLOTS];
>+static int mapi_num_stubs;
>+
>+static const struct mapi_stub *
>+get_stub(const char *name, const struct mapi_stub *alias)
>+{
>+   const struct mapi_stub *stub;
>+
>+   stub = stub_find_public(name);
>+   if (!stub) {
>+      struct mapi_stub *dyn = stub_find_dynamic(name, 1);
>+      if (dyn) {
>+         stub_fix_dynamic(dyn, alias);
>+         stub = dyn;
>+      }
>+   }
>+
>+   return stub;
>+}
>+
>+/**
>+ * Initialize mapi.  spec consists of NULL-separated strings.  The first string
>+ * denotes the version.  It is followed by variable numbers of entries.  Each
>+ * entry can have multiple names.  An empty name terminates an entry.  An empty
>+ * entry terminates the spec.  A spec of two entries, Foo and Bar, is as
>+ * follows
>+ *
>+ *   "1\0"
>+ *   "Foo\0"
>+ *   "FooEXT\0"
>+ *   "\0"
>+ *   "Bar\0"
>+ *   "\0"
>+ */
>+void
>+mapi_init(const char *spec)
>+{
>+   u_mutex_declare_static(mutex);
>+   const char *p;
>+   int ver, count;
>+
>+   u_mutex_lock(mutex);
>+
>+   /* already initialized */
>+   if (mapi_num_stubs) {
>+      u_mutex_unlock(mutex);
>+      return;
>+   }
>+
>+   count = 0;
>+   p = spec;
>+
>+   /* parse version string */
>+   ver = atoi(p);
>+   if (ver != 1) {
>+      u_mutex_unlock(mutex);
>+      return;
>+   }
>+   p += strlen(p) + 1;
>+
>+   while (*p) {
>+      const struct mapi_stub *stub;
>+
>+      stub = get_stub(p, NULL);
>+      /* out of dynamic entries */
>+      if (!stub)
>+         break;
>+      p += strlen(p) + 1;
>+
>+      while (*p) {
>+         get_stub(p, stub);
>+         p += strlen(p) + 1;
>+      }
>+
>+      mapi_stub_map[count++] = stub;
>+      p++;
>+   }
>+
>+   mapi_num_stubs = count;
>+
>+   u_mutex_unlock(mutex);
>+}
>+
>+/**
>+ * Return the address of an entry.  Optionally generate the entry if it does
>+ * not exist.
>+ */
>+mapi_proc
>+mapi_get_proc_address(const char *name)
>+{
>+   const struct mapi_stub *stub;
>+
>+   stub = stub_find_public(name);
>+   if (!stub)
>+      stub = stub_find_dynamic(name, 0);
>+
>+   return (stub) ? (mapi_proc) stub_get_addr(stub) : NULL;
>+}
>+
>+/**
>+ * Create a dispatch table.
>+ */
>+struct mapi_table *
>+mapi_table_create(void)
>+{
>+   const struct mapi_table *noop = table_get_noop();
>+   struct mapi_table *tbl;
>+
>+   tbl = malloc(MAPI_TABLE_SIZE);
>+   if (tbl)
>+      memcpy(tbl, noop, MAPI_TABLE_SIZE);
>+
>+   return tbl;
>+}
>+
>+/**
>+ * Destroy a dispatch table.
>+ */
>+void
>+mapi_table_destroy(struct mapi_table *tbl)
>+{
>+   free(tbl);
>+}
>+
>+/**
>+ * Fill a dispatch table.  The order of the procs is determined when mapi_init
>+ * is called.
>+ */
>+void
>+mapi_table_fill(struct mapi_table *tbl, const mapi_proc *procs)
>+{
>+   const struct mapi_table *noop = table_get_noop();
>+   int i;
>+
>+   for (i = 0; i < mapi_num_stubs; i++) {
>+      const struct mapi_stub *stub = mapi_stub_map[i];
>+      int slot = stub_get_slot(stub);
>+      mapi_func func = (mapi_func) procs[i];
>+
>+      if (!func)
>+         func = table_get_func(noop, slot);
>+      table_set_func(tbl, slot, func);
>+   }
>+}
>+
>+/**
>+ * Make a dispatch table current.
>+ */
>+void
>+mapi_table_make_current(const struct mapi_table *tbl)
>+{
>+   u_current_set(tbl);
>+}
>diff --git a/src/mapi/mapi.h b/src/mapi/mapi.h
>new file mode 100644
>index 0000000..c7e43e2
>--- /dev/null
>+++ b/src/mapi/mapi.h
>@@ -0,0 +1,66 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#ifndef _MAPI_H_
>+#define _MAPI_H_
>+
>+#include "u_compiler.h"
>+
>+#ifdef _WIN32
>+#ifdef MAPI_DLL_EXPORTS
>+#define MAPI_EXPORT __declspec(dllexport)
>+#else
>+#define MAPI_EXPORT __declspec(dllimport)
>+#endif
>+#else /* _WIN32 */
>+#define MAPI_EXPORT PUBLIC
>+#endif
>+
>+typedef void (*mapi_proc)(void);
>+
>+struct mapi_table;
>+
>+MAPI_EXPORT void
>+mapi_init(const char *spec);
>+
>+MAPI_EXPORT mapi_proc
>+mapi_get_proc_address(const char *name);
>+
>+MAPI_EXPORT struct mapi_table *
>+mapi_table_create(void);
>+
>+MAPI_EXPORT void
>+mapi_table_destroy(struct mapi_table *tbl);
>+
>+MAPI_EXPORT void
>+mapi_table_fill(struct mapi_table *tbl, const mapi_proc *procs);
>+
>+MAPI_EXPORT void
>+mapi_table_make_current(const struct mapi_table *tbl);
>+
>+#endif /* _MAPI_H_ */
>diff --git a/src/mapi/mapi/Makefile.sources b/src/mapi/mapi/Makefile.sources
>deleted file mode 100644
>index a2f6c71..0000000
>--- a/src/mapi/mapi/Makefile.sources
>+++ /dev/null
>@@ -1,36 +0,0 @@
>-# src/mapi/mapi/Makefile.sources
>-#
>-# mapi may be used in several ways
>-#
>-#  - In default mode, mapi implements the interface defined by mapi.h.  To use
>-#    this mode, compile MAPI_FILES.
>-#
>-#  - In util mode, mapi provides utility functions for use with glapi.  To use
>-#    this mode, compile MAPI_UTIL_FILES with MAPI_MODE_UTIL defined.
>-#
>-#  - In glapi mode, mapi implements the interface defined by glapi.h.  To use
>-#    this mode, compile MAPI_GLAPI_FILES with MAPI_MODE_GLAPI defined.
>-#
>-#  - In bridge mode, mapi provides entry points calling into glapi.  To use
>-#    this mode, compile MAPI_BRIDGE_FILES with MAPI_MODE_BRIDGE defined.
>-
>-MAPI_UTIL_FILES = \
>-	$(TOP)/src/mapi/mapi/u_current.c \
>-	$(TOP)/src/mapi/mapi/u_execmem.c
>-
>-MAPI_FILES = \
>-	$(TOP)/src/mapi/mapi/entry.c \
>-	$(TOP)/src/mapi/mapi/mapi.c \
>-	$(TOP)/src/mapi/mapi/stub.c \
>-	$(TOP)/src/mapi/mapi/table.c \
>-	$(MAPI_UTIL_FILES)
>-
>-MAPI_GLAPI_FILES = \
>-	$(TOP)/src/mapi/mapi/entry.c \
>-	$(TOP)/src/mapi/mapi/mapi_glapi.c \
>-	$(TOP)/src/mapi/mapi/stub.c \
>-	$(TOP)/src/mapi/mapi/table.c \
>-	$(MAPI_UTIL_FILES)
>-
>-MAPI_BRIDGE_FILES = \
>-	$(TOP)/src/mapi/mapi/entry.c
>diff --git a/src/mapi/mapi/entry.c b/src/mapi/mapi/entry.c
>deleted file mode 100644
>index 3d9168a..0000000
>--- a/src/mapi/mapi/entry.c
>+++ /dev/null
>@@ -1,98 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include "entry.h"
>-#include "u_current.h"
>-#include "u_macros.h"
>-
>-/* define macros for use by assembly dispatchers */
>-#define ENTRY_CURRENT_TABLE U_STRINGIFY(u_current_table)
>-
>-/* in bridge mode, mapi is a user of glapi */
>-#ifdef MAPI_MODE_BRIDGE
>-#define ENTRY_CURRENT_TABLE_GET "_glapi_get_dispatch"
>-#else
>-#define ENTRY_CURRENT_TABLE_GET U_STRINGIFY(u_current_get_internal)
>-#endif
>-
>-#if defined(USE_X86_ASM) && defined(__GNUC__)
>-#   ifdef GLX_USE_TLS
>-#      include "entry_x86_tls.h"
>-#   else                 
>-#      include "entry_x86_tsd.h"
>-#   endif
>-#elif defined(USE_X86_64_ASM) && defined(__GNUC__) && defined(GLX_USE_TLS)
>-#   include "entry_x86-64_tls.h"
>-#else
>-
>-#include <stdlib.h>
>-
>-static INLINE const struct mapi_table *
>-entry_current_get(void)
>-{
>-#ifdef MAPI_MODE_BRIDGE
>-   return GET_DISPATCH();
>-#else
>-   return u_current_get();
>-#endif
>-}
>-
>-/* C version of the public entries */
>-#define MAPI_TMP_DEFINES
>-#define MAPI_TMP_PUBLIC_DECLARES
>-#define MAPI_TMP_PUBLIC_ENTRIES
>-#include "mapi_tmp.h"
>-
>-#ifndef MAPI_MODE_BRIDGE
>-
>-void
>-entry_patch_public(void)
>-{
>-}
>-
>-mapi_func
>-entry_get_public(int slot)
>-{
>-   /* pubic_entries are defined by MAPI_TMP_PUBLIC_ENTRIES */
>-   return public_entries[slot];
>-}
>-
>-mapi_func
>-entry_generate(int slot)
>-{
>-   return NULL;
>-}
>-
>-void
>-entry_patch(mapi_func entry, int slot)
>-{
>-}
>-
>-#endif /* MAPI_MODE_BRIDGE */
>-
>-#endif /* asm */
>diff --git a/src/mapi/mapi/entry.h b/src/mapi/mapi/entry.h
>deleted file mode 100644
>index 9df8100..0000000
>--- a/src/mapi/mapi/entry.h
>+++ /dev/null
>@@ -1,48 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#ifndef _ENTRY_H_
>-#define _ENTRY_H_
>-
>-#include "u_compiler.h"
>-
>-typedef void (*mapi_func)(void);
>-
>-void
>-entry_patch_public(void);
>-
>-mapi_func
>-entry_get_public(int slot);
>-
>-mapi_func
>-entry_generate(int slot);
>-
>-void
>-entry_patch(mapi_func entry, int slot);
>-
>-#endif /* _ENTRY_H_ */
>diff --git a/src/mapi/mapi/entry_x86-64_tls.h b/src/mapi/mapi/entry_x86-64_tls.h
>deleted file mode 100644
>index 72d4125..0000000
>--- a/src/mapi/mapi/entry_x86-64_tls.h
>+++ /dev/null
>@@ -1,126 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include "u_macros.h"
>-
>-#ifdef __linux__
>-__asm__(".section .note.ABI-tag, \"a\"\n\t"
>-        ".p2align 2\n\t"
>-        ".long 1f - 0f\n\t"      /* name length */
>-        ".long 3f - 2f\n\t"      /* data length */
>-        ".long 1\n\t"            /* note length */
>-        "0: .asciz \"GNU\"\n\t"  /* vendor name */
>-        "1: .p2align 2\n\t"
>-        "2: .long 0\n\t"         /* note data: the ABI tag */
>-        ".long 2,4,20\n\t"       /* Minimum kernel version w/TLS */
>-        "3: .p2align 2\n\t");    /* pad out section */
>-#endif /* __linux__ */
>-
>-__asm__(".text\n"
>-        ".balign 32\n"
>-        "x86_64_entry_start:");
>-
>-#define STUB_ASM_ENTRY(func)                             \
>-   ".globl " func "\n"                                   \
>-   ".type " func ", @function\n"                         \
>-   ".balign 32\n"                                        \
>-   func ":"
>-
>-#define STUB_ASM_CODE(slot)                              \
>-   "movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t"  \
>-   "movq %fs:(%rax), %r11\n\t"                           \
>-   "jmp *(8 * " slot ")(%r11)"
>-
>-#define MAPI_TMP_STUB_ASM_GCC
>-#include "mapi_tmp.h"
>-
>-#ifndef MAPI_MODE_BRIDGE
>-
>-__asm__("x86_64_current_tls:\n\t"
>-	"movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t"
>-	"ret");
>-
>-extern unsigned long
>-x86_64_current_tls();
>-
>-#include <string.h>
>-#include "u_execmem.h"
>-
>-void
>-entry_patch_public(void)
>-{
>-}
>-
>-static char
>-x86_64_entry_start[];
>-
>-mapi_func
>-entry_get_public(int slot)
>-{
>-   return (mapi_func) (x86_64_entry_start + slot * 32);
>-}
>-
>-void
>-entry_patch(mapi_func entry, int slot)
>-{
>-   char *code = (char *) entry;
>-   *((unsigned int *) (code + 12)) = slot * sizeof(mapi_func);
>-}
>-
>-mapi_func
>-entry_generate(int slot)
>-{
>-   const char code_templ[16] = {
>-      /* movq %fs:0, %r11 */
>-      0x64, 0x4c, 0x8b, 0x1c, 0x25, 0x00, 0x00, 0x00, 0x00,
>-      /* jmp *0x1234(%r11) */
>-      0x41, 0xff, 0xa3, 0x34, 0x12, 0x00, 0x00,
>-   };
>-   unsigned long addr;
>-   void *code;
>-   mapi_func entry;
>-
>-   addr = x86_64_current_tls();
>-   if ((addr >> 32) != 0xffffffff)
>-      return NULL;
>-   addr &= 0xffffffff;
>-
>-   code = u_execmem_alloc(sizeof(code_templ));
>-   if (!code)
>-      return NULL;
>-
>-   memcpy(code, code_templ, sizeof(code_templ));
>-
>-   *((unsigned int *) (code + 5)) = addr;
>-   entry = (mapi_func) code;
>-   entry_patch(entry, slot);
>-
>-   return entry;
>-}
>-
>-#endif /* MAPI_MODE_BRIDGE */
>diff --git a/src/mapi/mapi/entry_x86_tls.h b/src/mapi/mapi/entry_x86_tls.h
>deleted file mode 100644
>index de91812..0000000
>--- a/src/mapi/mapi/entry_x86_tls.h
>+++ /dev/null
>@@ -1,146 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include <string.h>
>-#include "u_macros.h"
>-
>-#ifdef __linux__
>-__asm__(".section .note.ABI-tag, \"a\"\n\t"
>-        ".p2align 2\n\t"
>-        ".long 1f - 0f\n\t"      /* name length */
>-        ".long 3f - 2f\n\t"      /* data length */
>-        ".long 1\n\t"            /* note length */
>-        "0: .asciz \"GNU\"\n\t"  /* vendor name */
>-        "1: .p2align 2\n\t"
>-        "2: .long 0\n\t"         /* note data: the ABI tag */
>-        ".long 2,4,20\n\t"       /* Minimum kernel version w/TLS */
>-        "3: .p2align 2\n\t");    /* pad out section */
>-#endif /* __linux__ */
>-
>-__asm__(".text");
>-
>-__asm__("x86_current_tls:\n\t"
>-	"call 1f\n"
>-        "1:\n\t"
>-        "popl %eax\n\t"
>-	"addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax\n\t"
>-	"movl " ENTRY_CURRENT_TABLE "@GOTNTPOFF(%eax), %eax\n\t"
>-	"ret");
>-
>-#ifndef GLX_X86_READONLY_TEXT
>-__asm__(".section wtext, \"awx\", @progbits");
>-#endif /* GLX_X86_READONLY_TEXT */
>-
>-__asm__(".balign 16\n"
>-        "x86_entry_start:");
>-
>-#define STUB_ASM_ENTRY(func)     \
>-   ".globl " func "\n"           \
>-   ".type " func ", @function\n" \
>-   ".balign 16\n"                \
>-   func ":"
>-
>-#define STUB_ASM_CODE(slot)      \
>-   "call x86_current_tls\n\t"    \
>-   "movl %gs:(%eax), %eax\n\t"   \
>-   "jmp *(4 * " slot ")(%eax)"
>-
>-#define MAPI_TMP_STUB_ASM_GCC
>-#include "mapi_tmp.h"
>-
>-#ifndef GLX_X86_READONLY_TEXT
>-__asm__(".balign 16\n"
>-        "x86_entry_end:");
>-__asm__(".text");
>-#endif /* GLX_X86_READONLY_TEXT */
>-
>-#ifndef MAPI_MODE_BRIDGE
>-
>-#include "u_execmem.h"
>-
>-extern unsigned long
>-x86_current_tls();
>-
>-static char x86_entry_start[];
>-static char x86_entry_end[];
>-
>-void
>-entry_patch_public(void)
>-{
>-#ifndef GLX_X86_READONLY_TEXT
>-   char patch[8] = {
>-      0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, /* movl %gs:0x0, %eax */
>-      0x90, 0x90                          /* nop's */
>-   };
>-   char *entry;
>-
>-   *((unsigned long *) (patch + 2)) = x86_current_tls();
>-
>-   for (entry = x86_entry_start; entry < x86_entry_end; entry += 16)
>-      memcpy(entry, patch, sizeof(patch));
>-#endif
>-}
>-
>-mapi_func
>-entry_get_public(int slot)
>-{
>-   return (mapi_func) (x86_entry_start + slot * 16);
>-}
>-
>-void
>-entry_patch(mapi_func entry, int slot)
>-{
>-   char *code = (char *) entry;
>-   *((unsigned long *) (code + 8)) = slot * sizeof(mapi_func);
>-}
>-
>-mapi_func
>-entry_generate(int slot)
>-{
>-   const char code_templ[16] = {
>-      0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, /* movl %gs:0x0, %eax */
>-      0xff, 0xa0, 0x34, 0x12, 0x00, 0x00, /* jmp *0x1234(%eax) */
>-      0x90, 0x90, 0x90, 0x90              /* nop's */
>-   };
>-   void *code;
>-   mapi_func entry;
>-
>-   code = u_execmem_alloc(sizeof(code_templ));
>-   if (!code)
>-      return NULL;
>-
>-   memcpy(code, code_templ, sizeof(code_templ));
>-
>-   *((unsigned long *) (code + 2)) = x86_current_tls();
>-   entry = (mapi_func) code;
>-   entry_patch(entry, slot);
>-
>-   return entry;
>-}
>-
>-#endif /* MAPI_MODE_BRIDGE */
>diff --git a/src/mapi/mapi/entry_x86_tsd.h b/src/mapi/mapi/entry_x86_tsd.h
>deleted file mode 100644
>index c479c19..0000000
>--- a/src/mapi/mapi/entry_x86_tsd.h
>+++ /dev/null
>@@ -1,104 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include "u_macros.h"
>-
>-#define X86_ENTRY_SIZE 32
>-
>-__asm__(".text\n"
>-        ".balign 32\n"
>-        "x86_entry_start:");
>-
>-#define STUB_ASM_ENTRY(func)        \
>-   ".globl " func "\n"              \
>-   ".type " func ", @function\n"    \
>-   ".balign 32\n"                   \
>-   func ":"
>-
>-#define STUB_ASM_CODE(slot)         \
>-   "movl " ENTRY_CURRENT_TABLE ", %eax\n\t" \
>-   "testl %eax, %eax\n\t"           \
>-   "je 1f\n\t"                      \
>-   "jmp *(4 * " slot ")(%eax)\n"    \
>-   "1:\n\t"                         \
>-   "call " ENTRY_CURRENT_TABLE_GET "\n\t" \
>-   "jmp *(4 * " slot ")(%eax)"
>-
>-#define MAPI_TMP_STUB_ASM_GCC
>-#include "mapi_tmp.h"
>-
>-#ifndef MAPI_MODE_BRIDGE
>-
>-__asm__(".balign 32\n"
>-        "x86_entry_end:");
>-
>-#include <string.h>
>-#include "u_execmem.h"
>-
>-static const char x86_entry_start[];
>-static const char x86_entry_end[];
>-
>-void
>-entry_patch_public(void)
>-{
>-}
>-
>-mapi_func
>-entry_get_public(int slot)
>-{
>-   return (mapi_func) (x86_entry_start + slot * X86_ENTRY_SIZE);
>-}
>-
>-void
>-entry_patch(mapi_func entry, int slot)
>-{
>-   char *code = (char *) entry;
>-
>-   *((unsigned long *) (code + 11)) = slot * sizeof(mapi_func);
>-   *((unsigned long *) (code + 22)) = slot * sizeof(mapi_func);
>-}
>-
>-mapi_func
>-entry_generate(int slot)
>-{
>-   const char *code_templ = x86_entry_end - X86_ENTRY_SIZE;
>-   void *code;
>-   mapi_func entry;
>-
>-   code = u_execmem_alloc(X86_ENTRY_SIZE);
>-   if (!code)
>-      return NULL;
>-
>-   memcpy(code, code_templ, X86_ENTRY_SIZE);
>-   entry = (mapi_func) code;
>-   entry_patch(entry, slot);
>-
>-   return entry;
>-}
>-
>-#endif /* MAPI_MODE_BRIDGE */
>diff --git a/src/mapi/mapi/mapi.c b/src/mapi/mapi/mapi.c
>deleted file mode 100644
>index b471c40..0000000
>--- a/src/mapi/mapi/mapi.c
>+++ /dev/null
>@@ -1,191 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include <stdlib.h>
>-#include <string.h>
>-
>-#include "u_current.h"
>-#include "u_thread.h"
>-#include "mapi.h"
>-#include "stub.h"
>-#include "table.h"
>-
>-/* dynamic stubs will run out before this array */
>-static const struct mapi_stub *mapi_stub_map[MAPI_TABLE_NUM_SLOTS];
>-static int mapi_num_stubs;
>-
>-static const struct mapi_stub *
>-get_stub(const char *name, const struct mapi_stub *alias)
>-{
>-   const struct mapi_stub *stub;
>-
>-   stub = stub_find_public(name);
>-   if (!stub) {
>-      struct mapi_stub *dyn = stub_find_dynamic(name, 1);
>-      if (dyn) {
>-         stub_fix_dynamic(dyn, alias);
>-         stub = dyn;
>-      }
>-   }
>-
>-   return stub;
>-}
>-
>-/**
>- * Initialize mapi.  spec consists of NULL-separated strings.  The first string
>- * denotes the version.  It is followed by variable numbers of entries.  Each
>- * entry can have multiple names.  An empty name terminates an entry.  An empty
>- * entry terminates the spec.  A spec of two entries, Foo and Bar, is as
>- * follows
>- *
>- *   "1\0"
>- *   "Foo\0"
>- *   "FooEXT\0"
>- *   "\0"
>- *   "Bar\0"
>- *   "\0"
>- */
>-void
>-mapi_init(const char *spec)
>-{
>-   u_mutex_declare_static(mutex);
>-   const char *p;
>-   int ver, count;
>-
>-   u_mutex_lock(mutex);
>-
>-   /* already initialized */
>-   if (mapi_num_stubs) {
>-      u_mutex_unlock(mutex);
>-      return;
>-   }
>-
>-   count = 0;
>-   p = spec;
>-
>-   /* parse version string */
>-   ver = atoi(p);
>-   if (ver != 1) {
>-      u_mutex_unlock(mutex);
>-      return;
>-   }
>-   p += strlen(p) + 1;
>-
>-   while (*p) {
>-      const struct mapi_stub *stub;
>-
>-      stub = get_stub(p, NULL);
>-      /* out of dynamic entries */
>-      if (!stub)
>-         break;
>-      p += strlen(p) + 1;
>-
>-      while (*p) {
>-         get_stub(p, stub);
>-         p += strlen(p) + 1;
>-      }
>-
>-      mapi_stub_map[count++] = stub;
>-      p++;
>-   }
>-
>-   mapi_num_stubs = count;
>-
>-   u_mutex_unlock(mutex);
>-}
>-
>-/**
>- * Return the address of an entry.  Optionally generate the entry if it does
>- * not exist.
>- */
>-mapi_proc
>-mapi_get_proc_address(const char *name)
>-{
>-   const struct mapi_stub *stub;
>-
>-   stub = stub_find_public(name);
>-   if (!stub)
>-      stub = stub_find_dynamic(name, 0);
>-
>-   return (stub) ? (mapi_proc) stub_get_addr(stub) : NULL;
>-}
>-
>-/**
>- * Create a dispatch table.
>- */
>-struct mapi_table *
>-mapi_table_create(void)
>-{
>-   const struct mapi_table *noop = table_get_noop();
>-   struct mapi_table *tbl;
>-
>-   tbl = malloc(MAPI_TABLE_SIZE);
>-   if (tbl)
>-      memcpy(tbl, noop, MAPI_TABLE_SIZE);
>-
>-   return tbl;
>-}
>-
>-/**
>- * Destroy a dispatch table.
>- */
>-void
>-mapi_table_destroy(struct mapi_table *tbl)
>-{
>-   free(tbl);
>-}
>-
>-/**
>- * Fill a dispatch table.  The order of the procs is determined when mapi_init
>- * is called.
>- */
>-void
>-mapi_table_fill(struct mapi_table *tbl, const mapi_proc *procs)
>-{
>-   const struct mapi_table *noop = table_get_noop();
>-   int i;
>-
>-   for (i = 0; i < mapi_num_stubs; i++) {
>-      const struct mapi_stub *stub = mapi_stub_map[i];
>-      int slot = stub_get_slot(stub);
>-      mapi_func func = (mapi_func) procs[i];
>-
>-      if (!func)
>-         func = table_get_func(noop, slot);
>-      table_set_func(tbl, slot, func);
>-   }
>-}
>-
>-/**
>- * Make a dispatch table current.
>- */
>-void
>-mapi_table_make_current(const struct mapi_table *tbl)
>-{
>-   u_current_set(tbl);
>-}
>diff --git a/src/mapi/mapi/mapi.h b/src/mapi/mapi/mapi.h
>deleted file mode 100644
>index c7e43e2..0000000
>--- a/src/mapi/mapi/mapi.h
>+++ /dev/null
>@@ -1,66 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#ifndef _MAPI_H_
>-#define _MAPI_H_
>-
>-#include "u_compiler.h"
>-
>-#ifdef _WIN32
>-#ifdef MAPI_DLL_EXPORTS
>-#define MAPI_EXPORT __declspec(dllexport)
>-#else
>-#define MAPI_EXPORT __declspec(dllimport)
>-#endif
>-#else /* _WIN32 */
>-#define MAPI_EXPORT PUBLIC
>-#endif
>-
>-typedef void (*mapi_proc)(void);
>-
>-struct mapi_table;
>-
>-MAPI_EXPORT void
>-mapi_init(const char *spec);
>-
>-MAPI_EXPORT mapi_proc
>-mapi_get_proc_address(const char *name);
>-
>-MAPI_EXPORT struct mapi_table *
>-mapi_table_create(void);
>-
>-MAPI_EXPORT void
>-mapi_table_destroy(struct mapi_table *tbl);
>-
>-MAPI_EXPORT void
>-mapi_table_fill(struct mapi_table *tbl, const mapi_proc *procs);
>-
>-MAPI_EXPORT void
>-mapi_table_make_current(const struct mapi_table *tbl);
>-
>-#endif /* _MAPI_H_ */
>diff --git a/src/mapi/mapi/mapi_abi.py b/src/mapi/mapi/mapi_abi.py
>deleted file mode 100644
>index c645c02..0000000
>--- a/src/mapi/mapi/mapi_abi.py
>+++ /dev/null
>@@ -1,873 +0,0 @@
>-#!/usr/bin/env python
>-
>-# Mesa 3-D graphics library
>-# Version:  7.9
>-#
>-# Copyright (C) 2010 LunarG Inc.
>-#
>-# Permission is hereby granted, free of charge, to any person obtaining a
>-# copy of this software and associated documentation files (the "Software"),
>-# to deal in the Software without restriction, including without limitation
>-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
>-# and/or sell copies of the Software, and to permit persons to whom the
>-# Software is furnished to do so, subject to the following conditions:
>-#
>-# The above copyright notice and this permission notice shall be included
>-# in all copies or substantial portions of the Software.
>-#
>-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>-# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>-# DEALINGS IN THE SOFTWARE.
>-#
>-# Authors:
>-#    Chia-I Wu <olv at lunarg.com>
>-
>-import sys
>-# make it possible to import glapi
>-import os
>-GLAPI = os.path.join(".", os.path.dirname(sys.argv[0]), "../glapi/gen")
>-sys.path.append(GLAPI)
>-
>-import re
>-from optparse import OptionParser
>-import gl_XML
>-import glX_XML
>-
>-
>-# number of dynamic entries
>-ABI_NUM_DYNAMIC_ENTRIES = 256
>-
>-class ABIEntry(object):
>-    """Represent an ABI entry."""
>-
>-    _match_c_param = re.compile(
>-            '^(?P<type>[\w\s*]+?)(?P<name>\w+)(\[(?P<array>\d+)\])?$')
>-
>-    def __init__(self, cols, attrs, xml_data = None):
>-        self._parse(cols)
>-
>-        self.slot = attrs['slot']
>-        self.hidden = attrs['hidden']
>-        self.alias = attrs['alias']
>-        self.handcode = attrs['handcode']
>-        self.xml_data = xml_data
>-
>-    def c_prototype(self):
>-        return '%s %s(%s)' % (self.c_return(), self.name, self.c_params())
>-
>-    def c_return(self):
>-        ret = self.ret
>-        if not ret:
>-            ret = 'void'
>-
>-        return ret
>-
>-    def c_params(self):
>-        """Return the parameter list used in the entry prototype."""
>-        c_params = []
>-        for t, n, a in self.params:
>-            sep = '' if t.endswith('*') else ' '
>-            arr = '[%d]' % a if a else ''
>-            c_params.append(t + sep + n + arr)
>-        if not c_params:
>-            c_params.append('void')
>-
>-        return ", ".join(c_params)
>-
>-    def c_args(self):
>-        """Return the argument list used in the entry invocation."""
>-        c_args = []
>-        for t, n, a in self.params:
>-            c_args.append(n)
>-
>-        return ", ".join(c_args)
>-
>-    def _parse(self, cols):
>-        ret = cols.pop(0)
>-        if ret == 'void':
>-            ret = None
>-
>-        name = cols.pop(0)
>-
>-        params = []
>-        if not cols:
>-            raise Exception(cols)
>-        elif len(cols) == 1 and cols[0] == 'void':
>-            pass
>-        else:
>-            for val in cols:
>-                params.append(self._parse_param(val))
>-
>-        self.ret = ret
>-        self.name = name
>-        self.params = params
>-
>-    def _parse_param(self, c_param):
>-        m = self._match_c_param.match(c_param)
>-        if not m:
>-            raise Exception('unrecognized param ' + c_param)
>-
>-        c_type = m.group('type').strip()
>-        c_name = m.group('name')
>-        c_array = m.group('array')
>-        c_array = int(c_array) if c_array else 0
>-
>-        return (c_type, c_name, c_array)
>-
>-    def __str__(self):
>-        return self.c_prototype()
>-
>-    def __cmp__(self, other):
>-        # compare slot, alias, and then name
>-        res = cmp(self.slot, other.slot)
>-        if not res:
>-            if not self.alias:
>-                res = -1
>-            elif not other.alias:
>-                res = 1
>-
>-            if not res:
>-                res = cmp(self.name, other.name)
>-
>-        return res
>-
>-def abi_parse_xml(xml):
>-    """Parse a GLAPI XML file for ABI entries."""
>-    api = gl_XML.parse_GL_API(xml, glX_XML.glx_item_factory())
>-
>-    entry_dict = {}
>-    for func in api.functionIterateByOffset():
>-        # make sure func.name appear first
>-        entry_points = func.entry_points[:]
>-        entry_points.remove(func.name)
>-        entry_points.insert(0, func.name)
>-
>-        for name in entry_points:
>-            attrs = {
>-                    'slot': func.offset,
>-                    'hidden': not func.is_static_entry_point(name),
>-                    'alias': None if name == func.name else func.name,
>-                    'handcode': bool(func.has_different_protocol(name)),
>-            }
>-
>-            # post-process attrs
>-            if attrs['alias']:
>-                try:
>-                    alias = entry_dict[attrs['alias']]
>-                except KeyError:
>-                    raise Exception('failed to alias %s' % attrs['alias'])
>-                if alias.alias:
>-                    raise Exception('recursive alias %s' % ent.name)
>-                attrs['alias'] = alias
>-            if attrs['handcode']:
>-                attrs['handcode'] = func.static_glx_name(name)
>-            else:
>-                attrs['handcode'] = None
>-
>-            if entry_dict.has_key(name):
>-                raise Exception('%s is duplicated' % (name))
>-
>-            cols = []
>-            cols.append(func.return_type)
>-            cols.append(name)
>-            params = func.get_parameter_string(name)
>-            cols.extend([p.strip() for p in params.split(',')])
>-
>-            ent = ABIEntry(cols, attrs, func)
>-            entry_dict[ent.name] = ent
>-
>-    entries = entry_dict.values()
>-    entries.sort()
>-
>-    return entries
>-
>-def abi_parse_line(line):
>-    cols = [col.strip() for col in line.split(',')]
>-
>-    attrs = {
>-            'slot': -1,
>-            'hidden': False,
>-            'alias': None,
>-            'handcode': None,
>-    }
>-
>-    # extract attributes from the first column
>-    vals = cols[0].split(':')
>-    while len(vals) > 1:
>-        val = vals.pop(0)
>-        if val.startswith('slot='):
>-            attrs['slot'] = int(val[5:])
>-        elif val == 'hidden':
>-            attrs['hidden'] = True
>-        elif val.startswith('alias='):
>-            attrs['alias'] = val[6:]
>-        elif val.startswith('handcode='):
>-            attrs['handcode'] = val[9:]
>-        elif not val:
>-            pass
>-        else:
>-            raise Exception('unknown attribute %s' % val)
>-    cols[0] = vals[0]
>-
>-    return (attrs, cols)
>-
>-def abi_parse(filename):
>-    """Parse a CSV file for ABI entries."""
>-    fp = open(filename) if filename != '-' else sys.stdin
>-    lines = [line.strip() for line in fp.readlines()
>-            if not line.startswith('#') and line.strip()]
>-
>-    entry_dict = {}
>-    next_slot = 0
>-    for line in lines:
>-        attrs, cols = abi_parse_line(line)
>-
>-        # post-process attributes
>-        if attrs['alias']:
>-            try:
>-                alias = entry_dict[attrs['alias']]
>-            except KeyError:
>-                raise Exception('failed to alias %s' % attrs['alias'])
>-            if alias.alias:
>-                raise Exception('recursive alias %s' % ent.name)
>-            slot = alias.slot
>-            attrs['alias'] = alias
>-        else:
>-            slot = next_slot
>-            next_slot += 1
>-
>-        if attrs['slot'] < 0:
>-            attrs['slot'] = slot
>-        elif attrs['slot'] != slot:
>-            raise Exception('invalid slot in %s' % (line))
>-
>-        ent = ABIEntry(cols, attrs)
>-        if entry_dict.has_key(ent.name):
>-            raise Exception('%s is duplicated' % (ent.name))
>-        entry_dict[ent.name] = ent
>-
>-    entries = entry_dict.values()
>-    entries.sort()
>-
>-    return entries
>-
>-def abi_sanity_check(entries):
>-    if not entries:
>-        return
>-
>-    all_names = []
>-    last_slot = entries[-1].slot
>-    i = 0
>-    for slot in xrange(last_slot + 1):
>-        if entries[i].slot != slot:
>-            raise Exception('entries are not ordered by slots')
>-        if entries[i].alias:
>-            raise Exception('first entry of slot %d aliases %s'
>-                    % (slot, entries[i].alias.name))
>-        handcode = None
>-        while i < len(entries) and entries[i].slot == slot:
>-            ent = entries[i]
>-            if not handcode and ent.handcode:
>-                handcode = ent.handcode
>-            elif ent.handcode != handcode:
>-                raise Exception('two aliases with handcode %s != %s',
>-                        ent.handcode, handcode)
>-
>-            if ent.name in all_names:
>-                raise Exception('%s is duplicated' % (ent.name))
>-            if ent.alias and ent.alias.name not in all_names:
>-                raise Exception('failed to alias %s' % (ent.alias.name))
>-            all_names.append(ent.name)
>-            i += 1
>-    if i < len(entries):
>-        raise Exception('there are %d invalid entries' % (len(entries) - 1))
>-
>-class ABIPrinter(object):
>-    """MAPI Printer"""
>-
>-    def __init__(self, entries):
>-        self.entries = entries
>-
>-        # sort entries by their names
>-        self.entries_sorted_by_names = self.entries[:]
>-        self.entries_sorted_by_names.sort(lambda x, y: cmp(x.name, y.name))
>-
>-        self.indent = ' ' * 3
>-        self.noop_warn = 'noop_warn'
>-        self.noop_generic = 'noop_generic'
>-        self.current_get = 'entry_current_get'
>-
>-        self.api_defines = []
>-        self.api_headers = ['"KHR/khrplatform.h"']
>-        self.api_call = 'KHRONOS_APICALL'
>-        self.api_entry = 'KHRONOS_APIENTRY'
>-        self.api_attrs = 'KHRONOS_APIATTRIBUTES'
>-
>-        self.c_header = ''
>-
>-        self.lib_need_table_size = True
>-        self.lib_need_noop_array = True
>-        self.lib_need_stubs = True
>-        self.lib_need_all_entries = True
>-        self.lib_need_non_hidden_entries = False
>-
>-    def c_notice(self):
>-        return '/* This file is automatically generated by mapi_abi.py.  Do not modify. */'
>-
>-    def c_public_includes(self):
>-        """Return includes of the client API headers."""
>-        defines = ['#define ' + d for d in self.api_defines]
>-        includes = ['#include ' + h for h in self.api_headers]
>-        return "\n".join(defines + includes)
>-
>-    def need_entry_point(self, ent):
>-        """Return True if an entry point is needed for the entry."""
>-        # non-handcode hidden aliases may share the entry they alias
>-        use_alias = (ent.hidden and ent.alias and not ent.handcode)
>-        return not use_alias
>-
>-    def c_public_declarations(self, prefix):
>-        """Return the declarations of public entry points."""
>-        decls = []
>-        for ent in self.entries:
>-            if not self.need_entry_point(ent):
>-                continue
>-            export = self.api_call if not ent.hidden else ''
>-            decls.append(self._c_decl(ent, prefix, True, export) + ';')
>-
>-        return "\n".join(decls)
>-
>-    def c_mapi_table(self):
>-        """Return defines of the dispatch table size."""
>-        num_static_entries = self.entries[-1].slot + 1
>-        return ('#define MAPI_TABLE_NUM_STATIC %d\n' + \
>-                '#define MAPI_TABLE_NUM_DYNAMIC %d') % (
>-                        num_static_entries, ABI_NUM_DYNAMIC_ENTRIES)
>-
>-    def c_mapi_table_initializer(self, prefix):
>-        """Return the array initializer for mapi_table_fill."""
>-        entries = [self._c_function(ent, prefix)
>-                for ent in self.entries if not ent.alias]
>-        pre = self.indent + '(mapi_proc) '
>-        return pre + (',\n' + pre).join(entries)
>-
>-    def c_mapi_table_spec(self):
>-        """Return the spec for mapi_init."""
>-        specv1 = []
>-        line = '"1'
>-        for ent in self.entries:
>-            if not ent.alias:
>-                line += '\\0"\n'
>-                specv1.append(line)
>-                line = '"'
>-            line += '%s\\0' % ent.name
>-        line += '";'
>-        specv1.append(line)
>-
>-        return self.indent + self.indent.join(specv1)
>-
>-    def _c_function(self, ent, prefix, mangle=False, stringify=False):
>-        """Return the function name of an entry."""
>-        formats = {
>-                True: { True: '%s_STR(%s)', False: '%s(%s)' },
>-                False: { True: '"%s%s"', False: '%s%s' },
>-        }
>-        fmt = formats[prefix.isupper()][stringify]
>-        name = ent.name
>-        if mangle and ent.hidden:
>-            name = '_dispatch_stub_' + str(ent.slot)
>-        return fmt % (prefix, name)
>-
>-    def _c_function_call(self, ent, prefix):
>-        """Return the function name used for calling."""
>-        if ent.handcode:
>-            # _c_function does not handle this case
>-            formats = { True: '%s(%s)', False: '%s%s' }
>-            fmt = formats[prefix.isupper()]
>-            name = fmt % (prefix, ent.handcode)
>-        elif self.need_entry_point(ent):
>-            name = self._c_function(ent, prefix, True)
>-        else:
>-            name = self._c_function(ent.alias, prefix, True)
>-        return name
>-
>-    def _c_decl(self, ent, prefix, mangle=False, export=''):
>-        """Return the C declaration for the entry."""
>-        decl = '%s %s %s(%s)' % (ent.c_return(), self.api_entry,
>-                self._c_function(ent, prefix, mangle), ent.c_params())
>-        if export:
>-            decl = export + ' ' + decl
>-        if self.api_attrs:
>-            decl += ' ' + self.api_attrs
>-
>-        return decl
>-
>-    def _c_cast(self, ent):
>-        """Return the C cast for the entry."""
>-        cast = '%s (%s *)(%s)' % (
>-                ent.c_return(), self.api_entry, ent.c_params())
>-
>-        return cast
>-
>-    def c_private_declarations(self, prefix):
>-        """Return the declarations of private functions."""
>-        decls = [self._c_decl(ent, prefix) + ';'
>-                for ent in self.entries if not ent.alias]
>-
>-        return "\n".join(decls)
>-
>-    def c_public_dispatches(self, prefix, no_hidden):
>-        """Return the public dispatch functions."""
>-        dispatches = []
>-        for ent in self.entries:
>-            if ent.hidden and no_hidden:
>-                continue
>-
>-            if not self.need_entry_point(ent):
>-                continue
>-
>-            export = self.api_call if not ent.hidden else ''
>-
>-            proto = self._c_decl(ent, prefix, True, export)
>-            cast = self._c_cast(ent)
>-
>-            ret = ''
>-            if ent.ret:
>-                ret = 'return '
>-            stmt1 = self.indent
>-            stmt1 += 'const struct mapi_table *_tbl = %s();' % (
>-                    self.current_get)
>-            stmt2 = self.indent
>-            stmt2 += 'mapi_func _func = ((const mapi_func *) _tbl)[%d];' % (
>-                    ent.slot)
>-            stmt3 = self.indent
>-            stmt3 += '%s((%s) _func)(%s);' % (ret, cast, ent.c_args())
>-
>-            disp = '%s\n{\n%s\n%s\n%s\n}' % (proto, stmt1, stmt2, stmt3)
>-
>-            if ent.handcode:
>-                disp = '#if 0\n' + disp + '\n#endif'
>-
>-            dispatches.append(disp)
>-
>-        return '\n\n'.join(dispatches)
>-
>-    def c_public_initializer(self, prefix):
>-        """Return the initializer for public dispatch functions."""
>-        names = []
>-        for ent in self.entries:
>-            if ent.alias:
>-                continue
>-
>-            name = '%s(mapi_func) %s' % (self.indent,
>-                    self._c_function_call(ent, prefix))
>-            names.append(name)
>-
>-        return ',\n'.join(names)
>-
>-    def c_stub_string_pool(self):
>-        """Return the string pool for use by stubs."""
>-        # sort entries by their names
>-        sorted_entries = self.entries[:]
>-        sorted_entries.sort(lambda x, y: cmp(x.name, y.name))
>-
>-        pool = []
>-        offsets = {}
>-        count = 0
>-        for ent in sorted_entries:
>-            offsets[ent] = count
>-            pool.append('%s' % (ent.name))
>-            count += len(ent.name) + 1
>-
>-        pool_str =  self.indent + '"' + \
>-                ('\\0"\n' + self.indent + '"').join(pool) + '";'
>-        return (pool_str, offsets)
>-
>-    def c_stub_initializer(self, prefix, pool_offsets):
>-        """Return the initializer for struct mapi_stub array."""
>-        stubs = []
>-        for ent in self.entries_sorted_by_names:
>-            stubs.append('%s{ (void *) %d, %d, NULL }' % (
>-                self.indent, pool_offsets[ent], ent.slot))
>-
>-        return ',\n'.join(stubs)
>-
>-    def c_noop_functions(self, prefix, warn_prefix):
>-        """Return the noop functions."""
>-        noops = []
>-        for ent in self.entries:
>-            if ent.alias:
>-                continue
>-
>-            proto = self._c_decl(ent, prefix, False, 'static')
>-
>-            stmt1 = self.indent;
>-            space = ''
>-            for t, n, a in ent.params:
>-                stmt1 += "%s(void) %s;" % (space, n)
>-                space = ' '
>-
>-            if ent.params:
>-                stmt1 += '\n';
>-
>-            stmt1 += self.indent + '%s(%s);' % (self.noop_warn,
>-                    self._c_function(ent, warn_prefix, False, True))
>-
>-            if ent.ret:
>-                stmt2 = self.indent + 'return (%s) 0;' % (ent.ret)
>-                noop = '%s\n{\n%s\n%s\n}' % (proto, stmt1, stmt2)
>-            else:
>-                noop = '%s\n{\n%s\n}' % (proto, stmt1)
>-
>-            noops.append(noop)
>-
>-        return '\n\n'.join(noops)
>-
>-    def c_noop_initializer(self, prefix, use_generic):
>-        """Return an initializer for the noop dispatch table."""
>-        entries = [self._c_function(ent, prefix)
>-                for ent in self.entries if not ent.alias]
>-        if use_generic:
>-            entries = [self.noop_generic] * len(entries)
>-
>-        entries.extend([self.noop_generic] * ABI_NUM_DYNAMIC_ENTRIES)
>-
>-        pre = self.indent + '(mapi_func) '
>-        return pre + (',\n' + pre).join(entries)
>-
>-    def c_asm_gcc(self, prefix, no_hidden):
>-        asm = []
>-
>-        for ent in self.entries:
>-            if ent.hidden and no_hidden:
>-                continue
>-
>-            if not self.need_entry_point(ent):
>-                continue
>-
>-            name = self._c_function(ent, prefix, True, True)
>-
>-            if ent.handcode:
>-                asm.append('#if 0')
>-
>-            if ent.hidden:
>-                asm.append('".hidden "%s"\\n"' % (name))
>-
>-            if ent.alias and not (ent.alias.hidden and no_hidden):
>-                asm.append('".globl "%s"\\n"' % (name))
>-                asm.append('".set "%s", "%s"\\n"' % (name,
>-                    self._c_function(ent.alias, prefix, True, True)))
>-            else:
>-                asm.append('STUB_ASM_ENTRY(%s)"\\n"' % (name))
>-                asm.append('"\\t"STUB_ASM_CODE("%d")"\\n"' % (ent.slot))
>-
>-            if ent.handcode:
>-                asm.append('#endif')
>-            asm.append('')
>-
>-        return "\n".join(asm)
>-
>-    def output_for_lib(self):
>-        print self.c_notice()
>-
>-        if self.c_header:
>-            print
>-            print self.c_header
>-
>-        print
>-        print '#ifdef MAPI_TMP_DEFINES'
>-        print self.c_public_includes()
>-        print
>-        print self.c_public_declarations(self.prefix_lib)
>-        print '#undef MAPI_TMP_DEFINES'
>-        print '#endif /* MAPI_TMP_DEFINES */'
>-
>-        if self.lib_need_table_size:
>-            print
>-            print '#ifdef MAPI_TMP_TABLE'
>-            print self.c_mapi_table()
>-            print '#undef MAPI_TMP_TABLE'
>-            print '#endif /* MAPI_TMP_TABLE */'
>-
>-        if self.lib_need_noop_array:
>-            print
>-            print '#ifdef MAPI_TMP_NOOP_ARRAY'
>-            print '#ifdef DEBUG'
>-            print
>-            print self.c_noop_functions(self.prefix_noop, self.prefix_warn)
>-            print
>-            print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
>-            print self.c_noop_initializer(self.prefix_noop, False)
>-            print '};'
>-            print
>-            print '#else /* DEBUG */'
>-            print
>-            print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
>-            print self.c_noop_initializer(self.prefix_noop, True)
>-            print '};'
>-            print
>-            print '#endif /* DEBUG */'
>-            print '#undef MAPI_TMP_NOOP_ARRAY'
>-            print '#endif /* MAPI_TMP_NOOP_ARRAY */'
>-
>-        if self.lib_need_stubs:
>-            pool, pool_offsets = self.c_stub_string_pool()
>-            print
>-            print '#ifdef MAPI_TMP_PUBLIC_STUBS'
>-            print 'static const char public_string_pool[] ='
>-            print pool
>-            print
>-            print 'static const struct mapi_stub public_stubs[] = {'
>-            print self.c_stub_initializer(self.prefix_lib, pool_offsets)
>-            print '};'
>-            print '#undef MAPI_TMP_PUBLIC_STUBS'
>-            print '#endif /* MAPI_TMP_PUBLIC_STUBS */'
>-
>-        if self.lib_need_all_entries:
>-            print
>-            print '#ifdef MAPI_TMP_PUBLIC_ENTRIES'
>-            print self.c_public_dispatches(self.prefix_lib, False)
>-            print
>-            print 'static const mapi_func public_entries[] = {'
>-            print self.c_public_initializer(self.prefix_lib)
>-            print '};'
>-            print '#undef MAPI_TMP_PUBLIC_ENTRIES'
>-            print '#endif /* MAPI_TMP_PUBLIC_ENTRIES */'
>-
>-            print
>-            print '#ifdef MAPI_TMP_STUB_ASM_GCC'
>-            print '__asm__('
>-            print self.c_asm_gcc(self.prefix_lib, False)
>-            print ');'
>-            print '#undef MAPI_TMP_STUB_ASM_GCC'
>-            print '#endif /* MAPI_TMP_STUB_ASM_GCC */'
>-
>-        if self.lib_need_non_hidden_entries:
>-            all_hidden = True
>-            for ent in self.entries:
>-                if not ent.hidden:
>-                    all_hidden = False
>-                    break
>-            if not all_hidden:
>-                print
>-                print '#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN'
>-                print self.c_public_dispatches(self.prefix_lib, True)
>-                print
>-                print '/* does not need public_entries */'
>-                print '#undef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN'
>-                print '#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */'
>-
>-                print
>-                print '#ifdef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN'
>-                print '__asm__('
>-                print self.c_asm_gcc(self.prefix_lib, True)
>-                print ');'
>-                print '#undef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN'
>-                print '#endif /* MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN */'
>-
>-    def output_for_app(self):
>-        print self.c_notice()
>-        print
>-        print self.c_private_declarations(self.prefix_app)
>-        print
>-        print '#ifdef API_TMP_DEFINE_SPEC'
>-        print
>-        print 'static const char %s_spec[] =' % (self.prefix_app)
>-        print self.c_mapi_table_spec()
>-        print
>-        print 'static const mapi_proc %s_procs[] = {' % (self.prefix_app)
>-        print self.c_mapi_table_initializer(self.prefix_app)
>-        print '};'
>-        print
>-        print '#endif /* API_TMP_DEFINE_SPEC */'
>-
>-class GLAPIPrinter(ABIPrinter):
>-    """OpenGL API Printer"""
>-
>-    def __init__(self, entries):
>-        for ent in entries:
>-            self._override_for_api(ent)
>-        super(GLAPIPrinter, self).__init__(entries)
>-
>-        self.api_defines = ['GL_GLEXT_PROTOTYPES']
>-        self.api_headers = ['"GL/gl.h"', '"GL/glext.h"']
>-        self.api_call = 'GLAPI'
>-        self.api_entry = 'APIENTRY'
>-        self.api_attrs = ''
>-
>-        self.lib_need_table_size = False
>-        self.lib_need_noop_array = False
>-        self.lib_need_stubs = False
>-        self.lib_need_all_entries = False
>-        self.lib_need_non_hidden_entries = True
>-
>-        self.prefix_lib = 'GLAPI_PREFIX'
>-        self.prefix_app = '_mesa_'
>-        self.prefix_noop = 'noop'
>-        self.prefix_warn = self.prefix_lib
>-
>-        self.c_header = self._get_c_header()
>-
>-    def _override_for_api(self, ent):
>-        """Override attributes of an entry if necessary for this
>-        printer."""
>-        # By default, no override is necessary.
>-        pass
>-
>-    def _get_c_header(self):
>-        header = """#ifndef _GLAPI_TMP_H_
>-#define _GLAPI_TMP_H_
>-#ifdef USE_MGL_NAMESPACE
>-#define GLAPI_PREFIX(func)  mgl##func
>-#define GLAPI_PREFIX_STR(func)  "mgl"#func
>-#else
>-#define GLAPI_PREFIX(func)  gl##func
>-#define GLAPI_PREFIX_STR(func)  "gl"#func
>-#endif /* USE_MGL_NAMESPACE */
>-
>-typedef int GLfixed;
>-typedef int GLclampx;
>-#endif /* _GLAPI_TMP_H_ */"""
>-
>-        return header
>-
>-class ES1APIPrinter(GLAPIPrinter):
>-    """OpenGL ES 1.x API Printer"""
>-
>-    def __init__(self, entries):
>-        super(ES1APIPrinter, self).__init__(entries)
>-        self.prefix_lib = 'gl'
>-        self.prefix_warn = 'gl'
>-
>-    def _override_for_api(self, ent):
>-        if ent.xml_data is None:
>-            raise Exception('ES2 API printer requires XML input')
>-        ent.hidden = ent.name not in \
>-            ent.xml_data.entry_points_for_api_version('es1')
>-        ent.handcode = False
>-
>-    def _get_c_header(self):
>-        header = """#ifndef _GLAPI_TMP_H_
>-#define _GLAPI_TMP_H_
>-typedef int GLfixed;
>-typedef int GLclampx;
>-#endif /* _GLAPI_TMP_H_ */"""
>-
>-        return header
>-
>-class ES2APIPrinter(GLAPIPrinter):
>-    """OpenGL ES 2.x API Printer"""
>-
>-    def __init__(self, entries):
>-        super(ES2APIPrinter, self).__init__(entries)
>-        self.prefix_lib = 'gl'
>-        self.prefix_warn = 'gl'
>-
>-    def _override_for_api(self, ent):
>-        if ent.xml_data is None:
>-            raise Exception('ES2 API printer requires XML input')
>-        ent.hidden = ent.name not in \
>-            ent.xml_data.entry_points_for_api_version('es2')
>-        ent.handcode = False
>-
>-    def _get_c_header(self):
>-        header = """#ifndef _GLAPI_TMP_H_
>-#define _GLAPI_TMP_H_
>-typedef int GLfixed;
>-typedef int GLclampx;
>-#endif /* _GLAPI_TMP_H_ */"""
>-
>-        return header
>-
>-class SharedGLAPIPrinter(GLAPIPrinter):
>-    """Shared GLAPI API Printer"""
>-
>-    def __init__(self, entries):
>-        super(SharedGLAPIPrinter, self).__init__(entries)
>-
>-        self.lib_need_table_size = True
>-        self.lib_need_noop_array = True
>-        self.lib_need_stubs = True
>-        self.lib_need_all_entries = True
>-        self.lib_need_non_hidden_entries = False
>-
>-        self.prefix_lib = 'shared'
>-        self.prefix_warn = 'gl'
>-
>-    def _override_for_api(self, ent):
>-        ent.hidden = True
>-        ent.handcode = False
>-
>-    def _get_c_header(self):
>-        header = """#ifndef _GLAPI_TMP_H_
>-#define _GLAPI_TMP_H_
>-typedef int GLfixed;
>-typedef int GLclampx;
>-#endif /* _GLAPI_TMP_H_ */"""
>-
>-        return header
>-
>-class VGAPIPrinter(ABIPrinter):
>-    """OpenVG API Printer"""
>-
>-    def __init__(self, entries):
>-        super(VGAPIPrinter, self).__init__(entries)
>-
>-        self.api_defines = ['VG_VGEXT_PROTOTYPES']
>-        self.api_headers = ['"VG/openvg.h"', '"VG/vgext.h"']
>-        self.api_call = 'VG_API_CALL'
>-        self.api_entry = 'VG_API_ENTRY'
>-        self.api_attrs = 'VG_API_EXIT'
>-
>-        self.prefix_lib = 'vg'
>-        self.prefix_app = 'vega'
>-        self.prefix_noop = 'noop'
>-        self.prefix_warn = 'vg'
>-
>-def parse_args():
>-    printers = ['vgapi', 'glapi', 'es1api', 'es2api', 'shared-glapi']
>-    modes = ['lib', 'app']
>-
>-    parser = OptionParser(usage='usage: %prog [options] <filename>')
>-    parser.add_option('-p', '--printer', dest='printer',
>-            help='printer to use: %s' % (", ".join(printers)))
>-    parser.add_option('-m', '--mode', dest='mode',
>-            help='target user: %s' % (", ".join(modes)))
>-
>-    options, args = parser.parse_args()
>-    if not args or options.printer not in printers or \
>-            options.mode not in modes:
>-        parser.print_help()
>-        sys.exit(1)
>-
>-    return (args[0], options)
>-
>-def main():
>-    printers = {
>-        'vgapi': VGAPIPrinter,
>-        'glapi': GLAPIPrinter,
>-        'es1api': ES1APIPrinter,
>-        'es2api': ES2APIPrinter,
>-        'shared-glapi': SharedGLAPIPrinter,
>-    }
>-
>-    filename, options = parse_args()
>-
>-    if filename.endswith('.xml'):
>-        entries = abi_parse_xml(filename)
>-    else:
>-        entries = abi_parse(filename)
>-    abi_sanity_check(entries)
>-
>-    printer = printers[options.printer](entries)
>-    if options.mode == 'lib':
>-        printer.output_for_lib()
>-    else:
>-        printer.output_for_app()
>-
>-if __name__ == '__main__':
>-    main()
>diff --git a/src/mapi/mapi/mapi_glapi.c b/src/mapi/mapi/mapi_glapi.c
>deleted file mode 100644
>index 4627c4d..0000000
>--- a/src/mapi/mapi/mapi_glapi.c
>+++ /dev/null
>@@ -1,240 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include <string.h>
>-#include "glapi/glapi.h"
>-#include "mapi/u_current.h"
>-#include "mapi/table.h" /* for MAPI_TABLE_NUM_SLOTS */
>-#include "mapi/stub.h"
>-
>-/*
>- * Global variables, _glapi_get_context, and _glapi_get_dispatch are defined in
>- * u_current.c.
>- */
>-
>-#ifdef GLX_USE_TLS
>-/* not used, but defined for compatibility */
>-const struct _glapi_table *_glapi_Dispatch;
>-const void *_glapi_Context;
>-#endif /* GLX_USE_TLS */
>-
>-void
>-_glapi_destroy_multithread(void)
>-{
>-   u_current_destroy();
>-}
>-
>-void
>-_glapi_check_multithread(void)
>-{
>-   u_current_init();
>-}
>-
>-void
>-_glapi_set_context(void *context)
>-{
>-   u_current_set_user((const void *) context);
>-}
>-
>-void
>-_glapi_set_dispatch(struct _glapi_table *dispatch)
>-{
>-   u_current_set((const struct mapi_table *) dispatch);
>-}
>-
>-/**
>- * Return size of dispatch table struct as number of functions (or
>- * slots).
>- */
>-unsigned int
>-_glapi_get_dispatch_table_size(void)
>-{
>-   return MAPI_TABLE_NUM_SLOTS;
>-}
>-
>-/**
>- * Fill-in the dispatch stub for the named function.
>- *
>- * This function is intended to be called by a hardware driver.  When called,
>- * a dispatch stub may be created created for the function.  A pointer to this
>- * dispatch function will be returned by glXGetProcAddress.
>- *
>- * \param function_names       Array of pointers to function names that should
>- *                             share a common dispatch offset.
>- * \param parameter_signature  String representing the types of the parameters
>- *                             passed to the named function.  Parameter types
>- *                             are converted to characters using the following
>- *                             rules:
>- *                               - 'i' for \c GLint, \c GLuint, and \c GLenum
>- *                               - 'p' for any pointer type
>- *                               - 'f' for \c GLfloat and \c GLclampf
>- *                               - 'd' for \c GLdouble and \c GLclampd
>- *
>- * \returns
>- * The offset in the dispatch table of the named function.  A pointer to the
>- * driver's implementation of the named function should be stored at
>- * \c dispatch_table[\c offset].  Return -1 if error/problem.
>- *
>- * \sa glXGetProcAddress
>- *
>- * \warning
>- * This function can only handle up to 8 names at a time.  As far as I know,
>- * the maximum number of names ever associated with an existing GL function is
>- * 4 (\c glPointParameterfSGIS, \c glPointParameterfEXT,
>- * \c glPointParameterfARB, and \c glPointParameterf), so this should not be
>- * too painful of a limitation.
>- *
>- * \todo
>- * Check parameter_signature.
>- */
>-int
>-_glapi_add_dispatch( const char * const * function_names,
>-		     const char * parameter_signature )
>-{
>-   const struct mapi_stub *function_stubs[8];
>-   const struct mapi_stub *alias = NULL;
>-   unsigned i;
>-
>-   (void) memset(function_stubs, 0, sizeof(function_stubs));
>-
>-   /* find the missing stubs, and decide the alias */
>-   for (i = 0; function_names[i] != NULL && i < 8; i++) {
>-      const char * funcName = function_names[i];
>-      const struct mapi_stub *stub;
>-      int slot;
>-
>-      if (!funcName || funcName[0] != 'g' || funcName[1] != 'l')
>-         return -1;
>-      funcName += 2;
>-
>-      stub = stub_find_public(funcName);
>-      if (!stub)
>-         stub = stub_find_dynamic(funcName, 0);
>-
>-      slot = (stub) ? stub_get_slot(stub) : -1;
>-      if (slot >= 0) {
>-         if (alias && stub_get_slot(alias) != slot)
>-            return -1;
>-         /* use the first existing stub as the alias */
>-         if (!alias)
>-            alias = stub;
>-
>-         function_stubs[i] = stub;
>-      }
>-   }
>-
>-   /* generate missing stubs */
>-   for (i = 0; function_names[i] != NULL && i < 8; i++) {
>-      const char * funcName = function_names[i] + 2;
>-      struct mapi_stub *stub;
>-
>-      if (function_stubs[i])
>-         continue;
>-
>-      stub = stub_find_dynamic(funcName, 1);
>-      if (!stub)
>-         return -1;
>-
>-      stub_fix_dynamic(stub, alias);
>-      if (!alias)
>-         alias = stub;
>-   }
>-
>-   return (alias) ? stub_get_slot(alias) : -1;
>-}
>-
>-static const struct mapi_stub *
>-_glapi_get_stub(const char *name, int generate)
>-{
>-   const struct mapi_stub *stub;
>-
>-#ifdef USE_MGL_NAMESPACE
>-   if (name)
>-      name++;
>-#endif
>-
>-   if (!name || name[0] != 'g' || name[1] != 'l')
>-      return NULL;
>-   name += 2;
>-
>-   stub = stub_find_public(name);
>-   if (!stub)
>-      stub = stub_find_dynamic(name, generate);
>-
>-   return stub;
>-}
>-
>-/**
>- * Return offset of entrypoint for named function within dispatch table.
>- */
>-int
>-_glapi_get_proc_offset(const char *funcName)
>-{
>-   const struct mapi_stub *stub = _glapi_get_stub(funcName, 0);
>-   return (stub) ? stub_get_slot(stub) : -1;
>-}
>-
>-/**
>- * Return pointer to the named function.  If the function name isn't found
>- * in the name of static functions, try generating a new API entrypoint on
>- * the fly with assembly language.
>- */
>-_glapi_proc
>-_glapi_get_proc_address(const char *funcName)
>-{
>-   const struct mapi_stub *stub = _glapi_get_stub(funcName, 1);
>-   return (stub) ? (_glapi_proc) stub_get_addr(stub) : NULL;
>-}
>-
>-/**
>- * Return the name of the function at the given dispatch offset.
>- * This is only intended for debugging.
>- */
>-const char *
>-_glapi_get_proc_name(unsigned int offset)
>-{
>-   const struct mapi_stub *stub = stub_find_by_slot(offset);
>-   return stub ? stub_get_name(stub) : NULL;
>-}
>-
>-unsigned long
>-_glthread_GetID(void)
>-{
>-   return u_thread_self();
>-}
>-
>-void
>-_glapi_noop_enable_warnings(unsigned char enable)
>-{
>-}
>-
>-void
>-_glapi_set_warning_func(_glapi_proc func)
>-{
>-}
>diff --git a/src/mapi/mapi/mapi_tmp.h b/src/mapi/mapi/mapi_tmp.h
>deleted file mode 100644
>index f326b4a..0000000
>--- a/src/mapi/mapi/mapi_tmp.h
>+++ /dev/null
>@@ -1,48 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#ifndef MAPI_ABI_HEADER
>-#error "MAPI_ABI_HEADER must be defined"
>-#endif
>-
>-/* does not need hidden entries in bridge mode */
>-#ifdef MAPI_MODE_BRIDGE
>-
>-#ifdef MAPI_TMP_PUBLIC_ENTRIES
>-#undef MAPI_TMP_PUBLIC_ENTRIES
>-#define MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN
>-#endif
>-
>-#ifdef MAPI_TMP_STUB_ASM_GCC
>-#undef MAPI_TMP_STUB_ASM_GCC
>-#define MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN
>-#endif
>-
>-#endif /* MAPI_MODE_BRIDGE */
>-
>-#include MAPI_ABI_HEADER
>diff --git a/src/mapi/mapi/stub.c b/src/mapi/mapi/stub.c
>deleted file mode 100644
>index 688dc81..0000000
>--- a/src/mapi/mapi/stub.c
>+++ /dev/null
>@@ -1,229 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include <stdlib.h>
>-#include <string.h>
>-#include <assert.h>
>-
>-#include "u_current.h"
>-#include "u_thread.h"
>-#include "entry.h"
>-#include "stub.h"
>-#include "table.h"
>-
>-#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
>-
>-struct mapi_stub {
>-   const void *name;
>-   int slot;
>-   mapi_func addr;
>-};
>-
>-/* define public_string_pool and public_stubs */
>-#define MAPI_TMP_PUBLIC_STUBS
>-#include "mapi_tmp.h"
>-
>-static struct mapi_stub dynamic_stubs[MAPI_TABLE_NUM_DYNAMIC];
>-static int num_dynamic_stubs;
>-static int next_dynamic_slot = MAPI_TABLE_NUM_STATIC;
>-
>-void
>-stub_init_once(void)
>-{
>-#ifdef HAVE_PTHREAD
>-   static pthread_once_t once = PTHREAD_ONCE_INIT;
>-   pthread_once(&once, entry_patch_public);
>-#else
>-   static int first = 1;
>-   if (first) {
>-      first = 0;
>-      entry_patch_public();
>-   }
>-#endif
>-}
>-
>-static int
>-stub_compare(const void *key, const void *elem)
>-{
>-   const char *name = (const char *) key;
>-   const struct mapi_stub *stub = (const struct mapi_stub *) elem;
>-   const char *stub_name;
>-
>-   stub_name = &public_string_pool[(unsigned long) stub->name];
>-
>-   return strcmp(name, stub_name);
>-}
>-
>-/**
>- * Return the public stub with the given name.
>- */
>-const struct mapi_stub *
>-stub_find_public(const char *name)
>-{
>-   return (const struct mapi_stub *) bsearch(name, public_stubs,
>-         ARRAY_SIZE(public_stubs), sizeof(public_stubs[0]), stub_compare);
>-}
>-
>-/**
>- * Add a dynamic stub.
>- */
>-static struct mapi_stub *
>-stub_add_dynamic(const char *name)
>-{
>-   struct mapi_stub *stub;
>-   int idx;
>-
>-   idx = num_dynamic_stubs;
>-   /* minus 1 to make sure we can never reach the last slot */
>-   if (idx >= MAPI_TABLE_NUM_DYNAMIC - 1)
>-      return NULL;
>-
>-   stub = &dynamic_stubs[idx];
>-
>-   /* dispatch to the last slot, which is reserved for no-op */
>-   stub->addr = entry_generate(
>-         MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC - 1);
>-   if (!stub->addr)
>-      return NULL;
>-
>-   stub->name = (const void *) name;
>-   /* to be fixed later */
>-   stub->slot = -1;
>-
>-   num_dynamic_stubs = idx + 1;
>-
>-   return stub;
>-}
>-
>-/**
>- * Return the dynamic stub with the given name.  If no such stub exists and
>- * generate is true, a new stub is generated.
>- */
>-struct mapi_stub *
>-stub_find_dynamic(const char *name, int generate)
>-{
>-   u_mutex_declare_static(dynamic_mutex);
>-   struct mapi_stub *stub = NULL;
>-   int count, i;
>-   
>-   u_mutex_lock(dynamic_mutex);
>-
>-   if (generate)
>-      assert(!stub_find_public(name));
>-
>-   count = num_dynamic_stubs;
>-   for (i = 0; i < count; i++) {
>-      if (strcmp(name, (const char *) dynamic_stubs[i].name) == 0) {
>-         stub = &dynamic_stubs[i];
>-         break;
>-      }
>-   }
>-
>-   /* generate a dynamic stub */
>-   if (generate && !stub)
>-         stub = stub_add_dynamic(name);
>-
>-   u_mutex_unlock(dynamic_mutex);
>-
>-   return stub;
>-}
>-
>-static const struct mapi_stub *
>-search_table_by_slot(const struct mapi_stub *table, size_t num_entries,
>-                     int slot)
>-{
>-   size_t i;
>-   for (i = 0; i < num_entries; ++i) {
>-      if (table[i].slot == slot)
>-         return &table[i];
>-   }
>-   return NULL;
>-}
>-
>-const struct mapi_stub *
>-stub_find_by_slot(int slot)
>-{
>-   const struct mapi_stub *stub =
>-      search_table_by_slot(public_stubs, ARRAY_SIZE(public_stubs), slot);
>-   if (stub)
>-      return stub;
>-   return search_table_by_slot(dynamic_stubs, num_dynamic_stubs, slot);
>-}
>-
>-void
>-stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias)
>-{
>-   int slot;
>-
>-   if (stub->slot >= 0)
>-      return;
>-
>-   if (alias)
>-      slot = alias->slot;
>-   else
>-      slot = next_dynamic_slot++;
>-
>-   entry_patch(stub->addr, slot);
>-   stub->slot = slot;
>-}
>-
>-/**
>- * Return the name of a stub.
>- */
>-const char *
>-stub_get_name(const struct mapi_stub *stub)
>-{
>-   const char *name;
>-
>-   if (stub >= public_stubs &&
>-       stub < public_stubs + ARRAY_SIZE(public_stubs))
>-      name = &public_string_pool[(unsigned long) stub->name];
>-   else
>-      name = (const char *) stub->name;
>-
>-   return name;
>-}
>-
>-/**
>- * Return the slot of a stub.
>- */
>-int
>-stub_get_slot(const struct mapi_stub *stub)
>-{
>-   return stub->slot;
>-}
>-
>-/**
>- * Return the address of a stub.
>- */
>-mapi_func
>-stub_get_addr(const struct mapi_stub *stub)
>-{
>-   assert(stub->addr || (unsigned int) stub->slot < MAPI_TABLE_NUM_STATIC);
>-   return (stub->addr) ? stub->addr : entry_get_public(stub->slot);
>-}
>diff --git a/src/mapi/mapi/stub.h b/src/mapi/mapi/stub.h
>deleted file mode 100644
>index 98e2553..0000000
>--- a/src/mapi/mapi/stub.h
>+++ /dev/null
>@@ -1,60 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#ifndef _STUB_H_
>-#define _STUB_H_
>-
>-#include "entry.h"
>-
>-struct mapi_stub;
>-
>-void
>-stub_init_once(void);
>-
>-const struct mapi_stub *
>-stub_find_public(const char *name);
>-
>-struct mapi_stub *
>-stub_find_dynamic(const char *name, int generate);
>-
>-const struct mapi_stub *
>-stub_find_by_slot(int slot);
>-
>-void
>-stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias);
>-
>-const char *
>-stub_get_name(const struct mapi_stub *stub);
>-
>-int
>-stub_get_slot(const struct mapi_stub *stub);
>-
>-mapi_func
>-stub_get_addr(const struct mapi_stub *stub);
>-
>-#endif /* _STUB_H_ */
>diff --git a/src/mapi/mapi/table.c b/src/mapi/mapi/table.c
>deleted file mode 100644
>index 9bb9f65..0000000
>--- a/src/mapi/mapi/table.c
>+++ /dev/null
>@@ -1,56 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#include <stdlib.h>
>-#include <stdio.h>
>-
>-#include "table.h"
>-
>-static void
>-noop_warn(const char *name)
>-{
>-   static int debug = -1;
>-   
>-   if (debug < 0)
>-      debug = (getenv("MESA_DEBUG") || getenv("LIBGL_DEBUG"));
>-
>-   if (debug)
>-      fprintf(stderr, "%s is no-op\n", name);
>-}
>-
>-static int
>-noop_generic(void)
>-{
>-   noop_warn("function");
>-   return 0;
>-}
>-
>-/* define noop_array */
>-#define MAPI_TMP_DEFINES
>-#define MAPI_TMP_NOOP_ARRAY
>-#include "mapi_tmp.h"
>diff --git a/src/mapi/mapi/table.h b/src/mapi/mapi/table.h
>deleted file mode 100644
>index d84523f..0000000
>--- a/src/mapi/mapi/table.h
>+++ /dev/null
>@@ -1,72 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.9
>- *
>- * Copyright (C) 2010 LunarG Inc.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>- * DEALINGS IN THE SOFTWARE.
>- *
>- * Authors:
>- *    Chia-I Wu <olv at lunarg.com>
>- */
>-
>-#ifndef _TABLE_H_
>-#define _TABLE_H_
>-
>-#include "u_compiler.h"
>-#include "entry.h"
>-
>-#define MAPI_TMP_TABLE
>-#include "mapi_tmp.h"
>-
>-#define MAPI_TABLE_NUM_SLOTS (MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC)
>-#define MAPI_TABLE_SIZE (MAPI_TABLE_NUM_SLOTS * sizeof(mapi_func))
>-
>-extern const mapi_func table_noop_array[];
>-
>-/**
>- * Get the no-op dispatch table.
>- */
>-static INLINE const struct mapi_table *
>-table_get_noop(void)
>-{
>-   return (const struct mapi_table *) table_noop_array;
>-}
>-
>-/**
>- * Set the function of a slot.
>- */
>-static INLINE void
>-table_set_func(struct mapi_table *tbl, int slot, mapi_func func)
>-{
>-   mapi_func *funcs = (mapi_func *) tbl;
>-   funcs[slot] = func;
>-}
>-
>-/**
>- * Return the function of a slot.
>- */
>-static INLINE mapi_func
>-table_get_func(const struct mapi_table *tbl, int slot)
>-{
>-   const mapi_func *funcs = (const mapi_func *) tbl;
>-   return funcs[slot];
>-}
>-
>-#endif /* _TABLE_H_ */
>diff --git a/src/mapi/mapi/u_compiler.h b/src/mapi/mapi/u_compiler.h
>deleted file mode 100644
>index 2b019ed..0000000
>--- a/src/mapi/mapi/u_compiler.h
>+++ /dev/null
>@@ -1,51 +0,0 @@
>-#ifndef _U_COMPILER_H_
>-#define _U_COMPILER_H_
>-
>-/* Function inlining */
>-#ifndef inline
>-#  ifdef __cplusplus
>-     /* C++ supports inline keyword */
>-#  elif defined(__GNUC__)
>-#    define inline __inline__
>-#  elif defined(_MSC_VER)
>-#    define inline __inline
>-#  elif defined(__ICL)
>-#    define inline __inline
>-#  elif defined(__INTEL_COMPILER)
>-     /* Intel compiler supports inline keyword */
>-#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
>-#    define inline __inline
>-#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
>-     /* C99 supports inline keyword */
>-#  elif (__STDC_VERSION__ >= 199901L)
>-     /* C99 supports inline keyword */
>-#  else
>-#    define inline
>-#  endif
>-#endif
>-#ifndef INLINE
>-#  define INLINE inline
>-#endif
>-
>-/* Function visibility */
>-#ifndef PUBLIC
>-#  if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
>-#    define PUBLIC __attribute__((visibility("default")))
>-#  elif defined(_MSC_VER)
>-#    define PUBLIC __declspec(dllexport)
>-#  else
>-#    define PUBLIC
>-#  endif
>-#endif
>-
>-#ifndef likely
>-#  if defined(__GNUC__)
>-#    define likely(x)   __builtin_expect(!!(x), 1)
>-#    define unlikely(x) __builtin_expect(!!(x), 0)
>-#  else
>-#    define likely(x)   (x)
>-#    define unlikely(x) (x)
>-#  endif
>-#endif
>-
>-#endif /* _U_COMPILER_H_ */
>diff --git a/src/mapi/mapi/u_current.c b/src/mapi/mapi/u_current.c
>deleted file mode 100644
>index d902375..0000000
>--- a/src/mapi/mapi/u_current.c
>+++ /dev/null
>@@ -1,266 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  7.1
>- *
>- * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
>- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>- */
>-
>-
>-/*
>- * This file manages the OpenGL API dispatch layer.
>- * The dispatch table (struct _glapi_table) is basically just a list
>- * of function pointers.
>- * There are functions to set/get the current dispatch table for the
>- * current thread and to manage registration/dispatch of dynamically
>- * added extension functions.
>- *
>- * It's intended that this file and the other glapi*.[ch] files are
>- * flexible enough to be reused in several places:  XFree86, DRI-
>- * based libGL.so, and perhaps the SGI SI.
>- *
>- * NOTE: There are no dependencies on Mesa in this code.
>- *
>- * Versions (API changes):
>- *   2000/02/23  - original version for Mesa 3.3 and XFree86 4.0
>- *   2001/01/16  - added dispatch override feature for Mesa 3.5
>- *   2002/06/28  - added _glapi_set_warning_func(), Mesa 4.1.
>- *   2002/10/01  - _glapi_get_proc_address() will now generate new entrypoints
>- *                 itself (using offset ~0).  _glapi_add_entrypoint() can be
>- *                 called afterward and it'll fill in the correct dispatch
>- *                 offset.  This allows DRI libGL to avoid probing for DRI
>- *                 drivers!  No changes to the public glapi interface.
>- */
>-
>-#include "u_current.h"
>-#include "u_thread.h"
>-
>-#ifndef MAPI_MODE_UTIL
>-
>-#include "table.h"
>-#include "stub.h"
>-
>-#else
>-
>-extern void init_glapi_relocs_once(void);
>-extern void (*__glapi_noop_table[])(void);
>-
>-#define table_noop_array __glapi_noop_table
>-#define stub_init_once() init_glapi_relocs_once()
>-
>-#endif
>-
>-/**
>- * \name Current dispatch and current context control variables
>- *
>- * Depending on whether or not multithreading is support, and the type of
>- * support available, several variables are used to store the current context
>- * pointer and the current dispatch table pointer.  In the non-threaded case,
>- * the variables \c _glapi_Dispatch and \c _glapi_Context are used for this
>- * purpose.
>- *
>- * In the "normal" threaded case, the variables \c _glapi_Dispatch and
>- * \c _glapi_Context will be \c NULL if an application is detected as being
>- * multithreaded.  Single-threaded applications will use \c _glapi_Dispatch
>- * and \c _glapi_Context just like the case without any threading support.
>- * When \c _glapi_Dispatch and \c _glapi_Context are \c NULL, the thread state
>- * data \c _gl_DispatchTSD and \c ContextTSD are used.  Drivers and the
>- * static dispatch functions access these variables via \c _glapi_get_dispatch
>- * and \c _glapi_get_context.
>- *
>- * There is a race condition in setting \c _glapi_Dispatch to \c NULL.  It is
>- * possible for the original thread to be setting it at the same instant a new
>- * thread, perhaps running on a different processor, is clearing it.  Because
>- * of that, \c ThreadSafe, which can only ever be changed to \c GL_TRUE, is
>- * used to determine whether or not the application is multithreaded.
>- * 
>- * In the TLS case, the variables \c _glapi_Dispatch and \c _glapi_Context are
>- * hardcoded to \c NULL.  Instead the TLS variables \c _glapi_tls_Dispatch and
>- * \c _glapi_tls_Context are used.  Having \c _glapi_Dispatch and
>- * \c _glapi_Context be hardcoded to \c NULL maintains binary compatability
>- * between TLS enabled loaders and non-TLS DRI drivers.
>- */
>-/*@{*/
>-#if defined(GLX_USE_TLS)
>-
>-__thread struct mapi_table *u_current_table
>-    __attribute__((tls_model("initial-exec")))
>-    = (struct mapi_table *) table_noop_array;
>-
>-__thread void *u_current_user
>-    __attribute__((tls_model("initial-exec")));
>-
>-#else
>-
>-struct mapi_table *u_current_table =
>-   (struct mapi_table *) table_noop_array;
>-void *u_current_user;
>-
>-#ifdef THREADS
>-struct u_tsd u_current_table_tsd;
>-static struct u_tsd u_current_user_tsd;
>-static int ThreadSafe;
>-#endif /* THREADS */
>-
>-#endif /* defined(GLX_USE_TLS) */
>-/*@}*/
>-
>-
>-void
>-u_current_destroy(void)
>-{
>-#if defined(THREADS) && defined(_WIN32)
>-   u_tsd_destroy(&u_current_table_tsd);
>-   u_tsd_destroy(&u_current_user_tsd);
>-#endif
>-}
>-
>-
>-#if defined(THREADS) && !defined(GLX_USE_TLS)
>-
>-static void
>-u_current_init_tsd(void)
>-{
>-   u_tsd_init(&u_current_table_tsd);
>-   u_tsd_init(&u_current_user_tsd);
>-}
>-
>-/**
>- * Mutex for multithread check.
>- */
>-u_mutex_declare_static(ThreadCheckMutex);
>-
>-/**
>- * We should call this periodically from a function such as glXMakeCurrent
>- * in order to test if multiple threads are being used.
>- */
>-void
>-u_current_init(void)
>-{
>-   static unsigned long knownID;
>-   static int firstCall = 1;
>-
>-   if (ThreadSafe)
>-      return;
>-
>-   u_mutex_lock(ThreadCheckMutex);
>-   if (firstCall) {
>-      u_current_init_tsd();
>-
>-      knownID = u_thread_self();
>-      firstCall = 0;
>-   }
>-   else if (knownID != u_thread_self()) {
>-      ThreadSafe = 1;
>-      u_current_set(NULL);
>-      u_current_set_user(NULL);
>-   }
>-   u_mutex_unlock(ThreadCheckMutex);
>-}
>-
>-#else
>-
>-void
>-u_current_init(void)
>-{
>-}
>-
>-#endif
>-
>-
>-
>-/**
>- * Set the current context pointer for this thread.
>- * The context pointer is an opaque type which should be cast to
>- * void from the real context pointer type.
>- */
>-void
>-u_current_set_user(const void *ptr)
>-{
>-   u_current_init();
>-
>-#if defined(GLX_USE_TLS)
>-   u_current_user = (void *) ptr;
>-#elif defined(THREADS)
>-   u_tsd_set(&u_current_user_tsd, (void *) ptr);
>-   u_current_user = (ThreadSafe) ? NULL : (void *) ptr;
>-#else
>-   u_current_user = (void *) ptr;
>-#endif
>-}
>-
>-/**
>- * Get the current context pointer for this thread.
>- * The context pointer is an opaque type which should be cast from
>- * void to the real context pointer type.
>- */
>-void *
>-u_current_get_user_internal(void)
>-{
>-#if defined(GLX_USE_TLS)
>-   return u_current_user;
>-#elif defined(THREADS)
>-   return (ThreadSafe)
>-      ? u_tsd_get(&u_current_user_tsd)
>-      : u_current_user;
>-#else
>-   return u_current_user;
>-#endif
>-}
>-
>-/**
>- * Set the global or per-thread dispatch table pointer.
>- * If the dispatch parameter is NULL we'll plug in the no-op dispatch
>- * table (__glapi_noop_table).
>- */
>-void
>-u_current_set(const struct mapi_table *tbl)
>-{
>-   u_current_init();
>-
>-   stub_init_once();
>-
>-   if (!tbl)
>-      tbl = (const struct mapi_table *) table_noop_array;
>-
>-#if defined(GLX_USE_TLS)
>-   u_current_table = (struct mapi_table *) tbl;
>-#elif defined(THREADS)
>-   u_tsd_set(&u_current_table_tsd, (void *) tbl);
>-   u_current_table = (ThreadSafe) ? NULL : (void *) tbl;
>-#else
>-   u_current_table = (struct mapi_table *) tbl;
>-#endif
>-}
>-
>-/**
>- * Return pointer to current dispatch table for calling thread.
>- */
>-struct mapi_table *
>-u_current_get_internal(void)
>-{
>-#if defined(GLX_USE_TLS)
>-   return u_current_table;
>-#elif defined(THREADS)
>-   return (struct mapi_table *) ((ThreadSafe) ?
>-         u_tsd_get(&u_current_table_tsd) : (void *) u_current_table);
>-#else
>-   return u_current_table;
>-#endif
>-}
>diff --git a/src/mapi/mapi/u_current.h b/src/mapi/mapi/u_current.h
>deleted file mode 100644
>index f9cffd8..0000000
>--- a/src/mapi/mapi/u_current.h
>+++ /dev/null
>@@ -1,87 +0,0 @@
>-#ifndef _U_CURRENT_H_
>-#define _U_CURRENT_H_
>-
>-#if defined(MAPI_MODE_UTIL) || defined(MAPI_MODE_GLAPI) || \
>-    defined(MAPI_MODE_BRIDGE)
>-
>-#include "glapi/glapi.h"
>-
>-/* ugly renames to match glapi.h */
>-#define mapi_table _glapi_table
>-
>-#ifdef GLX_USE_TLS
>-#define u_current_table _glapi_tls_Dispatch
>-#define u_current_user _glapi_tls_Context
>-#else
>-#define u_current_table _glapi_Dispatch
>-#define u_current_user _glapi_Context
>-#endif
>-
>-#define u_current_get_internal _glapi_get_dispatch
>-#define u_current_get_user_internal _glapi_get_context
>-
>-#define u_current_table_tsd _gl_DispatchTSD
>-
>-#else /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
>-
>-#include "u_compiler.h"
>-
>-struct mapi_table;
>-
>-#ifdef GLX_USE_TLS
>-
>-extern __thread struct mapi_table *u_current_table
>-    __attribute__((tls_model("initial-exec")));
>-
>-extern __thread void *u_current_user
>-    __attribute__((tls_model("initial-exec")));
>-
>-#else /* GLX_USE_TLS */
>-
>-extern struct mapi_table *u_current_table;
>-extern void *u_current_user;
>-
>-#endif /* GLX_USE_TLS */
>-
>-#endif /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
>-
>-void
>-u_current_init(void);
>-
>-void
>-u_current_destroy(void);
>-
>-void
>-u_current_set(const struct mapi_table *tbl);
>-
>-struct mapi_table *
>-u_current_get_internal(void);
>-
>-void
>-u_current_set_user(const void *ptr);
>-
>-void *
>-u_current_get_user_internal(void);
>-
>-static INLINE const struct mapi_table *
>-u_current_get(void)
>-{
>-#ifdef GLX_USE_TLS
>-   return u_current_table;
>-#else
>-   return (likely(u_current_table) ?
>-         u_current_table : u_current_get_internal());
>-#endif
>-}
>-
>-static INLINE const void *
>-u_current_get_user(void)
>-{
>-#ifdef GLX_USE_TLS
>-   return u_current_user;
>-#else
>-   return likely(u_current_user) ? u_current_user : u_current_get_user_internal();
>-#endif
>-}
>-
>-#endif /* _U_CURRENT_H_ */
>diff --git a/src/mapi/mapi/u_execmem.c b/src/mapi/mapi/u_execmem.c
>deleted file mode 100644
>index e5072e0..0000000
>--- a/src/mapi/mapi/u_execmem.c
>+++ /dev/null
>@@ -1,145 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  6.5
>- *
>- * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
>- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>- */
>-
>-
>-/**
>- * \file glapi_execmem.c
>- *
>- * Function for allocating executable memory for dispatch stubs.
>- *
>- * Copied from main/execmem.c and simplified for dispatch stubs.
>- */
>-
>-
>-#include "u_compiler.h"
>-#include "u_thread.h"
>-#include "u_execmem.h"
>-
>-
>-#define EXEC_MAP_SIZE (4*1024)
>-
>-u_mutex_declare_static(exec_mutex);
>-
>-static unsigned int head = 0;
>-
>-static unsigned char *exec_mem = (unsigned char *)0;
>-
>-
>-#if defined(__linux__) || defined(__OpenBSD__) || defined(_NetBSD__) || defined(__sun)
>-
>-#include <unistd.h>
>-#include <sys/mman.h>
>-
>-#ifdef MESA_SELINUX
>-#include <selinux/selinux.h>
>-#endif
>-
>-
>-#ifndef MAP_ANONYMOUS
>-#define MAP_ANONYMOUS MAP_ANON
>-#endif
>-
>-
>-/*
>- * Dispatch stubs are of fixed size and never freed. Thus, we do not need to
>- * overlay a heap, we just mmap a page and manage through an index.
>- */
>-
>-static int
>-init_map(void)
>-{
>-#ifdef MESA_SELINUX
>-   if (is_selinux_enabled()) {
>-      if (!security_get_boolean_active("allow_execmem") ||
>-	  !security_get_boolean_pending("allow_execmem"))
>-         return 0;
>-   }
>-#endif
>-
>-   if (!exec_mem)
>-      exec_mem = mmap(NULL, EXEC_MAP_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE,
>-		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
>-
>-   return (exec_mem != MAP_FAILED);
>-}
>-
>-
>-#elif defined(_WIN32)
>-
>-#include <windows.h>
>-
>-
>-/*
>- * Avoid Data Execution Prevention.
>- */
>-
>-static int
>-init_map(void)
>-{
>-   exec_mem = VirtualAlloc(NULL, EXEC_MAP_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
>-
>-   return (exec_mem != NULL);
>-}
>-
>-
>-#else
>-
>-#include <stdlib.h>
>-
>-static int
>-init_map(void)
>-{
>-   exec_mem = malloc(EXEC_MAP_SIZE);
>-
>-   return (exec_mem != NULL);
>-}
>-
>-
>-#endif
>-
>-void *
>-u_execmem_alloc(unsigned int size)
>-{
>-   void *addr = NULL;
>-
>-   u_mutex_lock(exec_mutex);
>-
>-   if (!init_map())
>-      goto bail;
>-
>-   /* free space check, assumes no integer overflow */
>-   if (head + size > EXEC_MAP_SIZE)
>-      goto bail;
>-
>-   /* allocation, assumes proper addr and size alignement */
>-   addr = exec_mem + head;
>-   head += size;
>-
>-bail:
>-   u_mutex_unlock(exec_mutex);
>-
>-   return addr;
>-}
>-
>-
>diff --git a/src/mapi/mapi/u_execmem.h b/src/mapi/mapi/u_execmem.h
>deleted file mode 100644
>index 13fff8d..0000000
>--- a/src/mapi/mapi/u_execmem.h
>+++ /dev/null
>@@ -1,7 +0,0 @@
>-#ifndef _U_EXECMEM_H_
>-#define _U_EXECMEM_H_
>-
>-void *
>-u_execmem_alloc(unsigned int size);
>-
>-#endif /* _U_EXECMEM_H_ */
>diff --git a/src/mapi/mapi/u_macros.h b/src/mapi/mapi/u_macros.h
>deleted file mode 100644
>index 72345b5..0000000
>--- a/src/mapi/mapi/u_macros.h
>+++ /dev/null
>@@ -1,12 +0,0 @@
>-#ifndef _U_MACROS_
>-#define _U_MACROS_
>-
>-#define _U_STRINGIFY(x) #x
>-#define _U_CONCAT(x, y) x ## y
>-#define _U_CONCAT_STR(x, y) #x#y
>-
>-#define U_STRINGIFY(x) _U_STRINGIFY(x)
>-#define U_CONCAT(x, y) _U_CONCAT(x, y)
>-#define U_CONCAT_STR(x, y) _U_CONCAT_STR(x, y)
>-
>-#endif /* _U_MACROS_ */
>diff --git a/src/mapi/mapi/u_thread.h b/src/mapi/mapi/u_thread.h
>deleted file mode 100644
>index a5e5043..0000000
>--- a/src/mapi/mapi/u_thread.h
>+++ /dev/null
>@@ -1,287 +0,0 @@
>-/*
>- * Mesa 3-D graphics library
>- * Version:  6.5.2
>- *
>- * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
>- *
>- * Permission is hereby granted, free of charge, to any person obtaining a
>- * copy of this software and associated documentation files (the "Software"),
>- * to deal in the Software without restriction, including without limitation
>- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>- * and/or sell copies of the Software, and to permit persons to whom the
>- * Software is furnished to do so, subject to the following conditions:
>- *
>- * The above copyright notice and this permission notice shall be included
>- * in all copies or substantial portions of the Software.
>- *
>- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
>- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>- */
>-
>-
>-/*
>- * Thread support for gl dispatch.
>- *
>- * Initial version by John Stone (j.stone at acm.org) (johns at cs.umr.edu)
>- *                and Christoph Poliwoda (poliwoda at volumegraphics.com)
>- * Revised by Keith Whitwell
>- * Adapted for new gl dispatcher by Brian Paul
>- * Modified for use in mapi by Chia-I Wu
>- */
>-
>-/*
>- * If this file is accidentally included by a non-threaded build,
>- * it should not cause the build to fail, or otherwise cause problems.
>- * In general, it should only be included when needed however.
>- */
>-
>-#ifndef _U_THREAD_H_
>-#define _U_THREAD_H_
>-
>-#include <stdio.h>
>-#include <stdlib.h>
>-#include "u_compiler.h"
>-
>-#if defined(HAVE_PTHREAD)
>-#include <pthread.h> /* POSIX threads headers */
>-#endif
>-#ifdef _WIN32
>-#include <windows.h>
>-#endif
>-
>-#if defined(HAVE_PTHREAD) || defined(_WIN32)
>-#ifndef THREADS
>-#define THREADS
>-#endif
>-#endif
>-
>-/*
>- * Error messages
>- */
>-#define INIT_TSD_ERROR "_glthread_: failed to allocate key for thread specific data"
>-#define GET_TSD_ERROR "_glthread_: failed to get thread specific data"
>-#define SET_TSD_ERROR "_glthread_: thread failed to set thread specific data"
>-
>-
>-/*
>- * Magic number to determine if a TSD object has been initialized.
>- * Kind of a hack but there doesn't appear to be a better cross-platform
>- * solution.
>- */
>-#define INIT_MAGIC 0xff8adc98
>-
>-#ifdef __cplusplus
>-extern "C" {
>-#endif
>-
>-
>-/*
>- * POSIX threads. This should be your choice in the Unix world
>- * whenever possible.  When building with POSIX threads, be sure
>- * to enable any compiler flags which will cause the MT-safe
>- * libc (if one exists) to be used when linking, as well as any
>- * header macros for MT-safe errno, etc.  For Solaris, this is the -mt
>- * compiler flag.  On Solaris with gcc, use -D_REENTRANT to enable
>- * proper compiling for MT-safe libc etc.
>- */
>-#if defined(HAVE_PTHREAD)
>-
>-struct u_tsd {
>-   pthread_key_t key;
>-   unsigned initMagic;
>-};
>-
>-typedef pthread_mutex_t u_mutex;
>-
>-#define u_mutex_declare_static(name) \
>-   static u_mutex name = PTHREAD_MUTEX_INITIALIZER
>-
>-#define u_mutex_init(name)    pthread_mutex_init(&(name), NULL)
>-#define u_mutex_destroy(name) pthread_mutex_destroy(&(name))
>-#define u_mutex_lock(name)    (void) pthread_mutex_lock(&(name))
>-#define u_mutex_unlock(name)  (void) pthread_mutex_unlock(&(name))
>-
>-static INLINE unsigned long
>-u_thread_self(void)
>-{
>-   return (unsigned long) pthread_self();
>-}
>-
>-
>-static INLINE void
>-u_tsd_init(struct u_tsd *tsd)
>-{
>-   if (pthread_key_create(&tsd->key, NULL/*free*/) != 0) {
>-      perror(INIT_TSD_ERROR);
>-      exit(-1);
>-   }
>-   tsd->initMagic = INIT_MAGIC;
>-}
>-
>-
>-static INLINE void *
>-u_tsd_get(struct u_tsd *tsd)
>-{
>-   if (tsd->initMagic != INIT_MAGIC) {
>-      u_tsd_init(tsd);
>-   }
>-   return pthread_getspecific(tsd->key);
>-}
>-
>-
>-static INLINE void
>-u_tsd_set(struct u_tsd *tsd, void *ptr)
>-{
>-   if (tsd->initMagic != INIT_MAGIC) {
>-      u_tsd_init(tsd);
>-   }
>-   if (pthread_setspecific(tsd->key, ptr) != 0) {
>-      perror(SET_TSD_ERROR);
>-      exit(-1);
>-   }
>-}
>-
>-#endif /* HAVE_PTHREAD */
>-
>-
>-/*
>- * Windows threads. Should work with Windows NT and 95.
>- * IMPORTANT: Link with multithreaded runtime library when THREADS are
>- * used!
>- */
>-#ifdef _WIN32
>-
>-struct u_tsd {
>-   DWORD key;
>-   unsigned initMagic;
>-};
>-
>-typedef CRITICAL_SECTION u_mutex;
>-
>-/* http://locklessinc.com/articles/pthreads_on_windows/ */
>-#define u_mutex_declare_static(name) \
>-   static u_mutex name = {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0}
>-
>-#define u_mutex_init(name)    InitializeCriticalSection(&name)
>-#define u_mutex_destroy(name) DeleteCriticalSection(&name)
>-#define u_mutex_lock(name)    EnterCriticalSection(&name)
>-#define u_mutex_unlock(name)  LeaveCriticalSection(&name)
>-
>-static INLINE unsigned long
>-u_thread_self(void)
>-{
>-   return GetCurrentThreadId();
>-}
>-
>-
>-static INLINE void
>-u_tsd_init(struct u_tsd *tsd)
>-{
>-   tsd->key = TlsAlloc();
>-   if (tsd->key == TLS_OUT_OF_INDEXES) {
>-      perror(INIT_TSD_ERROR);
>-      exit(-1);
>-   }
>-   tsd->initMagic = INIT_MAGIC;
>-}
>-
>-
>-static INLINE void
>-u_tsd_destroy(struct u_tsd *tsd)
>-{
>-   if (tsd->initMagic != INIT_MAGIC) {
>-      return;
>-   }
>-   TlsFree(tsd->key);
>-   tsd->initMagic = 0x0;
>-}
>-
>-
>-static INLINE void *
>-u_tsd_get(struct u_tsd *tsd)
>-{
>-   if (tsd->initMagic != INIT_MAGIC) {
>-      u_tsd_init(tsd);
>-   }
>-   return TlsGetValue(tsd->key);
>-}
>-
>-
>-static INLINE void
>-u_tsd_set(struct u_tsd *tsd, void *ptr)
>-{
>-   /* the following code assumes that the struct u_tsd has been initialized
>-      to zero at creation */
>-   if (tsd->initMagic != INIT_MAGIC) {
>-      u_tsd_init(tsd);
>-   }
>-   if (TlsSetValue(tsd->key, ptr) == 0) {
>-      perror(SET_TSD_ERROR);
>-      exit(-1);
>-   }
>-}
>-
>-#endif /* _WIN32 */
>-
>-
>-/*
>- * THREADS not defined
>- */
>-#ifndef THREADS
>-
>-struct u_tsd {
>-   unsigned initMagic;
>-};
>-
>-typedef unsigned u_mutex;
>-
>-#define u_mutex_declare_static(name)   static u_mutex name = 0
>-#define u_mutex_init(name)             (void) name
>-#define u_mutex_destroy(name)          (void) name
>-#define u_mutex_lock(name)             (void) name
>-#define u_mutex_unlock(name)           (void) name
>-
>-/*
>- * no-op functions
>- */
>-
>-static INLINE unsigned long
>-u_thread_self(void)
>-{
>-   return 0;
>-}
>-
>-
>-static INLINE void
>-u_tsd_init(struct u_tsd *tsd)
>-{
>-   (void) tsd;
>-}
>-
>-
>-static INLINE void *
>-u_tsd_get(struct u_tsd *tsd)
>-{
>-   (void) tsd;
>-   return NULL;
>-}
>-
>-
>-static INLINE void
>-u_tsd_set(struct u_tsd *tsd, void *ptr)
>-{
>-   (void) tsd;
>-   (void) ptr;
>-}
>-#endif /* THREADS */
>-
>-
>-#ifdef __cplusplus
>-}
>-#endif
>-
>-#endif /* _U_THREAD_H_ */
>diff --git a/src/mapi/mapi_abi.py b/src/mapi/mapi_abi.py
>new file mode 100644
>index 0000000..6bfcfa9
>--- /dev/null
>+++ b/src/mapi/mapi_abi.py
>@@ -0,0 +1,873 @@
>+#!/usr/bin/env python
>+
>+# Mesa 3-D graphics library
>+# Version:  7.9
>+#
>+# Copyright (C) 2010 LunarG Inc.
>+#
>+# Permission is hereby granted, free of charge, to any person obtaining a
>+# copy of this software and associated documentation files (the "Software"),
>+# to deal in the Software without restriction, including without limitation
>+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+# and/or sell copies of the Software, and to permit persons to whom the
>+# Software is furnished to do so, subject to the following conditions:
>+#
>+# The above copyright notice and this permission notice shall be included
>+# in all copies or substantial portions of the Software.
>+#
>+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+# DEALINGS IN THE SOFTWARE.
>+#
>+# Authors:
>+#    Chia-I Wu <olv at lunarg.com>
>+
>+import sys
>+# make it possible to import glapi
>+import os
>+GLAPI = os.path.join(".", os.path.dirname(sys.argv[0]), "glapi/gen")
>+sys.path.append(GLAPI)
>+
>+import re
>+from optparse import OptionParser
>+import gl_XML
>+import glX_XML
>+
>+
>+# number of dynamic entries
>+ABI_NUM_DYNAMIC_ENTRIES = 256
>+
>+class ABIEntry(object):
>+    """Represent an ABI entry."""
>+
>+    _match_c_param = re.compile(
>+            '^(?P<type>[\w\s*]+?)(?P<name>\w+)(\[(?P<array>\d+)\])?$')
>+
>+    def __init__(self, cols, attrs, xml_data = None):
>+        self._parse(cols)
>+
>+        self.slot = attrs['slot']
>+        self.hidden = attrs['hidden']
>+        self.alias = attrs['alias']
>+        self.handcode = attrs['handcode']
>+        self.xml_data = xml_data
>+
>+    def c_prototype(self):
>+        return '%s %s(%s)' % (self.c_return(), self.name, self.c_params())
>+
>+    def c_return(self):
>+        ret = self.ret
>+        if not ret:
>+            ret = 'void'
>+
>+        return ret
>+
>+    def c_params(self):
>+        """Return the parameter list used in the entry prototype."""
>+        c_params = []
>+        for t, n, a in self.params:
>+            sep = '' if t.endswith('*') else ' '
>+            arr = '[%d]' % a if a else ''
>+            c_params.append(t + sep + n + arr)
>+        if not c_params:
>+            c_params.append('void')
>+
>+        return ", ".join(c_params)
>+
>+    def c_args(self):
>+        """Return the argument list used in the entry invocation."""
>+        c_args = []
>+        for t, n, a in self.params:
>+            c_args.append(n)
>+
>+        return ", ".join(c_args)
>+
>+    def _parse(self, cols):
>+        ret = cols.pop(0)
>+        if ret == 'void':
>+            ret = None
>+
>+        name = cols.pop(0)
>+
>+        params = []
>+        if not cols:
>+            raise Exception(cols)
>+        elif len(cols) == 1 and cols[0] == 'void':
>+            pass
>+        else:
>+            for val in cols:
>+                params.append(self._parse_param(val))
>+
>+        self.ret = ret
>+        self.name = name
>+        self.params = params
>+
>+    def _parse_param(self, c_param):
>+        m = self._match_c_param.match(c_param)
>+        if not m:
>+            raise Exception('unrecognized param ' + c_param)
>+
>+        c_type = m.group('type').strip()
>+        c_name = m.group('name')
>+        c_array = m.group('array')
>+        c_array = int(c_array) if c_array else 0
>+
>+        return (c_type, c_name, c_array)
>+
>+    def __str__(self):
>+        return self.c_prototype()
>+
>+    def __cmp__(self, other):
>+        # compare slot, alias, and then name
>+        res = cmp(self.slot, other.slot)
>+        if not res:
>+            if not self.alias:
>+                res = -1
>+            elif not other.alias:
>+                res = 1
>+
>+            if not res:
>+                res = cmp(self.name, other.name)
>+
>+        return res
>+
>+def abi_parse_xml(xml):
>+    """Parse a GLAPI XML file for ABI entries."""
>+    api = gl_XML.parse_GL_API(xml, glX_XML.glx_item_factory())
>+
>+    entry_dict = {}
>+    for func in api.functionIterateByOffset():
>+        # make sure func.name appear first
>+        entry_points = func.entry_points[:]
>+        entry_points.remove(func.name)
>+        entry_points.insert(0, func.name)
>+
>+        for name in entry_points:
>+            attrs = {
>+                    'slot': func.offset,
>+                    'hidden': not func.is_static_entry_point(name),
>+                    'alias': None if name == func.name else func.name,
>+                    'handcode': bool(func.has_different_protocol(name)),
>+            }
>+
>+            # post-process attrs
>+            if attrs['alias']:
>+                try:
>+                    alias = entry_dict[attrs['alias']]
>+                except KeyError:
>+                    raise Exception('failed to alias %s' % attrs['alias'])
>+                if alias.alias:
>+                    raise Exception('recursive alias %s' % ent.name)
>+                attrs['alias'] = alias
>+            if attrs['handcode']:
>+                attrs['handcode'] = func.static_glx_name(name)
>+            else:
>+                attrs['handcode'] = None
>+
>+            if entry_dict.has_key(name):
>+                raise Exception('%s is duplicated' % (name))
>+
>+            cols = []
>+            cols.append(func.return_type)
>+            cols.append(name)
>+            params = func.get_parameter_string(name)
>+            cols.extend([p.strip() for p in params.split(',')])
>+
>+            ent = ABIEntry(cols, attrs, func)
>+            entry_dict[ent.name] = ent
>+
>+    entries = entry_dict.values()
>+    entries.sort()
>+
>+    return entries
>+
>+def abi_parse_line(line):
>+    cols = [col.strip() for col in line.split(',')]
>+
>+    attrs = {
>+            'slot': -1,
>+            'hidden': False,
>+            'alias': None,
>+            'handcode': None,
>+    }
>+
>+    # extract attributes from the first column
>+    vals = cols[0].split(':')
>+    while len(vals) > 1:
>+        val = vals.pop(0)
>+        if val.startswith('slot='):
>+            attrs['slot'] = int(val[5:])
>+        elif val == 'hidden':
>+            attrs['hidden'] = True
>+        elif val.startswith('alias='):
>+            attrs['alias'] = val[6:]
>+        elif val.startswith('handcode='):
>+            attrs['handcode'] = val[9:]
>+        elif not val:
>+            pass
>+        else:
>+            raise Exception('unknown attribute %s' % val)
>+    cols[0] = vals[0]
>+
>+    return (attrs, cols)
>+
>+def abi_parse(filename):
>+    """Parse a CSV file for ABI entries."""
>+    fp = open(filename) if filename != '-' else sys.stdin
>+    lines = [line.strip() for line in fp.readlines()
>+            if not line.startswith('#') and line.strip()]
>+
>+    entry_dict = {}
>+    next_slot = 0
>+    for line in lines:
>+        attrs, cols = abi_parse_line(line)
>+
>+        # post-process attributes
>+        if attrs['alias']:
>+            try:
>+                alias = entry_dict[attrs['alias']]
>+            except KeyError:
>+                raise Exception('failed to alias %s' % attrs['alias'])
>+            if alias.alias:
>+                raise Exception('recursive alias %s' % ent.name)
>+            slot = alias.slot
>+            attrs['alias'] = alias
>+        else:
>+            slot = next_slot
>+            next_slot += 1
>+
>+        if attrs['slot'] < 0:
>+            attrs['slot'] = slot
>+        elif attrs['slot'] != slot:
>+            raise Exception('invalid slot in %s' % (line))
>+
>+        ent = ABIEntry(cols, attrs)
>+        if entry_dict.has_key(ent.name):
>+            raise Exception('%s is duplicated' % (ent.name))
>+        entry_dict[ent.name] = ent
>+
>+    entries = entry_dict.values()
>+    entries.sort()
>+
>+    return entries
>+
>+def abi_sanity_check(entries):
>+    if not entries:
>+        return
>+
>+    all_names = []
>+    last_slot = entries[-1].slot
>+    i = 0
>+    for slot in xrange(last_slot + 1):
>+        if entries[i].slot != slot:
>+            raise Exception('entries are not ordered by slots')
>+        if entries[i].alias:
>+            raise Exception('first entry of slot %d aliases %s'
>+                    % (slot, entries[i].alias.name))
>+        handcode = None
>+        while i < len(entries) and entries[i].slot == slot:
>+            ent = entries[i]
>+            if not handcode and ent.handcode:
>+                handcode = ent.handcode
>+            elif ent.handcode != handcode:
>+                raise Exception('two aliases with handcode %s != %s',
>+                        ent.handcode, handcode)
>+
>+            if ent.name in all_names:
>+                raise Exception('%s is duplicated' % (ent.name))
>+            if ent.alias and ent.alias.name not in all_names:
>+                raise Exception('failed to alias %s' % (ent.alias.name))
>+            all_names.append(ent.name)
>+            i += 1
>+    if i < len(entries):
>+        raise Exception('there are %d invalid entries' % (len(entries) - 1))
>+
>+class ABIPrinter(object):
>+    """MAPI Printer"""
>+
>+    def __init__(self, entries):
>+        self.entries = entries
>+
>+        # sort entries by their names
>+        self.entries_sorted_by_names = self.entries[:]
>+        self.entries_sorted_by_names.sort(lambda x, y: cmp(x.name, y.name))
>+
>+        self.indent = ' ' * 3
>+        self.noop_warn = 'noop_warn'
>+        self.noop_generic = 'noop_generic'
>+        self.current_get = 'entry_current_get'
>+
>+        self.api_defines = []
>+        self.api_headers = ['"KHR/khrplatform.h"']
>+        self.api_call = 'KHRONOS_APICALL'
>+        self.api_entry = 'KHRONOS_APIENTRY'
>+        self.api_attrs = 'KHRONOS_APIATTRIBUTES'
>+
>+        self.c_header = ''
>+
>+        self.lib_need_table_size = True
>+        self.lib_need_noop_array = True
>+        self.lib_need_stubs = True
>+        self.lib_need_all_entries = True
>+        self.lib_need_non_hidden_entries = False
>+
>+    def c_notice(self):
>+        return '/* This file is automatically generated by mapi_abi.py.  Do not modify. */'
>+
>+    def c_public_includes(self):
>+        """Return includes of the client API headers."""
>+        defines = ['#define ' + d for d in self.api_defines]
>+        includes = ['#include ' + h for h in self.api_headers]
>+        return "\n".join(defines + includes)
>+
>+    def need_entry_point(self, ent):
>+        """Return True if an entry point is needed for the entry."""
>+        # non-handcode hidden aliases may share the entry they alias
>+        use_alias = (ent.hidden and ent.alias and not ent.handcode)
>+        return not use_alias
>+
>+    def c_public_declarations(self, prefix):
>+        """Return the declarations of public entry points."""
>+        decls = []
>+        for ent in self.entries:
>+            if not self.need_entry_point(ent):
>+                continue
>+            export = self.api_call if not ent.hidden else ''
>+            decls.append(self._c_decl(ent, prefix, True, export) + ';')
>+
>+        return "\n".join(decls)
>+
>+    def c_mapi_table(self):
>+        """Return defines of the dispatch table size."""
>+        num_static_entries = self.entries[-1].slot + 1
>+        return ('#define MAPI_TABLE_NUM_STATIC %d\n' + \
>+                '#define MAPI_TABLE_NUM_DYNAMIC %d') % (
>+                        num_static_entries, ABI_NUM_DYNAMIC_ENTRIES)
>+
>+    def c_mapi_table_initializer(self, prefix):
>+        """Return the array initializer for mapi_table_fill."""
>+        entries = [self._c_function(ent, prefix)
>+                for ent in self.entries if not ent.alias]
>+        pre = self.indent + '(mapi_proc) '
>+        return pre + (',\n' + pre).join(entries)
>+
>+    def c_mapi_table_spec(self):
>+        """Return the spec for mapi_init."""
>+        specv1 = []
>+        line = '"1'
>+        for ent in self.entries:
>+            if not ent.alias:
>+                line += '\\0"\n'
>+                specv1.append(line)
>+                line = '"'
>+            line += '%s\\0' % ent.name
>+        line += '";'
>+        specv1.append(line)
>+
>+        return self.indent + self.indent.join(specv1)
>+
>+    def _c_function(self, ent, prefix, mangle=False, stringify=False):
>+        """Return the function name of an entry."""
>+        formats = {
>+                True: { True: '%s_STR(%s)', False: '%s(%s)' },
>+                False: { True: '"%s%s"', False: '%s%s' },
>+        }
>+        fmt = formats[prefix.isupper()][stringify]
>+        name = ent.name
>+        if mangle and ent.hidden:
>+            name = '_dispatch_stub_' + str(ent.slot)
>+        return fmt % (prefix, name)
>+
>+    def _c_function_call(self, ent, prefix):
>+        """Return the function name used for calling."""
>+        if ent.handcode:
>+            # _c_function does not handle this case
>+            formats = { True: '%s(%s)', False: '%s%s' }
>+            fmt = formats[prefix.isupper()]
>+            name = fmt % (prefix, ent.handcode)
>+        elif self.need_entry_point(ent):
>+            name = self._c_function(ent, prefix, True)
>+        else:
>+            name = self._c_function(ent.alias, prefix, True)
>+        return name
>+
>+    def _c_decl(self, ent, prefix, mangle=False, export=''):
>+        """Return the C declaration for the entry."""
>+        decl = '%s %s %s(%s)' % (ent.c_return(), self.api_entry,
>+                self._c_function(ent, prefix, mangle), ent.c_params())
>+        if export:
>+            decl = export + ' ' + decl
>+        if self.api_attrs:
>+            decl += ' ' + self.api_attrs
>+
>+        return decl
>+
>+    def _c_cast(self, ent):
>+        """Return the C cast for the entry."""
>+        cast = '%s (%s *)(%s)' % (
>+                ent.c_return(), self.api_entry, ent.c_params())
>+
>+        return cast
>+
>+    def c_private_declarations(self, prefix):
>+        """Return the declarations of private functions."""
>+        decls = [self._c_decl(ent, prefix) + ';'
>+                for ent in self.entries if not ent.alias]
>+
>+        return "\n".join(decls)
>+
>+    def c_public_dispatches(self, prefix, no_hidden):
>+        """Return the public dispatch functions."""
>+        dispatches = []
>+        for ent in self.entries:
>+            if ent.hidden and no_hidden:
>+                continue
>+
>+            if not self.need_entry_point(ent):
>+                continue
>+
>+            export = self.api_call if not ent.hidden else ''
>+
>+            proto = self._c_decl(ent, prefix, True, export)
>+            cast = self._c_cast(ent)
>+
>+            ret = ''
>+            if ent.ret:
>+                ret = 'return '
>+            stmt1 = self.indent
>+            stmt1 += 'const struct mapi_table *_tbl = %s();' % (
>+                    self.current_get)
>+            stmt2 = self.indent
>+            stmt2 += 'mapi_func _func = ((const mapi_func *) _tbl)[%d];' % (
>+                    ent.slot)
>+            stmt3 = self.indent
>+            stmt3 += '%s((%s) _func)(%s);' % (ret, cast, ent.c_args())
>+
>+            disp = '%s\n{\n%s\n%s\n%s\n}' % (proto, stmt1, stmt2, stmt3)
>+
>+            if ent.handcode:
>+                disp = '#if 0\n' + disp + '\n#endif'
>+
>+            dispatches.append(disp)
>+
>+        return '\n\n'.join(dispatches)
>+
>+    def c_public_initializer(self, prefix):
>+        """Return the initializer for public dispatch functions."""
>+        names = []
>+        for ent in self.entries:
>+            if ent.alias:
>+                continue
>+
>+            name = '%s(mapi_func) %s' % (self.indent,
>+                    self._c_function_call(ent, prefix))
>+            names.append(name)
>+
>+        return ',\n'.join(names)
>+
>+    def c_stub_string_pool(self):
>+        """Return the string pool for use by stubs."""
>+        # sort entries by their names
>+        sorted_entries = self.entries[:]
>+        sorted_entries.sort(lambda x, y: cmp(x.name, y.name))
>+
>+        pool = []
>+        offsets = {}
>+        count = 0
>+        for ent in sorted_entries:
>+            offsets[ent] = count
>+            pool.append('%s' % (ent.name))
>+            count += len(ent.name) + 1
>+
>+        pool_str =  self.indent + '"' + \
>+                ('\\0"\n' + self.indent + '"').join(pool) + '";'
>+        return (pool_str, offsets)
>+
>+    def c_stub_initializer(self, prefix, pool_offsets):
>+        """Return the initializer for struct mapi_stub array."""
>+        stubs = []
>+        for ent in self.entries_sorted_by_names:
>+            stubs.append('%s{ (void *) %d, %d, NULL }' % (
>+                self.indent, pool_offsets[ent], ent.slot))
>+
>+        return ',\n'.join(stubs)
>+
>+    def c_noop_functions(self, prefix, warn_prefix):
>+        """Return the noop functions."""
>+        noops = []
>+        for ent in self.entries:
>+            if ent.alias:
>+                continue
>+
>+            proto = self._c_decl(ent, prefix, False, 'static')
>+
>+            stmt1 = self.indent;
>+            space = ''
>+            for t, n, a in ent.params:
>+                stmt1 += "%s(void) %s;" % (space, n)
>+                space = ' '
>+
>+            if ent.params:
>+                stmt1 += '\n';
>+
>+            stmt1 += self.indent + '%s(%s);' % (self.noop_warn,
>+                    self._c_function(ent, warn_prefix, False, True))
>+
>+            if ent.ret:
>+                stmt2 = self.indent + 'return (%s) 0;' % (ent.ret)
>+                noop = '%s\n{\n%s\n%s\n}' % (proto, stmt1, stmt2)
>+            else:
>+                noop = '%s\n{\n%s\n}' % (proto, stmt1)
>+
>+            noops.append(noop)
>+
>+        return '\n\n'.join(noops)
>+
>+    def c_noop_initializer(self, prefix, use_generic):
>+        """Return an initializer for the noop dispatch table."""
>+        entries = [self._c_function(ent, prefix)
>+                for ent in self.entries if not ent.alias]
>+        if use_generic:
>+            entries = [self.noop_generic] * len(entries)
>+
>+        entries.extend([self.noop_generic] * ABI_NUM_DYNAMIC_ENTRIES)
>+
>+        pre = self.indent + '(mapi_func) '
>+        return pre + (',\n' + pre).join(entries)
>+
>+    def c_asm_gcc(self, prefix, no_hidden):
>+        asm = []
>+
>+        for ent in self.entries:
>+            if ent.hidden and no_hidden:
>+                continue
>+
>+            if not self.need_entry_point(ent):
>+                continue
>+
>+            name = self._c_function(ent, prefix, True, True)
>+
>+            if ent.handcode:
>+                asm.append('#if 0')
>+
>+            if ent.hidden:
>+                asm.append('".hidden "%s"\\n"' % (name))
>+
>+            if ent.alias and not (ent.alias.hidden and no_hidden):
>+                asm.append('".globl "%s"\\n"' % (name))
>+                asm.append('".set "%s", "%s"\\n"' % (name,
>+                    self._c_function(ent.alias, prefix, True, True)))
>+            else:
>+                asm.append('STUB_ASM_ENTRY(%s)"\\n"' % (name))
>+                asm.append('"\\t"STUB_ASM_CODE("%d")"\\n"' % (ent.slot))
>+
>+            if ent.handcode:
>+                asm.append('#endif')
>+            asm.append('')
>+
>+        return "\n".join(asm)
>+
>+    def output_for_lib(self):
>+        print self.c_notice()
>+
>+        if self.c_header:
>+            print
>+            print self.c_header
>+
>+        print
>+        print '#ifdef MAPI_TMP_DEFINES'
>+        print self.c_public_includes()
>+        print
>+        print self.c_public_declarations(self.prefix_lib)
>+        print '#undef MAPI_TMP_DEFINES'
>+        print '#endif /* MAPI_TMP_DEFINES */'
>+
>+        if self.lib_need_table_size:
>+            print
>+            print '#ifdef MAPI_TMP_TABLE'
>+            print self.c_mapi_table()
>+            print '#undef MAPI_TMP_TABLE'
>+            print '#endif /* MAPI_TMP_TABLE */'
>+
>+        if self.lib_need_noop_array:
>+            print
>+            print '#ifdef MAPI_TMP_NOOP_ARRAY'
>+            print '#ifdef DEBUG'
>+            print
>+            print self.c_noop_functions(self.prefix_noop, self.prefix_warn)
>+            print
>+            print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
>+            print self.c_noop_initializer(self.prefix_noop, False)
>+            print '};'
>+            print
>+            print '#else /* DEBUG */'
>+            print
>+            print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
>+            print self.c_noop_initializer(self.prefix_noop, True)
>+            print '};'
>+            print
>+            print '#endif /* DEBUG */'
>+            print '#undef MAPI_TMP_NOOP_ARRAY'
>+            print '#endif /* MAPI_TMP_NOOP_ARRAY */'
>+
>+        if self.lib_need_stubs:
>+            pool, pool_offsets = self.c_stub_string_pool()
>+            print
>+            print '#ifdef MAPI_TMP_PUBLIC_STUBS'
>+            print 'static const char public_string_pool[] ='
>+            print pool
>+            print
>+            print 'static const struct mapi_stub public_stubs[] = {'
>+            print self.c_stub_initializer(self.prefix_lib, pool_offsets)
>+            print '};'
>+            print '#undef MAPI_TMP_PUBLIC_STUBS'
>+            print '#endif /* MAPI_TMP_PUBLIC_STUBS */'
>+
>+        if self.lib_need_all_entries:
>+            print
>+            print '#ifdef MAPI_TMP_PUBLIC_ENTRIES'
>+            print self.c_public_dispatches(self.prefix_lib, False)
>+            print
>+            print 'static const mapi_func public_entries[] = {'
>+            print self.c_public_initializer(self.prefix_lib)
>+            print '};'
>+            print '#undef MAPI_TMP_PUBLIC_ENTRIES'
>+            print '#endif /* MAPI_TMP_PUBLIC_ENTRIES */'
>+
>+            print
>+            print '#ifdef MAPI_TMP_STUB_ASM_GCC'
>+            print '__asm__('
>+            print self.c_asm_gcc(self.prefix_lib, False)
>+            print ');'
>+            print '#undef MAPI_TMP_STUB_ASM_GCC'
>+            print '#endif /* MAPI_TMP_STUB_ASM_GCC */'
>+
>+        if self.lib_need_non_hidden_entries:
>+            all_hidden = True
>+            for ent in self.entries:
>+                if not ent.hidden:
>+                    all_hidden = False
>+                    break
>+            if not all_hidden:
>+                print
>+                print '#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN'
>+                print self.c_public_dispatches(self.prefix_lib, True)
>+                print
>+                print '/* does not need public_entries */'
>+                print '#undef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN'
>+                print '#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */'
>+
>+                print
>+                print '#ifdef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN'
>+                print '__asm__('
>+                print self.c_asm_gcc(self.prefix_lib, True)
>+                print ');'
>+                print '#undef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN'
>+                print '#endif /* MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN */'
>+
>+    def output_for_app(self):
>+        print self.c_notice()
>+        print
>+        print self.c_private_declarations(self.prefix_app)
>+        print
>+        print '#ifdef API_TMP_DEFINE_SPEC'
>+        print
>+        print 'static const char %s_spec[] =' % (self.prefix_app)
>+        print self.c_mapi_table_spec()
>+        print
>+        print 'static const mapi_proc %s_procs[] = {' % (self.prefix_app)
>+        print self.c_mapi_table_initializer(self.prefix_app)
>+        print '};'
>+        print
>+        print '#endif /* API_TMP_DEFINE_SPEC */'
>+
>+class GLAPIPrinter(ABIPrinter):
>+    """OpenGL API Printer"""
>+
>+    def __init__(self, entries):
>+        for ent in entries:
>+            self._override_for_api(ent)
>+        super(GLAPIPrinter, self).__init__(entries)
>+
>+        self.api_defines = ['GL_GLEXT_PROTOTYPES']
>+        self.api_headers = ['"GL/gl.h"', '"GL/glext.h"']
>+        self.api_call = 'GLAPI'
>+        self.api_entry = 'APIENTRY'
>+        self.api_attrs = ''
>+
>+        self.lib_need_table_size = False
>+        self.lib_need_noop_array = False
>+        self.lib_need_stubs = False
>+        self.lib_need_all_entries = False
>+        self.lib_need_non_hidden_entries = True
>+
>+        self.prefix_lib = 'GLAPI_PREFIX'
>+        self.prefix_app = '_mesa_'
>+        self.prefix_noop = 'noop'
>+        self.prefix_warn = self.prefix_lib
>+
>+        self.c_header = self._get_c_header()
>+
>+    def _override_for_api(self, ent):
>+        """Override attributes of an entry if necessary for this
>+        printer."""
>+        # By default, no override is necessary.
>+        pass
>+
>+    def _get_c_header(self):
>+        header = """#ifndef _GLAPI_TMP_H_
>+#define _GLAPI_TMP_H_
>+#ifdef USE_MGL_NAMESPACE
>+#define GLAPI_PREFIX(func)  mgl##func
>+#define GLAPI_PREFIX_STR(func)  "mgl"#func
>+#else
>+#define GLAPI_PREFIX(func)  gl##func
>+#define GLAPI_PREFIX_STR(func)  "gl"#func
>+#endif /* USE_MGL_NAMESPACE */
>+
>+typedef int GLfixed;
>+typedef int GLclampx;
>+#endif /* _GLAPI_TMP_H_ */"""
>+
>+        return header
>+
>+class ES1APIPrinter(GLAPIPrinter):
>+    """OpenGL ES 1.x API Printer"""
>+
>+    def __init__(self, entries):
>+        super(ES1APIPrinter, self).__init__(entries)
>+        self.prefix_lib = 'gl'
>+        self.prefix_warn = 'gl'
>+
>+    def _override_for_api(self, ent):
>+        if ent.xml_data is None:
>+            raise Exception('ES2 API printer requires XML input')
>+        ent.hidden = ent.name not in \
>+            ent.xml_data.entry_points_for_api_version('es1')
>+        ent.handcode = False
>+
>+    def _get_c_header(self):
>+        header = """#ifndef _GLAPI_TMP_H_
>+#define _GLAPI_TMP_H_
>+typedef int GLfixed;
>+typedef int GLclampx;
>+#endif /* _GLAPI_TMP_H_ */"""
>+
>+        return header
>+
>+class ES2APIPrinter(GLAPIPrinter):
>+    """OpenGL ES 2.x API Printer"""
>+
>+    def __init__(self, entries):
>+        super(ES2APIPrinter, self).__init__(entries)
>+        self.prefix_lib = 'gl'
>+        self.prefix_warn = 'gl'
>+
>+    def _override_for_api(self, ent):
>+        if ent.xml_data is None:
>+            raise Exception('ES2 API printer requires XML input')
>+        ent.hidden = ent.name not in \
>+            ent.xml_data.entry_points_for_api_version('es2')
>+        ent.handcode = False
>+
>+    def _get_c_header(self):
>+        header = """#ifndef _GLAPI_TMP_H_
>+#define _GLAPI_TMP_H_
>+typedef int GLfixed;
>+typedef int GLclampx;
>+#endif /* _GLAPI_TMP_H_ */"""
>+
>+        return header
>+
>+class SharedGLAPIPrinter(GLAPIPrinter):
>+    """Shared GLAPI API Printer"""
>+
>+    def __init__(self, entries):
>+        super(SharedGLAPIPrinter, self).__init__(entries)
>+
>+        self.lib_need_table_size = True
>+        self.lib_need_noop_array = True
>+        self.lib_need_stubs = True
>+        self.lib_need_all_entries = True
>+        self.lib_need_non_hidden_entries = False
>+
>+        self.prefix_lib = 'shared'
>+        self.prefix_warn = 'gl'
>+
>+    def _override_for_api(self, ent):
>+        ent.hidden = True
>+        ent.handcode = False
>+
>+    def _get_c_header(self):
>+        header = """#ifndef _GLAPI_TMP_H_
>+#define _GLAPI_TMP_H_
>+typedef int GLfixed;
>+typedef int GLclampx;
>+#endif /* _GLAPI_TMP_H_ */"""
>+
>+        return header
>+
>+class VGAPIPrinter(ABIPrinter):
>+    """OpenVG API Printer"""
>+
>+    def __init__(self, entries):
>+        super(VGAPIPrinter, self).__init__(entries)
>+
>+        self.api_defines = ['VG_VGEXT_PROTOTYPES']
>+        self.api_headers = ['"VG/openvg.h"', '"VG/vgext.h"']
>+        self.api_call = 'VG_API_CALL'
>+        self.api_entry = 'VG_API_ENTRY'
>+        self.api_attrs = 'VG_API_EXIT'
>+
>+        self.prefix_lib = 'vg'
>+        self.prefix_app = 'vega'
>+        self.prefix_noop = 'noop'
>+        self.prefix_warn = 'vg'
>+
>+def parse_args():
>+    printers = ['vgapi', 'glapi', 'es1api', 'es2api', 'shared-glapi']
>+    modes = ['lib', 'app']
>+
>+    parser = OptionParser(usage='usage: %prog [options] <filename>')
>+    parser.add_option('-p', '--printer', dest='printer',
>+            help='printer to use: %s' % (", ".join(printers)))
>+    parser.add_option('-m', '--mode', dest='mode',
>+            help='target user: %s' % (", ".join(modes)))
>+
>+    options, args = parser.parse_args()
>+    if not args or options.printer not in printers or \
>+            options.mode not in modes:
>+        parser.print_help()
>+        sys.exit(1)
>+
>+    return (args[0], options)
>+
>+def main():
>+    printers = {
>+        'vgapi': VGAPIPrinter,
>+        'glapi': GLAPIPrinter,
>+        'es1api': ES1APIPrinter,
>+        'es2api': ES2APIPrinter,
>+        'shared-glapi': SharedGLAPIPrinter,
>+    }
>+
>+    filename, options = parse_args()
>+
>+    if filename.endswith('.xml'):
>+        entries = abi_parse_xml(filename)
>+    else:
>+        entries = abi_parse(filename)
>+    abi_sanity_check(entries)
>+
>+    printer = printers[options.printer](entries)
>+    if options.mode == 'lib':
>+        printer.output_for_lib()
>+    else:
>+        printer.output_for_app()
>+
>+if __name__ == '__main__':
>+    main()
>diff --git a/src/mapi/mapi_glapi.c b/src/mapi/mapi_glapi.c
>new file mode 100644
>index 0000000..a6838ce
>--- /dev/null
>+++ b/src/mapi/mapi_glapi.c
>@@ -0,0 +1,240 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include <string.h>
>+#include "glapi/glapi.h"
>+#include "u_current.h"
>+#include "table.h" /* for MAPI_TABLE_NUM_SLOTS */
>+#include "stub.h"
>+
>+/*
>+ * Global variables, _glapi_get_context, and _glapi_get_dispatch are defined in
>+ * u_current.c.
>+ */
>+
>+#ifdef GLX_USE_TLS
>+/* not used, but defined for compatibility */
>+const struct _glapi_table *_glapi_Dispatch;
>+const void *_glapi_Context;
>+#endif /* GLX_USE_TLS */
>+
>+void
>+_glapi_destroy_multithread(void)
>+{
>+   u_current_destroy();
>+}
>+
>+void
>+_glapi_check_multithread(void)
>+{
>+   u_current_init();
>+}
>+
>+void
>+_glapi_set_context(void *context)
>+{
>+   u_current_set_user((const void *) context);
>+}
>+
>+void
>+_glapi_set_dispatch(struct _glapi_table *dispatch)
>+{
>+   u_current_set((const struct mapi_table *) dispatch);
>+}
>+
>+/**
>+ * Return size of dispatch table struct as number of functions (or
>+ * slots).
>+ */
>+unsigned int
>+_glapi_get_dispatch_table_size(void)
>+{
>+   return MAPI_TABLE_NUM_SLOTS;
>+}
>+
>+/**
>+ * Fill-in the dispatch stub for the named function.
>+ *
>+ * This function is intended to be called by a hardware driver.  When called,
>+ * a dispatch stub may be created created for the function.  A pointer to this
>+ * dispatch function will be returned by glXGetProcAddress.
>+ *
>+ * \param function_names       Array of pointers to function names that should
>+ *                             share a common dispatch offset.
>+ * \param parameter_signature  String representing the types of the parameters
>+ *                             passed to the named function.  Parameter types
>+ *                             are converted to characters using the following
>+ *                             rules:
>+ *                               - 'i' for \c GLint, \c GLuint, and \c GLenum
>+ *                               - 'p' for any pointer type
>+ *                               - 'f' for \c GLfloat and \c GLclampf
>+ *                               - 'd' for \c GLdouble and \c GLclampd
>+ *
>+ * \returns
>+ * The offset in the dispatch table of the named function.  A pointer to the
>+ * driver's implementation of the named function should be stored at
>+ * \c dispatch_table[\c offset].  Return -1 if error/problem.
>+ *
>+ * \sa glXGetProcAddress
>+ *
>+ * \warning
>+ * This function can only handle up to 8 names at a time.  As far as I know,
>+ * the maximum number of names ever associated with an existing GL function is
>+ * 4 (\c glPointParameterfSGIS, \c glPointParameterfEXT,
>+ * \c glPointParameterfARB, and \c glPointParameterf), so this should not be
>+ * too painful of a limitation.
>+ *
>+ * \todo
>+ * Check parameter_signature.
>+ */
>+int
>+_glapi_add_dispatch( const char * const * function_names,
>+		     const char * parameter_signature )
>+{
>+   const struct mapi_stub *function_stubs[8];
>+   const struct mapi_stub *alias = NULL;
>+   unsigned i;
>+
>+   (void) memset(function_stubs, 0, sizeof(function_stubs));
>+
>+   /* find the missing stubs, and decide the alias */
>+   for (i = 0; function_names[i] != NULL && i < 8; i++) {
>+      const char * funcName = function_names[i];
>+      const struct mapi_stub *stub;
>+      int slot;
>+
>+      if (!funcName || funcName[0] != 'g' || funcName[1] != 'l')
>+         return -1;
>+      funcName += 2;
>+
>+      stub = stub_find_public(funcName);
>+      if (!stub)
>+         stub = stub_find_dynamic(funcName, 0);
>+
>+      slot = (stub) ? stub_get_slot(stub) : -1;
>+      if (slot >= 0) {
>+         if (alias && stub_get_slot(alias) != slot)
>+            return -1;
>+         /* use the first existing stub as the alias */
>+         if (!alias)
>+            alias = stub;
>+
>+         function_stubs[i] = stub;
>+      }
>+   }
>+
>+   /* generate missing stubs */
>+   for (i = 0; function_names[i] != NULL && i < 8; i++) {
>+      const char * funcName = function_names[i] + 2;
>+      struct mapi_stub *stub;
>+
>+      if (function_stubs[i])
>+         continue;
>+
>+      stub = stub_find_dynamic(funcName, 1);
>+      if (!stub)
>+         return -1;
>+
>+      stub_fix_dynamic(stub, alias);
>+      if (!alias)
>+         alias = stub;
>+   }
>+
>+   return (alias) ? stub_get_slot(alias) : -1;
>+}
>+
>+static const struct mapi_stub *
>+_glapi_get_stub(const char *name, int generate)
>+{
>+   const struct mapi_stub *stub;
>+
>+#ifdef USE_MGL_NAMESPACE
>+   if (name)
>+      name++;
>+#endif
>+
>+   if (!name || name[0] != 'g' || name[1] != 'l')
>+      return NULL;
>+   name += 2;
>+
>+   stub = stub_find_public(name);
>+   if (!stub)
>+      stub = stub_find_dynamic(name, generate);
>+
>+   return stub;
>+}
>+
>+/**
>+ * Return offset of entrypoint for named function within dispatch table.
>+ */
>+int
>+_glapi_get_proc_offset(const char *funcName)
>+{
>+   const struct mapi_stub *stub = _glapi_get_stub(funcName, 0);
>+   return (stub) ? stub_get_slot(stub) : -1;
>+}
>+
>+/**
>+ * Return pointer to the named function.  If the function name isn't found
>+ * in the name of static functions, try generating a new API entrypoint on
>+ * the fly with assembly language.
>+ */
>+_glapi_proc
>+_glapi_get_proc_address(const char *funcName)
>+{
>+   const struct mapi_stub *stub = _glapi_get_stub(funcName, 1);
>+   return (stub) ? (_glapi_proc) stub_get_addr(stub) : NULL;
>+}
>+
>+/**
>+ * Return the name of the function at the given dispatch offset.
>+ * This is only intended for debugging.
>+ */
>+const char *
>+_glapi_get_proc_name(unsigned int offset)
>+{
>+   const struct mapi_stub *stub = stub_find_by_slot(offset);
>+   return stub ? stub_get_name(stub) : NULL;
>+}
>+
>+unsigned long
>+_glthread_GetID(void)
>+{
>+   return u_thread_self();
>+}
>+
>+void
>+_glapi_noop_enable_warnings(unsigned char enable)
>+{
>+}
>+
>+void
>+_glapi_set_warning_func(_glapi_proc func)
>+{
>+}
>diff --git a/src/mapi/mapi_tmp.h b/src/mapi/mapi_tmp.h
>new file mode 100644
>index 0000000..f326b4a
>--- /dev/null
>+++ b/src/mapi/mapi_tmp.h
>@@ -0,0 +1,48 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#ifndef MAPI_ABI_HEADER
>+#error "MAPI_ABI_HEADER must be defined"
>+#endif
>+
>+/* does not need hidden entries in bridge mode */
>+#ifdef MAPI_MODE_BRIDGE
>+
>+#ifdef MAPI_TMP_PUBLIC_ENTRIES
>+#undef MAPI_TMP_PUBLIC_ENTRIES
>+#define MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN
>+#endif
>+
>+#ifdef MAPI_TMP_STUB_ASM_GCC
>+#undef MAPI_TMP_STUB_ASM_GCC
>+#define MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN
>+#endif
>+
>+#endif /* MAPI_MODE_BRIDGE */
>+
>+#include MAPI_ABI_HEADER
>diff --git a/src/mapi/shared-glapi/Makefile.am b/src/mapi/shared-glapi/Makefile.am
>index 2cc5c59..2021a73 100644
>--- a/src/mapi/shared-glapi/Makefile.am
>+++ b/src/mapi/shared-glapi/Makefile.am
>@@ -2,7 +2,7 @@
> 
> TOP = $(top_srcdir)
> GLAPI = $(top_srcdir)/src/mapi/glapi
>-include $(top_srcdir)/src/mapi/mapi/Makefile.sources
>+include $(top_srcdir)/src/mapi/Makefile.sources
> 
> lib_LTLIBRARIES = libglapi.la
> libglapi_la_SOURCES = $(MAPI_GLAPI_FILES)
>diff --git a/src/mapi/shared-glapi/SConscript b/src/mapi/shared-glapi/SConscript
>index 0097c1c..07b3eff 100644
>--- a/src/mapi/shared-glapi/SConscript
>+++ b/src/mapi/shared-glapi/SConscript
>@@ -28,7 +28,7 @@ def mapi_objects(env, printer, mode):
>     # generate ABI header
>     header = env.CodeGenerate(
>         target = header_name,
>-        script = '../mapi/mapi_abi.py',
>+        script = '../mapi_abi.py',
>         source = '../glapi/gen/gl_and_es_API.xml',
>         command = python_cmd + ' $SCRIPT ' + \
>                 '--printer %s --mode lib $SOURCE > $TARGET' % (printer),
>@@ -59,7 +59,7 @@ def mapi_objects(env, printer, mode):
>     for s in mapi_sources[mode]:
>         o = env.SharedObject(
>             target = '%s-%s' % (printer, s[:-2]),
>-            source = '../mapi/' + s,
>+            source = '../' + s,
>             CPPPATH = cpppath,
>             CPPDEFINES = cppdefines,
>         )
>diff --git a/src/mapi/stub.c b/src/mapi/stub.c
>new file mode 100644
>index 0000000..688dc81
>--- /dev/null
>+++ b/src/mapi/stub.c
>@@ -0,0 +1,229 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include <stdlib.h>
>+#include <string.h>
>+#include <assert.h>
>+
>+#include "u_current.h"
>+#include "u_thread.h"
>+#include "entry.h"
>+#include "stub.h"
>+#include "table.h"
>+
>+#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
>+
>+struct mapi_stub {
>+   const void *name;
>+   int slot;
>+   mapi_func addr;
>+};
>+
>+/* define public_string_pool and public_stubs */
>+#define MAPI_TMP_PUBLIC_STUBS
>+#include "mapi_tmp.h"
>+
>+static struct mapi_stub dynamic_stubs[MAPI_TABLE_NUM_DYNAMIC];
>+static int num_dynamic_stubs;
>+static int next_dynamic_slot = MAPI_TABLE_NUM_STATIC;
>+
>+void
>+stub_init_once(void)
>+{
>+#ifdef HAVE_PTHREAD
>+   static pthread_once_t once = PTHREAD_ONCE_INIT;
>+   pthread_once(&once, entry_patch_public);
>+#else
>+   static int first = 1;
>+   if (first) {
>+      first = 0;
>+      entry_patch_public();
>+   }
>+#endif
>+}
>+
>+static int
>+stub_compare(const void *key, const void *elem)
>+{
>+   const char *name = (const char *) key;
>+   const struct mapi_stub *stub = (const struct mapi_stub *) elem;
>+   const char *stub_name;
>+
>+   stub_name = &public_string_pool[(unsigned long) stub->name];
>+
>+   return strcmp(name, stub_name);
>+}
>+
>+/**
>+ * Return the public stub with the given name.
>+ */
>+const struct mapi_stub *
>+stub_find_public(const char *name)
>+{
>+   return (const struct mapi_stub *) bsearch(name, public_stubs,
>+         ARRAY_SIZE(public_stubs), sizeof(public_stubs[0]), stub_compare);
>+}
>+
>+/**
>+ * Add a dynamic stub.
>+ */
>+static struct mapi_stub *
>+stub_add_dynamic(const char *name)
>+{
>+   struct mapi_stub *stub;
>+   int idx;
>+
>+   idx = num_dynamic_stubs;
>+   /* minus 1 to make sure we can never reach the last slot */
>+   if (idx >= MAPI_TABLE_NUM_DYNAMIC - 1)
>+      return NULL;
>+
>+   stub = &dynamic_stubs[idx];
>+
>+   /* dispatch to the last slot, which is reserved for no-op */
>+   stub->addr = entry_generate(
>+         MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC - 1);
>+   if (!stub->addr)
>+      return NULL;
>+
>+   stub->name = (const void *) name;
>+   /* to be fixed later */
>+   stub->slot = -1;
>+
>+   num_dynamic_stubs = idx + 1;
>+
>+   return stub;
>+}
>+
>+/**
>+ * Return the dynamic stub with the given name.  If no such stub exists and
>+ * generate is true, a new stub is generated.
>+ */
>+struct mapi_stub *
>+stub_find_dynamic(const char *name, int generate)
>+{
>+   u_mutex_declare_static(dynamic_mutex);
>+   struct mapi_stub *stub = NULL;
>+   int count, i;
>+   
>+   u_mutex_lock(dynamic_mutex);
>+
>+   if (generate)
>+      assert(!stub_find_public(name));
>+
>+   count = num_dynamic_stubs;
>+   for (i = 0; i < count; i++) {
>+      if (strcmp(name, (const char *) dynamic_stubs[i].name) == 0) {
>+         stub = &dynamic_stubs[i];
>+         break;
>+      }
>+   }
>+
>+   /* generate a dynamic stub */
>+   if (generate && !stub)
>+         stub = stub_add_dynamic(name);
>+
>+   u_mutex_unlock(dynamic_mutex);
>+
>+   return stub;
>+}
>+
>+static const struct mapi_stub *
>+search_table_by_slot(const struct mapi_stub *table, size_t num_entries,
>+                     int slot)
>+{
>+   size_t i;
>+   for (i = 0; i < num_entries; ++i) {
>+      if (table[i].slot == slot)
>+         return &table[i];
>+   }
>+   return NULL;
>+}
>+
>+const struct mapi_stub *
>+stub_find_by_slot(int slot)
>+{
>+   const struct mapi_stub *stub =
>+      search_table_by_slot(public_stubs, ARRAY_SIZE(public_stubs), slot);
>+   if (stub)
>+      return stub;
>+   return search_table_by_slot(dynamic_stubs, num_dynamic_stubs, slot);
>+}
>+
>+void
>+stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias)
>+{
>+   int slot;
>+
>+   if (stub->slot >= 0)
>+      return;
>+
>+   if (alias)
>+      slot = alias->slot;
>+   else
>+      slot = next_dynamic_slot++;
>+
>+   entry_patch(stub->addr, slot);
>+   stub->slot = slot;
>+}
>+
>+/**
>+ * Return the name of a stub.
>+ */
>+const char *
>+stub_get_name(const struct mapi_stub *stub)
>+{
>+   const char *name;
>+
>+   if (stub >= public_stubs &&
>+       stub < public_stubs + ARRAY_SIZE(public_stubs))
>+      name = &public_string_pool[(unsigned long) stub->name];
>+   else
>+      name = (const char *) stub->name;
>+
>+   return name;
>+}
>+
>+/**
>+ * Return the slot of a stub.
>+ */
>+int
>+stub_get_slot(const struct mapi_stub *stub)
>+{
>+   return stub->slot;
>+}
>+
>+/**
>+ * Return the address of a stub.
>+ */
>+mapi_func
>+stub_get_addr(const struct mapi_stub *stub)
>+{
>+   assert(stub->addr || (unsigned int) stub->slot < MAPI_TABLE_NUM_STATIC);
>+   return (stub->addr) ? stub->addr : entry_get_public(stub->slot);
>+}
>diff --git a/src/mapi/stub.h b/src/mapi/stub.h
>new file mode 100644
>index 0000000..98e2553
>--- /dev/null
>+++ b/src/mapi/stub.h
>@@ -0,0 +1,60 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#ifndef _STUB_H_
>+#define _STUB_H_
>+
>+#include "entry.h"
>+
>+struct mapi_stub;
>+
>+void
>+stub_init_once(void);
>+
>+const struct mapi_stub *
>+stub_find_public(const char *name);
>+
>+struct mapi_stub *
>+stub_find_dynamic(const char *name, int generate);
>+
>+const struct mapi_stub *
>+stub_find_by_slot(int slot);
>+
>+void
>+stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias);
>+
>+const char *
>+stub_get_name(const struct mapi_stub *stub);
>+
>+int
>+stub_get_slot(const struct mapi_stub *stub);
>+
>+mapi_func
>+stub_get_addr(const struct mapi_stub *stub);
>+
>+#endif /* _STUB_H_ */
>diff --git a/src/mapi/table.c b/src/mapi/table.c
>new file mode 100644
>index 0000000..9bb9f65
>--- /dev/null
>+++ b/src/mapi/table.c
>@@ -0,0 +1,56 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#include <stdlib.h>
>+#include <stdio.h>
>+
>+#include "table.h"
>+
>+static void
>+noop_warn(const char *name)
>+{
>+   static int debug = -1;
>+   
>+   if (debug < 0)
>+      debug = (getenv("MESA_DEBUG") || getenv("LIBGL_DEBUG"));
>+
>+   if (debug)
>+      fprintf(stderr, "%s is no-op\n", name);
>+}
>+
>+static int
>+noop_generic(void)
>+{
>+   noop_warn("function");
>+   return 0;
>+}
>+
>+/* define noop_array */
>+#define MAPI_TMP_DEFINES
>+#define MAPI_TMP_NOOP_ARRAY
>+#include "mapi_tmp.h"
>diff --git a/src/mapi/table.h b/src/mapi/table.h
>new file mode 100644
>index 0000000..d84523f
>--- /dev/null
>+++ b/src/mapi/table.h
>@@ -0,0 +1,72 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.9
>+ *
>+ * Copyright (C) 2010 LunarG Inc.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+ * DEALINGS IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ *    Chia-I Wu <olv at lunarg.com>
>+ */
>+
>+#ifndef _TABLE_H_
>+#define _TABLE_H_
>+
>+#include "u_compiler.h"
>+#include "entry.h"
>+
>+#define MAPI_TMP_TABLE
>+#include "mapi_tmp.h"
>+
>+#define MAPI_TABLE_NUM_SLOTS (MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC)
>+#define MAPI_TABLE_SIZE (MAPI_TABLE_NUM_SLOTS * sizeof(mapi_func))
>+
>+extern const mapi_func table_noop_array[];
>+
>+/**
>+ * Get the no-op dispatch table.
>+ */
>+static INLINE const struct mapi_table *
>+table_get_noop(void)
>+{
>+   return (const struct mapi_table *) table_noop_array;
>+}
>+
>+/**
>+ * Set the function of a slot.
>+ */
>+static INLINE void
>+table_set_func(struct mapi_table *tbl, int slot, mapi_func func)
>+{
>+   mapi_func *funcs = (mapi_func *) tbl;
>+   funcs[slot] = func;
>+}
>+
>+/**
>+ * Return the function of a slot.
>+ */
>+static INLINE mapi_func
>+table_get_func(const struct mapi_table *tbl, int slot)
>+{
>+   const mapi_func *funcs = (const mapi_func *) tbl;
>+   return funcs[slot];
>+}
>+
>+#endif /* _TABLE_H_ */
>diff --git a/src/mapi/u_compiler.h b/src/mapi/u_compiler.h
>new file mode 100644
>index 0000000..2b019ed
>--- /dev/null
>+++ b/src/mapi/u_compiler.h
>@@ -0,0 +1,51 @@
>+#ifndef _U_COMPILER_H_
>+#define _U_COMPILER_H_
>+
>+/* Function inlining */
>+#ifndef inline
>+#  ifdef __cplusplus
>+     /* C++ supports inline keyword */
>+#  elif defined(__GNUC__)
>+#    define inline __inline__
>+#  elif defined(_MSC_VER)
>+#    define inline __inline
>+#  elif defined(__ICL)
>+#    define inline __inline
>+#  elif defined(__INTEL_COMPILER)
>+     /* Intel compiler supports inline keyword */
>+#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
>+#    define inline __inline
>+#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
>+     /* C99 supports inline keyword */
>+#  elif (__STDC_VERSION__ >= 199901L)
>+     /* C99 supports inline keyword */
>+#  else
>+#    define inline
>+#  endif
>+#endif
>+#ifndef INLINE
>+#  define INLINE inline
>+#endif
>+
>+/* Function visibility */
>+#ifndef PUBLIC
>+#  if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
>+#    define PUBLIC __attribute__((visibility("default")))
>+#  elif defined(_MSC_VER)
>+#    define PUBLIC __declspec(dllexport)
>+#  else
>+#    define PUBLIC
>+#  endif
>+#endif
>+
>+#ifndef likely
>+#  if defined(__GNUC__)
>+#    define likely(x)   __builtin_expect(!!(x), 1)
>+#    define unlikely(x) __builtin_expect(!!(x), 0)
>+#  else
>+#    define likely(x)   (x)
>+#    define unlikely(x) (x)
>+#  endif
>+#endif
>+
>+#endif /* _U_COMPILER_H_ */
>diff --git a/src/mapi/u_current.c b/src/mapi/u_current.c
>new file mode 100644
>index 0000000..d902375
>--- /dev/null
>+++ b/src/mapi/u_current.c
>@@ -0,0 +1,266 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  7.1
>+ *
>+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
>+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>+ */
>+
>+
>+/*
>+ * This file manages the OpenGL API dispatch layer.
>+ * The dispatch table (struct _glapi_table) is basically just a list
>+ * of function pointers.
>+ * There are functions to set/get the current dispatch table for the
>+ * current thread and to manage registration/dispatch of dynamically
>+ * added extension functions.
>+ *
>+ * It's intended that this file and the other glapi*.[ch] files are
>+ * flexible enough to be reused in several places:  XFree86, DRI-
>+ * based libGL.so, and perhaps the SGI SI.
>+ *
>+ * NOTE: There are no dependencies on Mesa in this code.
>+ *
>+ * Versions (API changes):
>+ *   2000/02/23  - original version for Mesa 3.3 and XFree86 4.0
>+ *   2001/01/16  - added dispatch override feature for Mesa 3.5
>+ *   2002/06/28  - added _glapi_set_warning_func(), Mesa 4.1.
>+ *   2002/10/01  - _glapi_get_proc_address() will now generate new entrypoints
>+ *                 itself (using offset ~0).  _glapi_add_entrypoint() can be
>+ *                 called afterward and it'll fill in the correct dispatch
>+ *                 offset.  This allows DRI libGL to avoid probing for DRI
>+ *                 drivers!  No changes to the public glapi interface.
>+ */
>+
>+#include "u_current.h"
>+#include "u_thread.h"
>+
>+#ifndef MAPI_MODE_UTIL
>+
>+#include "table.h"
>+#include "stub.h"
>+
>+#else
>+
>+extern void init_glapi_relocs_once(void);
>+extern void (*__glapi_noop_table[])(void);
>+
>+#define table_noop_array __glapi_noop_table
>+#define stub_init_once() init_glapi_relocs_once()
>+
>+#endif
>+
>+/**
>+ * \name Current dispatch and current context control variables
>+ *
>+ * Depending on whether or not multithreading is support, and the type of
>+ * support available, several variables are used to store the current context
>+ * pointer and the current dispatch table pointer.  In the non-threaded case,
>+ * the variables \c _glapi_Dispatch and \c _glapi_Context are used for this
>+ * purpose.
>+ *
>+ * In the "normal" threaded case, the variables \c _glapi_Dispatch and
>+ * \c _glapi_Context will be \c NULL if an application is detected as being
>+ * multithreaded.  Single-threaded applications will use \c _glapi_Dispatch
>+ * and \c _glapi_Context just like the case without any threading support.
>+ * When \c _glapi_Dispatch and \c _glapi_Context are \c NULL, the thread state
>+ * data \c _gl_DispatchTSD and \c ContextTSD are used.  Drivers and the
>+ * static dispatch functions access these variables via \c _glapi_get_dispatch
>+ * and \c _glapi_get_context.
>+ *
>+ * There is a race condition in setting \c _glapi_Dispatch to \c NULL.  It is
>+ * possible for the original thread to be setting it at the same instant a new
>+ * thread, perhaps running on a different processor, is clearing it.  Because
>+ * of that, \c ThreadSafe, which can only ever be changed to \c GL_TRUE, is
>+ * used to determine whether or not the application is multithreaded.
>+ * 
>+ * In the TLS case, the variables \c _glapi_Dispatch and \c _glapi_Context are
>+ * hardcoded to \c NULL.  Instead the TLS variables \c _glapi_tls_Dispatch and
>+ * \c _glapi_tls_Context are used.  Having \c _glapi_Dispatch and
>+ * \c _glapi_Context be hardcoded to \c NULL maintains binary compatability
>+ * between TLS enabled loaders and non-TLS DRI drivers.
>+ */
>+/*@{*/
>+#if defined(GLX_USE_TLS)
>+
>+__thread struct mapi_table *u_current_table
>+    __attribute__((tls_model("initial-exec")))
>+    = (struct mapi_table *) table_noop_array;
>+
>+__thread void *u_current_user
>+    __attribute__((tls_model("initial-exec")));
>+
>+#else
>+
>+struct mapi_table *u_current_table =
>+   (struct mapi_table *) table_noop_array;
>+void *u_current_user;
>+
>+#ifdef THREADS
>+struct u_tsd u_current_table_tsd;
>+static struct u_tsd u_current_user_tsd;
>+static int ThreadSafe;
>+#endif /* THREADS */
>+
>+#endif /* defined(GLX_USE_TLS) */
>+/*@}*/
>+
>+
>+void
>+u_current_destroy(void)
>+{
>+#if defined(THREADS) && defined(_WIN32)
>+   u_tsd_destroy(&u_current_table_tsd);
>+   u_tsd_destroy(&u_current_user_tsd);
>+#endif
>+}
>+
>+
>+#if defined(THREADS) && !defined(GLX_USE_TLS)
>+
>+static void
>+u_current_init_tsd(void)
>+{
>+   u_tsd_init(&u_current_table_tsd);
>+   u_tsd_init(&u_current_user_tsd);
>+}
>+
>+/**
>+ * Mutex for multithread check.
>+ */
>+u_mutex_declare_static(ThreadCheckMutex);
>+
>+/**
>+ * We should call this periodically from a function such as glXMakeCurrent
>+ * in order to test if multiple threads are being used.
>+ */
>+void
>+u_current_init(void)
>+{
>+   static unsigned long knownID;
>+   static int firstCall = 1;
>+
>+   if (ThreadSafe)
>+      return;
>+
>+   u_mutex_lock(ThreadCheckMutex);
>+   if (firstCall) {
>+      u_current_init_tsd();
>+
>+      knownID = u_thread_self();
>+      firstCall = 0;
>+   }
>+   else if (knownID != u_thread_self()) {
>+      ThreadSafe = 1;
>+      u_current_set(NULL);
>+      u_current_set_user(NULL);
>+   }
>+   u_mutex_unlock(ThreadCheckMutex);
>+}
>+
>+#else
>+
>+void
>+u_current_init(void)
>+{
>+}
>+
>+#endif
>+
>+
>+
>+/**
>+ * Set the current context pointer for this thread.
>+ * The context pointer is an opaque type which should be cast to
>+ * void from the real context pointer type.
>+ */
>+void
>+u_current_set_user(const void *ptr)
>+{
>+   u_current_init();
>+
>+#if defined(GLX_USE_TLS)
>+   u_current_user = (void *) ptr;
>+#elif defined(THREADS)
>+   u_tsd_set(&u_current_user_tsd, (void *) ptr);
>+   u_current_user = (ThreadSafe) ? NULL : (void *) ptr;
>+#else
>+   u_current_user = (void *) ptr;
>+#endif
>+}
>+
>+/**
>+ * Get the current context pointer for this thread.
>+ * The context pointer is an opaque type which should be cast from
>+ * void to the real context pointer type.
>+ */
>+void *
>+u_current_get_user_internal(void)
>+{
>+#if defined(GLX_USE_TLS)
>+   return u_current_user;
>+#elif defined(THREADS)
>+   return (ThreadSafe)
>+      ? u_tsd_get(&u_current_user_tsd)
>+      : u_current_user;
>+#else
>+   return u_current_user;
>+#endif
>+}
>+
>+/**
>+ * Set the global or per-thread dispatch table pointer.
>+ * If the dispatch parameter is NULL we'll plug in the no-op dispatch
>+ * table (__glapi_noop_table).
>+ */
>+void
>+u_current_set(const struct mapi_table *tbl)
>+{
>+   u_current_init();
>+
>+   stub_init_once();
>+
>+   if (!tbl)
>+      tbl = (const struct mapi_table *) table_noop_array;
>+
>+#if defined(GLX_USE_TLS)
>+   u_current_table = (struct mapi_table *) tbl;
>+#elif defined(THREADS)
>+   u_tsd_set(&u_current_table_tsd, (void *) tbl);
>+   u_current_table = (ThreadSafe) ? NULL : (void *) tbl;
>+#else
>+   u_current_table = (struct mapi_table *) tbl;
>+#endif
>+}
>+
>+/**
>+ * Return pointer to current dispatch table for calling thread.
>+ */
>+struct mapi_table *
>+u_current_get_internal(void)
>+{
>+#if defined(GLX_USE_TLS)
>+   return u_current_table;
>+#elif defined(THREADS)
>+   return (struct mapi_table *) ((ThreadSafe) ?
>+         u_tsd_get(&u_current_table_tsd) : (void *) u_current_table);
>+#else
>+   return u_current_table;
>+#endif
>+}
>diff --git a/src/mapi/u_current.h b/src/mapi/u_current.h
>new file mode 100644
>index 0000000..f9cffd8
>--- /dev/null
>+++ b/src/mapi/u_current.h
>@@ -0,0 +1,87 @@
>+#ifndef _U_CURRENT_H_
>+#define _U_CURRENT_H_
>+
>+#if defined(MAPI_MODE_UTIL) || defined(MAPI_MODE_GLAPI) || \
>+    defined(MAPI_MODE_BRIDGE)
>+
>+#include "glapi/glapi.h"
>+
>+/* ugly renames to match glapi.h */
>+#define mapi_table _glapi_table
>+
>+#ifdef GLX_USE_TLS
>+#define u_current_table _glapi_tls_Dispatch
>+#define u_current_user _glapi_tls_Context
>+#else
>+#define u_current_table _glapi_Dispatch
>+#define u_current_user _glapi_Context
>+#endif
>+
>+#define u_current_get_internal _glapi_get_dispatch
>+#define u_current_get_user_internal _glapi_get_context
>+
>+#define u_current_table_tsd _gl_DispatchTSD
>+
>+#else /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
>+
>+#include "u_compiler.h"
>+
>+struct mapi_table;
>+
>+#ifdef GLX_USE_TLS
>+
>+extern __thread struct mapi_table *u_current_table
>+    __attribute__((tls_model("initial-exec")));
>+
>+extern __thread void *u_current_user
>+    __attribute__((tls_model("initial-exec")));
>+
>+#else /* GLX_USE_TLS */
>+
>+extern struct mapi_table *u_current_table;
>+extern void *u_current_user;
>+
>+#endif /* GLX_USE_TLS */
>+
>+#endif /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
>+
>+void
>+u_current_init(void);
>+
>+void
>+u_current_destroy(void);
>+
>+void
>+u_current_set(const struct mapi_table *tbl);
>+
>+struct mapi_table *
>+u_current_get_internal(void);
>+
>+void
>+u_current_set_user(const void *ptr);
>+
>+void *
>+u_current_get_user_internal(void);
>+
>+static INLINE const struct mapi_table *
>+u_current_get(void)
>+{
>+#ifdef GLX_USE_TLS
>+   return u_current_table;
>+#else
>+   return (likely(u_current_table) ?
>+         u_current_table : u_current_get_internal());
>+#endif
>+}
>+
>+static INLINE const void *
>+u_current_get_user(void)
>+{
>+#ifdef GLX_USE_TLS
>+   return u_current_user;
>+#else
>+   return likely(u_current_user) ? u_current_user : u_current_get_user_internal();
>+#endif
>+}
>+
>+#endif /* _U_CURRENT_H_ */
>diff --git a/src/mapi/u_execmem.c b/src/mapi/u_execmem.c
>new file mode 100644
>index 0000000..e5072e0
>--- /dev/null
>+++ b/src/mapi/u_execmem.c
>@@ -0,0 +1,145 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  6.5
>+ *
>+ * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
>+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>+ */
>+
>+
>+/**
>+ * \file glapi_execmem.c
>+ *
>+ * Function for allocating executable memory for dispatch stubs.
>+ *
>+ * Copied from main/execmem.c and simplified for dispatch stubs.
>+ */
>+
>+
>+#include "u_compiler.h"
>+#include "u_thread.h"
>+#include "u_execmem.h"
>+
>+
>+#define EXEC_MAP_SIZE (4*1024)
>+
>+u_mutex_declare_static(exec_mutex);
>+
>+static unsigned int head = 0;
>+
>+static unsigned char *exec_mem = (unsigned char *)0;
>+
>+
>+#if defined(__linux__) || defined(__OpenBSD__) || defined(_NetBSD__) || defined(__sun)
>+
>+#include <unistd.h>
>+#include <sys/mman.h>
>+
>+#ifdef MESA_SELINUX
>+#include <selinux/selinux.h>
>+#endif
>+
>+
>+#ifndef MAP_ANONYMOUS
>+#define MAP_ANONYMOUS MAP_ANON
>+#endif
>+
>+
>+/*
>+ * Dispatch stubs are of fixed size and never freed. Thus, we do not need to
>+ * overlay a heap, we just mmap a page and manage through an index.
>+ */
>+
>+static int
>+init_map(void)
>+{
>+#ifdef MESA_SELINUX
>+   if (is_selinux_enabled()) {
>+      if (!security_get_boolean_active("allow_execmem") ||
>+	  !security_get_boolean_pending("allow_execmem"))
>+         return 0;
>+   }
>+#endif
>+
>+   if (!exec_mem)
>+      exec_mem = mmap(NULL, EXEC_MAP_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE,
>+		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
>+
>+   return (exec_mem != MAP_FAILED);
>+}
>+
>+
>+#elif defined(_WIN32)
>+
>+#include <windows.h>
>+
>+
>+/*
>+ * Avoid Data Execution Prevention.
>+ */
>+
>+static int
>+init_map(void)
>+{
>+   exec_mem = VirtualAlloc(NULL, EXEC_MAP_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
>+
>+   return (exec_mem != NULL);
>+}
>+
>+
>+#else
>+
>+#include <stdlib.h>
>+
>+static int
>+init_map(void)
>+{
>+   exec_mem = malloc(EXEC_MAP_SIZE);
>+
>+   return (exec_mem != NULL);
>+}
>+
>+
>+#endif
>+
>+void *
>+u_execmem_alloc(unsigned int size)
>+{
>+   void *addr = NULL;
>+
>+   u_mutex_lock(exec_mutex);
>+
>+   if (!init_map())
>+      goto bail;
>+
>+   /* free space check, assumes no integer overflow */
>+   if (head + size > EXEC_MAP_SIZE)
>+      goto bail;
>+
>+   /* allocation, assumes proper addr and size alignement */
>+   addr = exec_mem + head;
>+   head += size;
>+
>+bail:
>+   u_mutex_unlock(exec_mutex);
>+
>+   return addr;
>+}
>+
>+
>diff --git a/src/mapi/u_execmem.h b/src/mapi/u_execmem.h
>new file mode 100644
>index 0000000..13fff8d
>--- /dev/null
>+++ b/src/mapi/u_execmem.h
>@@ -0,0 +1,7 @@
>+#ifndef _U_EXECMEM_H_
>+#define _U_EXECMEM_H_
>+
>+void *
>+u_execmem_alloc(unsigned int size);
>+
>+#endif /* _U_EXECMEM_H_ */
>diff --git a/src/mapi/u_macros.h b/src/mapi/u_macros.h
>new file mode 100644
>index 0000000..72345b5
>--- /dev/null
>+++ b/src/mapi/u_macros.h
>@@ -0,0 +1,12 @@
>+#ifndef _U_MACROS_
>+#define _U_MACROS_
>+
>+#define _U_STRINGIFY(x) #x
>+#define _U_CONCAT(x, y) x ## y
>+#define _U_CONCAT_STR(x, y) #x#y
>+
>+#define U_STRINGIFY(x) _U_STRINGIFY(x)
>+#define U_CONCAT(x, y) _U_CONCAT(x, y)
>+#define U_CONCAT_STR(x, y) _U_CONCAT_STR(x, y)
>+
>+#endif /* _U_MACROS_ */
>diff --git a/src/mapi/u_thread.h b/src/mapi/u_thread.h
>new file mode 100644
>index 0000000..a5e5043
>--- /dev/null
>+++ b/src/mapi/u_thread.h
>@@ -0,0 +1,287 @@
>+/*
>+ * Mesa 3-D graphics library
>+ * Version:  6.5.2
>+ *
>+ * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
>+ *
>+ * Permission is hereby granted, free of charge, to any person obtaining a
>+ * copy of this software and associated documentation files (the "Software"),
>+ * to deal in the Software without restriction, including without limitation
>+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice shall be included
>+ * in all copies or substantial portions of the Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
>+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>+ */
>+
>+
>+/*
>+ * Thread support for gl dispatch.
>+ *
>+ * Initial version by John Stone (j.stone at acm.org) (johns at cs.umr.edu)
>+ *                and Christoph Poliwoda (poliwoda at volumegraphics.com)
>+ * Revised by Keith Whitwell
>+ * Adapted for new gl dispatcher by Brian Paul
>+ * Modified for use in mapi by Chia-I Wu
>+ */
>+
>+/*
>+ * If this file is accidentally included by a non-threaded build,
>+ * it should not cause the build to fail, or otherwise cause problems.
>+ * In general, it should only be included when needed however.
>+ */
>+
>+#ifndef _U_THREAD_H_
>+#define _U_THREAD_H_
>+
>+#include <stdio.h>
>+#include <stdlib.h>
>+#include "u_compiler.h"
>+
>+#if defined(HAVE_PTHREAD)
>+#include <pthread.h> /* POSIX threads headers */
>+#endif
>+#ifdef _WIN32
>+#include <windows.h>
>+#endif
>+
>+#if defined(HAVE_PTHREAD) || defined(_WIN32)
>+#ifndef THREADS
>+#define THREADS
>+#endif
>+#endif
>+
>+/*
>+ * Error messages
>+ */
>+#define INIT_TSD_ERROR "_glthread_: failed to allocate key for thread specific data"
>+#define GET_TSD_ERROR "_glthread_: failed to get thread specific data"
>+#define SET_TSD_ERROR "_glthread_: thread failed to set thread specific data"
>+
>+
>+/*
>+ * Magic number to determine if a TSD object has been initialized.
>+ * Kind of a hack but there doesn't appear to be a better cross-platform
>+ * solution.
>+ */
>+#define INIT_MAGIC 0xff8adc98
>+
>+#ifdef __cplusplus
>+extern "C" {
>+#endif
>+
>+
>+/*
>+ * POSIX threads. This should be your choice in the Unix world
>+ * whenever possible.  When building with POSIX threads, be sure
>+ * to enable any compiler flags which will cause the MT-safe
>+ * libc (if one exists) to be used when linking, as well as any
>+ * header macros for MT-safe errno, etc.  For Solaris, this is the -mt
>+ * compiler flag.  On Solaris with gcc, use -D_REENTRANT to enable
>+ * proper compiling for MT-safe libc etc.
>+ */
>+#if defined(HAVE_PTHREAD)
>+
>+struct u_tsd {
>+   pthread_key_t key;
>+   unsigned initMagic;
>+};
>+
>+typedef pthread_mutex_t u_mutex;
>+
>+#define u_mutex_declare_static(name) \
>+   static u_mutex name = PTHREAD_MUTEX_INITIALIZER
>+
>+#define u_mutex_init(name)    pthread_mutex_init(&(name), NULL)
>+#define u_mutex_destroy(name) pthread_mutex_destroy(&(name))
>+#define u_mutex_lock(name)    (void) pthread_mutex_lock(&(name))
>+#define u_mutex_unlock(name)  (void) pthread_mutex_unlock(&(name))
>+
>+static INLINE unsigned long
>+u_thread_self(void)
>+{
>+   return (unsigned long) pthread_self();
>+}
>+
>+
>+static INLINE void
>+u_tsd_init(struct u_tsd *tsd)
>+{
>+   if (pthread_key_create(&tsd->key, NULL/*free*/) != 0) {
>+      perror(INIT_TSD_ERROR);
>+      exit(-1);
>+   }
>+   tsd->initMagic = INIT_MAGIC;
>+}
>+
>+
>+static INLINE void *
>+u_tsd_get(struct u_tsd *tsd)
>+{
>+   if (tsd->initMagic != INIT_MAGIC) {
>+      u_tsd_init(tsd);
>+   }
>+   return pthread_getspecific(tsd->key);
>+}
>+
>+
>+static INLINE void
>+u_tsd_set(struct u_tsd *tsd, void *ptr)
>+{
>+   if (tsd->initMagic != INIT_MAGIC) {
>+      u_tsd_init(tsd);
>+   }
>+   if (pthread_setspecific(tsd->key, ptr) != 0) {
>+      perror(SET_TSD_ERROR);
>+      exit(-1);
>+   }
>+}
>+
>+#endif /* HAVE_PTHREAD */
>+
>+
>+/*
>+ * Windows threads. Should work with Windows NT and 95.
>+ * IMPORTANT: Link with multithreaded runtime library when THREADS are
>+ * used!
>+ */
>+#ifdef _WIN32
>+
>+struct u_tsd {
>+   DWORD key;
>+   unsigned initMagic;
>+};
>+
>+typedef CRITICAL_SECTION u_mutex;
>+
>+/* http://locklessinc.com/articles/pthreads_on_windows/ */
>+#define u_mutex_declare_static(name) \
>+   static u_mutex name = {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0}
>+
>+#define u_mutex_init(name)    InitializeCriticalSection(&name)
>+#define u_mutex_destroy(name) DeleteCriticalSection(&name)
>+#define u_mutex_lock(name)    EnterCriticalSection(&name)
>+#define u_mutex_unlock(name)  LeaveCriticalSection(&name)
>+
>+static INLINE unsigned long
>+u_thread_self(void)
>+{
>+   return GetCurrentThreadId();
>+}
>+
>+
>+static INLINE void
>+u_tsd_init(struct u_tsd *tsd)
>+{
>+   tsd->key = TlsAlloc();
>+   if (tsd->key == TLS_OUT_OF_INDEXES) {
>+      perror(INIT_TSD_ERROR);
>+      exit(-1);
>+   }
>+   tsd->initMagic = INIT_MAGIC;
>+}
>+
>+
>+static INLINE void
>+u_tsd_destroy(struct u_tsd *tsd)
>+{
>+   if (tsd->initMagic != INIT_MAGIC) {
>+      return;
>+   }
>+   TlsFree(tsd->key);
>+   tsd->initMagic = 0x0;
>+}
>+
>+
>+static INLINE void *
>+u_tsd_get(struct u_tsd *tsd)
>+{
>+   if (tsd->initMagic != INIT_MAGIC) {
>+      u_tsd_init(tsd);
>+   }
>+   return TlsGetValue(tsd->key);
>+}
>+
>+
>+static INLINE void
>+u_tsd_set(struct u_tsd *tsd, void *ptr)
>+{
>+   /* the following code assumes that the struct u_tsd has been initialized
>+      to zero at creation */
>+   if (tsd->initMagic != INIT_MAGIC) {
>+      u_tsd_init(tsd);
>+   }
>+   if (TlsSetValue(tsd->key, ptr) == 0) {
>+      perror(SET_TSD_ERROR);
>+      exit(-1);
>+   }
>+}
>+
>+#endif /* _WIN32 */
>+
>+
>+/*
>+ * THREADS not defined
>+ */
>+#ifndef THREADS
>+
>+struct u_tsd {
>+   unsigned initMagic;
>+};
>+
>+typedef unsigned u_mutex;
>+
>+#define u_mutex_declare_static(name)   static u_mutex name = 0
>+#define u_mutex_init(name)             (void) name
>+#define u_mutex_destroy(name)          (void) name
>+#define u_mutex_lock(name)             (void) name
>+#define u_mutex_unlock(name)           (void) name
>+
>+/*
>+ * no-op functions
>+ */
>+
>+static INLINE unsigned long
>+u_thread_self(void)
>+{
>+   return 0;
>+}
>+
>+
>+static INLINE void
>+u_tsd_init(struct u_tsd *tsd)
>+{
>+   (void) tsd;
>+}
>+
>+
>+static INLINE void *
>+u_tsd_get(struct u_tsd *tsd)
>+{
>+   (void) tsd;
>+   return NULL;
>+}
>+
>+
>+static INLINE void
>+u_tsd_set(struct u_tsd *tsd, void *ptr)
>+{
>+   (void) tsd;
>+   (void) ptr;
>+}
>+#endif /* THREADS */
>+
>+
>+#ifdef __cplusplus
>+}
>+#endif
>+
>+#endif /* _U_THREAD_H_ */
>diff --git a/src/mapi/vgapi/Makefile.am b/src/mapi/vgapi/Makefile.am
>index 7d7c581..0af7115 100644
>--- a/src/mapi/vgapi/Makefile.am
>+++ b/src/mapi/vgapi/Makefile.am
>@@ -40,13 +40,13 @@ VG_include_HEADERS = \
> lib_LTLIBRARIES = libOpenVG.la
> 
> TOP=$(top_srcdir)
>-include ../mapi/Makefile.sources
>+include ../Makefile.sources
> libOpenVG_la_SOURCES = $(MAPI_FILES) vgapi_tmp.h
> libOpenVG_la_LIBADD = $(VG_LIB_DEPS)
> libOpenVG_la_LDFLAGS = -version-number 1 -no-undefined
> 
>-vgapi_tmp.h: $(srcdir)/vgapi.csv $(top_srcdir)/src/mapi/mapi/mapi_abi.py
>-	$(AM_V_GEN) $(PYTHON2) $(PYTHON_FLAGS) $(top_srcdir)/src/mapi/mapi/mapi_abi.py \
>+vgapi_tmp.h: $(srcdir)/vgapi.csv $(top_srcdir)/src/mapi/mapi_abi.py
>+	$(AM_V_GEN) $(PYTHON2) $(PYTHON_FLAGS) $(top_srcdir)/src/mapi/mapi_abi.py \
> 		--printer vgapi --mode lib $< > $@
> 
> BUILT_SOURCES = vgapi_tmp.h
>diff --git a/src/mapi/vgapi/SConscript b/src/mapi/vgapi/SConscript
>index fd4467b..63102c1 100644
>--- a/src/mapi/vgapi/SConscript
>+++ b/src/mapi/vgapi/SConscript
>@@ -9,7 +9,7 @@ env = env.Clone()
> 
> vgapi_header, = env.CodeGenerate(
>     target = 'vgapi_tmp.h',
>-    script = '../mapi/mapi_abi.py',
>+    script = '../mapi_abi.py',
>     source = 'vgapi.csv',
>     command = python_cmd + ' $SCRIPT --printer vgapi --mode lib $SOURCE > $TARGET'
> )
>@@ -37,7 +37,7 @@ mapi_sources = [
> 
> vgapi_objects = []
> for s in mapi_sources:
>-    o = env.SharedObject(s[:-2], '../mapi/' + s)
>+    o = env.SharedObject(s[:-2], '../' + s)
>     vgapi_objects.append(o)
> 
> env.Depends(vgapi_objects, vgapi_header)
>-- 
>1.7.8.6
>
>_______________________________________________
>mesa-dev mailing list
>mesa-dev at lists.freedesktop.org
>http://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list