static __DRIscreen * driCreateNewScreen(int scrn, const __DRIextension **extensions, const __DRIconfig ***driver_configs, void *data) { static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; psp = CALLOC_STRUCT(__DRIscreenRec); if (!psp) return NULL; setupLoaderExtensions(psp, extensions); psp->loaderPrivate = data; psp->extensions = emptyExtensionList; psp->fd = -1; psp->myNum = scrn; *driver_configs = driDriverAPI.InitScreen(psp); if (*driver_configs == NULL) { FREE(psp); return NULL; } return psp; }
/** * DRI2 */ static __DRIscreen * dri2CreateNewScreen(int scrn, int fd, const __DRIextension **extensions, const __DRIconfig ***driver_configs, void *data) { static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; drmVersionPtr version; if (driDriverAPI.InitScreen2 == NULL) return NULL; psp = calloc(1, sizeof(*psp)); if (!psp) return NULL; setupLoaderExtensions(psp, extensions); version = drmGetVersion(fd); if (version) { psp->drm_version.major = version->version_major; psp->drm_version.minor = version->version_minor; psp->drm_version.patch = version->version_patchlevel; drmFreeVersion(version); } psp->extensions = emptyExtensionList; psp->fd = fd; psp->myNum = scrn; psp->dri2.enabled = GL_TRUE; psp->DriverAPI = driDriverAPI; psp->api_mask = (1 << __DRI_API_OPENGL); *driver_configs = driDriverAPI.InitScreen2(psp); if (*driver_configs == NULL) { free(psp); return NULL; } psp->DriverAPI = driDriverAPI; psp->loaderPrivate = data; driParseOptionInfo(&psp->optionInfo, __dri2ConfigOptions, __dri2NConfigOptions); driParseConfigFiles(&psp->optionCache, &psp->optionInfo, psp->myNum, "dri2"); return psp; }
/** * This is the first entrypoint in the driver called by the DRI driver loader * after dlopen()ing it. * * It's used to create global state for the driver across contexts on the same * Display. */ static __DRIscreen * driCreateNewScreen2(int scrn, int fd, const __DRIextension **extensions, const __DRIextension **driver_extensions, const __DRIconfig ***driver_configs, void *data) { static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; psp = calloc(1, sizeof(*psp)); if (!psp) return NULL; /* By default, use the global driDriverAPI symbol (non-megadrivers). */ psp->driver = globalDriverAPI; /* If the driver exposes its vtable through its extensions list * (megadrivers), use that instead. */ if (driver_extensions) { for (int i = 0; driver_extensions[i]; i++) { if (strcmp(driver_extensions[i]->name, __DRI_DRIVER_VTABLE) == 0) { psp->driver = ((__DRIDriverVtableExtension *)driver_extensions[i])->vtable; } } } setupLoaderExtensions(psp, extensions); psp->loaderPrivate = data; psp->extensions = emptyExtensionList; psp->fd = fd; psp->myNum = scrn; *driver_configs = psp->driver->InitScreen(psp); if (*driver_configs == NULL) { free(psp); return NULL; } struct gl_constants consts = { 0 }; gl_api api; unsigned version; api = API_OPENGLES2; if (_mesa_override_gl_version_contextless(&consts, &api, &version)) psp->max_gl_es2_version = version; api = API_OPENGL_COMPAT; if (_mesa_override_gl_version_contextless(&consts, &api, &version)) { if (api == API_OPENGL_CORE) { psp->max_gl_core_version = version; } else { psp->max_gl_compat_version = version; } } psp->api_mask = 0; if (psp->max_gl_compat_version > 0) psp->api_mask |= (1 << __DRI_API_OPENGL); if (psp->max_gl_core_version > 0) psp->api_mask |= (1 << __DRI_API_OPENGL_CORE); if (psp->max_gl_es1_version > 0) psp->api_mask |= (1 << __DRI_API_GLES); if (psp->max_gl_es2_version > 0) psp->api_mask |= (1 << __DRI_API_GLES2); if (psp->max_gl_es2_version >= 30) psp->api_mask |= (1 << __DRI_API_GLES3); driParseOptionInfo(&psp->optionInfo, __dri2ConfigOptions); driParseConfigFiles(&psp->optionCache, &psp->optionInfo, psp->myNum, "dri2"); return psp; }
/** * This is the first entrypoint in the driver called by the DRI driver loader * after dlopen()ing it. * * It's used to create global state for the driver across contexts on the same * Display. */ static __DRIscreen * driCreateNewScreen2(int scrn, int fd, const __DRIextension **extensions, const __DRIextension **driver_extensions, const __DRIconfig ***driver_configs, void *data) { static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; psp = calloc(1, sizeof(*psp)); if (!psp) return NULL; /* By default, use the global driDriverAPI symbol (non-megadrivers). */ psp->driver = globalDriverAPI; /* If the driver exposes its vtable through its extensions list * (megadrivers), use that instead. */ if (driver_extensions) { for (int i = 0; driver_extensions[i]; i++) { if (strcmp(driver_extensions[i]->name, __DRI_DRIVER_VTABLE) == 0) { psp->driver = ((__DRIDriverVtableExtension *)driver_extensions[i])->vtable; } } } setupLoaderExtensions(psp, extensions); #ifndef __NOT_HAVE_DRM_H if (fd != -1) { drmVersionPtr version = drmGetVersion(fd); if (version) { psp->drm_version.major = version->version_major; psp->drm_version.minor = version->version_minor; psp->drm_version.patch = version->version_patchlevel; drmFreeVersion(version); } } #endif psp->loaderPrivate = data; psp->extensions = emptyExtensionList; psp->fd = fd; psp->myNum = scrn; *driver_configs = psp->driver->InitScreen(psp); if (*driver_configs == NULL) { free(psp); return NULL; } int gl_version_override = _mesa_get_gl_version_override(); if (gl_version_override >= 31) { psp->max_gl_core_version = MAX2(psp->max_gl_core_version, gl_version_override); } else { psp->max_gl_compat_version = MAX2(psp->max_gl_compat_version, gl_version_override); } psp->api_mask = (1 << __DRI_API_OPENGL); if (psp->max_gl_core_version > 0) psp->api_mask |= (1 << __DRI_API_OPENGL_CORE); if (psp->max_gl_es1_version > 0) psp->api_mask |= (1 << __DRI_API_GLES); if (psp->max_gl_es2_version > 0) psp->api_mask |= (1 << __DRI_API_GLES2); if (psp->max_gl_es2_version >= 30) psp->api_mask |= (1 << __DRI_API_GLES3); driParseOptionInfo(&psp->optionInfo, __dri2ConfigOptions); driParseConfigFiles(&psp->optionCache, &psp->optionInfo, psp->myNum, "dri2"); return psp; }
/** * DRI2 */ static __DRIscreen * dri2CreateNewScreen(int scrn, int fd, unsigned int sarea_handle, const __DRIextension **extensions, const __DRIconfig ***driver_configs, void *data) { #ifdef TTM_API static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; unsigned int *p; drmVersionPtr version; if (driDriverAPI.InitScreen2 == NULL) return NULL; psp = _mesa_malloc(sizeof(*psp)); if (!psp) return NULL; setupLoaderExtensions(psp, extensions); version = drmGetVersion(fd); if (version) { psp->drm_version.major = version->version_major; psp->drm_version.minor = version->version_minor; psp->drm_version.patch = version->version_patchlevel; drmFreeVersion(version); } psp->extensions = emptyExtensionList; psp->fd = fd; psp->myNum = scrn; psp->dri2.enabled = GL_TRUE; if (drmBOReference(psp->fd, sarea_handle, &psp->dri2.sareaBO)) { fprintf(stderr, "Failed to reference DRI2 sarea BO\n"); _mesa_free(psp); return NULL; } if (drmBOMap(psp->fd, &psp->dri2.sareaBO, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &psp->dri2.sarea)) { drmBOUnreference(psp->fd, &psp->dri2.sareaBO); _mesa_free(psp); return NULL; } p = psp->dri2.sarea; while (DRI2_SAREA_BLOCK_TYPE(*p)) { switch (DRI2_SAREA_BLOCK_TYPE(*p)) { case DRI2_SAREA_BLOCK_LOCK: psp->dri2.lock = (__DRILock *) p; break; case DRI2_SAREA_BLOCK_EVENT_BUFFER: psp->dri2.buffer = (__DRIEventBuffer *) p; break; } p = DRI2_SAREA_BLOCK_NEXT(p); } psp->lock = (drmLock *) &psp->dri2.lock->lock; psp->DriverAPI = driDriverAPI; *driver_configs = driDriverAPI.InitScreen2(psp); if (*driver_configs == NULL) { drmBOUnmap(psp->fd, &psp->dri2.sareaBO); drmBOUnreference(psp->fd, &psp->dri2.sareaBO); _mesa_free(psp); return NULL; } psp->DriverAPI = driDriverAPI; return psp; #else return NULL; #endif }
/** * This is the bootstrap function for the driver. libGL supplies all of the * requisite information about the system, and the driver initializes itself. * This routine also fills in the linked list pointed to by \c driver_modes * with the \c __GLcontextModes that the driver can support for windows or * pbuffers. * * For legacy DRI. * * \param scrn Index of the screen * \param ddx_version Version of the 2D DDX. This may not be meaningful for * all drivers. * \param dri_version Version of the "server-side" DRI. * \param drm_version Version of the kernel DRM. * \param frame_buffer Data describing the location and layout of the * framebuffer. * \param pSAREA Pointer to the SAREA. * \param fd Device handle for the DRM. * \param extensions ?? * \param driver_modes Returns modes supported by the driver * \param loaderPrivate ?? * * \note There is no need to check the minimum API version in this * function. Since the name of this function is versioned, it is * impossible for a loader that is too old to even load this driver. */ static __DRIscreen * driCreateNewScreen(int scrn, const __DRIversion *ddx_version, const __DRIversion *dri_version, const __DRIversion *drm_version, const __DRIframebuffer *frame_buffer, drmAddress pSAREA, int fd, const __DRIextension **extensions, const __DRIconfig ***driver_modes, void *loaderPrivate) { static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; psp = _mesa_malloc(sizeof *psp); if (!psp) return NULL; setupLoaderExtensions(psp, extensions); /* ** NOT_DONE: This is used by the X server to detect when the client ** has died while holding the drawable lock. The client sets the ** drawable lock to this value. */ psp->drawLockID = 1; psp->drm_version = *drm_version; psp->ddx_version = *ddx_version; psp->dri_version = *dri_version; psp->pSAREA = pSAREA; psp->lock = (drmLock *) &psp->pSAREA->lock; psp->pFB = frame_buffer->base; psp->fbSize = frame_buffer->size; psp->fbStride = frame_buffer->stride; psp->fbWidth = frame_buffer->width; psp->fbHeight = frame_buffer->height; psp->devPrivSize = frame_buffer->dev_priv_size; psp->pDevPriv = frame_buffer->dev_priv; psp->fbBPP = psp->fbStride * 8 / frame_buffer->width; psp->extensions = emptyExtensionList; psp->fd = fd; psp->myNum = scrn; psp->dri2.enabled = GL_FALSE; /* ** Do not init dummy context here; actual initialization will be ** done when the first DRI context is created. Init screen priv ptr ** to NULL to let CreateContext routine that it needs to be inited. */ psp->dummyContextPriv.driScreenPriv = NULL; psp->DriverAPI = driDriverAPI; *driver_modes = driDriverAPI.InitScreen(psp); if (*driver_modes == NULL) { _mesa_free(psp); return NULL; } return psp; }
/** * This is the bootstrap function for the driver. libGL supplies all of the * requisite information about the system, and the driver initializes itself. * This routine also fills in the linked list pointed to by \c driver_modes * with the \c struct gl_config that the driver can support for windows or * pbuffers. * * For legacy DRI. * * \param scrn Index of the screen * \param ddx_version Version of the 2D DDX. This may not be meaningful for * all drivers. * \param dri_version Version of the "server-side" DRI. * \param drm_version Version of the kernel DRM. * \param frame_buffer Data describing the location and layout of the * framebuffer. * \param pSAREA Pointer to the SAREA. * \param fd Device handle for the DRM. * \param extensions ?? * \param driver_modes Returns modes suppoted by the driver * \param loaderPrivate ?? * * \note There is no need to check the minimum API version in this * function. Since the name of this function is versioned, it is * impossible for a loader that is too old to even load this driver. */ static __DRIscreen * driCreateNewScreen(int scrn, const __DRIversion *ddx_version, const __DRIversion *dri_version, const __DRIversion *drm_version, const __DRIframebuffer *frame_buffer, drmAddress pSAREA, int fd, const __DRIextension **extensions, const __DRIconfig ***driver_modes, void *loaderPrivate) { static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; if (driDriverAPI.InitScreen == NULL) return NULL; psp = calloc(1, sizeof *psp); if (!psp) return NULL; setupLoaderExtensions(psp, extensions); /* ** NOT_DONE: This is used by the X server to detect when the client ** has died while holding the drawable lock. The client sets the ** drawable lock to this value. */ psp->drawLockID = 1; psp->drm_version = *drm_version; psp->ddx_version = *ddx_version; psp->dri_version = *dri_version; psp->pSAREA = pSAREA; psp->lock = (drmLock *) &psp->pSAREA->lock; psp->pFB = frame_buffer->base; psp->fbSize = frame_buffer->size; psp->fbStride = frame_buffer->stride; psp->fbWidth = frame_buffer->width; psp->fbHeight = frame_buffer->height; psp->devPrivSize = frame_buffer->dev_priv_size; psp->pDevPriv = frame_buffer->dev_priv; psp->fbBPP = psp->fbStride * 8 / frame_buffer->width; psp->extensions = emptyExtensionList; psp->fd = fd; psp->myNum = scrn; psp->dri2.enabled = GL_FALSE; psp->DriverAPI = driDriverAPI; psp->api_mask = (1 << __DRI_API_OPENGL); *driver_modes = driDriverAPI.InitScreen(psp); if (*driver_modes == NULL) { free(psp); return NULL; } return psp; }