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