static EGLBoolean fbInitialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor) { _EGLDisplay *disp = _eglLookupDisplay(dpy); fbDisplay *display; fbScreen *s; _EGLScreen *scrn; char c; unsigned int x, y, r; DIR *dir; FILE *file; struct dirent *dirent; char path[NAME_MAX]; /* Switch display structure to one with our private fields */ display = calloc(1, sizeof(*display)); display->Base = *disp; _eglHashInsert(_eglGlobal.Displays, disp->Handle, display); free(disp); *major = 1; *minor = 0; dir = opendir(sysfs); if (!dir) { printf("EGL - %s framebuffer device not found.", sysfs); return EGL_FALSE; } while ((dirent = readdir(dir))) { /* assignment! */ if (dirent->d_name[0] != 'f') continue; if (dirent->d_name[1] != 'b') continue; if (fbSetupFramebuffer(display, dirent->d_name) == EGL_FALSE) continue; /* Create a screen */ s = (fbScreen *) calloc(1, sizeof(fbScreen)); if (!s) return EGL_FALSE; strncpy(s->fb, dirent->d_name, NAME_MAX); scrn = &s->Base; _eglInitScreen(scrn); _eglAddScreen(&display->Base, scrn); snprintf(path, sizeof(path), "%s/%s/modes", sysfs, s->fb); file = fopen(path, "r"); while (fgets(path, sizeof(path), file)) { sscanf(path, "%c:%ux%u-%u", &c, &x, &y, &r); _eglAddMode(scrn, x, y, r * 1000, path); } fclose(file); fbFillInConfigs(&display->Base, 32, 24, 8, 1); } closedir(dir); drv->Initialized = EGL_TRUE; return EGL_TRUE; }
EGLBoolean drm_initialize(_EGLDriver *drv, _EGLDisplay *disp, EGLint *major, EGLint *minor) { struct drm_device *dev; struct drm_screen *screen = NULL; drmModeConnectorPtr connector = NULL; drmModeResPtr res = NULL; unsigned count_connectors = 0; int num_screens = 0; EGLint i; int fd; _EGLConfig *config; dev = (struct drm_device *) calloc(1, sizeof(struct drm_device)); if (!dev) return EGL_FALSE; dev->api = drm_api_create(); /* try the first node */ fd = drm_open_minor(0); if (fd < 0) goto err_fd; dev->drmFD = fd; drm_get_device_id(dev); dev->screen = dev->api->create_screen(dev->api, dev->drmFD, NULL); if (!dev->screen) goto err_screen; dev->winsys = dev->screen->winsys; driInitExtensions(NULL, NULL, GL_FALSE); drm_update_res(dev); res = dev->res; if (res) count_connectors = res->count_connectors; else _eglLog(_EGL_WARNING, "Could not retrive kms information\n"); for(i = 0; i < count_connectors && i < MAX_SCREENS; i++) { connector = drmModeGetConnector(fd, res->connectors[i]); if (!connector) continue; if (connector->connection != DRM_MODE_CONNECTED) { drmModeFreeConnector(connector); continue; } screen = malloc(sizeof(struct drm_screen)); memset(screen, 0, sizeof(*screen)); screen->connector = connector; screen->connectorID = connector->connector_id; _eglInitScreen(&screen->base); _eglAddScreen(disp, &screen->base); drm_add_modes_from_connector(&screen->base, connector); drm_find_dpms(dev, screen); dev->screens[num_screens++] = screen; } dev->count_screens = num_screens; disp->DriverData = dev; /* for now we only have one config */ config = calloc(1, sizeof(*config)); memset(config, 1, sizeof(*config)); _eglInitConfig(config, 1); _eglSetConfigAttrib(config, EGL_RED_SIZE, 8); _eglSetConfigAttrib(config, EGL_GREEN_SIZE, 8); _eglSetConfigAttrib(config, EGL_BLUE_SIZE, 8); _eglSetConfigAttrib(config, EGL_ALPHA_SIZE, 8); _eglSetConfigAttrib(config, EGL_BUFFER_SIZE, 32); _eglSetConfigAttrib(config, EGL_DEPTH_SIZE, 24); _eglSetConfigAttrib(config, EGL_STENCIL_SIZE, 8); _eglSetConfigAttrib(config, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT); _eglAddConfig(disp, config); disp->ClientAPIsMask = EGL_OPENGL_BIT /*| EGL_OPENGL_ES_BIT*/; /* enable supported extensions */ disp->Extensions.MESA_screen_surface = EGL_TRUE; disp->Extensions.MESA_copy_context = EGL_TRUE; *major = 1; *minor = 4; return EGL_TRUE; err_screen: drmClose(fd); err_fd: free(dev); return EGL_FALSE; }