wrapper_sw_winsys.c revision c882c310cc03df9065af5c80bade811cc46a608c
18b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz/********************************************************** 28b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * Copyright 2010 VMware, Inc. All rights reserved. 38b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * 48b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * Permission is hereby granted, free of charge, to any person 58b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * obtaining a copy of this software and associated documentation 68b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * files (the "Software"), to deal in the Software without 78b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * restriction, including without limitation the rights to use, copy, 88b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 98b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * of the Software, and to permit persons to whom the Software is 108b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * furnished to do so, subject to the following conditions: 118b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * 128b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * The above copyright notice and this permission notice shall be 138b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * included in all copies or substantial portions of the Software. 148b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * 158b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 168b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 178b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 188b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 198b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 208b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 218b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 228b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * SOFTWARE. 238b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * 248b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz **********************************************************/ 258b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 268b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 278b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz#include "wrapper_sw_winsys.h" 288b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 298b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz#include "pipe/p_format.h" 308b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz#include "pipe/p_state.h" 318b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 328b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz#include "state_tracker/sw_winsys.h" 338b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 348b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz#include "util/u_memory.h" 358b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz#include "util/u_inlines.h" 368b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 378b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz/* 388b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * This code wraps a pipe_screen and exposes a sw_winsys interface for use 398b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * with software resterizers. This code is used by the DRM based winsys to 408b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * allow access to the drm driver. 418b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * 428b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * We must borrow the whole stack because only the pipe screen knows how 438b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * to decode the content of a buffer. Or how to create a buffer that 448b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * can still be used by drivers using real hardware (as the case is 458b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * with software st/xorg but hw st/dri). 468b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * 478b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * We also need a pipe context for the transfers. 488b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz */ 498b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 508b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstruct wrapper_sw_winsys 518b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 528b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct sw_winsys base; 538b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_screen *screen; 548b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_context *pipe; 558b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz}; 568b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 578b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstruct wrapper_sw_displaytarget 588b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 598b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *winsys; 60287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex; 618b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_transfer *transfer; 628b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 638b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned width; 648b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned height; 658b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned map_count; 668b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned stride; /**< because we give stride at create */ 678b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz void *ptr; 688b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz}; 698b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 708b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic INLINE struct wrapper_sw_winsys * 718b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwrapper_sw_winsys(struct sw_winsys *ws) 728b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 738b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return (struct wrapper_sw_winsys *)ws; 748b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 758b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 768b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic INLINE struct wrapper_sw_displaytarget * 778b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwrapper_sw_displaytarget(struct sw_displaytarget *dt) 788b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 798b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return (struct wrapper_sw_displaytarget *)dt; 808b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 818b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 828b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 838b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz/* 848b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * Functions 858b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz */ 868b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 878b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 888b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic boolean 898b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, unsigned *stride) 908b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 918b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_context *pipe = wdt->winsys->pipe; 92287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = wdt->tex; 938b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_transfer *tr; 948b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 95287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tr = pipe_get_transfer(pipe, tex, 0, 0, 0, 96287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_TRANSFER_READ_WRITE, 97287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 0, 0, wdt->width, wdt->height); 988b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tr) 998b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return FALSE; 1008b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1018b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz *stride = tr->stride; 1028b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->stride = tr->stride; 1038b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 104287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tr); 1058b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1068b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return TRUE; 1078b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1088b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1098b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic struct sw_displaytarget * 1108b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_wrap_texture(struct wrapper_sw_winsys *wsw, 111287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex, unsigned *stride) 1128b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1138b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = CALLOC_STRUCT(wrapper_sw_displaytarget); 1148b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wdt) 1158b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz goto err_unref; 1168b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1178b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->tex = tex; 1188b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->winsys = wsw; 1198b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1208b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wsw_dt_get_stride(wdt, stride)) 1218b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz goto err_free; 1228b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1238b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return (struct sw_displaytarget *)wdt; 1248b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1258b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzerr_free: 1268b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wdt); 1278b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzerr_unref: 128287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&tex, NULL); 1298b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 1308b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1318b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1328b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic struct sw_displaytarget * 1338b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_create(struct sw_winsys *ws, 134287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned bind, 1358b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz enum pipe_format format, 1368b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned width, unsigned height, 1378b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned alignment, 1388b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned *stride) 1398b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1408b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 141287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 142287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex; 1438b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1448b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz /* 1458b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * XXX Why don't we just get the template. 1468b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz */ 1478b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz memset(&templ, 0, sizeof(templ)); 148d294c349d5758e80d1fc99c57a0ad49a844a2823Jakob Bornecrantz templ.target = PIPE_TEXTURE_2D; 1498b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz templ.width0 = width; 1508b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz templ.height0 = height; 1518b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz templ.format = format; 152287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = bind; 1538b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1548b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz /* XXX alignment: we can't do anything about this */ 1558b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 156287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex = wsw->screen->resource_create(wsw->screen, &templ); 1578b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tex) 1588b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 1598b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1608b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return wsw_dt_wrap_texture(wsw, tex, stride); 1618b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1628b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1638b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic struct sw_displaytarget * 1648b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_from_handle(struct sw_winsys *ws, 165287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource *templ, 1668b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct winsys_handle *whandle, 1678b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned *stride) 1688b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1698b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 170287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex; 1718b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 172287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex = wsw->screen->resource_from_handle(wsw->screen, templ, whandle); 1738b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tex) 1748b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 1758b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1768b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return wsw_dt_wrap_texture(wsw, tex, stride); 1778b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1788b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 179c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantzstatic boolean 180c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantzwsw_dt_get_handle(struct sw_winsys *ws, 181c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct sw_displaytarget *dt, 182c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct winsys_handle *whandle) 183c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz{ 184c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 185c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 186c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct pipe_resource *tex = wdt->tex; 187c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz 188c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz return wsw->screen->resource_get_handle(wsw->screen, tex, whandle); 189c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz} 190c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz 1918b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void * 1928b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_map(struct sw_winsys *ws, 1938b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct sw_displaytarget *dt, 1948b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned flags) 1958b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1968b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 1978b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_context *pipe = wdt->winsys->pipe; 198287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = wdt->tex; 1998b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_transfer *tr; 2008b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz void *ptr; 2018b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2028b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wdt->map_count) { 2038b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2048b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz assert(!wdt->transfer); 2058b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 206287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tr = pipe_get_transfer(pipe, tex, 0, 0, 0, 207287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_TRANSFER_READ_WRITE, 208287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 0, 0, wdt->width, wdt->height); 2098b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tr) 2108b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 2118b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2128b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz ptr = pipe->transfer_map(pipe, tr); 2138b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!ptr) 2148b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz goto err; 2158b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2168b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->transfer = tr; 2178b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->ptr = ptr; 2188b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2198b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz /* XXX Handle this case */ 2208b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz assert(tr->stride == wdt->stride); 2218b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz } 2228b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2238b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->map_count++; 2248b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2258b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return wdt->ptr; 2268b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2278b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzerr: 228287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tr); 2298b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 2308b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2318b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2328b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void 2338b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_unmap(struct sw_winsys *ws, 2348b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct sw_displaytarget *dt) 2358b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2368b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 2378b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_context *pipe = wdt->winsys->pipe; 2388b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2398b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz assert(wdt->transfer); 2408b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2418b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->map_count--; 2428b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2438b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (wdt->map_count) 2448b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return; 2458b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2468b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz pipe->transfer_unmap(pipe, wdt->transfer); 247287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, wdt->transfer); 2488b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->transfer = NULL; 2498b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2508b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2518b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void 2528b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_destroy(struct sw_winsys *ws, 2538b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct sw_displaytarget *dt) 2548b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2558b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 2568b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 257287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&wdt->tex, NULL); 2588b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2598b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wdt); 2608b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2618b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2628b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void 2638b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_destroy(struct sw_winsys *ws) 2648b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2658b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 2668b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2678b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->pipe->destroy(wsw->pipe); 2688b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->screen->destroy(wsw->screen); 2698b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2708b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wsw); 2718b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2728b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2738b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstruct sw_winsys * 2748b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwrapper_sw_winsys_warp_pipe_screen(struct pipe_screen *screen) 2758b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2768b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = CALLOC_STRUCT(wrapper_sw_winsys); 2778b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 278cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz if (!wsw) 279cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz goto err; 280cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz 2818b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_create = wsw_dt_create; 2828b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_from_handle = wsw_dt_from_handle; 283c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz wsw->base.displaytarget_get_handle = wsw_dt_get_handle; 2848b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_map = wsw_dt_map; 2858b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_unmap = wsw_dt_unmap; 2868b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_destroy = wsw_dt_destroy; 2878b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.destroy = wsw_destroy; 2888b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2898b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->screen = screen; 2908b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->pipe = screen->context_create(screen, NULL); 2918b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wsw->pipe) 292cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz goto err_free; 2938b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2948b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return &wsw->base; 2958b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 296cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantzerr_free: 2978b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wsw); 298cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantzerr: 2998b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 3008b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 301