diff options
Diffstat (limited to 'mesalib/src/mapi/mapi/u_current.h')
-rw-r--r-- | mesalib/src/mapi/mapi/u_current.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/mesalib/src/mapi/mapi/u_current.h b/mesalib/src/mapi/mapi/u_current.h new file mode 100644 index 000000000..62e54c6c9 --- /dev/null +++ b/mesalib/src/mapi/mapi/u_current.h @@ -0,0 +1,102 @@ +#ifndef _U_CURRENT_H_ +#define _U_CURRENT_H_ + +#ifdef MAPI_GLAPI_CURRENT + +#include "glapi/glapi.h" + +/* ugly renames to match glapi.h */ +#define mapi_table _glapi_table + +#define u_current_table_tls _glapi_tls_Dispatch +#define u_current_user_tls _glapi_tls_Context +#define u_current_table _glapi_Dispatch +#define u_current_user _glapi_Context + +#define u_current_destroy _glapi_destroy_multithread +#define u_current_init _glapi_check_multithread +#define u_current_set_internal _glapi_set_dispatch +#define u_current_get_internal _glapi_get_dispatch +#define u_current_set_user_internal _glapi_set_context +#define u_current_get_user_internal _glapi_get_context + +#define u_current_table_tsd _gl_DispatchTSD + +#else /* MAPI_GLAPI_CURRENT */ + +#include "u_compiler.h" + +struct mapi_table; + +#ifdef GLX_USE_TLS + +extern __thread struct mapi_table *u_current_table_tls + __attribute__((tls_model("initial-exec"))); + +extern __thread void *u_current_user_tls + __attribute__((tls_model("initial-exec"))); + +extern const struct mapi_table *u_current_table; +extern const void *u_current_user; + +#else /* GLX_USE_TLS */ + +extern struct mapi_table *u_current_table; +extern void *u_current_user; + +#endif /* GLX_USE_TLS */ + +void +u_current_init(void); + +void +u_current_destroy(void); + +void +u_current_set_internal(struct mapi_table *tbl); + +struct mapi_table * +u_current_get_internal(void); + +void +u_current_set_user_internal(void *ptr); + +void * +u_current_get_user_internal(void); + +static INLINE void +u_current_set(const struct mapi_table *tbl) +{ + u_current_set_internal((struct mapi_table *) tbl); +} + +static INLINE const struct mapi_table * +u_current_get(void) +{ +#ifdef GLX_USE_TLS + return (const struct mapi_table *) u_current_table_tls; +#else + return (likely(u_current_table) ? + (const struct mapi_table *) u_current_table : u_current_get_internal()); +#endif +} + +static INLINE void +u_current_set_user(void *ptr) +{ + u_current_set_internal(ptr); +} + +static INLINE void * +u_current_get_user(void) +{ +#ifdef GLX_USE_TLS + return u_current_user_tls; +#else + return likely(u_current_user) ? u_current_user : u_current_get_user_internal(); +#endif +} + +#endif /* MAPI_GLAPI_CURRENT */ + +#endif /* _U_CURRENT_H_ */ |