1 /* 2 * Copyright © 2013 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24 #include "config.h" 25 26 #ifdef _WIN32 27 #define PLATFORM_HAS_EGL ENABLE_EGL 28 #define PLATFORM_HAS_GLX ENABLE_GLX 29 #define PLATFORM_HAS_WGL 1 30 #elif defined(__APPLE__) 31 #define PLATFORM_HAS_EGL 0 32 #define PLATFORM_HAS_GLX ENABLE_GLX 33 #define PLATFORM_HAS_WGL 0 34 #elif defined(ANDROID) 35 #define PLATFORM_HAS_EGL ENABLE_EGL 36 #define PLATFORM_HAS_GLX 0 37 #define PLATFORM_HAS_WGL 0 38 #else 39 #define PLATFORM_HAS_EGL ENABLE_EGL 40 #define PLATFORM_HAS_GLX ENABLE_GLX 41 #define PLATFORM_HAS_WGL 0 42 #endif 43 44 #include "epoxy/gl.h" 45 #if PLATFORM_HAS_GLX 46 #include "epoxy/glx.h" 47 #endif 48 #if PLATFORM_HAS_EGL 49 # if !ENABLE_X11 50 /* Mesa uses this symbol to avoid including X11 headers when including 51 * EGL.h; since X11 was explicitly disabled at configuration time, we 52 * should do the same 53 */ 54 # define MESA_EGL_NO_X11_HEADERS 1 55 # endif 56 #include "epoxy/egl.h" 57 #endif 58 #if PLATFORM_HAS_WGL 59 #include "epoxy/wgl.h" 60 #endif 61 62 #if defined(__GNUC__) 63 #define PACKED __attribute__((__packed__)) 64 #define ENDPACKED 65 #elif defined (_MSC_VER) 66 #define PACKED __pragma(pack(push,1)) 67 #define ENDPACKED __pragma(pack(pop)) 68 #else 69 #define PACKED 70 #define ENDPACKED 71 #endif 72 73 /* On win32, we're going to need to keep a per-thread dispatch table, 74 * since the function pointers depend on the device and pixel format 75 * of the current context. 76 */ 77 #if defined(_WIN32) 78 #define USING_DISPATCH_TABLE 1 79 #else 80 #define USING_DISPATCH_TABLE 0 81 #endif 82 83 #define UNWRAPPED_PROTO(x) (GLAPIENTRY *x) 84 #define WRAPPER_VISIBILITY(type) static type GLAPIENTRY 85 #define WRAPPER(x) x ## _wrapped 86 87 #define GEN_GLOBAL_REWRITE_PTR(name, args, passthrough) \ 88 static void EPOXY_CALLSPEC \ 89 name##_global_rewrite_ptr args \ 90 { \ 91 if (name == (void *)name##_global_rewrite_ptr) \ 92 name = (void *)name##_resolver(); \ 93 name passthrough; \ 94 } 95 96 #define GEN_GLOBAL_REWRITE_PTR_RET(ret, name, args, passthrough) \ 97 static ret EPOXY_CALLSPEC \ 98 name##_global_rewrite_ptr args \ 99 { \ 100 if (name == (void *)name##_global_rewrite_ptr) \ 101 name = (void *)name##_resolver(); \ 102 return name passthrough; \ 103 } 104 105 #if USING_DISPATCH_TABLE 106 #define GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) \ 107 static void EPOXY_CALLSPEC \ 108 name##_dispatch_table_rewrite_ptr args \ 109 { \ 110 struct dispatch_table *dispatch_table = get_dispatch_table(); \ 111 \ 112 dispatch_table->name = (void *)name##_resolver(); \ 113 dispatch_table->name passthrough; \ 114 } 115 116 #define GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) \ 117 static ret EPOXY_CALLSPEC \ 118 name##_dispatch_table_rewrite_ptr args \ 119 { \ 120 struct dispatch_table *dispatch_table = get_dispatch_table(); \ 121 \ 122 dispatch_table->name = (void *)name##_resolver(); \ 123 return dispatch_table->name passthrough; \ 124 } 125 126 #define GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) \ 127 static void EPOXY_CALLSPEC \ 128 name##_dispatch_table_thunk args \ 129 { \ 130 get_dispatch_table()->name passthrough; \ 131 } 132 133 #define GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) \ 134 static ret EPOXY_CALLSPEC \ 135 name##_dispatch_table_thunk args \ 136 { \ 137 return get_dispatch_table()->name passthrough; \ 138 } 139 140 #else 141 #define GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) 142 #define GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) 143 #define GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) 144 #define GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) 145 #endif 146 147 #define GEN_THUNKS(name, args, passthrough) \ 148 GEN_GLOBAL_REWRITE_PTR(name, args, passthrough) \ 149 GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) \ 150 GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) 151 152 #define GEN_THUNKS_RET(ret, name, args, passthrough) \ 153 GEN_GLOBAL_REWRITE_PTR_RET(ret, name, args, passthrough) \ 154 GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) \ 155 GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) 156 157 void *epoxy_egl_dlsym(const char *name); 158 void *epoxy_glx_dlsym(const char *name); 159 void *epoxy_gl_dlsym(const char *name); 160 void *epoxy_gles1_dlsym(const char *name); 161 void *epoxy_gles2_dlsym(const char *name); 162 void *epoxy_gles3_dlsym(const char *name); 163 void *epoxy_get_proc_address(const char *name); 164 void *epoxy_get_core_proc_address(const char *name, int core_version); 165 void *epoxy_get_bootstrap_proc_address(const char *name); 166 167 int epoxy_conservative_gl_version(void); 168 bool epoxy_conservative_has_gl_extension(const char *name); 169 int epoxy_conservative_glx_version(void); 170 bool epoxy_conservative_has_glx_extension(const char *name); 171 int epoxy_conservative_egl_version(void); 172 bool epoxy_conservative_has_egl_extension(const char *name); 173 bool epoxy_conservative_has_wgl_extension(const char *name); 174 void *epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails); 175 void *epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails); 176 177 bool epoxy_load_glx(bool exit_if_fails, bool load); 178 bool epoxy_load_egl(bool exit_if_fails, bool load); 179 180 #define glBegin_unwrapped epoxy_glBegin_unwrapped 181 #define glEnd_unwrapped epoxy_glEnd_unwrapped 182 extern void UNWRAPPED_PROTO(glBegin_unwrapped)(GLenum primtype); 183 extern void UNWRAPPED_PROTO(glEnd_unwrapped)(void); 184 185 extern epoxy_resolver_failure_handler_t epoxy_resolver_failure_handler; 186 187 #if USING_DISPATCH_TABLE 188 void gl_init_dispatch_table(void); 189 void gl_switch_to_dispatch_table(void); 190 void wgl_init_dispatch_table(void); 191 void wgl_switch_to_dispatch_table(void); 192 extern uint32_t gl_tls_index, gl_tls_size; 193 extern uint32_t wgl_tls_index, wgl_tls_size; 194 195 #define wglMakeCurrent_unwrapped epoxy_wglMakeCurrent_unwrapped 196 #define wglMakeContextCurrentARB_unwrapped epoxy_wglMakeContextCurrentARB_unwrapped 197 #define wglMakeContextCurrentEXT_unwrapped epoxy_wglMakeContextCurrentEXT_unwrapped 198 #define wglMakeAssociatedContextCurrentAMD_unwrapped epoxy_wglMakeAssociatedContextCurrentAMD_unwrapped 199 extern BOOL UNWRAPPED_PROTO(wglMakeCurrent_unwrapped)(HDC hdc, HGLRC hglrc); 200 extern BOOL UNWRAPPED_PROTO(wglMakeContextCurrentARB_unwrapped)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc); 201 extern BOOL UNWRAPPED_PROTO(wglMakeContextCurrentEXT_unwrapped)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc); 202 extern BOOL UNWRAPPED_PROTO(wglMakeAssociatedContextCurrentAMD_unwrapped)(HGLRC hglrc); 203 #endif /* _WIN32_ */ 204