Chia-I Wu | f2001df | 2011-07-02 17:57:30 +0900 | [diff] [blame] | 1 | /************************************************************************** |
| 2 | * |
José Fonseca | 8771285 | 2014-01-17 16:27:50 +0000 | [diff] [blame] | 3 | * Copyright 2008 VMware, Inc. |
Chia-I Wu | f2001df | 2011-07-02 17:57:30 +0900 | [diff] [blame] | 4 | * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com> |
| 5 | * Copyright 2010-2011 LunarG, Inc. |
| 6 | * All Rights Reserved. |
| 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 9 | * copy of this software and associated documentation files (the |
| 10 | * "Software"), to deal in the Software without restriction, including |
| 11 | * without limitation the rights to use, copy, modify, merge, publish, |
| 12 | * distribute, sub license, and/or sell copies of the Software, and to |
| 13 | * permit persons to whom the Software is furnished to do so, subject to |
| 14 | * the following conditions: |
| 15 | * |
| 16 | * The above copyright notice and this permission notice (including the |
| 17 | * next paragraph) shall be included in all copies or substantial portions |
| 18 | * of the Software. |
| 19 | * |
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 23 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 24 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| 26 | * DEALINGS IN THE SOFTWARE. |
| 27 | * |
| 28 | **************************************************************************/ |
| 29 | |
| 30 | |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 31 | #ifndef EGLDISPLAY_INCLUDED |
| 32 | #define EGLDISPLAY_INCLUDED |
| 33 | |
Emil Velikov | 7bd1693 | 2015-02-28 16:35:22 +0000 | [diff] [blame] | 34 | #include "c99_compat.h" |
Emil Velikov | efe87f1 | 2015-03-06 16:54:55 +0000 | [diff] [blame] | 35 | #include "c11/threads.h" |
Chia-I Wu | 94cb321 | 2010-01-29 09:00:30 +0800 | [diff] [blame] | 36 | |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 37 | #include "egltypedefs.h" |
Chia-I Wu | 5a2c937 | 2009-08-13 13:38:24 +0800 | [diff] [blame] | 38 | #include "egldefines.h" |
Chia-I Wu | 6717a31 | 2010-06-30 17:10:10 +0800 | [diff] [blame] | 39 | #include "eglarray.h" |
Chia-I Wu | 5a2c937 | 2009-08-13 13:38:24 +0800 | [diff] [blame] | 40 | |
| 41 | |
Alexander von Gluck IV | 8362068 | 2015-05-13 17:13:37 -0500 | [diff] [blame] | 42 | #ifdef __cplusplus |
| 43 | extern "C" { |
| 44 | #endif |
| 45 | |
Chia-I Wu | f22665d | 2010-06-17 17:14:03 +0800 | [diff] [blame] | 46 | enum _egl_platform_type { |
Chia-I Wu | f22665d | 2010-06-17 17:14:03 +0800 | [diff] [blame] | 47 | _EGL_PLATFORM_X11, |
Benjamin Franzke | e586c4b | 2011-02-04 12:22:58 +0100 | [diff] [blame] | 48 | _EGL_PLATFORM_WAYLAND, |
Chia-I Wu | f22665d | 2010-06-17 17:14:03 +0800 | [diff] [blame] | 49 | _EGL_PLATFORM_DRM, |
Chia-I Wu | b0945c1 | 2010-10-11 16:09:52 +0800 | [diff] [blame] | 50 | _EGL_PLATFORM_ANDROID, |
Alexander von Gluck IV | 400b833 | 2014-12-22 10:10:13 -0500 | [diff] [blame] | 51 | _EGL_PLATFORM_HAIKU, |
Haixia Shi | 6b8accb | 2015-06-12 10:10:58 -0700 | [diff] [blame] | 52 | _EGL_PLATFORM_SURFACELESS, |
Chia-I Wu | f22665d | 2010-06-17 17:14:03 +0800 | [diff] [blame] | 53 | |
| 54 | _EGL_NUM_PLATFORMS, |
| 55 | _EGL_INVALID_PLATFORM = -1 |
| 56 | }; |
| 57 | typedef enum _egl_platform_type _EGLPlatformType; |
| 58 | |
| 59 | |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 60 | enum _egl_resource_type { |
| 61 | _EGL_RESOURCE_CONTEXT, |
| 62 | _EGL_RESOURCE_SURFACE, |
Chia-I Wu | a1c4a8a | 2009-08-15 22:58:13 +0800 | [diff] [blame] | 63 | _EGL_RESOURCE_IMAGE, |
Chia-I Wu | 4eebea7 | 2010-08-14 23:09:12 +0800 | [diff] [blame] | 64 | _EGL_RESOURCE_SYNC, |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 65 | |
| 66 | _EGL_NUM_RESOURCES |
| 67 | }; |
Chia-I Wu | 496724b | 2010-02-19 11:47:54 +0800 | [diff] [blame] | 68 | /* this cannot and need not go into egltypedefs.h */ |
| 69 | typedef enum _egl_resource_type _EGLResourceType; |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 70 | |
| 71 | |
| 72 | /** |
| 73 | * A resource of a display. |
| 74 | */ |
| 75 | struct _egl_resource |
| 76 | { |
Chia-I Wu | f65ed0a | 2010-01-26 15:16:49 +0800 | [diff] [blame] | 77 | /* which display the resource belongs to */ |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 78 | _EGLDisplay *Display; |
Chia-I Wu | f65ed0a | 2010-01-26 15:16:49 +0800 | [diff] [blame] | 79 | EGLBoolean IsLinked; |
Chia-I Wu | dc4f845 | 2010-10-23 11:59:03 +0800 | [diff] [blame] | 80 | EGLint RefCount; |
Chia-I Wu | f65ed0a | 2010-01-26 15:16:49 +0800 | [diff] [blame] | 81 | |
| 82 | /* used to link resources of the same type */ |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 83 | _EGLResource *Next; |
| 84 | }; |
| 85 | |
| 86 | |
Chia-I Wu | 5a2c937 | 2009-08-13 13:38:24 +0800 | [diff] [blame] | 87 | /** |
| 88 | * Optional EGL extensions info. |
| 89 | */ |
| 90 | struct _egl_extensions |
| 91 | { |
Marek Olšák | 32aa1d7 | 2015-06-09 23:08:57 +0200 | [diff] [blame] | 92 | /* Please keep these sorted alphabetically. */ |
Chia-I Wu | 00b365b | 2010-10-01 15:27:42 -0400 | [diff] [blame] | 93 | EGLBoolean ANDROID_image_native_buffer; |
Fredrik Höglund | 7d46b45 | 2011-12-14 21:24:09 +0100 | [diff] [blame] | 94 | |
Sarah Sharp | c524f3e | 2014-05-06 12:10:57 -0700 | [diff] [blame] | 95 | EGLBoolean CHROMIUM_sync_control; |
| 96 | |
Marek Olšák | 32aa1d7 | 2015-06-09 23:08:57 +0200 | [diff] [blame] | 97 | EGLBoolean EXT_buffer_age; |
| 98 | EGLBoolean EXT_create_context_robustness; |
| 99 | EGLBoolean EXT_image_dma_buf_import; |
| 100 | EGLBoolean EXT_swap_buffers_with_damage; |
| 101 | |
| 102 | EGLBoolean KHR_cl_event2; |
| 103 | EGLBoolean KHR_create_context; |
| 104 | EGLBoolean KHR_fence_sync; |
| 105 | EGLBoolean KHR_get_all_proc_addresses; |
| 106 | EGLBoolean KHR_gl_colorspace; |
| 107 | EGLBoolean KHR_gl_renderbuffer_image; |
| 108 | EGLBoolean KHR_gl_texture_2D_image; |
| 109 | EGLBoolean KHR_gl_texture_3D_image; |
| 110 | EGLBoolean KHR_gl_texture_cubemap_image; |
| 111 | EGLBoolean KHR_image_base; |
| 112 | EGLBoolean KHR_image_pixmap; |
| 113 | EGLBoolean KHR_reusable_sync; |
| 114 | EGLBoolean KHR_surfaceless_context; |
Marek Olšák | 32aa1d7 | 2015-06-09 23:08:57 +0200 | [diff] [blame] | 115 | EGLBoolean KHR_wait_sync; |
| 116 | |
| 117 | EGLBoolean MESA_configless_context; |
Marek Olšák | 32aa1d7 | 2015-06-09 23:08:57 +0200 | [diff] [blame] | 118 | EGLBoolean MESA_drm_image; |
| 119 | EGLBoolean MESA_image_dma_buf_export; |
| 120 | |
| 121 | EGLBoolean NOK_swap_region; |
| 122 | EGLBoolean NOK_texture_from_pixmap; |
| 123 | |
Fredrik Höglund | 7d46b45 | 2011-12-14 21:24:09 +0100 | [diff] [blame] | 124 | EGLBoolean NV_post_sub_buffer; |
Ian Romanick | f171571 | 2012-07-19 15:08:06 -0700 | [diff] [blame] | 125 | |
Marek Olšák | 32aa1d7 | 2015-06-09 23:08:57 +0200 | [diff] [blame] | 126 | EGLBoolean WL_bind_wayland_display; |
| 127 | EGLBoolean WL_create_wayland_buffer_from_image; |
Chia-I Wu | 5a2c937 | 2009-08-13 13:38:24 +0800 | [diff] [blame] | 128 | }; |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 129 | |
| 130 | |
Chia-I Wu | f22665d | 2010-06-17 17:14:03 +0800 | [diff] [blame] | 131 | struct _egl_display |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 132 | { |
Chia-I Wu | 38feefd | 2009-08-14 17:47:00 +0800 | [diff] [blame] | 133 | /* used to link displays */ |
| 134 | _EGLDisplay *Next; |
| 135 | |
Emil Velikov | efe87f1 | 2015-03-06 16:54:55 +0000 | [diff] [blame] | 136 | mtx_t Mutex; |
Chia-I Wu | 99bcb1f | 2010-02-17 17:29:52 +0800 | [diff] [blame] | 137 | |
Chia-I Wu | a4a38dc | 2011-01-13 16:53:13 +0800 | [diff] [blame] | 138 | _EGLPlatformType Platform; /**< The type of the platform display */ |
| 139 | void *PlatformDisplay; /**< A pointer to the platform display */ |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 140 | |
Chia-I Wu | a4a38dc | 2011-01-13 16:53:13 +0800 | [diff] [blame] | 141 | _EGLDriver *Driver; /**< Matched driver of the display */ |
| 142 | EGLBoolean Initialized; /**< True if the display is initialized */ |
Chia-I Wu | 5a2c937 | 2009-08-13 13:38:24 +0800 | [diff] [blame] | 143 | |
Chia-I Wu | 655e459 | 2011-01-13 00:27:45 +0800 | [diff] [blame] | 144 | /* options that affect how the driver initializes the display */ |
| 145 | struct { |
| 146 | EGLBoolean TestOnly; /**< Driver should not set fields when true */ |
Chia-I Wu | a22a332 | 2011-01-13 04:40:38 +0800 | [diff] [blame] | 147 | EGLBoolean UseFallback; /**< Use fallback driver (sw or less features) */ |
Chia-I Wu | 655e459 | 2011-01-13 00:27:45 +0800 | [diff] [blame] | 148 | } Options; |
| 149 | |
Chia-I Wu | a4a38dc | 2011-01-13 16:53:13 +0800 | [diff] [blame] | 150 | /* these fields are set by the driver during init */ |
| 151 | void *DriverData; /**< Driver private data */ |
Marek Olšák | 0e4b564 | 2015-05-12 16:40:29 +0200 | [diff] [blame] | 152 | EGLint Version; /**< EGL version major*10+minor */ |
Chia-I Wu | a4a38dc | 2011-01-13 16:53:13 +0800 | [diff] [blame] | 153 | EGLint ClientAPIs; /**< Bitmask of APIs supported (EGL_xxx_BIT) */ |
| 154 | _EGLExtensions Extensions; /**< Extensions supported */ |
Chia-I Wu | 5a2c937 | 2009-08-13 13:38:24 +0800 | [diff] [blame] | 155 | |
Chia-I Wu | a4a38dc | 2011-01-13 16:53:13 +0800 | [diff] [blame] | 156 | /* these fields are derived from above */ |
Emil Velikov | bbaf22a | 2015-03-19 01:36:08 +0000 | [diff] [blame] | 157 | char VersionString[100]; /**< EGL_VERSION */ |
| 158 | char ClientAPIsString[100]; /**< EGL_CLIENT_APIS */ |
Chia-I Wu | a4a38dc | 2011-01-13 16:53:13 +0800 | [diff] [blame] | 159 | char ExtensionsString[_EGL_MAX_EXTENSIONS_LEN]; /**< EGL_EXTENSIONS */ |
Chia-I Wu | 5a2c937 | 2009-08-13 13:38:24 +0800 | [diff] [blame] | 160 | |
Chia-I Wu | 8b0c6c4 | 2010-06-30 18:02:23 +0800 | [diff] [blame] | 161 | _EGLArray *Screens; |
Chia-I Wu | 6717a31 | 2010-06-30 17:10:10 +0800 | [diff] [blame] | 162 | _EGLArray *Configs; |
Brian Paul | 6052af1 | 2008-05-27 16:48:23 -0600 | [diff] [blame] | 163 | |
Chia-I Wu | ecb3b31 | 2010-01-24 20:32:34 +0800 | [diff] [blame] | 164 | /* lists of resources */ |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 165 | _EGLResource *ResourceLists[_EGL_NUM_RESOURCES]; |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 166 | }; |
| 167 | |
| 168 | |
Chia-I Wu | ea05299 | 2010-06-17 23:45:41 +0800 | [diff] [blame] | 169 | extern _EGLPlatformType |
Chad Versace | 6d1f83e | 2014-01-07 14:54:51 -0800 | [diff] [blame] | 170 | _eglGetNativePlatform(void *nativeDisplay); |
Chia-I Wu | ea05299 | 2010-06-17 23:45:41 +0800 | [diff] [blame] | 171 | |
| 172 | |
Chia-I Wu | 38feefd | 2009-08-14 17:47:00 +0800 | [diff] [blame] | 173 | extern void |
| 174 | _eglFiniDisplay(void); |
| 175 | |
| 176 | |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 177 | extern _EGLDisplay * |
Chia-I Wu | f22665d | 2010-06-17 17:14:03 +0800 | [diff] [blame] | 178 | _eglFindDisplay(_EGLPlatformType plat, void *plat_dpy); |
Chia-I Wu | be9d1ab | 2009-07-16 21:21:56 -0700 | [diff] [blame] | 179 | |
| 180 | |
Emil Velikov | dd438ae | 2015-02-28 17:20:01 +0000 | [diff] [blame] | 181 | extern void |
Chia-I Wu | 2f2cf46 | 2009-08-11 17:09:39 +0800 | [diff] [blame] | 182 | _eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *dpy); |
Chia-I Wu | 3f7e0d5 | 2009-07-16 21:21:57 -0700 | [diff] [blame] | 183 | |
| 184 | |
Emil Velikov | dd438ae | 2015-02-28 17:20:01 +0000 | [diff] [blame] | 185 | extern void |
Jon Smirl | 7012d01 | 2005-05-13 18:31:35 +0000 | [diff] [blame] | 186 | _eglCleanupDisplay(_EGLDisplay *disp); |
| 187 | |
| 188 | |
Chia-I Wu | e484a92 | 2009-08-14 18:02:38 +0800 | [diff] [blame] | 189 | extern EGLBoolean |
| 190 | _eglCheckDisplayHandle(EGLDisplay dpy); |
| 191 | |
| 192 | |
Emil Velikov | dd438ae | 2015-02-28 17:20:01 +0000 | [diff] [blame] | 193 | extern EGLBoolean |
Chia-I Wu | dbb866a | 2010-01-25 11:39:44 +0800 | [diff] [blame] | 194 | _eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy); |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 195 | |
| 196 | |
Chia-I Wu | e3734e4 | 2009-08-14 18:05:19 +0800 | [diff] [blame] | 197 | /** |
| 198 | * Lookup a handle to find the linked display. |
| 199 | * Return NULL if the handle has no corresponding linked display. |
| 200 | */ |
Emil Velikov | 7bd1693 | 2015-02-28 16:35:22 +0000 | [diff] [blame] | 201 | static inline _EGLDisplay * |
Chia-I Wu | e3734e4 | 2009-08-14 18:05:19 +0800 | [diff] [blame] | 202 | _eglLookupDisplay(EGLDisplay display) |
| 203 | { |
| 204 | _EGLDisplay *dpy = (_EGLDisplay *) display; |
Chia-I Wu | e484a92 | 2009-08-14 18:02:38 +0800 | [diff] [blame] | 205 | if (!_eglCheckDisplayHandle(display)) |
| 206 | dpy = NULL; |
Chia-I Wu | e3734e4 | 2009-08-14 18:05:19 +0800 | [diff] [blame] | 207 | return dpy; |
| 208 | } |
| 209 | |
| 210 | |
| 211 | /** |
| 212 | * Return the handle of a linked display, or EGL_NO_DISPLAY. |
| 213 | */ |
Emil Velikov | 7bd1693 | 2015-02-28 16:35:22 +0000 | [diff] [blame] | 214 | static inline EGLDisplay |
Chia-I Wu | e3734e4 | 2009-08-14 18:05:19 +0800 | [diff] [blame] | 215 | _eglGetDisplayHandle(_EGLDisplay *dpy) |
| 216 | { |
| 217 | return (EGLDisplay) ((dpy) ? dpy : EGL_NO_DISPLAY); |
| 218 | } |
| 219 | |
| 220 | |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 221 | extern void |
Chia-I Wu | dc4f845 | 2010-10-23 11:59:03 +0800 | [diff] [blame] | 222 | _eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy); |
| 223 | |
| 224 | |
Emil Velikov | dd438ae | 2015-02-28 17:20:01 +0000 | [diff] [blame] | 225 | extern void |
Chia-I Wu | dc4f845 | 2010-10-23 11:59:03 +0800 | [diff] [blame] | 226 | _eglGetResource(_EGLResource *res); |
| 227 | |
| 228 | |
Emil Velikov | dd438ae | 2015-02-28 17:20:01 +0000 | [diff] [blame] | 229 | extern EGLBoolean |
Chia-I Wu | dc4f845 | 2010-10-23 11:59:03 +0800 | [diff] [blame] | 230 | _eglPutResource(_EGLResource *res); |
| 231 | |
| 232 | |
| 233 | extern void |
Chia-I Wu | 4ce33ec | 2010-10-23 00:37:19 +0800 | [diff] [blame] | 234 | _eglLinkResource(_EGLResource *res, _EGLResourceType type); |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 235 | |
| 236 | |
| 237 | extern void |
| 238 | _eglUnlinkResource(_EGLResource *res, _EGLResourceType type); |
| 239 | |
| 240 | |
| 241 | /** |
| 242 | * Return true if the resource is linked. |
| 243 | */ |
Emil Velikov | 7bd1693 | 2015-02-28 16:35:22 +0000 | [diff] [blame] | 244 | static inline EGLBoolean |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 245 | _eglIsResourceLinked(_EGLResource *res) |
| 246 | { |
Chia-I Wu | f65ed0a | 2010-01-26 15:16:49 +0800 | [diff] [blame] | 247 | return res->IsLinked; |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 248 | } |
| 249 | |
Chad Versace | 468cc86 | 2014-01-23 07:26:10 -0800 | [diff] [blame] | 250 | #ifdef HAVE_X11_PLATFORM |
| 251 | _EGLDisplay* |
| 252 | _eglGetX11Display(Display *native_display, const EGLint *attrib_list); |
| 253 | #endif |
| 254 | |
| 255 | #ifdef HAVE_DRM_PLATFORM |
| 256 | struct gbm_device; |
| 257 | |
| 258 | _EGLDisplay* |
| 259 | _eglGetGbmDisplay(struct gbm_device *native_display, |
| 260 | const EGLint *attrib_list); |
| 261 | #endif |
| 262 | |
| 263 | #ifdef HAVE_WAYLAND_PLATFORM |
| 264 | struct wl_display; |
| 265 | |
| 266 | _EGLDisplay* |
| 267 | _eglGetWaylandDisplay(struct wl_display *native_display, |
| 268 | const EGLint *attrib_list); |
| 269 | #endif |
Chia-I Wu | 7abf426 | 2010-01-24 20:30:04 +0800 | [diff] [blame] | 270 | |
Alexander von Gluck IV | 8362068 | 2015-05-13 17:13:37 -0500 | [diff] [blame] | 271 | |
| 272 | #ifdef __cplusplus |
| 273 | } |
| 274 | #endif |
| 275 | |
Brian Paul | adbff7e | 2005-04-22 21:09:39 +0000 | [diff] [blame] | 276 | #endif /* EGLDISPLAY_INCLUDED */ |