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