EGLBoolean init_haiku(_EGLDriver *drv, _EGLDisplay *dpy) { _eglLog(_EGL_DEBUG,"\nInitializing Haiku EGL\n"); //_EGLDisplay* egl_dpy; printf("Initializing Haiku EGL\n"); _eglSetLogProc(haiku_log); loader_set_logger(_eglLog); /*egl_dpy = (_EGLDisplay*) calloc(1, sizeof(_EGLDisplay)); if (!egl_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); dpy->DriverData=(void*) egl_dpy; if (!dpy->PlatformDisplay) { // OPEN DEVICE //dri2_dpy->bwindow = (void*)haiku_create_window(); //dri2_dpy->own_device = true; } else { //dri2_dpy->bwindow = (BWindow*)dpy->PlatformDisplay; }*/ //dri2_dpy->driver_name = strdup("swrast"); //if (!dri2_load_driver_swrast(dpy)) // goto cleanup_conn; /*dri2_dpy->swrast_loader_extension.base.name = __DRI_SWRAST_LOADER; dri2_dpy->swrast_loader_extension.base.version = __DRI_SWRAST_LOADER_VERSION; dri2_dpy->swrast_loader_extension.getDrawableInfo = swrastGetDrawableInfo; dri2_dpy->swrast_loader_extension.putImage = swrastPutImage; dri2_dpy->swrast_loader_extension.getImage = swrastGetImage; dri2_dpy->extensions[0] = &dri2_dpy->swrast_loader_extension.base; dri2_dpy->extensions[1] = NULL; dri2_dpy->extensions[2] = NULL;*/ /*if (dri2_dpy->bwindow) { if (!dri2_haiku_add_configs_for_visuals(dri2_dpy, dpy)) goto cleanup_configs; }*/ _eglLog(_EGL_DEBUG,"Add configs"); haiku_add_configs_for_visuals(dpy); dpy->VersionMajor=1; dpy->VersionMinor=4; //dpy->Extensions.KHR_create_context = true; //dri2_dpy->vtbl = &dri2_haiku_display_vtbl; _eglLog(_EGL_DEBUG, "Initialization finished"); return EGL_TRUE; }
static const struct egl_g3d_loader * loader_init(void) { egl_g3d_loader.get_st_api = get_st_api; egl_g3d_loader.create_drm_screen = create_drm_screen; egl_g3d_loader.create_sw_screen = create_sw_screen; loader_set_logger(_eglLog); return &egl_g3d_loader; }
EGLBoolean dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) { struct dri2_egl_display *dri2_dpy; struct gbm_device *gbm; int fd = -1; int i; loader_set_logger(_eglLog); dri2_dpy = calloc(1, sizeof *dri2_dpy); if (!dri2_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); disp->DriverData = (void *) dri2_dpy; gbm = disp->PlatformDisplay; if (gbm == NULL) { char buf[64]; int n = snprintf(buf, sizeof(buf), DRM_DEV_NAME, DRM_DIR_NAME, 0); if (n != -1 && n < sizeof(buf)) fd = open(buf, O_RDWR); if (fd < 0) fd = open("/dev/dri/card0", O_RDWR); dri2_dpy->own_device = 1; gbm = gbm_create_device(fd); if (gbm == NULL) return EGL_FALSE; } if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) { free(dri2_dpy); return EGL_FALSE; } dri2_dpy->gbm_dri = gbm_dri_device(gbm); if (dri2_dpy->gbm_dri->base.type != GBM_DRM_DRIVER_TYPE_DRI) { free(dri2_dpy); return EGL_FALSE; } if (fd < 0) { fd = dup(gbm_device_get_fd(gbm)); if (fd < 0) { free(dri2_dpy); return EGL_FALSE; } } dri2_dpy->fd = fd; dri2_dpy->device_name = loader_get_device_name_for_fd(dri2_dpy->fd); dri2_dpy->driver_name = strdup(dri2_dpy->gbm_dri->base.driver_name); dri2_dpy->dri_screen = dri2_dpy->gbm_dri->screen; dri2_dpy->core = dri2_dpy->gbm_dri->core; dri2_dpy->dri2 = dri2_dpy->gbm_dri->dri2; dri2_dpy->image = dri2_dpy->gbm_dri->image; dri2_dpy->flush = dri2_dpy->gbm_dri->flush; dri2_dpy->swrast = dri2_dpy->gbm_dri->swrast; dri2_dpy->driver_configs = dri2_dpy->gbm_dri->driver_configs; dri2_dpy->gbm_dri->lookup_image = dri2_lookup_egl_image; dri2_dpy->gbm_dri->lookup_user_data = disp; dri2_dpy->gbm_dri->get_buffers = dri2_drm_get_buffers; dri2_dpy->gbm_dri->flush_front_buffer = dri2_drm_flush_front_buffer; dri2_dpy->gbm_dri->get_buffers_with_format = dri2_drm_get_buffers_with_format; dri2_dpy->gbm_dri->image_get_buffers = dri2_drm_image_get_buffers; dri2_dpy->gbm_dri->swrast_put_image2 = swrast_put_image2; dri2_dpy->gbm_dri->swrast_get_image = swrast_get_image; dri2_dpy->gbm_dri->base.base.surface_lock_front_buffer = lock_front_buffer; dri2_dpy->gbm_dri->base.base.surface_release_buffer = release_buffer; dri2_dpy->gbm_dri->base.base.surface_has_free_buffers = has_free_buffers; dri2_setup_screen(disp); for (i = 0; dri2_dpy->driver_configs[i]; i++) { EGLint format, attr_list[3]; unsigned int mask; dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i], __DRI_ATTRIB_RED_MASK, &mask); if (mask == 0x3ff00000) format = GBM_FORMAT_XRGB2101010; else if (mask == 0x00ff0000) format = GBM_FORMAT_XRGB8888; else if (mask == 0xf800) format = GBM_FORMAT_RGB565; else continue; attr_list[0] = EGL_NATIVE_VISUAL_ID; attr_list[1] = format; attr_list[2] = EGL_NONE; dri2_add_config(disp, dri2_dpy->driver_configs[i], i + 1, EGL_WINDOW_BIT, attr_list, NULL); } if (dri2_dpy->dri2) disp->Extensions.EXT_buffer_age = EGL_TRUE; #ifdef HAVE_WAYLAND_PLATFORM if (dri2_dpy->image) { if (dri2_dpy->image->base.version >= 10 && dri2_dpy->image->getCapabilities != NULL) { int capabilities; capabilities = dri2_dpy->image->getCapabilities(dri2_dpy->dri_screen); disp->Extensions.WL_bind_wayland_display = (capabilities & __DRI_IMAGE_CAP_GLOBAL_NAMES) != 0; } else disp->Extensions.WL_bind_wayland_display = EGL_TRUE; } #endif /* we're supporting EGL 1.4 */ disp->VersionMajor = 1; disp->VersionMinor = 4; /* Fill vtbl last to prevent accidentally calling virtual function during * initialization. */ dri2_dpy->vtbl = &dri2_drm_display_vtbl; return EGL_TRUE; }
EGLBoolean dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *dpy) { struct dri2_egl_display *dri2_dpy; const char *err; _eglSetLogProc(droid_log); loader_set_logger(_eglLog); dri2_dpy = calloc(1, sizeof(*dri2_dpy)); if (!dri2_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); dpy->DriverData = (void *) dri2_dpy; dri2_dpy->fd = droid_open_device(); if (dri2_dpy->fd < 0) { err = "DRI2: failed to open device"; goto cleanup_display; } dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd, 0); if (dri2_dpy->driver_name == NULL) { err = "DRI2: failed to get driver name"; goto cleanup_device; } if (!dri2_load_driver(dpy)) { err = "DRI2: failed to load driver"; goto cleanup_driver_name; } dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER; dri2_dpy->dri2_loader_extension.base.version = 3; dri2_dpy->dri2_loader_extension.getBuffers = NULL; dri2_dpy->dri2_loader_extension.flushFrontBuffer = droid_flush_front_buffer; dri2_dpy->dri2_loader_extension.getBuffersWithFormat = droid_get_buffers_with_format; dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base; dri2_dpy->extensions[1] = &image_lookup_extension.base; dri2_dpy->extensions[2] = &use_invalidate.base; dri2_dpy->extensions[3] = NULL; if (!dri2_create_screen(dpy)) { err = "DRI2: failed to create screen"; goto cleanup_driver; } if (!droid_add_configs_for_visuals(drv, dpy)) { err = "DRI2: failed to add configs"; goto cleanup_screen; } dpy->Extensions.ANDROID_image_native_buffer = EGL_TRUE; dpy->Extensions.KHR_image_base = EGL_TRUE; /* we're supporting EGL 1.4 */ dpy->VersionMajor = 1; dpy->VersionMinor = 4; /* Fill vtbl last to prevent accidentally calling virtual function during * initialization. */ dri2_dpy->vtbl = &droid_display_vtbl; return EGL_TRUE; cleanup_screen: dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); cleanup_driver: dlclose(dri2_dpy->driver); cleanup_driver_name: free(dri2_dpy->driver_name); cleanup_device: close(dri2_dpy->fd); cleanup_display: free(dri2_dpy); return _eglError(EGL_NOT_INITIALIZED, err); }
EGLBoolean dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *dpy) { struct dri2_egl_display *dri2_dpy; const char *err; _eglSetLogProc(droid_log); loader_set_logger(_eglLog); dri2_dpy = calloc(1, sizeof(*dri2_dpy)); if (!dri2_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); dpy->DriverData = (void *) dri2_dpy; dri2_dpy->fd = droid_open_device(); if (dri2_dpy->fd < 0) { err = "DRI2: failed to open device"; goto cleanup_display; } dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd); if (dri2_dpy->driver_name == NULL) { err = "DRI2: failed to get driver name"; goto cleanup_device; } if (!dri2_load_driver(dpy)) { err = "DRI2: failed to load driver"; goto cleanup_driver_name; } dri2_dpy->is_render_node = drmGetNodeTypeFromFd(dri2_dpy->fd) == DRM_NODE_RENDER; /* render nodes cannot use Gem names, and thus do not support * the __DRI_DRI2_LOADER extension */ if (!dri2_dpy->is_render_node) dri2_dpy->loader_extensions = droid_dri2_loader_extensions; else dri2_dpy->loader_extensions = droid_image_loader_extensions; if (!dri2_create_screen(dpy)) { err = "DRI2: failed to create screen"; goto cleanup_driver; } if (!droid_add_configs_for_visuals(drv, dpy)) { err = "DRI2: failed to add configs"; goto cleanup_screen; } dpy->Extensions.ANDROID_framebuffer_target = EGL_TRUE; dpy->Extensions.ANDROID_image_native_buffer = EGL_TRUE; dpy->Extensions.ANDROID_recordable = EGL_TRUE; /* Fill vtbl last to prevent accidentally calling virtual function during * initialization. */ dri2_dpy->vtbl = &droid_display_vtbl; return EGL_TRUE; cleanup_screen: dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); cleanup_driver: dlclose(dri2_dpy->driver); cleanup_driver_name: free(dri2_dpy->driver_name); cleanup_device: close(dri2_dpy->fd); cleanup_display: free(dri2_dpy); dpy->DriverData = NULL; return _eglError(EGL_NOT_INITIALIZED, err); }
EGLBoolean dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp) { struct dri2_egl_display *dri2_dpy; const char* err; int i; int driver_loaded = 0; loader_set_logger(_eglLog); dri2_dpy = calloc(1, sizeof *dri2_dpy); if (!dri2_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); disp->DriverData = (void *) dri2_dpy; const int limit = 64; const int base = 128; for (i = 0; i < limit; ++i) { char *card_path; if (asprintf(&card_path, DRM_RENDER_DEV_NAME, DRM_DIR_NAME, base + i) < 0) continue; dri2_dpy->fd = loader_open_device(card_path); free(card_path); if (dri2_dpy->fd < 0) continue; dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd, 0); if (dri2_dpy->driver_name) { if (dri2_load_driver(disp)) { driver_loaded = 1; break; } free(dri2_dpy->driver_name); } close(dri2_dpy->fd); } if (!driver_loaded) { err = "DRI2: failed to load driver"; goto cleanup_display; } dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER; dri2_dpy->dri2_loader_extension.base.version = 3; dri2_dpy->dri2_loader_extension.getBuffers = NULL; dri2_dpy->dri2_loader_extension.flushFrontBuffer = surfaceless_flush_front_buffer; dri2_dpy->dri2_loader_extension.getBuffersWithFormat = surfaceless_get_buffers_with_format; dri2_dpy->extensions[0] = &image_loader_extension.base; dri2_dpy->extensions[1] = &image_lookup_extension.base; dri2_dpy->extensions[2] = &use_invalidate.base; dri2_dpy->extensions[3] = NULL; if (!dri2_create_screen(disp)) { err = "DRI2: failed to create screen"; goto cleanup_driver; } if (!surfaceless_add_configs_for_visuals(drv, disp)) { err = "DRI2: failed to add configs"; goto cleanup_screen; } disp->Extensions.KHR_image_base = EGL_TRUE; /* Fill vtbl last to prevent accidentally calling virtual function during * initialization. */ dri2_dpy->vtbl = &dri2_surfaceless_display_vtbl; return EGL_TRUE; cleanup_screen: dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); cleanup_driver: dlclose(dri2_dpy->driver); free(dri2_dpy->driver_name); close(dri2_dpy->fd); cleanup_display: free(dri2_dpy); return _eglError(EGL_NOT_INITIALIZED, err); }