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 EGLDRIVER_INCLUDED
32 #define EGLDRIVER_INCLUDED
33 
34 
35 #include "c99_compat.h"
36 
37 #include "egltypedefs.h"
38 #include <stdbool.h>
39 #include <stddef.h>
40 
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 /**
47  * Define an inline driver typecast function.
48  *
49  * Note that this macro defines a function and should not be ended with a
50  * semicolon when used.
51  */
52 #define _EGL_DRIVER_TYPECAST(drvtype, egltype, code)           \
53    static inline struct drvtype *drvtype(const egltype *obj)   \
54    { return (struct drvtype *) code; }
55 
56 
57 /**
58  * Define the driver typecast functions for _EGLDisplay,
59  * _EGLContext, _EGLSurface, and _EGLConfig.
60  *
61  * Note that this macro defines several functions and should not be ended with
62  * a semicolon when used.
63  */
64 #define _EGL_DRIVER_STANDARD_TYPECASTS(drvname)                            \
65    /* note that this is not a direct cast */                               \
66    _EGL_DRIVER_TYPECAST(drvname ## _display, _EGLDisplay, obj->DriverData) \
67    _EGL_DRIVER_TYPECAST(drvname ## _context, _EGLContext, obj)             \
68    _EGL_DRIVER_TYPECAST(drvname ## _surface, _EGLSurface, obj)             \
69    _EGL_DRIVER_TYPECAST(drvname ## _config, _EGLConfig, obj)
70 
71 /**
72  * A generic function ptr type
73  */
74 typedef void (*_EGLProc)(void);
75 
76 struct wl_display;
77 struct mesa_glinterop_device_info;
78 struct mesa_glinterop_export_in;
79 struct mesa_glinterop_export_out;
80 
81 /**
82  * The API dispatcher jumps through these functions
83  */
84 struct _egl_driver
85 {
86    /* driver funcs */
87    EGLBoolean (*Initialize)(_EGLDisplay *disp);
88    EGLBoolean (*Terminate)(_EGLDisplay *disp);
89 
90    /* context funcs */
91    _EGLContext *(*CreateContext)(_EGLDisplay *disp, _EGLConfig *config,
92                                  _EGLContext *share_list, const EGLint *attrib_list);
93    EGLBoolean (*DestroyContext)(_EGLDisplay *disp, _EGLContext *ctx);
94    /* this is the only function (other than Initialize) that may be called
95     * with an uninitialized display
96     */
97    EGLBoolean (*MakeCurrent)(_EGLDisplay *disp,
98                              _EGLSurface *draw, _EGLSurface *read,
99                              _EGLContext *ctx);
100 
101    /* surface funcs */
102    _EGLSurface *(*CreateWindowSurface)(_EGLDisplay *disp, _EGLConfig *config,
103                                        void *native_window, const EGLint *attrib_list);
104    _EGLSurface *(*CreatePixmapSurface)(_EGLDisplay *disp, _EGLConfig *config,
105                                        void *native_pixmap, const EGLint *attrib_list);
106    _EGLSurface *(*CreatePbufferSurface)(_EGLDisplay *disp, _EGLConfig *config,
107                                         const EGLint *attrib_list);
108    EGLBoolean (*DestroySurface)(_EGLDisplay *disp, _EGLSurface *surface);
109    EGLBoolean (*QuerySurface)(_EGLDisplay *disp, _EGLSurface *surface,
110                               EGLint attribute, EGLint *value);
111    EGLBoolean (*BindTexImage)(_EGLDisplay *disp, _EGLSurface *surface,
112                               EGLint buffer);
113    EGLBoolean (*ReleaseTexImage)(_EGLDisplay *disp, _EGLSurface *surface,
114                                  EGLint buffer);
115    EGLBoolean (*SwapInterval)(_EGLDisplay *disp, _EGLSurface *surf,
116                               EGLint interval);
117    EGLBoolean (*SwapBuffers)(_EGLDisplay *disp, _EGLSurface *draw);
118    EGLBoolean (*CopyBuffers)(_EGLDisplay *disp, _EGLSurface *surface,
119                              void *native_pixmap_target);
120 
121    /* for EGL_KHR_partial_update */
122    EGLBoolean (*SetDamageRegion)(_EGLDisplay *disp, _EGLSurface *surface,
123                                  EGLint *rects, EGLint n_rects);
124 
125    /* misc functions */
126    EGLBoolean (*WaitClient)(_EGLDisplay *disp, _EGLContext *ctx);
127    EGLBoolean (*WaitNative)(EGLint engine);
128 
129    /* this function may be called from multiple threads at the same time */
130    _EGLProc (*GetProcAddress)(const char *procname);
131 
132    /* for EGL_KHR_image_base */
133    _EGLImage *(*CreateImageKHR)(_EGLDisplay *disp, _EGLContext *ctx,
134                                 EGLenum target, EGLClientBuffer buffer,
135                                 const EGLint *attr_list);
136    EGLBoolean (*DestroyImageKHR)(_EGLDisplay *disp, _EGLImage *image);
137 
138    /* for EGL_KHR_reusable_sync/EGL_KHR_fence_sync */
139    _EGLSync *(*CreateSyncKHR)(_EGLDisplay *disp, EGLenum type,
140                               const EGLAttrib *attrib_list);
141    EGLBoolean (*DestroySyncKHR)(_EGLDisplay *disp, _EGLSync *sync);
142    EGLint (*ClientWaitSyncKHR)(_EGLDisplay *disp, _EGLSync *sync,
143                                EGLint flags, EGLTime timeout);
144    EGLint (*WaitSyncKHR)(_EGLDisplay *disp, _EGLSync *sync);
145    /* for EGL_KHR_reusable_sync */
146    EGLBoolean (*SignalSyncKHR)(_EGLDisplay *disp, _EGLSync *sync, EGLenum mode);
147 
148    /* for EGL_ANDROID_native_fence_sync */
149    EGLint (*DupNativeFenceFDANDROID)(_EGLDisplay *disp, _EGLSync *sync);
150 
151    /* for EGL_NOK_swap_region */
152    EGLBoolean (*SwapBuffersRegionNOK)(_EGLDisplay *disp, _EGLSurface *surf,
153                                       EGLint numRects, const EGLint *rects);
154 
155    /* for EGL_MESA_drm_image */
156    _EGLImage *(*CreateDRMImageMESA)(_EGLDisplay *disp, const EGLint *attr_list);
157    EGLBoolean (*ExportDRMImageMESA)(_EGLDisplay *disp, _EGLImage *img,
158                                     EGLint *name, EGLint *handle,
159                                     EGLint *stride);
160 
161    /* for EGL_WL_bind_wayland_display */
162    EGLBoolean (*BindWaylandDisplayWL)(_EGLDisplay *disp, struct wl_display *display);
163    EGLBoolean (*UnbindWaylandDisplayWL)(_EGLDisplay *disp, struct wl_display *display);
164    EGLBoolean (*QueryWaylandBufferWL)(_EGLDisplay *displ, struct wl_resource *buffer,
165                                       EGLint attribute, EGLint *value);
166 
167    /* for EGL_WL_create_wayland_buffer_from_image */
168    struct wl_buffer *(*CreateWaylandBufferFromImageWL)(_EGLDisplay *disp, _EGLImage *img);
169 
170    /* for EGL_EXT_swap_buffers_with_damage */
171    EGLBoolean (*SwapBuffersWithDamageEXT)(_EGLDisplay *disp, _EGLSurface *surface,
172                                           const EGLint *rects, EGLint n_rects);
173 
174    /* for EGL_NV_post_sub_buffer */
175    EGLBoolean (*PostSubBufferNV)(_EGLDisplay *disp, _EGLSurface *surface,
176                                  EGLint x, EGLint y, EGLint width, EGLint height);
177 
178    /* for EGL_EXT_buffer_age/EGL_KHR_partial_update */
179    EGLint (*QueryBufferAge)(_EGLDisplay *disp, _EGLSurface *surface);
180 
181    /* for EGL_CHROMIUM_sync_control */
182    EGLBoolean (*GetSyncValuesCHROMIUM)(_EGLDisplay *disp, _EGLSurface *surface,
183                                        EGLuint64KHR *ust, EGLuint64KHR *msc,
184                                        EGLuint64KHR *sbc);
185 
186    /* for EGL_MESA_image_dma_buf_export */
187    EGLBoolean (*ExportDMABUFImageQueryMESA)(_EGLDisplay *disp, _EGLImage *img,
188                                             EGLint *fourcc, EGLint *nplanes,
189                                             EGLuint64KHR *modifiers);
190    EGLBoolean (*ExportDMABUFImageMESA)(_EGLDisplay *disp, _EGLImage *img,
191                                        EGLint *fds, EGLint *strides,
192                                        EGLint *offsets);
193 
194    /* for EGL_MESA_query_driver */
195    const char *(*QueryDriverName)(_EGLDisplay *disp);
196    char *(*QueryDriverConfig)(_EGLDisplay *disp);
197 
198    /* for OpenGL-OpenCL interop; see include/GL/mesa_glinterop.h */
199    int (*GLInteropQueryDeviceInfo)(_EGLDisplay *disp, _EGLContext *ctx,
200                                    struct mesa_glinterop_device_info *out);
201    int (*GLInteropExportObject)(_EGLDisplay *disp, _EGLContext *ctx,
202                                 struct mesa_glinterop_export_in *in,
203                                 struct mesa_glinterop_export_out *out);
204 
205    /* for EGL_EXT_image_dma_buf_import_modifiers */
206    EGLBoolean (*QueryDmaBufFormatsEXT)(_EGLDisplay *disp,
207                                        EGLint max_formats, EGLint *formats,
208                                        EGLint *num_formats);
209    EGLBoolean (*QueryDmaBufModifiersEXT)(_EGLDisplay *disp, EGLint format,
210                                          EGLint max_modifiers, EGLuint64KHR *modifiers,
211                                          EGLBoolean *external_only,
212                                          EGLint *num_modifiers);
213 
214    /* for EGL_ANDROID_blob_cache */
215    void (*SetBlobCacheFuncsANDROID)(_EGLDisplay *disp,
216                                     EGLSetBlobFuncANDROID set,
217                                     EGLGetBlobFuncANDROID get);
218 };
219 
220 
221 #ifdef __cplusplus
222 }
223 #endif
224 
225 
226 #endif /* EGLDRIVER_INCLUDED */
227