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