u_current.h revision 848b8605
1848b8605Smrg#ifndef _U_CURRENT_H_
2848b8605Smrg#define _U_CURRENT_H_
3848b8605Smrg
4848b8605Smrg#if defined(MAPI_MODE_UTIL) || defined(MAPI_MODE_GLAPI) || \
5848b8605Smrg    defined(MAPI_MODE_BRIDGE)
6848b8605Smrg
7848b8605Smrg#include "glapi/glapi.h"
8848b8605Smrg
9848b8605Smrg/* ugly renames to match glapi.h */
10848b8605Smrg#define mapi_table _glapi_table
11848b8605Smrg
12848b8605Smrg#ifdef GLX_USE_TLS
13848b8605Smrg#define u_current_table _glapi_tls_Dispatch
14848b8605Smrg#define u_current_context _glapi_tls_Context
15848b8605Smrg#else
16848b8605Smrg#define u_current_table _glapi_Dispatch
17848b8605Smrg#define u_current_context _glapi_Context
18848b8605Smrg#endif
19848b8605Smrg
20848b8605Smrg#define u_current_get_table_internal _glapi_get_dispatch
21848b8605Smrg#define u_current_get_context_internal _glapi_get_context
22848b8605Smrg
23848b8605Smrg#define u_current_table_tsd _gl_DispatchTSD
24848b8605Smrg
25848b8605Smrg#else /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
26848b8605Smrg
27848b8605Smrg#include "u_compiler.h"
28848b8605Smrg
29848b8605Smrgstruct mapi_table;
30848b8605Smrg
31848b8605Smrg#ifdef GLX_USE_TLS
32848b8605Smrg
33848b8605Smrgextern __thread struct mapi_table *u_current_table
34848b8605Smrg    __attribute__((tls_model("initial-exec")));
35848b8605Smrg
36848b8605Smrgextern __thread void *u_current_context
37848b8605Smrg    __attribute__((tls_model("initial-exec")));
38848b8605Smrg
39848b8605Smrg#else /* GLX_USE_TLS */
40848b8605Smrg
41848b8605Smrgextern struct mapi_table *u_current_table;
42848b8605Smrgextern void *u_current_context;
43848b8605Smrg
44848b8605Smrg#endif /* GLX_USE_TLS */
45848b8605Smrg
46848b8605Smrg#endif /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
47848b8605Smrg
48848b8605Smrgvoid
49848b8605Smrgu_current_init(void);
50848b8605Smrg
51848b8605Smrgvoid
52848b8605Smrgu_current_destroy(void);
53848b8605Smrg
54848b8605Smrgvoid
55848b8605Smrgu_current_set_table(const struct mapi_table *tbl);
56848b8605Smrg
57848b8605Smrgstruct mapi_table *
58848b8605Smrgu_current_get_table_internal(void);
59848b8605Smrg
60848b8605Smrgvoid
61848b8605Smrgu_current_set_context(const void *ptr);
62848b8605Smrg
63848b8605Smrgvoid *
64848b8605Smrgu_current_get_context_internal(void);
65848b8605Smrg
66848b8605Smrgstatic INLINE const struct mapi_table *
67848b8605Smrgu_current_get_table(void)
68848b8605Smrg{
69848b8605Smrg#ifdef GLX_USE_TLS
70848b8605Smrg   return u_current_table;
71848b8605Smrg#else
72848b8605Smrg   return (likely(u_current_table) ?
73848b8605Smrg         u_current_table : u_current_get_table_internal());
74848b8605Smrg#endif
75848b8605Smrg}
76848b8605Smrg
77848b8605Smrgstatic INLINE const void *
78848b8605Smrgu_current_get_context(void)
79848b8605Smrg{
80848b8605Smrg#ifdef GLX_USE_TLS
81848b8605Smrg   return u_current_context;
82848b8605Smrg#else
83848b8605Smrg   return likely(u_current_context) ? u_current_context : u_current_get_context_internal();
84848b8605Smrg#endif
85848b8605Smrg}
86848b8605Smrg
87848b8605Smrg#endif /* _U_CURRENT_H_ */
88