egl: move alloc & init out of _eglBuiltInDriver{DRI2,Haiku}
authorEric Engestrom <eric@engestrom.ch>
Mon, 25 Sep 2017 21:35:24 +0000 (22:35 +0100)
committerEric Engestrom <eric.engestrom@intel.com>
Wed, 31 Oct 2018 11:01:54 +0000 (11:01 +0000)
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 <eric@engestrom.ch>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/haiku/egl_haiku.cpp
src/egl/main/README.txt
src/egl/main/egldriver.c
src/egl/main/egldriver.h

index 8b482c90be0e04668fd554e571be48f0fa366d04..e38459de0b138a764d7897f7f2a40edc305f1c1d 100644 (file)
@@ -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;
 }
index 287760661e5c4e3402f1fd193eff351ea7c9e1e9..590e43f00fb96b051fb4d610e4761280425fe058 100644 (file)
@@ -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;
 }
index 1af995997291e301677c388d4b4b4a8d38b715e4..9b5fd410618913f8bdcbe6ef56bac87cf0527a42 100644 (file)
@@ -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).
 
index 218b3daef25bf476c601d074183178cb835c647d..3fe37f1641c8ef1699f2e21431dc84a5f2776336 100644 (file)
@@ -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);
 
index 6ab667c4e699fdfa295f5fb21b581427bff26af2..ba12a060cab7f7c6c22311418fb0f3e6209c2b20 100644 (file)
@@ -81,8 +81,8 @@ struct _egl_driver
 };
 
 
-extern _EGLDriver*
-_eglBuiltInDriver(void);
+extern void
+_eglInitDriver(_EGLDriver *driver);
 
 
 extern _EGLDriver *