Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2008 VMware, Inc.
  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.  
  31. #ifndef EGLDISPLAY_INCLUDED
  32. #define EGLDISPLAY_INCLUDED
  33.  
  34. #include "c99_compat.h"
  35. #include "c11/threads.h"
  36.  
  37. #include "egltypedefs.h"
  38. #include "egldefines.h"
  39. #include "eglarray.h"
  40.  
  41.  
  42. #ifdef __cplusplus
  43. extern "C" {
  44. #endif
  45.  
  46. enum _egl_platform_type {
  47.    _EGL_PLATFORM_WINDOWS,
  48.    _EGL_PLATFORM_X11,
  49.    _EGL_PLATFORM_WAYLAND,
  50.    _EGL_PLATFORM_DRM,
  51.    _EGL_PLATFORM_NULL,
  52.    _EGL_PLATFORM_ANDROID,
  53.    _EGL_PLATFORM_HAIKU,
  54.  
  55.    _EGL_NUM_PLATFORMS,
  56.    _EGL_INVALID_PLATFORM = -1
  57. };
  58. typedef enum _egl_platform_type _EGLPlatformType;
  59.  
  60.  
  61. enum _egl_resource_type {
  62.    _EGL_RESOURCE_CONTEXT,
  63.    _EGL_RESOURCE_SURFACE,
  64.    _EGL_RESOURCE_IMAGE,
  65.    _EGL_RESOURCE_SYNC,
  66.  
  67.    _EGL_NUM_RESOURCES
  68. };
  69. /* this cannot and need not go into egltypedefs.h */
  70. typedef enum _egl_resource_type _EGLResourceType;
  71.  
  72.  
  73. /**
  74.  * A resource of a display.
  75.  */
  76. struct _egl_resource
  77. {
  78.    /* which display the resource belongs to */
  79.    _EGLDisplay *Display;
  80.    EGLBoolean IsLinked;
  81.    EGLint RefCount;
  82.  
  83.    /* used to link resources of the same type */
  84.    _EGLResource *Next;
  85. };
  86.  
  87.  
  88. /**
  89.  * Optional EGL extensions info.
  90.  */
  91. struct _egl_extensions
  92. {
  93.    EGLBoolean MESA_drm_display;
  94.    EGLBoolean MESA_drm_image;
  95.    EGLBoolean MESA_configless_context;
  96.  
  97.    EGLBoolean WL_bind_wayland_display;
  98.    EGLBoolean WL_create_wayland_buffer_from_image;
  99.  
  100.    EGLBoolean KHR_image_base;
  101.    EGLBoolean KHR_image_pixmap;
  102.    EGLBoolean KHR_vg_parent_image;
  103.    EGLBoolean KHR_get_all_proc_addresses;
  104.    EGLBoolean KHR_gl_texture_2D_image;
  105.    EGLBoolean KHR_gl_texture_cubemap_image;
  106.    EGLBoolean KHR_gl_texture_3D_image;
  107.    EGLBoolean KHR_gl_renderbuffer_image;
  108.  
  109.    EGLBoolean KHR_reusable_sync;
  110.    EGLBoolean KHR_fence_sync;
  111.    EGLBoolean KHR_wait_sync;
  112.    EGLBoolean KHR_cl_event2;
  113.  
  114.    EGLBoolean KHR_surfaceless_context;
  115.    EGLBoolean KHR_create_context;
  116.  
  117.    EGLBoolean NOK_swap_region;
  118.    EGLBoolean NOK_texture_from_pixmap;
  119.  
  120.    EGLBoolean ANDROID_image_native_buffer;
  121.  
  122.    EGLBoolean CHROMIUM_sync_control;
  123.  
  124.    EGLBoolean NV_post_sub_buffer;
  125.  
  126.    EGLBoolean EXT_create_context_robustness;
  127.    EGLBoolean EXT_buffer_age;
  128.    EGLBoolean EXT_swap_buffers_with_damage;
  129.    EGLBoolean EXT_image_dma_buf_import;
  130.  
  131.    EGLBoolean MESA_image_dma_buf_export;
  132. };
  133.  
  134.  
  135. struct _egl_display
  136. {
  137.    /* used to link displays */
  138.    _EGLDisplay *Next;
  139.  
  140.    mtx_t Mutex;
  141.  
  142.    _EGLPlatformType Platform; /**< The type of the platform display */
  143.    void *PlatformDisplay;     /**< A pointer to the platform display */
  144.  
  145.    _EGLDriver *Driver;        /**< Matched driver of the display */
  146.    EGLBoolean Initialized;    /**< True if the display is initialized */
  147.  
  148.    /* options that affect how the driver initializes the display */
  149.    struct {
  150.       EGLBoolean TestOnly;    /**< Driver should not set fields when true */
  151.       EGLBoolean UseFallback; /**< Use fallback driver (sw or less features) */
  152.    } Options;
  153.  
  154.    /* these fields are set by the driver during init */
  155.    void *DriverData;          /**< Driver private data */
  156.    EGLint VersionMajor;       /**< EGL major version */
  157.    EGLint VersionMinor;       /**< EGL minor version */
  158.    EGLint ClientAPIs;         /**< Bitmask of APIs supported (EGL_xxx_BIT) */
  159.    _EGLExtensions Extensions; /**< Extensions supported */
  160.  
  161.    /* these fields are derived from above */
  162.    char VersionString[100];                        /**< EGL_VERSION */
  163.    char ClientAPIsString[100];                     /**< EGL_CLIENT_APIS */
  164.    char ExtensionsString[_EGL_MAX_EXTENSIONS_LEN]; /**< EGL_EXTENSIONS */
  165.  
  166.    _EGLArray *Screens;
  167.    _EGLArray *Configs;
  168.  
  169.    /* lists of resources */
  170.    _EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
  171. };
  172.  
  173.  
  174. extern _EGLPlatformType
  175. _eglGetNativePlatform(void *nativeDisplay);
  176.  
  177.  
  178. extern void
  179. _eglFiniDisplay(void);
  180.  
  181.  
  182. extern _EGLDisplay *
  183. _eglFindDisplay(_EGLPlatformType plat, void *plat_dpy);
  184.  
  185.  
  186. extern void
  187. _eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *dpy);
  188.  
  189.  
  190. extern void
  191. _eglCleanupDisplay(_EGLDisplay *disp);
  192.  
  193.  
  194. extern EGLBoolean
  195. _eglCheckDisplayHandle(EGLDisplay dpy);
  196.  
  197.  
  198. extern EGLBoolean
  199. _eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy);
  200.  
  201.  
  202. /**
  203.  * Lookup a handle to find the linked display.
  204.  * Return NULL if the handle has no corresponding linked display.
  205.  */
  206. static inline _EGLDisplay *
  207. _eglLookupDisplay(EGLDisplay display)
  208. {
  209.    _EGLDisplay *dpy = (_EGLDisplay *) display;
  210.    if (!_eglCheckDisplayHandle(display))
  211.       dpy = NULL;
  212.    return dpy;
  213. }
  214.  
  215.  
  216. /**
  217.  * Return the handle of a linked display, or EGL_NO_DISPLAY.
  218.  */
  219. static inline EGLDisplay
  220. _eglGetDisplayHandle(_EGLDisplay *dpy)
  221. {
  222.    return (EGLDisplay) ((dpy) ? dpy : EGL_NO_DISPLAY);
  223. }
  224.  
  225.  
  226. extern void
  227. _eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy);
  228.  
  229.  
  230. extern void
  231. _eglGetResource(_EGLResource *res);
  232.  
  233.  
  234. extern EGLBoolean
  235. _eglPutResource(_EGLResource *res);
  236.  
  237.  
  238. extern void
  239. _eglLinkResource(_EGLResource *res, _EGLResourceType type);
  240.  
  241.  
  242. extern void
  243. _eglUnlinkResource(_EGLResource *res, _EGLResourceType type);
  244.  
  245.  
  246. /**
  247.  * Return true if the resource is linked.
  248.  */
  249. static inline EGLBoolean
  250. _eglIsResourceLinked(_EGLResource *res)
  251. {
  252.    return res->IsLinked;
  253. }
  254.  
  255. #ifdef HAVE_X11_PLATFORM
  256. _EGLDisplay*
  257. _eglGetX11Display(Display *native_display, const EGLint *attrib_list);
  258. #endif
  259.  
  260. #ifdef HAVE_DRM_PLATFORM
  261. struct gbm_device;
  262.  
  263. _EGLDisplay*
  264. _eglGetGbmDisplay(struct gbm_device *native_display,
  265.                   const EGLint *attrib_list);
  266. #endif
  267.  
  268. #ifdef HAVE_WAYLAND_PLATFORM
  269. struct wl_display;
  270.  
  271. _EGLDisplay*
  272. _eglGetWaylandDisplay(struct wl_display *native_display,
  273.                       const EGLint *attrib_list);
  274. #endif
  275.  
  276.  
  277. #ifdef __cplusplus
  278. }
  279. #endif
  280.  
  281. #endif /* EGLDISPLAY_INCLUDED */
  282.