/**
* This is the main entrypoint into the driver, called by libEGL.
- * Gets an _EGLDriver object and init its dispatch table.
+ * Create a new _EGLDriver object and init its dispatch table.
*/
-void
-_eglInitDriver(_EGLDriver *dri2_drv)
+_EGLDriver *
+_eglBuiltInDriver(void)
{
+ _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;
dri2_drv->API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd;
dri2_drv->Name = "DRI2";
+
+ return dri2_drv;
}
/**
* This is the main entrypoint into the driver, called by libEGL.
- * Gets an _EGLDriver object and init its dispatch table.
+ * Create a new _EGLDriver object and init its dispatch table.
*/
extern "C"
-void
-_eglInitDriver(_EGLDriver *driver)
+_EGLDriver*
+_eglBuiltInDriver(void)
{
CALLED();
+ _EGLDriver* driver = 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;
driver->Name = "Haiku";
TRACE("API Calls defined\n");
+
+ return driver;
}
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 and given
-a freshly allocated and initialised _EGLDriver, with default fallback
-entrypoints set.
+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).
As part of initialization, the dispatch table in _EGLDriver->API must be
-populated with all the EGL entrypoints. Some functions like
+populated with all the EGL entrypoints. Typically, _eglInitDriverFallbacks()
+can be used to plug in default/fallback functions. Some functions like
driver->API.Initialize and driver->API.Terminate _must_ be implemented
with driver-specific code (no default/fallback function is possible).
{
mtx_lock(&_eglModuleMutex);
- if (!_eglDriver) {
- _eglDriver = calloc(1, sizeof(*_eglDriver));
- if (!_eglDriver)
- return NULL;
- _eglInitDriver(_eglDriver);
- }
+ if (!_eglDriver)
+ _eglDriver = _eglBuiltInDriver();
mtx_unlock(&_eglModuleMutex);
};
-extern void
-_eglInitDriver(_EGLDriver *driver);
+extern _EGLDriver*
+_eglBuiltInDriver(void);
extern _EGLDriver *