X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fmain%2Fegldriver.h;h=21dd422c9553cb57ae1b3b9e9f2efa141698905d;hb=435ad514163d58596059256ae8f0bc518b99b4a1;hp=6c848eb35eab5f2fe72d7bd08c936ff5c68c8861;hpb=1d4dbd8d9b00cdba8c4aef4a3994d8763fea0dff;p=mesa.git diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h index 6c848eb35ea..21dd422c955 100644 --- a/src/egl/main/egldriver.h +++ b/src/egl/main/egldriver.h @@ -1,59 +1,240 @@ +/************************************************************************** + * + * Copyright 2008 VMware, Inc. + * Copyright 2009-2010 Chia-I Wu + * 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 EGLDRIVER_INCLUDED #define EGLDRIVER_INCLUDED +#include "c99_compat.h" + #include "egltypedefs.h" -#include "eglapi.h" +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + /** - * Base class for device drivers. + * Define an inline driver typecast function. + * + * Note that this macro defines a function and should not be ended with a + * semicolon when used. */ -struct _egl_driver -{ - void *LibHandle; /**< dlopen handle */ - const char *Path; /**< path to this driver */ - const char *Args; /**< args to load this driver */ - - const char *Name; /**< name of this driver */ - /**< probe a display to see if it is supported */ - EGLBoolean (*Probe)(_EGLDriver *drv, _EGLDisplay *dpy); - /**< called before dlclose to release this driver */ - void (*Unload)(_EGLDriver *drv); - - _EGLAPI API; /**< EGL API dispatch table */ -}; - - -extern _EGLDriver *_eglMain(const char *args); - +#define _EGL_DRIVER_TYPECAST(drvtype, egltype, code) \ + static inline struct drvtype *drvtype(const egltype *obj) \ + { return (struct drvtype *) code; } -extern const char * -_eglPreloadDriver(_EGLDisplay *dpy); - - -extern _EGLDriver * -_eglOpenDriver(_EGLDisplay *dpy); +/** + * Define the driver typecast functions for _EGLDriver, _EGLDisplay, + * _EGLContext, _EGLSurface, and _EGLConfig. + * + * Note that this macro defines several functions and should not be ended with + * a semicolon when used. + */ +#define _EGL_DRIVER_STANDARD_TYPECASTS(drvname) \ + _EGL_DRIVER_TYPECAST(drvname ## _driver, _EGLDriver, obj) \ + /* note that this is not a direct cast */ \ + _EGL_DRIVER_TYPECAST(drvname ## _display, _EGLDisplay, obj->DriverData) \ + _EGL_DRIVER_TYPECAST(drvname ## _context, _EGLContext, obj) \ + _EGL_DRIVER_TYPECAST(drvname ## _surface, _EGLSurface, obj) \ + _EGL_DRIVER_TYPECAST(drvname ## _config, _EGLConfig, obj) -extern EGLBoolean -_eglCloseDriver(_EGLDriver *drv, _EGLDisplay *dpy); +/** + * A generic function ptr type + */ +typedef void (*_EGLProc)(void); +struct wl_display; +struct mesa_glinterop_device_info; +struct mesa_glinterop_export_in; +struct mesa_glinterop_export_out; -void -_eglUnloadDrivers(void); +/** + * The API dispatcher jumps through these functions + */ +struct _egl_driver +{ + /* driver funcs */ + EGLBoolean (*Initialize)(_EGLDisplay *disp); + EGLBoolean (*Terminate)(_EGLDisplay *disp); + const char *(*QueryDriverName)(_EGLDisplay *disp); + char *(*QueryDriverConfig)(_EGLDisplay *disp); + + /* context funcs */ + _EGLContext *(*CreateContext)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLConfig *config, _EGLContext *share_list, + const EGLint *attrib_list); + EGLBoolean (*DestroyContext)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLContext *ctx); + /* this is the only function (other than Initialize) that may be called + * with an uninitialized display + */ + EGLBoolean (*MakeCurrent)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *draw, _EGLSurface *read, + _EGLContext *ctx); + + /* surface funcs */ + _EGLSurface *(*CreateWindowSurface)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLConfig *config, void *native_window, + const EGLint *attrib_list); + _EGLSurface *(*CreatePixmapSurface)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLConfig *config, void *native_pixmap, + const EGLint *attrib_list); + _EGLSurface *(*CreatePbufferSurface)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLConfig *config, + const EGLint *attrib_list); + EGLBoolean (*DestroySurface)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface); + EGLBoolean (*QuerySurface)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface, EGLint attribute, + EGLint *value); + EGLBoolean (*BindTexImage)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface, EGLint buffer); + EGLBoolean (*ReleaseTexImage)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface, EGLint buffer); + EGLBoolean (*SwapInterval)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surf, EGLint interval); + EGLBoolean (*SwapBuffers)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *draw); + EGLBoolean (*CopyBuffers)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface, void *native_pixmap_target); + EGLBoolean (*SetDamageRegion)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface, EGLint *rects, EGLint n_rects); + + /* misc functions */ + EGLBoolean (*WaitClient)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLContext *ctx); + EGLBoolean (*WaitNative)(const _EGLDriver *drv, _EGLDisplay *disp, + EGLint engine); + + /* this function may be called from multiple threads at the same time */ + _EGLProc (*GetProcAddress)(const _EGLDriver *drv, const char *procname); + + _EGLImage *(*CreateImageKHR)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLContext *ctx, EGLenum target, + EGLClientBuffer buffer, + const EGLint *attr_list); + EGLBoolean (*DestroyImageKHR)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLImage *image); + + _EGLSync *(*CreateSyncKHR)(const _EGLDriver *drv, _EGLDisplay *disp, EGLenum type, + const EGLAttrib *attrib_list); + EGLBoolean (*DestroySyncKHR)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSync *sync); + EGLint (*ClientWaitSyncKHR)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSync *sync, EGLint flags, EGLTime timeout); + EGLint (*WaitSyncKHR)(const _EGLDriver *drv, _EGLDisplay *disp, _EGLSync *sync); + EGLBoolean (*SignalSyncKHR)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSync *sync, EGLenum mode); + EGLint (*DupNativeFenceFDANDROID)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSync *sync); + + EGLBoolean (*SwapBuffersRegionNOK)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surf, EGLint numRects, + const EGLint *rects); + + _EGLImage *(*CreateDRMImageMESA)(const _EGLDriver *drv, _EGLDisplay *disp, + const EGLint *attr_list); + EGLBoolean (*ExportDRMImageMESA)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLImage *img, EGLint *name, + EGLint *handle, EGLint *stride); + + EGLBoolean (*BindWaylandDisplayWL)(const _EGLDriver *drv, _EGLDisplay *disp, + struct wl_display *display); + EGLBoolean (*UnbindWaylandDisplayWL)(const _EGLDriver *drv, _EGLDisplay *disp, + struct wl_display *display); + EGLBoolean (*QueryWaylandBufferWL)(const _EGLDriver *drv, _EGLDisplay *displ, + struct wl_resource *buffer, + EGLint attribute, EGLint *value); + + struct wl_buffer *(*CreateWaylandBufferFromImageWL)(const _EGLDriver *drv, + _EGLDisplay *disp, + _EGLImage *img); + + EGLBoolean (*SwapBuffersWithDamageEXT)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface, + const EGLint *rects, EGLint n_rects); + + EGLBoolean (*PostSubBufferNV)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLSurface *surface, EGLint x, EGLint y, + EGLint width, EGLint height); + + EGLint (*QueryBufferAge)(const _EGLDriver *drv, + _EGLDisplay *disp, _EGLSurface *surface); + EGLBoolean (*GetSyncValuesCHROMIUM)(_EGLDisplay *disp, _EGLSurface *surface, + EGLuint64KHR *ust, EGLuint64KHR *msc, + EGLuint64KHR *sbc); + + EGLBoolean (*ExportDMABUFImageQueryMESA)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLImage *img, EGLint *fourcc, + EGLint *nplanes, + EGLuint64KHR *modifiers); + EGLBoolean (*ExportDMABUFImageMESA)(const _EGLDriver *drv, _EGLDisplay *disp, + _EGLImage *img, EGLint *fds, + EGLint *strides, EGLint *offsets); + + int (*GLInteropQueryDeviceInfo)(_EGLDisplay *disp, _EGLContext *ctx, + struct mesa_glinterop_device_info *out); + int (*GLInteropExportObject)(_EGLDisplay *disp, _EGLContext *ctx, + struct mesa_glinterop_export_in *in, + struct mesa_glinterop_export_out *out); + + EGLBoolean (*QueryDmaBufFormatsEXT)(const _EGLDriver *drv, _EGLDisplay *disp, + EGLint max_formats, EGLint *formats, + EGLint *num_formats); + EGLBoolean (*QueryDmaBufModifiersEXT) (const _EGLDriver *drv, _EGLDisplay *disp, + EGLint format, EGLint max_modifiers, + EGLuint64KHR *modifiers, + EGLBoolean *external_only, + EGLint *num_modifiers); + + void (*SetBlobCacheFuncsANDROID) (const _EGLDriver *drv, _EGLDisplay *disp, + EGLSetBlobFuncANDROID set, + EGLGetBlobFuncANDROID get); +}; -extern _EGLDriver * -_eglLookupDriver(EGLDisplay d); +extern bool +_eglInitializeDisplay(_EGLDisplay *disp); -extern void -_eglInitDriverFallbacks(_EGLDriver *drv); +extern __eglMustCastToProperFunctionPointerType +_eglGetDriverProc(const char *procname); -extern EGLint -_eglFindAPIs(void); +#ifdef __cplusplus +} +#endif #endif /* EGLDRIVER_INCLUDED */