#include "c11/threads.h"
#include "util/macros.h"
-#include "eglapi.h"
#include "egldefines.h"
#include "eglglobals.h"
#include "eglcontext.h"
};
-static inline _EGLDriver *
+static inline const _EGLDriver *
_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
{
if (!disp) {
}
-static inline _EGLDriver *
+static inline const _EGLDriver *
_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
{
- _EGLDriver *drv = _eglCheckDisplay(disp, msg);
+ const _EGLDriver *drv = _eglCheckDisplay(disp, msg);
if (!drv)
return NULL;
if (!surf) {
}
-static inline _EGLDriver *
+static inline const _EGLDriver *
_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
{
- _EGLDriver *drv = _eglCheckDisplay(disp, msg);
+ const _EGLDriver *drv = _eglCheckDisplay(disp, msg);
if (!drv)
return NULL;
if (!context) {
}
-static inline _EGLDriver *
+static inline const _EGLDriver *
_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
{
- _EGLDriver *drv = _eglCheckDisplay(disp, msg);
+ const _EGLDriver *drv = _eglCheckDisplay(disp, msg);
if (!drv)
return NULL;
if (!conf) {
}
-static inline _EGLDriver *
+static inline const _EGLDriver *
_eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg)
{
- _EGLDriver *drv = _eglCheckDisplay(disp, msg);
+ const _EGLDriver *drv = _eglCheckDisplay(disp, msg);
if (!drv)
return NULL;
if (!s) {
attrib_list);
break;
#endif
-#ifdef HAVE_SURFACELESS_PLATFORM
case EGL_PLATFORM_SURFACELESS_MESA:
disp = _eglGetSurfacelessDisplay(native_display, attrib_list);
break;
+#ifdef HAVE_ANDROID_PLATFORM
+ case EGL_PLATFORM_ANDROID_KHR:
+ disp = _eglGetAndroidDisplay(native_display, attrib_list);
+ break;
#endif
case EGL_PLATFORM_DEVICE_EXT:
disp = _eglGetDeviceDisplay(native_display, attrib_list);
disp->Extensions.KHR_gl_colorspace &&
disp->Extensions.KHR_surfaceless_context)
disp->Version = 15;
+
+ /* For Android P and below limit the EGL version to 1.4 */
+#if defined(ANDROID) && ANDROID_API_LEVEL <= 28
+ disp->Version = 14;
+#endif
}
/**
RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
if (!disp->Initialized) {
- if (!_eglMatchDriver(disp))
+ if (!_eglInitializeDisplay(disp))
RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
/* limit to APIs supported by core */
RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
if (disp->Initialized) {
- _EGLDriver *drv = disp->Driver;
-
- drv->API.Terminate(drv, disp);
+ disp->Driver->Terminate(disp);
/* do not reset disp->Driver */
disp->ClientAPIsString[0] = 0;
disp->Initialized = EGL_FALSE;
+
+ /* Reset blob cache funcs on terminate. */
+ disp->BlobCacheSet = NULL;
+ disp->BlobCacheGet = NULL;
}
RETURN_EGL_SUCCESS(disp, EGL_TRUE);
eglQueryString(EGLDisplay dpy, EGLint name)
{
_EGLDisplay *disp;
- _EGLDriver *drv;
+ const _EGLDriver *drv;
+#if !USE_LIBGLVND
if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) {
- const char *ret = _eglGetClientExtensionString();
- if (ret != NULL)
- RETURN_EGL_SUCCESS(NULL, ret);
- else
- RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL);
+ RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString);
}
+#endif
disp = _eglLockDisplay(dpy);
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, NULL);
EGLint config_size, EGLint *num_config)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
EGLint config_size, EGLint *num_config)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLConfig *conf = _eglLookupConfig(config, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLConfig *conf = _eglLookupConfig(config, disp);
_EGLContext *share = _eglLookupContext(share_list, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLContext *context;
EGLContext ret;
if (!share && share_list != EGL_NO_CONTEXT)
RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
- context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
+ context = drv->CreateContext(disp, conf, share, attrib_list);
ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
RETURN_EGL_EVAL(disp, ret);
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLContext *context = _eglLookupContext(ctx, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
_EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
_eglUnlinkContext(context);
- ret = drv->API.DestroyContext(drv, disp, context);
+ ret = drv->DestroyContext(disp, context);
RETURN_EGL_EVAL(disp, ret);
}
_EGLContext *context = _eglLookupContext(ctx, disp);
_EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
_EGLSurface *read_surf = _eglLookupSurface(read, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
if (read_surf && read_surf->Lost)
RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_FALSE);
- ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
+ ret = drv->MakeCurrent(disp, draw_surf, read_surf, context);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLContext *context = _eglLookupContext(ctx, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
void *native_window, const EGLint *attrib_list)
{
_EGLConfig *conf = _eglLookupConfig(config, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLSurface *surf;
EGLSurface ret;
if (_eglNativeSurfaceAlreadyUsed(disp, native_window))
RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
- surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window,
- attrib_list);
+ surf = drv->CreateWindowSurface(disp, conf, native_window, attrib_list);
ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
RETURN_EGL_EVAL(disp, ret);
void *native_pixmap, const EGLint *attrib_list)
{
_EGLConfig *conf = _eglLookupConfig(config, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLSurface *surf;
EGLSurface ret;
if (_eglNativeSurfaceAlreadyUsed(disp, native_pixmap))
RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
- surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap,
- attrib_list);
+ surf = drv->CreatePixmapSurface(disp, conf, native_pixmap, attrib_list);
ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
RETURN_EGL_EVAL(disp, ret);
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLConfig *conf = _eglLookupConfig(config, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLSurface *surf;
EGLSurface ret;
if ((conf->SurfaceType & EGL_PBUFFER_BIT) == 0)
RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE);
- surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
+ surf = drv->CreatePbufferSurface(disp, conf, attrib_list);
ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
RETURN_EGL_EVAL(disp, ret);
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
_eglUnlinkSurface(surf);
- ret = drv->API.DestroySurface(drv, disp, surf);
+ ret = drv->DestroySurface(disp, surf);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
- if (drv->API.QuerySurface)
- ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
+ if (drv->QuerySurface)
+ ret = drv->QuerySurface(disp, surf, attribute, value);
else
- ret = _eglQuerySurface(drv, disp, surf, attribute, value);
+ ret = _eglQuerySurface(disp, surf, attribute, value);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
- ret = drv->API.BindTexImage(drv, disp, surf, buffer);
+ ret = drv->BindTexImage(disp, surf, buffer);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
- ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
+ ret = drv->ReleaseTexImage(disp, surf, buffer);
RETURN_EGL_EVAL(disp, ret);
}
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLContext *ctx = _eglGetCurrentContext();
_EGLSurface *surf = ctx ? ctx->DrawSurface : NULL;
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
surf->Config->MaxSwapInterval);
if (surf->SwapInterval != interval) {
- if (drv->API.SwapInterval)
- ret = drv->API.SwapInterval(drv, disp, surf, interval);
+ if (drv->SwapInterval)
+ ret = drv->SwapInterval(disp, surf, interval);
else
- ret = _eglSwapInterval(drv, disp, surf, interval);
+ ret = _eglSwapInterval(disp, surf, interval);
}
else {
ret = EGL_TRUE;
_EGLContext *ctx = _eglGetCurrentContext();
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
if (surf->Lost)
RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_FALSE);
- ret = drv->API.SwapBuffers(drv, disp, surf);
+ ret = drv->SwapBuffers(disp, surf);
/* EGL_KHR_partial_update
* Frame boundary successfully reached,
static EGLBoolean
_eglSwapBuffersWithDamageCommon(_EGLDisplay *disp, _EGLSurface *surf,
- EGLint *rects, EGLint n_rects)
+ const EGLint *rects, EGLint n_rects)
{
_EGLContext *ctx = _eglGetCurrentContext();
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
if ((n_rects > 0 && rects == NULL) || n_rects < 0)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.SwapBuffersWithDamageEXT(drv, disp, surf, rects, n_rects);
+ ret = drv->SwapBuffersWithDamageEXT(disp, surf, rects, n_rects);
/* EGL_KHR_partial_update
* Frame boundary successfully reached,
static EGLBoolean EGLAPIENTRY
eglSwapBuffersWithDamageEXT(EGLDisplay dpy, EGLSurface surface,
- EGLint *rects, EGLint n_rects)
+ const EGLint *rects, EGLint n_rects)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
static EGLBoolean EGLAPIENTRY
eglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface,
- EGLint *rects, EGLint n_rects)
+ const EGLint *rects, EGLint n_rects)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
_EGLContext *ctx = _eglGetCurrentContext();
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
RETURN_EGL_ERROR(disp, EGL_BAD_ACCESS, EGL_FALSE);
_eglSetDamageRegionKHRClampRects(disp, surf, rects, n_rects);
- ret = drv->API.SetDamageRegion(drv, disp, surf, rects, n_rects);
+ ret = drv->SetDamageRegion(disp, surf, rects, n_rects);
if (ret)
surf->SetDamageRegionCalled = EGL_TRUE;
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
void *native_pixmap_ptr;
native_pixmap_ptr = (void*) target;
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
- ret = drv->API.CopyBuffers(drv, disp, surf, native_pixmap_ptr);
+ ret = drv->CopyBuffers(disp, surf, native_pixmap_ptr);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLContext *ctx = _eglGetCurrentContext();
_EGLDisplay *disp;
- _EGLDriver *drv;
EGLBoolean ret;
if (!ctx)
/* a valid current context implies an initialized current display */
assert(disp->Initialized);
- drv = disp->Driver;
- ret = drv->API.WaitClient(drv, disp, ctx);
+ ret = disp->Driver->WaitClient(disp, ctx);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLContext *ctx = _eglGetCurrentContext();
_EGLDisplay *disp;
- _EGLDriver *drv;
EGLBoolean ret;
if (!ctx)
/* a valid current context implies an initialized current display */
assert(disp->Initialized);
- drv = disp->Driver;
- ret = drv->API.WaitNative(drv, disp, engine);
+ ret = disp->Driver->WaitNative(engine);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLConfig *conf = _eglLookupConfig(config, disp);
- _EGLDriver *drv;
- _EGLSurface *surf;
- EGLSurface ret;
+ const _EGLDriver *drv;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
- surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
- conf, attrib_list);
- ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
-
- RETURN_EGL_EVAL(disp, ret);
+ /* OpenVG is not supported */
+ RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
}
if (ctx) {
_EGLDisplay *disp = ctx->Resource.Display;
- _EGLDriver *drv;
mtx_lock(&disp->Mutex);
- drv = disp->Driver;
- (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
+ (void) disp->Driver->MakeCurrent(disp, NULL, NULL, NULL);
mtx_unlock(&disp->Mutex);
}
}
EGLClientBuffer buffer, const EGLint *attr_list)
{
_EGLContext *context = _eglLookupContext(ctx, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLImage *img;
EGLImage ret;
if (ctx != EGL_NO_CONTEXT && target == EGL_LINUX_DMA_BUF_EXT)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
- img = drv->API.CreateImageKHR(drv, disp, context, target,
- buffer, attr_list);
+ img = drv->CreateImageKHR(disp, context, target, buffer, attr_list);
ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
RETURN_EGL_EVAL(disp, ret);
static EGLBoolean
_eglDestroyImageCommon(_EGLDisplay *disp, _EGLImage *img)
{
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
_eglUnlinkImage(img);
- ret = drv->API.DestroyImageKHR(drv, disp, img);
+ ret = drv->DestroyImageKHR(disp, img);
RETURN_EGL_EVAL(disp, ret);
}
EGLenum invalid_type_error)
{
_EGLContext *ctx = _eglGetCurrentContext();
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLSync *sync;
EGLSync ret;
(type == EGL_SYNC_FENCE_KHR || type == EGL_SYNC_NATIVE_FENCE_ANDROID))
RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
- /* return an error if the client API doesn't support GL_OES_EGL_sync */
+ /* return an error if the client API doesn't support GL_[OES|MESA]_EGL_sync. */
if (ctx && (ctx->Resource.Display != disp ||
- ctx->ClientAPI != EGL_OPENGL_ES_API))
+ (ctx->ClientAPI != EGL_OPENGL_ES_API &&
+ ctx->ClientAPI != EGL_OPENGL_API)))
RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
switch (type) {
RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
}
- sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
+ sync = drv->CreateSyncKHR(disp, type, attrib_list);
ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
RETURN_EGL_EVAL(disp, ret);
static EGLBoolean
_eglDestroySync(_EGLDisplay *disp, _EGLSync *s)
{
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
disp->Extensions.ANDROID_native_fence_sync);
_eglUnlinkSync(s);
- ret = drv->API.DestroySyncKHR(drv, disp, s);
+ ret = drv->DestroySyncKHR(disp, s);
RETURN_EGL_EVAL(disp, ret);
}
_eglClientWaitSyncCommon(_EGLDisplay *disp, EGLDisplay dpy,
_EGLSync *s, EGLint flags, EGLTime timeout)
{
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLint ret;
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
if (s->Type == EGL_SYNC_REUSABLE_KHR)
_eglUnlockDisplay(dpy);
- ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
+ ret = drv->ClientWaitSyncKHR(disp, s, flags, timeout);
/*
* 'disp' is already unlocked for reusable sync type,
_eglWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags)
{
_EGLContext *ctx = _eglGetCurrentContext();
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLint ret;
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
assert(disp->Extensions.KHR_wait_sync);
- /* return an error if the client API doesn't support GL_OES_EGL_sync */
- if (ctx == EGL_NO_CONTEXT || ctx->ClientAPI != EGL_OPENGL_ES_API)
+ /* return an error if the client API doesn't support GL_[OES|MESA]_EGL_sync. */
+ if (ctx == EGL_NO_CONTEXT ||
+ (ctx->ClientAPI != EGL_OPENGL_ES_API &&
+ ctx->ClientAPI != EGL_OPENGL_API))
RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
/* the API doesn't allow any flags yet */
if (flags != 0)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.WaitSyncKHR(drv, disp, s);
+ ret = drv->WaitSyncKHR(disp, s);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSync *s = _eglLookupSync(sync, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
assert(disp->Extensions.KHR_reusable_sync);
- ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
+ ret = drv->SignalSyncKHR(disp, s, mode);
RETURN_EGL_EVAL(disp, ret);
}
static EGLBoolean
_eglGetSyncAttribCommon(_EGLDisplay *disp, _EGLSync *s, EGLint attribute, EGLAttrib *value)
{
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSync *s = _eglLookupSync(sync, disp);
_EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
+
+ if (!value)
+ RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
+
return _eglGetSyncAttribCommon(disp, s, attribute, value);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSync *s = _eglLookupSync(sync, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
_EGL_CHECK_SYNC(disp, s, EGL_NO_NATIVE_FENCE_FD_ANDROID, drv);
assert(disp->Extensions.ANDROID_native_fence_sync);
- ret = drv->API.DupNativeFenceFDANDROID(drv, disp, s);
+ ret = drv->DupNativeFenceFDANDROID(disp, s);
RETURN_EGL_EVAL(disp, ret);
}
_EGLContext *ctx = _eglGetCurrentContext();
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
surf != ctx->DrawSurface)
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
- ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
+ ret = drv->SwapBuffersRegionNOK(disp, surf, numRects, rects);
RETURN_EGL_EVAL(disp, ret);
}
eglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLImage *img;
EGLImage ret;
if (!disp->Extensions.MESA_drm_image)
RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
- img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
+ img = drv->CreateDRMImageMESA(disp, attr_list);
ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
RETURN_EGL_EVAL(disp, ret);
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLImage *img = _eglLookupImage(image, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
if (!img)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.ExportDRMImageMESA(drv, disp, img, name, handle, stride);
+ ret = drv->ExportDRMImageMESA(disp, img, name, handle, stride);
RETURN_EGL_EVAL(disp, ret);
}
eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
if (!display)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.BindWaylandDisplayWL(drv, disp, display);
+ ret = drv->BindWaylandDisplayWL(drv, disp, display);
RETURN_EGL_EVAL(disp, ret);
}
eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
if (!display)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.UnbindWaylandDisplayWL(drv, disp, display);
+ ret = drv->UnbindWaylandDisplayWL(drv, disp, display);
RETURN_EGL_EVAL(disp, ret);
}
EGLint attribute, EGLint *value)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
if (!buffer)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.QueryWaylandBufferWL(drv, disp, buffer, attribute, value);
+ ret = drv->QueryWaylandBufferWL(drv, disp, buffer, attribute, value);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLImage *img;
- _EGLDriver *drv;
+ const _EGLDriver *drv;
struct wl_buffer *ret;
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
if (!img)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL);
- ret = drv->API.CreateWaylandBufferFromImageWL(drv, disp, img);
+ ret = drv->CreateWaylandBufferFromImageWL(drv, disp, img);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
if (!disp->Extensions.NV_post_sub_buffer)
RETURN_EGL_EVAL(disp, EGL_FALSE);
- ret = drv->API.PostSubBufferNV(drv, disp, surf, x, y, width, height);
+ ret = drv->PostSubBufferNV(drv, disp, surf, x, y, width, height);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLSurface *surf = _eglLookupSurface(surface, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
if (!ust || !msc || !sbc)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc);
+ ret = drv->GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc);
RETURN_EGL_EVAL(disp, ret);
}
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLImage *img = _eglLookupImage(image, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
if (!img)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.ExportDMABUFImageQueryMESA(drv, disp, img, fourcc, nplanes,
+ ret = drv->ExportDMABUFImageQueryMESA(drv, disp, img, fourcc, nplanes,
modifiers);
RETURN_EGL_EVAL(disp, ret);
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLImage *img = _eglLookupImage(image, disp);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
if (!img)
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
- ret = drv->API.ExportDMABUFImageMESA(drv, disp, img, fds, strides, offsets);
+ ret = drv->ExportDMABUFImageMESA(drv, disp, img, fds, strides, offsets);
RETURN_EGL_EVAL(disp, ret);
}
EGLint *formats, EGLint *num_formats)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_FALSE);
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
- ret = drv->API.QueryDmaBufFormatsEXT(drv, disp, max_formats, formats,
+ ret = drv->QueryDmaBufFormatsEXT(drv, disp, max_formats, formats,
num_formats);
RETURN_EGL_EVAL(disp, ret);
EGLint *num_modifiers)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
EGLBoolean ret;
_EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_FALSE);
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
- ret = drv->API.QueryDmaBufModifiersEXT(drv, disp, format, max_modifiers,
+ ret = drv->QueryDmaBufModifiersEXT(drv, disp, format, max_modifiers,
modifiers, external_only,
num_modifiers);
return;
}
- _EGLDriver *drv = _eglCheckDisplay(disp, __func__);
+ const _EGLDriver *drv = _eglCheckDisplay(disp, __func__);
if (!drv) {
if (disp)
_eglUnlockDisplay(disp);
disp->BlobCacheSet = set;
disp->BlobCacheGet = get;
- drv->API.SetBlobCacheFuncsANDROID(drv, disp, set, get);
+ drv->SetBlobCacheFuncsANDROID(drv, disp, set, get);
_eglUnlockDisplay(disp);
}
EGLAttrib *value)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_FALSE);
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
eglGetDisplayDriverConfig(EGLDisplay dpy)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
char *ret;
_EGL_FUNC_START(disp, EGL_NONE, NULL, NULL);
assert(disp->Extensions.MESA_query_driver);
- ret = drv->API.QueryDriverConfig(disp);
+ ret = drv->QueryDriverConfig(disp);
RETURN_EGL_EVAL(disp, ret);
}
eglGetDisplayDriverName(EGLDisplay dpy)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
- _EGLDriver *drv;
+ const _EGLDriver *drv;
const char *ret;
_EGL_FUNC_START(disp, EGL_NONE, NULL, NULL);
assert(disp->Extensions.MESA_query_driver);
- ret = drv->API.QueryDriverName(disp);
+ ret = drv->QueryDriverName(disp);
RETURN_EGL_EVAL(disp, ret);
}
static int
_eglLockDisplayInterop(EGLDisplay dpy, EGLContext context,
- _EGLDisplay **disp, _EGLDriver **drv,
+ _EGLDisplay **disp, const _EGLDriver **drv,
_EGLContext **ctx)
{
struct mesa_glinterop_device_info *out)
{
_EGLDisplay *disp;
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLContext *ctx;
int ret;
if (ret != MESA_GLINTEROP_SUCCESS)
return ret;
- if (drv->API.GLInteropQueryDeviceInfo)
- ret = drv->API.GLInteropQueryDeviceInfo(disp, ctx, out);
+ if (drv->GLInteropQueryDeviceInfo)
+ ret = drv->GLInteropQueryDeviceInfo(disp, ctx, out);
else
ret = MESA_GLINTEROP_UNSUPPORTED;
struct mesa_glinterop_export_out *out)
{
_EGLDisplay *disp;
- _EGLDriver *drv;
+ const _EGLDriver *drv;
_EGLContext *ctx;
int ret;
if (ret != MESA_GLINTEROP_SUCCESS)
return ret;
- if (drv->API.GLInteropExportObject)
- ret = drv->API.GLInteropExportObject(disp, ctx, in, out);
+ if (drv->GLInteropExportObject)
+ ret = drv->GLInteropExportObject(disp, ctx, in, out);
else
ret = MESA_GLINTEROP_UNSUPPORTED;