1848b8605Smrg#ifndef _U_CURRENT_H_ 2848b8605Smrg#define _U_CURRENT_H_ 3848b8605Smrg 4b8e80941Smrg#include "c99_compat.h" 5b8e80941Smrg#include "util/macros.h" 6b8e80941Smrg 7b8e80941Smrg 8848b8605Smrg#if defined(MAPI_MODE_UTIL) || defined(MAPI_MODE_GLAPI) || \ 9848b8605Smrg defined(MAPI_MODE_BRIDGE) 10848b8605Smrg 11848b8605Smrg#include "glapi/glapi.h" 12848b8605Smrg 13848b8605Smrg#ifdef GLX_USE_TLS 14848b8605Smrg#define u_current_table _glapi_tls_Dispatch 15848b8605Smrg#define u_current_context _glapi_tls_Context 16848b8605Smrg#else 17848b8605Smrg#define u_current_table _glapi_Dispatch 18848b8605Smrg#define u_current_context _glapi_Context 19848b8605Smrg#endif 20848b8605Smrg 21848b8605Smrg#define u_current_get_table_internal _glapi_get_dispatch 22848b8605Smrg#define u_current_get_context_internal _glapi_get_context 23848b8605Smrg 24848b8605Smrg#define u_current_table_tsd _gl_DispatchTSD 25848b8605Smrg 26848b8605Smrg#else /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */ 27848b8605Smrg 28b8e80941Smrgstruct _glapi_table; 29848b8605Smrg 30848b8605Smrg#ifdef GLX_USE_TLS 31848b8605Smrg 32b8e80941Smrgextern __thread struct _glapi_table *u_current_table 33848b8605Smrg __attribute__((tls_model("initial-exec"))); 34848b8605Smrg 35848b8605Smrgextern __thread void *u_current_context 36848b8605Smrg __attribute__((tls_model("initial-exec"))); 37848b8605Smrg 38848b8605Smrg#else /* GLX_USE_TLS */ 39848b8605Smrg 40b8e80941Smrgextern struct _glapi_table *u_current_table; 41848b8605Smrgextern void *u_current_context; 42848b8605Smrg 43848b8605Smrg#endif /* GLX_USE_TLS */ 44848b8605Smrg 45848b8605Smrg#endif /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */ 46848b8605Smrg 47848b8605Smrgvoid 48848b8605Smrgu_current_init(void); 49848b8605Smrg 50848b8605Smrgvoid 51848b8605Smrgu_current_destroy(void); 52848b8605Smrg 53848b8605Smrgvoid 54b8e80941Smrgu_current_set_table(const struct _glapi_table *tbl); 55848b8605Smrg 56b8e80941Smrgstruct _glapi_table * 57848b8605Smrgu_current_get_table_internal(void); 58848b8605Smrg 59848b8605Smrgvoid 60848b8605Smrgu_current_set_context(const void *ptr); 61848b8605Smrg 62848b8605Smrgvoid * 63848b8605Smrgu_current_get_context_internal(void); 64848b8605Smrg 65b8e80941Smrgstatic inline const struct _glapi_table * 66848b8605Smrgu_current_get_table(void) 67848b8605Smrg{ 68b8e80941Smrg#if defined(GLX_USE_TLS) && !defined(__NetBSD__) 69848b8605Smrg return u_current_table; 70848b8605Smrg#else 71848b8605Smrg return (likely(u_current_table) ? 72848b8605Smrg u_current_table : u_current_get_table_internal()); 73848b8605Smrg#endif 74848b8605Smrg} 75848b8605Smrg 76b8e80941Smrgstatic inline const void * 77848b8605Smrgu_current_get_context(void) 78848b8605Smrg{ 79848b8605Smrg#ifdef GLX_USE_TLS 80848b8605Smrg return u_current_context; 81848b8605Smrg#else 82848b8605Smrg return likely(u_current_context) ? u_current_context : u_current_get_context_internal(); 83848b8605Smrg#endif 84848b8605Smrg} 85848b8605Smrg 86848b8605Smrg#endif /* _U_CURRENT_H_ */ 87