Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  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_ */
  103.