static struct sw_displaytarget * wsw_dt_create(struct sw_winsys *ws, unsigned bind, enum pipe_format format, unsigned width, unsigned height, unsigned alignment, unsigned *stride) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); struct pipe_resource templ; struct pipe_resource *tex; /* * XXX Why don't we just get the template. */ memset(&templ, 0, sizeof(templ)); templ.target = wsw->target; templ.width0 = width; templ.height0 = height; templ.format = format; templ.bind = bind; /* XXX alignment: we can't do anything about this */ tex = wsw->screen->resource_create(wsw->screen, &templ); if (!tex) return NULL; return wsw_dt_wrap_texture(wsw, tex, stride); }
static void wsw_destroy(struct sw_winsys *ws) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); wsw->pipe->destroy(wsw->pipe); wsw->screen->destroy(wsw->screen); FREE(wsw); }
static boolean wsw_dt_get_handle(struct sw_winsys *ws, struct sw_displaytarget *dt, struct winsys_handle *whandle) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); struct pipe_resource *tex = wdt->tex; return wsw->screen->resource_get_handle(wsw->screen, tex, whandle); }
static boolean wsw_is_dt_format_supported(struct sw_winsys *ws, unsigned tex_usage, enum pipe_format format) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); return wsw->screen->is_format_supported(wsw->screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET); }
struct pipe_screen * wrapper_sw_winsys_dewrap_pipe_screen(struct sw_winsys *ws) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); struct pipe_screen *screen = wsw->screen; wsw->pipe->destroy(wsw->pipe); /* don't destroy the screen its needed later on */ FREE(wsw); return screen; }
static boolean wsw_dt_get_handle(struct sw_winsys *ws, struct sw_displaytarget *dt, struct winsys_handle *whandle) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); struct pipe_resource *tex = wdt->tex; return wsw->screen->resource_get_handle(wsw->screen, NULL, tex, whandle, PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE); }
static struct sw_displaytarget * wsw_dt_from_handle(struct sw_winsys *ws, const struct pipe_resource *templ, struct winsys_handle *whandle, unsigned *stride) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); struct pipe_resource *tex; tex = wsw->screen->resource_from_handle(wsw->screen, templ, whandle); if (!tex) return NULL; return wsw_dt_wrap_texture(wsw, tex, stride); }