static EGLBoolean dri2_initialize_x11_swrast(_EGLDriver *drv, _EGLDisplay *disp) { _EGLDevice *dev; struct dri2_egl_display *dri2_dpy; dri2_dpy = calloc(1, sizeof *dri2_dpy); if (!dri2_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); dri2_dpy->fd = -1; if (!dri2_get_xcb_connection(drv, disp, dri2_dpy)) goto cleanup; dev = _eglAddDevice(dri2_dpy->fd, true); if (!dev) { _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to find EGLDevice"); goto cleanup; } disp->Device = dev; /* * Every hardware driver_name is set using strdup. Doing the same in * here will allow is to simply free the memory at dri2_terminate(). */ dri2_dpy->driver_name = strdup("swrast"); if (!dri2_load_driver_swrast(disp)) goto cleanup; dri2_dpy->loader_extensions = swrast_loader_extensions; if (!dri2_create_screen(disp)) goto cleanup; if (!dri2_setup_extensions(disp)) goto cleanup; dri2_setup_screen(disp); if (!dri2_x11_add_configs_for_visuals(dri2_dpy, disp, true)) goto cleanup; /* Fill vtbl last to prevent accidentally calling virtual function during * initialization. */ dri2_dpy->vtbl = &dri2_x11_swrast_display_vtbl; return EGL_TRUE; cleanup: dri2_display_destroy(disp); return EGL_FALSE; }
EGLBoolean dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) { struct dri2_egl_display *dri2_dpy; struct gbm_device *gbm; int fd = -1; int i; dri2_dpy = malloc(sizeof *dri2_dpy); if (!dri2_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); memset(dri2_dpy, 0, sizeof *dri2_dpy); disp->DriverData = (void *) dri2_dpy; gbm = disp->PlatformDisplay; if (gbm == NULL) { 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 = dri2_get_device_name_for_fd(dri2_dpy->fd); dri2_dpy->driver_name = 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->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_get_buffers; dri2_dpy->gbm_dri->flush_front_buffer = dri2_flush_front_buffer; dri2_dpy->gbm_dri->get_buffers_with_format = dri2_get_buffers_with_format; 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++) dri2_add_config(disp, dri2_dpy->driver_configs[i], i + 1, 0, EGL_WINDOW_BIT, NULL, NULL); drv->API.CreateWindowSurface = dri2_create_window_surface; drv->API.DestroySurface = dri2_destroy_surface; drv->API.SwapBuffers = dri2_swap_buffers; drv->API.CreateImageKHR = dri2_drm_create_image_khr; #ifdef HAVE_WAYLAND_PLATFORM disp->Extensions.WL_bind_wayland_display = EGL_TRUE; #endif dri2_dpy->authenticate = dri2_drm_authenticate; /* we're supporting EGL 1.4 */ disp->VersionMajor = 1; disp->VersionMinor = 4; return EGL_TRUE; }
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; }
static EGLBoolean dri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp) { _EGLDevice *dev; struct dri2_egl_display *dri2_dpy; dri2_dpy = calloc(1, sizeof *dri2_dpy); if (!dri2_dpy) return _eglError(EGL_BAD_ALLOC, "eglInitialize"); dri2_dpy->fd = -1; if (!dri2_get_xcb_connection(drv, disp, dri2_dpy)) goto cleanup; if (!dri2_x11_connect(dri2_dpy)) goto cleanup; dev = _eglAddDevice(dri2_dpy->fd, false); if (!dev) { _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to find EGLDevice"); goto cleanup; } disp->Device = dev; if (!dri2_load_driver(disp)) goto cleanup; if (dri2_dpy->dri2_minor >= 1) dri2_dpy->loader_extensions = dri2_loader_extensions; else dri2_dpy->loader_extensions = dri2_loader_extensions_old; dri2_dpy->swap_available = (dri2_dpy->dri2_minor >= 2); dri2_dpy->invalidate_available = (dri2_dpy->dri2_minor >= 3); if (!dri2_create_screen(disp)) goto cleanup; if (!dri2_setup_extensions(disp)) goto cleanup; dri2_setup_screen(disp); dri2_x11_setup_swap_interval(disp); disp->Extensions.KHR_image_pixmap = EGL_TRUE; disp->Extensions.NOK_swap_region = EGL_TRUE; disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE; disp->Extensions.NV_post_sub_buffer = EGL_TRUE; disp->Extensions.CHROMIUM_sync_control = EGL_TRUE; dri2_set_WL_bind_wayland_display(drv, disp); if (!dri2_x11_add_configs_for_visuals(dri2_dpy, disp, true)) goto cleanup; /* Fill vtbl last to prevent accidentally calling virtual function during * initialization. */ dri2_dpy->vtbl = &dri2_x11_display_vtbl; _eglLog(_EGL_INFO, "Using DRI2"); return EGL_TRUE; cleanup: dri2_display_destroy(disp); return EGL_FALSE; }
EGLBoolean dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) { struct dri2_egl_display *dri2_dpy; struct gbm_device *gbm; void *lib; int fd = -1; int i; 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) { fd = get_service("DISPLAY"); 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 0 lib = load_library("intel-sna.drv"); if(lib) { blit_bitmap_from_handle = get_proc_address(lib,"sna_bitmap_from_handle"); blit_set_bo_handle = get_proc_address(lib,"sna_set_bo_handle"); blit_blit_tex = get_proc_address(lib,"sna_blit_tex"); } else { lib = load_library("intel-uxa.drv"); if(lib) { blit_bitmap_from_handle = get_proc_address(lib,"uxa_bitmap_from_handle"); blit_set_bo_handle = get_proc_address(lib,"uxa_set_bo_handle"); blit_blit_tex = get_proc_address(lib,"uxa_blit_tex"); } else return EGL_FALSE; } #endif dri2_dpy->fd = fd; dri2_dpy->device_name = strdup("drm device"); //dri2_get_device_name_for_fd(dri2_dpy->fd); dri2_dpy->driver_name = 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->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_get_buffers; dri2_dpy->gbm_dri->flush_front_buffer = dri2_flush_front_buffer; dri2_dpy->gbm_dri->get_buffers_with_format = dri2_get_buffers_with_format; 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++) dri2_add_config(disp, dri2_dpy->driver_configs[i], i + 1, 0, EGL_WINDOW_BIT, NULL, NULL); drv->API.CreateWindowSurface = dri2_create_window_surface; drv->API.DestroySurface = dri2_destroy_surface; drv->API.SwapBuffers = dri2_swap_buffers; drv->API.CreateImageKHR = dri2_drm_create_image_khr; drv->API.QueryBufferAge = dri2_query_buffer_age; drv->API.GetImageFB = dri2_get_fb_image; disp->Extensions.EXT_buffer_age = EGL_TRUE; #ifdef HAVE_WAYLAND_PLATFORM disp->Extensions.WL_bind_wayland_display = EGL_TRUE; #endif // dri2_dpy->authenticate = dri2_drm_authenticate; /* we're supporting EGL 1.4 */ disp->VersionMajor = 1; disp->VersionMinor = 4; return EGL_TRUE; }