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; 5596a82cc314667542b7e046311595f58b01704205Luca Barbieri enum pipe_texture_target target; 568b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz}; 578b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 588b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstruct wrapper_sw_displaytarget 598b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 608b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *winsys; 61287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex; 628b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_transfer *transfer; 638b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 648b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned map_count; 658b60bf4e9f37aa1c7bd19fed67ec50aedb9a0beeJakob Bornecrantz unsigned stride; /**< because we get stride at create */ 668b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz void *ptr; 678b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz}; 688b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 698b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic INLINE struct wrapper_sw_winsys * 708b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwrapper_sw_winsys(struct sw_winsys *ws) 718b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 728b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return (struct wrapper_sw_winsys *)ws; 738b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 748b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 758b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic INLINE struct wrapper_sw_displaytarget * 768b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwrapper_sw_displaytarget(struct sw_displaytarget *dt) 778b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 788b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return (struct wrapper_sw_displaytarget *)dt; 798b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 808b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 818b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 828b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz/* 838b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * Functions 848b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz */ 858b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 868b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 878b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic boolean 888b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, unsigned *stride) 898b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 908b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_context *pipe = wdt->winsys->pipe; 91287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = wdt->tex; 928b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_transfer *tr; 938b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 944c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger tr = pipe_get_transfer(pipe, tex, 0, 0, 954c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ_WRITE, 968b60bf4e9f37aa1c7bd19fed67ec50aedb9a0beeJakob Bornecrantz 0, 0, wdt->tex->width0, wdt->tex->height0); 978b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tr) 988b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return FALSE; 998b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1008b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz *stride = tr->stride; 1018b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->stride = tr->stride; 1028b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 103287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tr); 1048b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1058b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return TRUE; 1068b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1078b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1088b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic struct sw_displaytarget * 1098b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_wrap_texture(struct wrapper_sw_winsys *wsw, 110287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex, unsigned *stride) 1118b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1128b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = CALLOC_STRUCT(wrapper_sw_displaytarget); 1138b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wdt) 1148b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz goto err_unref; 1158b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1168b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->tex = tex; 1178b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->winsys = wsw; 1188b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1198b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wsw_dt_get_stride(wdt, stride)) 1208b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz goto err_free; 1218b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1228b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return (struct sw_displaytarget *)wdt; 1238b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1248b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzerr_free: 1258b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wdt); 1268b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzerr_unref: 127287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&tex, NULL); 1288b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 1298b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1308b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1318b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic struct sw_displaytarget * 1328b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_create(struct sw_winsys *ws, 133287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned bind, 1348b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz enum pipe_format format, 1358b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned width, unsigned height, 1368b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned alignment, 1378b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned *stride) 1388b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1398b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 140287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 141287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex; 1428b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1438b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz /* 1448b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz * XXX Why don't we just get the template. 1458b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz */ 1468b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz memset(&templ, 0, sizeof(templ)); 14796a82cc314667542b7e046311595f58b01704205Luca Barbieri templ.target = wsw->target; 1488b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz templ.width0 = width; 1498b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz templ.height0 = height; 1504c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger templ.depth0 = 1; 1514c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger templ.array_size = 1; 1528b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz templ.format = format; 153287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = bind; 1548b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1558b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz /* XXX alignment: we can't do anything about this */ 1568b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 157287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex = wsw->screen->resource_create(wsw->screen, &templ); 1588b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tex) 1598b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 1608b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1618b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return wsw_dt_wrap_texture(wsw, tex, stride); 1628b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1638b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1648b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic struct sw_displaytarget * 1658b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_from_handle(struct sw_winsys *ws, 166287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource *templ, 1678b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct winsys_handle *whandle, 1688b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned *stride) 1698b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1708b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 171287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex; 1728b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 173287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex = wsw->screen->resource_from_handle(wsw->screen, templ, whandle); 1748b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tex) 1758b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 1768b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 1778b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return wsw_dt_wrap_texture(wsw, tex, stride); 1788b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 1798b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 180c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantzstatic boolean 181c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantzwsw_dt_get_handle(struct sw_winsys *ws, 182c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct sw_displaytarget *dt, 183c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct winsys_handle *whandle) 184c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz{ 185c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 186c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 187c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz struct pipe_resource *tex = wdt->tex; 188c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz 189c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz return wsw->screen->resource_get_handle(wsw->screen, tex, whandle); 190c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz} 191c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz 1928b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void * 1938b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_map(struct sw_winsys *ws, 1948b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct sw_displaytarget *dt, 1958b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz unsigned flags) 1968b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 1978b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 1988b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_context *pipe = wdt->winsys->pipe; 199287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = wdt->tex; 2008b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_transfer *tr; 2018b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz void *ptr; 2028b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2038b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wdt->map_count) { 2048b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2058b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz assert(!wdt->transfer); 2068b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2074c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger tr = pipe_get_transfer(pipe, tex, 0, 0, 2084c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ_WRITE, 2098b60bf4e9f37aa1c7bd19fed67ec50aedb9a0beeJakob Bornecrantz 0, 0, wdt->tex->width0, wdt->tex->height0); 2108b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!tr) 2118b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 2128b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2138b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz ptr = pipe->transfer_map(pipe, tr); 2148b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!ptr) 2158b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz goto err; 2168b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2178b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->transfer = tr; 2188b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->ptr = ptr; 2198b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2208b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz /* XXX Handle this case */ 2218b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz assert(tr->stride == wdt->stride); 2228b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz } 2238b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2248b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->map_count++; 2258b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2268b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return wdt->ptr; 2278b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2288b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzerr: 229287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tr); 2308b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 2318b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2328b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2338b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void 2348b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_unmap(struct sw_winsys *ws, 2358b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct sw_displaytarget *dt) 2368b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2378b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 2388b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct pipe_context *pipe = wdt->winsys->pipe; 2398b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2408b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz assert(wdt->transfer); 2418b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2428b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->map_count--; 2438b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2448b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (wdt->map_count) 2458b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return; 2468b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2478b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz pipe->transfer_unmap(pipe, wdt->transfer); 248287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, wdt->transfer); 2497e02303497237cde958c28608477d0c355a8038bMarek Olšák pipe->flush(pipe, NULL); 2508b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wdt->transfer = NULL; 2518b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2528b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2538b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void 2548b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_dt_destroy(struct sw_winsys *ws, 2558b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct sw_displaytarget *dt) 2568b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2578b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); 2588b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 259287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&wdt->tex, NULL); 2608b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2618b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wdt); 2628b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2638b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2648b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstatic void 2658b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzwsw_destroy(struct sw_winsys *ws) 2668b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2678b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 2688b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2698b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->pipe->destroy(wsw->pipe); 2708b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->screen->destroy(wsw->screen); 2718b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2728b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wsw); 2738b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 2748b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2758b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantzstruct sw_winsys * 276f8f3baa43a3954b7078e5e24b41ae123f398bff8Jakob Bornecrantzwrapper_sw_winsys_wrap_pipe_screen(struct pipe_screen *screen) 2778b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz{ 2788b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz struct wrapper_sw_winsys *wsw = CALLOC_STRUCT(wrapper_sw_winsys); 2798b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 280cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz if (!wsw) 281cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz goto err; 282cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz 2838b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_create = wsw_dt_create; 2848b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_from_handle = wsw_dt_from_handle; 285c882c310cc03df9065af5c80bade811cc46a608cJakob Bornecrantz wsw->base.displaytarget_get_handle = wsw_dt_get_handle; 2868b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_map = wsw_dt_map; 2878b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_unmap = wsw_dt_unmap; 2888b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.displaytarget_destroy = wsw_dt_destroy; 2898b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->base.destroy = wsw_destroy; 2908b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 2918b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->screen = screen; 2928b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz wsw->pipe = screen->context_create(screen, NULL); 2938b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz if (!wsw->pipe) 294cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantz goto err_free; 2958b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 29696a82cc314667542b7e046311595f58b01704205Luca Barbieri if(screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) 29796a82cc314667542b7e046311595f58b01704205Luca Barbieri wsw->target = PIPE_TEXTURE_2D; 29896a82cc314667542b7e046311595f58b01704205Luca Barbieri else 29996a82cc314667542b7e046311595f58b01704205Luca Barbieri wsw->target = PIPE_TEXTURE_RECT; 30096a82cc314667542b7e046311595f58b01704205Luca Barbieri 3018b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return &wsw->base; 3028b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz 303cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantzerr_free: 3048b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz FREE(wsw); 305cefe2a1dc258e4c1fe75a5cf7c3d6804a616366dJakob Bornecrantzerr: 3068b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz return NULL; 3078b63f9b497c22cb59678588d921699189f8b712fJakob Bornecrantz} 30844207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz 30944207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantzstruct pipe_screen * 31044207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantzwrapper_sw_winsys_dewrap_pipe_screen(struct sw_winsys *ws) 31144207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz{ 31244207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); 31344207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz struct pipe_screen *screen = wsw->screen; 31444207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz 31544207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz wsw->pipe->destroy(wsw->pipe); 31644207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz /* don't destroy the screen its needed later on */ 31744207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz 31844207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz FREE(wsw); 31944207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz return screen; 32044207ff71b3d53b30cf6c3e52c84ddc5cd44b424Jakob Bornecrantz} 321