aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/mapi/u_current.h
diff options
context:
space:
mode:
Diffstat (limited to 'mesalib/src/mapi/u_current.h')
-rw-r--r--mesalib/src/mapi/u_current.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/mesalib/src/mapi/u_current.h b/mesalib/src/mapi/u_current.h
new file mode 100644
index 000000000..f9cffd8c3
--- /dev/null
+++ b/mesalib/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_ */