dispatch_common.h revision 8c7a0568
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 ENABLE_EGL 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#elif defined(__NetBSD__) 39# if !defined(PLATFORM_HAS_EGL) 40# if defined(__amd64__) || defined(__i386__) || defined(__aarch64__) // XXX evbarm32 41# define PLATFORM_HAS_EGL 1 42# else 43# define PLATFORM_HAS_EGL ENABLE_EGL 44# endif 45# endif 46# define PLATFORM_HAS_GLX 1 47# define PLATFORM_HAS_WGL 0 48#else 49#define PLATFORM_HAS_EGL ENABLE_EGL 50#define PLATFORM_HAS_GLX ENABLE_GLX 51#define PLATFORM_HAS_WGL 0 52#endif 53 54#include "epoxy/gl.h" 55#if PLATFORM_HAS_GLX 56#include "epoxy/glx.h" 57#endif 58#if PLATFORM_HAS_EGL 59#include "epoxy/egl.h" 60#endif 61#if PLATFORM_HAS_WGL 62#include "epoxy/wgl.h" 63#endif 64 65#if defined(__GNUC__) 66#define PACKED __attribute__((__packed__)) 67#define ENDPACKED 68#elif defined (_MSC_VER) 69#define PACKED __pragma(pack(push,1)) 70#define ENDPACKED __pragma(pack(pop)) 71#else 72#define PACKED 73#define ENDPACKED 74#endif 75 76/* On win32, we're going to need to keep a per-thread dispatch table, 77 * since the function pointers depend on the device and pixel format 78 * of the current context. 79 */ 80#if defined(_WIN32) 81#define USING_DISPATCH_TABLE 1 82#else 83#define USING_DISPATCH_TABLE 0 84#endif 85 86#define UNWRAPPED_PROTO(x) (GLAPIENTRY *x) 87#define WRAPPER_VISIBILITY(type) static type GLAPIENTRY 88#define WRAPPER(x) x ## _wrapped 89 90#define GEN_GLOBAL_REWRITE_PTR(name, args, passthrough) \ 91 static void EPOXY_CALLSPEC \ 92 name##_global_rewrite_ptr args \ 93 { \ 94 name = (void *)name##_resolver(); \ 95 name passthrough; \ 96 } 97 98#define GEN_GLOBAL_REWRITE_PTR_RET(ret, name, args, passthrough) \ 99 static ret EPOXY_CALLSPEC \ 100 name##_global_rewrite_ptr args \ 101 { \ 102 name = (void *)name##_resolver(); \ 103 return name passthrough; \ 104 } 105 106#if USING_DISPATCH_TABLE 107#define GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) \ 108 static void EPOXY_CALLSPEC \ 109 name##_dispatch_table_rewrite_ptr args \ 110 { \ 111 struct dispatch_table *dispatch_table = get_dispatch_table(); \ 112 \ 113 dispatch_table->name = (void *)name##_resolver(); \ 114 dispatch_table->name passthrough; \ 115 } 116 117#define GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) \ 118 static ret EPOXY_CALLSPEC \ 119 name##_dispatch_table_rewrite_ptr args \ 120 { \ 121 struct dispatch_table *dispatch_table = get_dispatch_table(); \ 122 \ 123 dispatch_table->name = (void *)name##_resolver(); \ 124 return dispatch_table->name passthrough; \ 125 } 126 127#define GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) \ 128 static void EPOXY_CALLSPEC \ 129 name##_dispatch_table_thunk args \ 130 { \ 131 get_dispatch_table()->name passthrough; \ 132 } 133 134#define GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) \ 135 static ret EPOXY_CALLSPEC \ 136 name##_dispatch_table_thunk args \ 137 { \ 138 return get_dispatch_table()->name passthrough; \ 139 } 140 141#else 142#define GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) 143#define GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) 144#define GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) 145#define GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) 146#endif 147 148#define GEN_THUNKS(name, args, passthrough) \ 149 GEN_GLOBAL_REWRITE_PTR(name, args, passthrough) \ 150 GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) \ 151 GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) 152 153#define GEN_THUNKS_RET(ret, name, args, passthrough) \ 154 GEN_GLOBAL_REWRITE_PTR_RET(ret, name, args, passthrough) \ 155 GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) \ 156 GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) 157 158void *epoxy_egl_dlsym(const char *name); 159void *epoxy_glx_dlsym(const char *name); 160void *epoxy_gl_dlsym(const char *name); 161void *epoxy_gles1_dlsym(const char *name); 162void *epoxy_gles2_dlsym(const char *name); 163void *epoxy_gles3_dlsym(const char *name); 164void *epoxy_get_proc_address(const char *name); 165void *epoxy_get_core_proc_address(const char *name, int core_version); 166void *epoxy_get_bootstrap_proc_address(const char *name); 167 168int epoxy_conservative_gl_version(void); 169bool epoxy_conservative_has_gl_extension(const char *name); 170int epoxy_conservative_glx_version(void); 171bool epoxy_conservative_has_glx_extension(const char *name); 172int epoxy_conservative_egl_version(void); 173bool epoxy_conservative_has_egl_extension(const char *name); 174bool epoxy_conservative_has_wgl_extension(const char *name); 175void *epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails); 176void *epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails); 177 178bool epoxy_extension_in_string(const char *extension_list, const char *ext); 179 180#define glBegin_unwrapped epoxy_glBegin_unwrapped 181#define glEnd_unwrapped epoxy_glEnd_unwrapped 182extern void UNWRAPPED_PROTO(glBegin_unwrapped)(GLenum primtype); 183extern void UNWRAPPED_PROTO(glEnd_unwrapped)(void); 184 185#if USING_DISPATCH_TABLE 186void gl_init_dispatch_table(void); 187void gl_switch_to_dispatch_table(void); 188void wgl_init_dispatch_table(void); 189void wgl_switch_to_dispatch_table(void); 190extern uint32_t gl_tls_index, gl_tls_size; 191extern uint32_t wgl_tls_index, wgl_tls_size; 192 193#define wglMakeCurrent_unwrapped epoxy_wglMakeCurrent_unwrapped 194#define wglMakeContextCurrentARB_unwrapped epoxy_wglMakeContextCurrentARB_unwrapped 195#define wglMakeContextCurrentEXT_unwrapped epoxy_wglMakeContextCurrentEXT_unwrapped 196#define wglMakeAssociatedContextCurrentAMD_unwrapped epoxy_wglMakeAssociatedContextCurrentAMD_unwrapped 197extern BOOL UNWRAPPED_PROTO(wglMakeCurrent_unwrapped)(HDC hdc, HGLRC hglrc); 198extern BOOL UNWRAPPED_PROTO(wglMakeContextCurrentARB_unwrapped)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc); 199extern BOOL UNWRAPPED_PROTO(wglMakeContextCurrentEXT_unwrapped)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc); 200extern BOOL UNWRAPPED_PROTO(wglMakeAssociatedContextCurrentAMD_unwrapped)(HGLRC hglrc); 201#endif /* _WIN32_ */ 202