static void wsw_dt_destroy(struct sw_winsys *ws, struct sw_displaytarget *dt) { struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); pipe_resource_reference(&wdt->tex, NULL); FREE(wdt); }
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_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 void wsw_dt_unmap(struct sw_winsys *ws, struct sw_displaytarget *dt) { struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); struct pipe_context *pipe = wdt->winsys->pipe; assert(wdt->transfer); wdt->map_count--; if (wdt->map_count) return; pipe->transfer_unmap(pipe, wdt->transfer); pipe->transfer_destroy(pipe, wdt->transfer); wdt->transfer = NULL; }
static void * wsw_dt_map(struct sw_winsys *ws, struct sw_displaytarget *dt, unsigned flags) { struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); struct pipe_context *pipe = wdt->winsys->pipe; struct pipe_resource *tex = wdt->tex; struct pipe_transfer *tr; void *ptr; if (!wdt->map_count) { assert(!wdt->transfer); tr = pipe_get_transfer(pipe, tex, 0, 0, 0, PIPE_TRANSFER_READ_WRITE, 0, 0, wdt->width, wdt->height); if (!tr) return NULL; ptr = pipe->transfer_map(pipe, tr); if (!ptr) goto err; wdt->transfer = tr; wdt->ptr = ptr; /* XXX Handle this case */ assert(tr->stride == wdt->stride); } wdt->map_count++; return wdt->ptr; err: pipe->transfer_destroy(pipe, tr); return NULL; }