Merge remote branch 'origin/master' into nv50-compiler
[mesa.git] / src / mapi / mapi / u_current.h
1 #ifndef _U_CURRENT_H_
2 #define _U_CURRENT_H_
3
4 #ifdef MAPI_GLAPI_CURRENT
5
6 #include "glapi/glapi.h"
7
8 /* ugly renames to match glapi.h */
9 #define mapi_table _glapi_table
10
11 #define u_current_table_tls _glapi_tls_Dispatch
12 #define u_current_user_tls _glapi_tls_Context
13 #define u_current_table _glapi_Dispatch
14 #define u_current_user _glapi_Context
15
16 #define u_current_destroy _glapi_destroy_multithread
17 #define u_current_init _glapi_check_multithread
18 #define u_current_set_internal _glapi_set_dispatch
19 #define u_current_get_internal _glapi_get_dispatch
20 #define u_current_set_user_internal _glapi_set_context
21 #define u_current_get_user_internal _glapi_get_context
22
23 #define u_current_table_tsd _gl_DispatchTSD
24
25 #else /* MAPI_GLAPI_CURRENT */
26
27 #include "u_compiler.h"
28
29 struct mapi_table;
30
31 #ifdef GLX_USE_TLS
32
33 extern __thread struct mapi_table *u_current_table_tls
34 __attribute__((tls_model("initial-exec")));
35
36 extern __thread void *u_current_user_tls
37 __attribute__((tls_model("initial-exec")));
38
39 extern const struct mapi_table *u_current_table;
40 extern const void *u_current_user;
41
42 #else /* GLX_USE_TLS */
43
44 extern struct mapi_table *u_current_table;
45 extern void *u_current_user;
46
47 #endif /* GLX_USE_TLS */
48
49 void
50 u_current_init(void);
51
52 void
53 u_current_destroy(void);
54
55 void
56 u_current_set_internal(struct mapi_table *tbl);
57
58 struct mapi_table *
59 u_current_get_internal(void);
60
61 void
62 u_current_set_user_internal(void *ptr);
63
64 void *
65 u_current_get_user_internal(void);
66
67 static INLINE void
68 u_current_set(const struct mapi_table *tbl)
69 {
70 u_current_set_internal((struct mapi_table *) tbl);
71 }
72
73 static INLINE const struct mapi_table *
74 u_current_get(void)
75 {
76 #ifdef GLX_USE_TLS
77 return (const struct mapi_table *) u_current_table_tls;
78 #else
79 return (likely(u_current_table) ?
80 (const struct mapi_table *) u_current_table : u_current_get_internal());
81 #endif
82 }
83
84 static INLINE void
85 u_current_set_user(void *ptr)
86 {
87 u_current_set_internal(ptr);
88 }
89
90 static INLINE void *
91 u_current_get_user(void)
92 {
93 #ifdef GLX_USE_TLS
94 return u_current_user_tls;
95 #else
96 return likely(u_current_user) ? u_current_user : u_current_get_user_internal();
97 #endif
98 }
99
100 #endif /* MAPI_GLAPI_CURRENT */
101
102 #endif /* _U_CURRENT_H_ */