From cb0980e69aa921af7086e5d00a547735bc3229e2 Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Mon, 25 Sep 2017 22:35:24 +0100 Subject: [PATCH] egl: move alloc & init out of _eglBuiltInDriver{DRI2,Haiku} This is a revert of Marek's 84f3afc2e122cb418573 revert, with a missing line added back. I failed a rebase and dropped that crucial line, and didn't do a runtime test after my rebase, and as a result broke EGL for everyone. This commit has been tested by Intel's CI and I re-read it once more, so it should be good this time. -- Note: dropping the EGL_BAD_ALLOC in egl_haiku because it's overwritten by the EGL_NOT_INITIALIZED in eglInitialize(). Signed-off-by: Eric Engestrom Reviewed-by: Emil Velikov --- src/egl/drivers/dri2/egl_dri2.c | 13 +++---------- src/egl/drivers/haiku/egl_haiku.cpp | 16 +++------------- src/egl/main/README.txt | 9 ++++----- src/egl/main/egldriver.c | 9 +++++++-- src/egl/main/egldriver.h | 4 ++-- 5 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 8b482c90be0..e38459de0b1 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -3255,16 +3255,11 @@ dri2_interop_export_object(_EGLDisplay *dpy, _EGLContext *ctx, /** * This is the main entrypoint into the driver, called by libEGL. - * Create a new _EGLDriver object and init its dispatch table. + * Gets an _EGLDriver object and init its dispatch table. */ -_EGLDriver * -_eglBuiltInDriver(void) +void +_eglInitDriver(_EGLDriver *dri2_drv) { - _EGLDriver *dri2_drv = calloc(1, sizeof *dri2_drv); - if (!dri2_drv) - return NULL; - - _eglInitDriverFallbacks(dri2_drv); dri2_drv->API.Initialize = dri2_initialize; dri2_drv->API.Terminate = dri2_terminate; dri2_drv->API.CreateContext = dri2_create_context; @@ -3316,6 +3311,4 @@ _eglBuiltInDriver(void) dri2_drv->API.SetBlobCacheFuncsANDROID = dri2_set_blob_cache_funcs; dri2_drv->Name = "DRI2"; - - return dri2_drv; } diff --git a/src/egl/drivers/haiku/egl_haiku.cpp b/src/egl/drivers/haiku/egl_haiku.cpp index 287760661e5..590e43f00fb 100644 --- a/src/egl/drivers/haiku/egl_haiku.cpp +++ b/src/egl/drivers/haiku/egl_haiku.cpp @@ -305,22 +305,14 @@ haiku_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) /** * This is the main entrypoint into the driver, called by libEGL. - * Create a new _EGLDriver object and init its dispatch table. + * Gets an _EGLDriver object and init its dispatch table. */ extern "C" -_EGLDriver* -_eglBuiltInDriver(void) +void +_eglInitDriver(_EGLDriver *driver) { CALLED(); - _EGLDriver* driver; - driver = (_EGLDriver*) calloc(1, sizeof(*driver)); - if (!driver) { - _eglError(EGL_BAD_ALLOC, "_eglBuiltInDriverHaiku"); - return NULL; - } - - _eglInitDriverFallbacks(driver); driver->API.Initialize = init_haiku; driver->API.Terminate = haiku_terminate; driver->API.CreateContext = haiku_create_context; @@ -336,6 +328,4 @@ _eglBuiltInDriver(void) driver->Name = "Haiku"; TRACE("API Calls defined\n"); - - return driver; } diff --git a/src/egl/main/README.txt b/src/egl/main/README.txt index 1af99599729..9b5fd410618 100644 --- a/src/egl/main/README.txt +++ b/src/egl/main/README.txt @@ -19,13 +19,12 @@ Bootstrapping: When the apps calls eglInitialize() a device driver is selected and loaded (look for _eglAddDrivers() and _eglLoadModule() in egldriver.c). -The built-in driver's entry point function is then called. This driver function -allocates, initializes and returns a new _EGLDriver object (usually a -subclass of that type). +The built-in driver's entry point function is then called and given +a freshly allocated and initialised _EGLDriver, with default fallback +entrypoints set. As part of initialization, the dispatch table in _EGLDriver->API must be -populated with all the EGL entrypoints. Typically, _eglInitDriverFallbacks() -can be used to plug in default/fallback functions. Some functions like +populated with all the EGL entrypoints. Some functions like driver->API.Initialize and driver->API.Terminate _must_ be implemented with driver-specific code (no default/fallback function is possible). diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c index 218b3daef25..3fe37f1641c 100644 --- a/src/egl/main/egldriver.c +++ b/src/egl/main/egldriver.c @@ -54,8 +54,13 @@ _eglGetDriver(void) { mtx_lock(&_eglModuleMutex); - if (!_eglDriver) - _eglDriver = _eglBuiltInDriver(); + if (!_eglDriver) { + _eglDriver = calloc(1, sizeof(*_eglDriver)); + if (!_eglDriver) + return NULL; + _eglInitDriverFallbacks(_eglDriver); + _eglInitDriver(_eglDriver); + } mtx_unlock(&_eglModuleMutex); diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h index 6ab667c4e69..ba12a060cab 100644 --- a/src/egl/main/egldriver.h +++ b/src/egl/main/egldriver.h @@ -81,8 +81,8 @@ struct _egl_driver }; -extern _EGLDriver* -_eglBuiltInDriver(void); +extern void +_eglInitDriver(_EGLDriver *driver); extern _EGLDriver * -- 2.30.2