blob: cec6d59e6a4ec01821f88778059ec03c385fdc36 [file] [log] [blame]
Chia-I Wuf2001df2011-07-02 17:57:30 +09001/**************************************************************************
2 *
José Fonseca87712852014-01-17 16:27:50 +00003 * Copyright 2008 VMware, Inc.
Chia-I Wuf2001df2011-07-02 17:57:30 +09004 * 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 Pauladbff7e2005-04-22 21:09:39 +000031#ifndef EGLDISPLAY_INCLUDED
32#define EGLDISPLAY_INCLUDED
33
Emil Velikov7bd16932015-02-28 16:35:22 +000034#include "c99_compat.h"
Emil Velikovefe87f12015-03-06 16:54:55 +000035#include "c11/threads.h"
Chia-I Wu94cb3212010-01-29 09:00:30 +080036
Brian Pauladbff7e2005-04-22 21:09:39 +000037#include "egltypedefs.h"
Chia-I Wu5a2c9372009-08-13 13:38:24 +080038#include "egldefines.h"
Chia-I Wu6717a312010-06-30 17:10:10 +080039#include "eglarray.h"
Chia-I Wu5a2c9372009-08-13 13:38:24 +080040
41
Alexander von Gluck IV83620682015-05-13 17:13:37 -050042#ifdef __cplusplus
43extern "C" {
44#endif
45
Chia-I Wuf22665d2010-06-17 17:14:03 +080046enum _egl_platform_type {
Chia-I Wuf22665d2010-06-17 17:14:03 +080047 _EGL_PLATFORM_X11,
Benjamin Franzkee586c4b2011-02-04 12:22:58 +010048 _EGL_PLATFORM_WAYLAND,
Chia-I Wuf22665d2010-06-17 17:14:03 +080049 _EGL_PLATFORM_DRM,
Chia-I Wub0945c12010-10-11 16:09:52 +080050 _EGL_PLATFORM_ANDROID,
Alexander von Gluck IV400b8332014-12-22 10:10:13 -050051 _EGL_PLATFORM_HAIKU,
Haixia Shi6b8accb2015-06-12 10:10:58 -070052 _EGL_PLATFORM_SURFACELESS,
Chia-I Wuf22665d2010-06-17 17:14:03 +080053
54 _EGL_NUM_PLATFORMS,
55 _EGL_INVALID_PLATFORM = -1
56};
57typedef enum _egl_platform_type _EGLPlatformType;
58
59
Chia-I Wu7abf4262010-01-24 20:30:04 +080060enum _egl_resource_type {
61 _EGL_RESOURCE_CONTEXT,
62 _EGL_RESOURCE_SURFACE,
Chia-I Wua1c4a8a2009-08-15 22:58:13 +080063 _EGL_RESOURCE_IMAGE,
Chia-I Wu4eebea72010-08-14 23:09:12 +080064 _EGL_RESOURCE_SYNC,
Chia-I Wu7abf4262010-01-24 20:30:04 +080065
66 _EGL_NUM_RESOURCES
67};
Chia-I Wu496724b2010-02-19 11:47:54 +080068/* this cannot and need not go into egltypedefs.h */
69typedef enum _egl_resource_type _EGLResourceType;
Chia-I Wu7abf4262010-01-24 20:30:04 +080070
71
72/**
73 * A resource of a display.
74 */
75struct _egl_resource
76{
Chia-I Wuf65ed0a2010-01-26 15:16:49 +080077 /* which display the resource belongs to */
Chia-I Wu7abf4262010-01-24 20:30:04 +080078 _EGLDisplay *Display;
Chia-I Wuf65ed0a2010-01-26 15:16:49 +080079 EGLBoolean IsLinked;
Chia-I Wudc4f8452010-10-23 11:59:03 +080080 EGLint RefCount;
Chia-I Wuf65ed0a2010-01-26 15:16:49 +080081
82 /* used to link resources of the same type */
Chia-I Wu7abf4262010-01-24 20:30:04 +080083 _EGLResource *Next;
84};
85
86
Chia-I Wu5a2c9372009-08-13 13:38:24 +080087/**
88 * Optional EGL extensions info.
89 */
90struct _egl_extensions
91{
Marek Olšák32aa1d72015-06-09 23:08:57 +020092 /* Please keep these sorted alphabetically. */
Chia-I Wu00b365b2010-10-01 15:27:42 -040093 EGLBoolean ANDROID_image_native_buffer;
Fredrik Höglund7d46b452011-12-14 21:24:09 +010094
Sarah Sharpc524f3e2014-05-06 12:10:57 -070095 EGLBoolean CHROMIUM_sync_control;
96
Marek Olšák32aa1d72015-06-09 23:08:57 +020097 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šák32aa1d72015-06-09 23:08:57 +0200115 EGLBoolean KHR_wait_sync;
116
117 EGLBoolean MESA_configless_context;
Marek Olšák32aa1d72015-06-09 23:08:57 +0200118 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öglund7d46b452011-12-14 21:24:09 +0100124 EGLBoolean NV_post_sub_buffer;
Ian Romanickf1715712012-07-19 15:08:06 -0700125
Marek Olšák32aa1d72015-06-09 23:08:57 +0200126 EGLBoolean WL_bind_wayland_display;
127 EGLBoolean WL_create_wayland_buffer_from_image;
Chia-I Wu5a2c9372009-08-13 13:38:24 +0800128};
Brian Pauladbff7e2005-04-22 21:09:39 +0000129
130
Chia-I Wuf22665d2010-06-17 17:14:03 +0800131struct _egl_display
Brian Pauladbff7e2005-04-22 21:09:39 +0000132{
Chia-I Wu38feefd2009-08-14 17:47:00 +0800133 /* used to link displays */
134 _EGLDisplay *Next;
135
Emil Velikovefe87f12015-03-06 16:54:55 +0000136 mtx_t Mutex;
Chia-I Wu99bcb1f2010-02-17 17:29:52 +0800137
Chia-I Wua4a38dc2011-01-13 16:53:13 +0800138 _EGLPlatformType Platform; /**< The type of the platform display */
139 void *PlatformDisplay; /**< A pointer to the platform display */
Brian Pauladbff7e2005-04-22 21:09:39 +0000140
Chia-I Wua4a38dc2011-01-13 16:53:13 +0800141 _EGLDriver *Driver; /**< Matched driver of the display */
142 EGLBoolean Initialized; /**< True if the display is initialized */
Chia-I Wu5a2c9372009-08-13 13:38:24 +0800143
Chia-I Wu655e4592011-01-13 00:27:45 +0800144 /* options that affect how the driver initializes the display */
145 struct {
146 EGLBoolean TestOnly; /**< Driver should not set fields when true */
Chia-I Wua22a3322011-01-13 04:40:38 +0800147 EGLBoolean UseFallback; /**< Use fallback driver (sw or less features) */
Chia-I Wu655e4592011-01-13 00:27:45 +0800148 } Options;
149
Chia-I Wua4a38dc2011-01-13 16:53:13 +0800150 /* these fields are set by the driver during init */
151 void *DriverData; /**< Driver private data */
Marek Olšák0e4b5642015-05-12 16:40:29 +0200152 EGLint Version; /**< EGL version major*10+minor */
Chia-I Wua4a38dc2011-01-13 16:53:13 +0800153 EGLint ClientAPIs; /**< Bitmask of APIs supported (EGL_xxx_BIT) */
154 _EGLExtensions Extensions; /**< Extensions supported */
Chia-I Wu5a2c9372009-08-13 13:38:24 +0800155
Chia-I Wua4a38dc2011-01-13 16:53:13 +0800156 /* these fields are derived from above */
Emil Velikovbbaf22a2015-03-19 01:36:08 +0000157 char VersionString[100]; /**< EGL_VERSION */
158 char ClientAPIsString[100]; /**< EGL_CLIENT_APIS */
Chia-I Wua4a38dc2011-01-13 16:53:13 +0800159 char ExtensionsString[_EGL_MAX_EXTENSIONS_LEN]; /**< EGL_EXTENSIONS */
Chia-I Wu5a2c9372009-08-13 13:38:24 +0800160
Chia-I Wu8b0c6c42010-06-30 18:02:23 +0800161 _EGLArray *Screens;
Chia-I Wu6717a312010-06-30 17:10:10 +0800162 _EGLArray *Configs;
Brian Paul6052af12008-05-27 16:48:23 -0600163
Chia-I Wuecb3b312010-01-24 20:32:34 +0800164 /* lists of resources */
Chia-I Wu7abf4262010-01-24 20:30:04 +0800165 _EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
Brian Pauladbff7e2005-04-22 21:09:39 +0000166};
167
168
Chia-I Wuea052992010-06-17 23:45:41 +0800169extern _EGLPlatformType
Chad Versace6d1f83e2014-01-07 14:54:51 -0800170_eglGetNativePlatform(void *nativeDisplay);
Chia-I Wuea052992010-06-17 23:45:41 +0800171
172
Chia-I Wu38feefd2009-08-14 17:47:00 +0800173extern void
174_eglFiniDisplay(void);
175
176
Brian Pauladbff7e2005-04-22 21:09:39 +0000177extern _EGLDisplay *
Chia-I Wuf22665d2010-06-17 17:14:03 +0800178_eglFindDisplay(_EGLPlatformType plat, void *plat_dpy);
Chia-I Wube9d1ab2009-07-16 21:21:56 -0700179
180
Emil Velikovdd438ae2015-02-28 17:20:01 +0000181extern void
Chia-I Wu2f2cf462009-08-11 17:09:39 +0800182_eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *dpy);
Chia-I Wu3f7e0d52009-07-16 21:21:57 -0700183
184
Emil Velikovdd438ae2015-02-28 17:20:01 +0000185extern void
Jon Smirl7012d012005-05-13 18:31:35 +0000186_eglCleanupDisplay(_EGLDisplay *disp);
187
188
Chia-I Wue484a922009-08-14 18:02:38 +0800189extern EGLBoolean
190_eglCheckDisplayHandle(EGLDisplay dpy);
191
192
Emil Velikovdd438ae2015-02-28 17:20:01 +0000193extern EGLBoolean
Chia-I Wudbb866a2010-01-25 11:39:44 +0800194_eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy);
Chia-I Wu7abf4262010-01-24 20:30:04 +0800195
196
Chia-I Wue3734e42009-08-14 18:05:19 +0800197/**
198 * Lookup a handle to find the linked display.
199 * Return NULL if the handle has no corresponding linked display.
200 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000201static inline _EGLDisplay *
Chia-I Wue3734e42009-08-14 18:05:19 +0800202_eglLookupDisplay(EGLDisplay display)
203{
204 _EGLDisplay *dpy = (_EGLDisplay *) display;
Chia-I Wue484a922009-08-14 18:02:38 +0800205 if (!_eglCheckDisplayHandle(display))
206 dpy = NULL;
Chia-I Wue3734e42009-08-14 18:05:19 +0800207 return dpy;
208}
209
210
211/**
212 * Return the handle of a linked display, or EGL_NO_DISPLAY.
213 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000214static inline EGLDisplay
Chia-I Wue3734e42009-08-14 18:05:19 +0800215_eglGetDisplayHandle(_EGLDisplay *dpy)
216{
217 return (EGLDisplay) ((dpy) ? dpy : EGL_NO_DISPLAY);
218}
219
220
Chia-I Wu7abf4262010-01-24 20:30:04 +0800221extern void
Chia-I Wudc4f8452010-10-23 11:59:03 +0800222_eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy);
223
224
Emil Velikovdd438ae2015-02-28 17:20:01 +0000225extern void
Chia-I Wudc4f8452010-10-23 11:59:03 +0800226_eglGetResource(_EGLResource *res);
227
228
Emil Velikovdd438ae2015-02-28 17:20:01 +0000229extern EGLBoolean
Chia-I Wudc4f8452010-10-23 11:59:03 +0800230_eglPutResource(_EGLResource *res);
231
232
233extern void
Chia-I Wu4ce33ec2010-10-23 00:37:19 +0800234_eglLinkResource(_EGLResource *res, _EGLResourceType type);
Chia-I Wu7abf4262010-01-24 20:30:04 +0800235
236
237extern void
238_eglUnlinkResource(_EGLResource *res, _EGLResourceType type);
239
240
241/**
242 * Return true if the resource is linked.
243 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000244static inline EGLBoolean
Chia-I Wu7abf4262010-01-24 20:30:04 +0800245_eglIsResourceLinked(_EGLResource *res)
246{
Chia-I Wuf65ed0a2010-01-26 15:16:49 +0800247 return res->IsLinked;
Chia-I Wu7abf4262010-01-24 20:30:04 +0800248}
249
Chad Versace468cc862014-01-23 07:26:10 -0800250#ifdef HAVE_X11_PLATFORM
251_EGLDisplay*
252_eglGetX11Display(Display *native_display, const EGLint *attrib_list);
253#endif
254
255#ifdef HAVE_DRM_PLATFORM
256struct 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
264struct wl_display;
265
266_EGLDisplay*
267_eglGetWaylandDisplay(struct wl_display *native_display,
268 const EGLint *attrib_list);
269#endif
Chia-I Wu7abf4262010-01-24 20:30:04 +0800270
Alexander von Gluck IV83620682015-05-13 17:13:37 -0500271
272#ifdef __cplusplus
273}
274#endif
275
Brian Pauladbff7e2005-04-22 21:09:39 +0000276#endif /* EGLDISPLAY_INCLUDED */