| /************************************************************************** |
| * |
| * Copyright 2008 VMware, Inc. |
| * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com> |
| * Copyright 2010-2011 LunarG, Inc. |
| * All Rights Reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the |
| * "Software"), to deal in the Software without restriction, including |
| * without limitation the rights to use, copy, modify, merge, publish, |
| * distribute, sub license, and/or sell copies of the Software, and to |
| * permit persons to whom the Software is furnished to do so, subject to |
| * the following conditions: |
| * |
| * The above copyright notice and this permission notice (including the |
| * next paragraph) shall be included in all copies or substantial portions |
| * of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| * DEALINGS IN THE SOFTWARE. |
| * |
| **************************************************************************/ |
| |
| |
| #ifndef EGLDISPLAY_INCLUDED |
| #define EGLDISPLAY_INCLUDED |
| |
| #include "util/simple_mtx.h" |
| #include "util/rwlock.h" |
| |
| #include "egltypedefs.h" |
| #include "egldefines.h" |
| #include "eglarray.h" |
| |
| #ifdef HAVE_X11_PLATFORM |
| #include <X11/Xlib.h> |
| #endif |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| enum _egl_platform_type { |
| _EGL_PLATFORM_X11, |
| _EGL_PLATFORM_XCB, |
| _EGL_PLATFORM_WAYLAND, |
| _EGL_PLATFORM_DRM, |
| _EGL_PLATFORM_ANDROID, |
| _EGL_PLATFORM_HAIKU, |
| _EGL_PLATFORM_SURFACELESS, |
| _EGL_PLATFORM_DEVICE, |
| _EGL_PLATFORM_WINDOWS, |
| |
| _EGL_NUM_PLATFORMS, |
| _EGL_INVALID_PLATFORM = -1 |
| }; |
| typedef enum _egl_platform_type _EGLPlatformType; |
| |
| |
| enum _egl_resource_type { |
| _EGL_RESOURCE_CONTEXT, |
| _EGL_RESOURCE_SURFACE, |
| _EGL_RESOURCE_IMAGE, |
| _EGL_RESOURCE_SYNC, |
| |
| _EGL_NUM_RESOURCES |
| }; |
| /* this cannot and need not go into egltypedefs.h */ |
| typedef enum _egl_resource_type _EGLResourceType; |
| |
| |
| /** |
| * A resource of a display. |
| */ |
| struct _egl_resource |
| { |
| /* which display the resource belongs to */ |
| _EGLDisplay *Display; |
| EGLBoolean IsLinked; |
| EGLint RefCount; |
| |
| EGLLabelKHR Label; |
| |
| /* used to link resources of the same type */ |
| _EGLResource *Next; |
| }; |
| |
| |
| /** |
| * Optional EGL extensions info. |
| */ |
| struct _egl_extensions |
| { |
| /* Please keep these sorted alphabetically. */ |
| EGLBoolean ANDROID_blob_cache; |
| EGLBoolean ANDROID_framebuffer_target; |
| EGLBoolean ANDROID_image_native_buffer; |
| EGLBoolean ANDROID_native_fence_sync; |
| EGLBoolean ANDROID_recordable; |
| |
| EGLBoolean ANGLE_sync_control_rate; |
| EGLBoolean CHROMIUM_sync_control; |
| |
| EGLBoolean EXT_buffer_age; |
| EGLBoolean EXT_create_context_robustness; |
| EGLBoolean EXT_image_dma_buf_import; |
| EGLBoolean EXT_image_dma_buf_import_modifiers; |
| EGLBoolean EXT_pixel_format_float; |
| EGLBoolean EXT_protected_content; |
| EGLBoolean EXT_protected_surface; |
| EGLBoolean EXT_present_opaque; |
| EGLBoolean EXT_surface_CTA861_3_metadata; |
| EGLBoolean EXT_surface_SMPTE2086_metadata; |
| EGLBoolean EXT_swap_buffers_with_damage; |
| |
| unsigned int IMG_context_priority; |
| #define __EGL_CONTEXT_PRIORITY_LOW_BIT 0 |
| #define __EGL_CONTEXT_PRIORITY_MEDIUM_BIT 1 |
| #define __EGL_CONTEXT_PRIORITY_HIGH_BIT 2 |
| |
| EGLBoolean KHR_cl_event2; |
| EGLBoolean KHR_config_attribs; |
| EGLBoolean KHR_context_flush_control; |
| EGLBoolean KHR_create_context; |
| EGLBoolean KHR_create_context_no_error; |
| EGLBoolean KHR_fence_sync; |
| EGLBoolean KHR_get_all_proc_addresses; |
| EGLBoolean KHR_gl_colorspace; |
| EGLBoolean KHR_gl_renderbuffer_image; |
| EGLBoolean KHR_gl_texture_2D_image; |
| EGLBoolean KHR_gl_texture_3D_image; |
| EGLBoolean KHR_gl_texture_cubemap_image; |
| EGLBoolean KHR_image; |
| EGLBoolean KHR_image_base; |
| EGLBoolean KHR_image_pixmap; |
| EGLBoolean KHR_mutable_render_buffer; |
| EGLBoolean KHR_no_config_context; |
| EGLBoolean KHR_partial_update; |
| EGLBoolean KHR_reusable_sync; |
| EGLBoolean KHR_surfaceless_context; |
| EGLBoolean KHR_wait_sync; |
| |
| EGLBoolean MESA_drm_image; |
| EGLBoolean MESA_image_dma_buf_export; |
| EGLBoolean MESA_query_driver; |
| |
| EGLBoolean NOK_swap_region; |
| EGLBoolean NOK_texture_from_pixmap; |
| |
| EGLBoolean NV_post_sub_buffer; |
| |
| EGLBoolean WL_bind_wayland_display; |
| EGLBoolean WL_create_wayland_buffer_from_image; |
| }; |
| |
| struct _egl_display |
| { |
| /* used to link displays */ |
| _EGLDisplay *Next; |
| |
| /** |
| * The big-display-lock (BDL) which protects our internal state. EGL |
| * drivers should use their own locking, as needed, to protect their |
| * own state, rather than relying on this. |
| */ |
| simple_mtx_t Mutex; |
| |
| /** |
| * The spec appears to allow eglTerminate() to race with more or less |
| * any other egl call. To allow for this, while relaxing the BDL to |
| * allow other egl calls to happen in parallel, a rwlock is used. All |
| * points where the BDL lock is acquired also acquire TerminateLock |
| * for reading, while eglTerminate() itself acquires the TerminateLock |
| * for writing. |
| * |
| * Note, we could conceivably just replace the BDL with a single |
| * rwlock. But there are a couple shortcomings of u_rwlock: |
| * |
| * 1) The WIN32 implementation does not allow promoting a read- |
| * lock to write-lock, nor recursive locking, whereas the |
| * pthread based implementation does. Because of this, it |
| * would be difficult to keep the eglapi layer portable if |
| * we depended on any less-than-trivial rwlock usage. |
| * |
| * 2) We'd lose simple_mtx_assert_locked(). |
| */ |
| struct u_rwlock TerminateLock; |
| |
| _EGLPlatformType Platform; /**< The type of the platform display */ |
| void *PlatformDisplay; /**< A pointer to the platform display */ |
| |
| _EGLDevice *Device; /**< Device backing the display */ |
| const _EGLDriver *Driver; /**< Matched driver of the display */ |
| EGLBoolean Initialized; /**< True if the display is initialized */ |
| |
| /* options that affect how the driver initializes the display */ |
| struct { |
| EGLBoolean Zink; /**< Use kopper only */ |
| EGLBoolean ForceSoftware; /**< Use software path only */ |
| EGLAttrib *Attribs; /**< Platform-specific options */ |
| int fd; /**< plaform device specific, local fd */ |
| } Options; |
| |
| /* these fields are set by the driver during init */ |
| void *DriverData; /**< Driver private data */ |
| EGLint Version; /**< EGL version major*10+minor */ |
| EGLint ClientAPIs; /**< Bitmask of APIs supported (EGL_xxx_BIT) */ |
| _EGLExtensions Extensions; /**< Extensions supported */ |
| |
| /* these fields are derived from above */ |
| char VersionString[100]; /**< EGL_VERSION */ |
| char ClientAPIsString[100]; /**< EGL_CLIENT_APIS */ |
| char ExtensionsString[_EGL_MAX_EXTENSIONS_LEN]; /**< EGL_EXTENSIONS */ |
| |
| _EGLArray *Configs; |
| |
| /* lists of resources */ |
| _EGLResource *ResourceLists[_EGL_NUM_RESOURCES]; |
| |
| EGLLabelKHR Label; |
| |
| EGLSetBlobFuncANDROID BlobCacheSet; |
| EGLGetBlobFuncANDROID BlobCacheGet; |
| }; |
| |
| |
| extern _EGLDisplay * |
| _eglLockDisplay(EGLDisplay dpy); |
| |
| |
| extern void |
| _eglUnlockDisplay(_EGLDisplay *disp); |
| |
| |
| extern _EGLPlatformType |
| _eglGetNativePlatform(void *nativeDisplay); |
| |
| |
| extern void |
| _eglFiniDisplay(void); |
| |
| |
| extern _EGLDisplay * |
| _eglFindDisplay(_EGLPlatformType plat, void *plat_dpy, const EGLAttrib *attr); |
| |
| |
| extern void |
| _eglReleaseDisplayResources(_EGLDisplay *disp); |
| |
| |
| extern void |
| _eglCleanupDisplay(_EGLDisplay *disp); |
| |
| |
| extern EGLBoolean |
| _eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *disp); |
| |
| |
| /** |
| * Return the handle of a linked display, or EGL_NO_DISPLAY. |
| */ |
| static inline EGLDisplay |
| _eglGetDisplayHandle(_EGLDisplay *disp) |
| { |
| return (EGLDisplay) ((disp) ? disp : EGL_NO_DISPLAY); |
| } |
| |
| |
| extern void |
| _eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *disp); |
| |
| |
| extern void |
| _eglGetResource(_EGLResource *res); |
| |
| |
| extern EGLBoolean |
| _eglPutResource(_EGLResource *res); |
| |
| |
| extern void |
| _eglLinkResource(_EGLResource *res, _EGLResourceType type); |
| |
| |
| extern void |
| _eglUnlinkResource(_EGLResource *res, _EGLResourceType type); |
| |
| |
| /** |
| * Return true if the resource is linked. |
| */ |
| static inline EGLBoolean |
| _eglIsResourceLinked(_EGLResource *res) |
| { |
| return res->IsLinked; |
| } |
| |
| static inline size_t |
| _eglNumAttribs(const EGLAttrib *attribs) |
| { |
| size_t len = 0; |
| |
| if (attribs) { |
| while (attribs[len] != EGL_NONE) |
| len += 2; |
| len++; |
| } |
| return len; |
| } |
| |
| #ifdef HAVE_X11_PLATFORM |
| _EGLDisplay* |
| _eglGetX11Display(Display *native_display, const EGLAttrib *attrib_list); |
| #endif |
| |
| #ifdef HAVE_XCB_PLATFORM |
| typedef struct xcb_connection_t xcb_connection_t; |
| _EGLDisplay* |
| _eglGetXcbDisplay(xcb_connection_t *native_display, const EGLAttrib *attrib_list); |
| #endif |
| |
| #ifdef HAVE_DRM_PLATFORM |
| struct gbm_device; |
| |
| _EGLDisplay* |
| _eglGetGbmDisplay(struct gbm_device *native_display, |
| const EGLAttrib *attrib_list); |
| #endif |
| |
| #ifdef HAVE_WAYLAND_PLATFORM |
| struct wl_display; |
| |
| _EGLDisplay* |
| _eglGetWaylandDisplay(struct wl_display *native_display, |
| const EGLAttrib *attrib_list); |
| #endif |
| |
| _EGLDisplay* |
| _eglGetSurfacelessDisplay(void *native_display, |
| const EGLAttrib *attrib_list); |
| |
| #ifdef HAVE_ANDROID_PLATFORM |
| _EGLDisplay* |
| _eglGetAndroidDisplay(void *native_display, |
| const EGLAttrib *attrib_list); |
| #endif |
| |
| _EGLDisplay* |
| _eglGetDeviceDisplay(void *native_display, |
| const EGLAttrib *attrib_list); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* EGLDISPLAY_INCLUDED */ |