static void set_max_gl_versions(struct intel_screen *screen) { int gl_version_override = _mesa_get_gl_version_override(); switch (screen->gen) { case 7: screen->max_gl_core_version = 31; screen->max_gl_compat_version = 30; screen->max_gl_es1_version = 11; screen->max_gl_es2_version = 30; break; case 6: screen->max_gl_core_version = 31; screen->max_gl_compat_version = 30; screen->max_gl_es1_version = 11; screen->max_gl_es2_version = 30; break; case 5: case 4: screen->max_gl_core_version = 0; screen->max_gl_compat_version = 21; screen->max_gl_es1_version = 11; screen->max_gl_es2_version = 20; break; default: assert(!"unrecognized intel_screen::gen"); break; } if (gl_version_override >= 31) { screen->max_gl_core_version = MAX2(screen->max_gl_core_version, gl_version_override); } else { screen->max_gl_compat_version = MAX2(screen->max_gl_compat_version, gl_version_override); } #ifndef FEATURE_ES1 screen->max_gl_es1_version = 0; #endif #ifndef FEATURE_ES2 screen->max_gl_es2_version = 0; #endif }
/** * 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; }