struct vl_screen* vl_screen_create(Display *display, int screen) { struct vl_xsp_screen *xsp_screen; struct sw_winsys *winsys; assert(display); xsp_screen = CALLOC_STRUCT(vl_xsp_screen); if (!xsp_screen) return NULL; winsys = xlib_create_sw_winsys(display); if (!winsys) { FREE(xsp_screen); return NULL; } xsp_screen->base.pscreen = softpipe_create_screen(winsys); if (!xsp_screen->base.pscreen) { winsys->destroy(winsys); FREE(xsp_screen); return NULL; } xsp_screen->display = display; xsp_screen->screen = screen; xsp_screen->xdraw.visual = XDefaultVisual(display, screen); return &xsp_screen->base; }
/* Helper function to build a subset of a driver stack consisting of * one of the software rasterizers (llvmpipe, softpipe) and the * xlib winsys. */ static struct pipe_screen * swrast_xlib_create_screen( Display *display ) { struct sw_winsys *winsys; struct pipe_screen *screen = NULL; /* Create the underlying winsys, which performs presents to Xlib * drawables: */ winsys = xlib_create_sw_winsys( display ); if (winsys == NULL) return NULL; /* Create a software rasterizer on top of that winsys: */ screen = sw_screen_create( winsys ); if (screen == NULL) goto fail; /* Inject any wrapping layers we want to here: */ return debug_screen_wrap( screen ); fail: if (winsys) winsys->destroy( winsys ); return NULL; }
struct native_display * x11_create_ximage_display(Display *dpy, struct native_event_handler *event_handler, void *user_data) { struct ximage_display *xdpy; struct sw_winsys *winsys = NULL; xdpy = CALLOC_STRUCT(ximage_display); if (!xdpy) return NULL; xdpy->dpy = dpy; if (!xdpy->dpy) { xdpy->dpy = XOpenDisplay(NULL); if (!xdpy->dpy) { FREE(xdpy); return NULL; } xdpy->own_dpy = TRUE; } xdpy->event_handler = event_handler; xdpy->base.user_data = user_data; xdpy->xscr_number = DefaultScreen(xdpy->dpy); xdpy->xscr = x11_screen_create(xdpy->dpy, xdpy->xscr_number); if (!xdpy->xscr) goto fail; winsys = xlib_create_sw_winsys(xdpy->dpy); if (!winsys) goto fail; xdpy->base.screen = xdpy->event_handler->new_sw_screen(&xdpy->base, winsys); if (!xdpy->base.screen) goto fail; xdpy->base.destroy = ximage_display_destroy; xdpy->base.get_param = ximage_display_get_param; xdpy->base.get_configs = ximage_display_get_configs; xdpy->base.is_pixmap_supported = ximage_display_is_pixmap_supported; xdpy->base.create_window_surface = ximage_display_create_window_surface; xdpy->base.create_pixmap_surface = ximage_display_create_pixmap_surface; return &xdpy->base; fail: if (winsys && winsys->destroy) winsys->destroy(winsys); if (xdpy->xscr) x11_screen_destroy(xdpy->xscr); if (xdpy->dpy && xdpy->own_dpy) XCloseDisplay(xdpy->dpy); FREE(xdpy); return NULL; }
bool pipe_loader_sw_probe_xlib(struct pipe_loader_device **devs, Display *display) { struct pipe_loader_sw_device *sdev = CALLOC_STRUCT(pipe_loader_sw_device); if (!sdev) return false; sdev->base.type = PIPE_LOADER_DEVICE_SOFTWARE; sdev->base.driver_name = "swrast"; sdev->base.ops = &pipe_loader_sw_ops; sdev->ws = xlib_create_sw_winsys(display); if (!sdev->ws) { FREE(sdev); return false; } *devs = &sdev->base; return true; }
static boolean ximage_display_init_screen(struct native_display *ndpy) { struct ximage_display *xdpy = ximage_display(ndpy); struct sw_winsys *winsys; winsys = xlib_create_sw_winsys(xdpy->dpy); if (!winsys) return FALSE; xdpy->base.screen = xdpy->event_handler->new_sw_screen(&xdpy->base, winsys); if (!xdpy->base.screen) { if (winsys->destroy) winsys->destroy(winsys); return FALSE; } return TRUE; }