1007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis/**************************************************************************
2007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis *
3007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * Copyright 2009, VMware, Inc.
4007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * All Rights Reserved.
5007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * Copyright 2010 George Sapountzis <gsapountzis@gmail.com>
6007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis *
7007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * Permission is hereby granted, free of charge, to any person obtaining a
8007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * copy of this software and associated documentation files (the
9007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * "Software"), to deal in the Software without restriction, including
10007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * without limitation the rights to use, copy, modify, merge, publish,
11007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * distribute, sub license, and/or sell copies of the Software, and to
12007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * permit persons to whom the Software is furnished to do so, subject to
13007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * the following conditions:
14007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis *
15007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * The above copyright notice and this permission notice (including the
16007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * next paragraph) shall be included in all copies or substantial portions
17007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * of the Software.
18007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis *
19007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
23007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis *
27007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis **************************************************************************/
28007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
29007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "pipe/p_compiler.h"
30007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "pipe/p_format.h"
31007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "util/u_inlines.h"
32007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "util/u_format.h"
33007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "util/u_math.h"
34007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "util/u_memory.h"
35007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
36007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "state_tracker/sw_winsys.h"
37007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis#include "dri_sw_winsys.h"
38007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
39007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
406cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisstruct dri_sw_displaytarget
41007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
42625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   enum pipe_format format;
43625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   unsigned width;
44625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   unsigned height;
45625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   unsigned stride;
46625e024b186829f199458679921916971a5b00cbGeorge Sapountzis
47007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   void *data;
48007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   void *mapped;
49007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis};
50007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
516cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisstruct dri_sw_winsys
526cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis{
536cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   struct sw_winsys base;
54625e024b186829f199458679921916971a5b00cbGeorge Sapountzis
55625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   struct drisw_loader_funcs *lf;
566cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis};
57007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
586cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisstatic INLINE struct dri_sw_displaytarget *
596cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget( struct sw_displaytarget *dt )
60007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
616cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   return (struct dri_sw_displaytarget *)dt;
626cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis}
636cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis
646cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisstatic INLINE struct dri_sw_winsys *
656cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_winsys( struct sw_winsys *ws )
666cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis{
676cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   return (struct dri_sw_winsys *)ws;
68007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
69007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
70007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
71007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic boolean
726cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_is_displaytarget_format_supported( struct sw_winsys *ws,
736cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                                          unsigned tex_usage,
746cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                                          enum pipe_format format )
75007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
76007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   /* TODO: check visuals or other sensible thing here */
77007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   return TRUE;
78007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
79007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
80007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic struct sw_displaytarget *
816cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget_create(struct sw_winsys *winsys,
826cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                            unsigned tex_usage,
836cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                            enum pipe_format format,
846cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                            unsigned width, unsigned height,
856cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                            unsigned alignment,
866cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                            unsigned *stride)
87007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
886cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   struct dri_sw_displaytarget *dri_sw_dt;
89625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   unsigned nblocksy, size, format_stride;
90007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
916cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   dri_sw_dt = CALLOC_STRUCT(dri_sw_displaytarget);
926cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   if(!dri_sw_dt)
936cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis      goto no_dt;
94007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
95625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   dri_sw_dt->format = format;
96625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   dri_sw_dt->width = width;
97625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   dri_sw_dt->height = height;
98625e024b186829f199458679921916971a5b00cbGeorge Sapountzis
99bb289a8a7019cc0b40121e91fe5cd404a76b1fb5George Sapountzis   format_stride = util_format_get_stride(format, width);
100625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   dri_sw_dt->stride = align(format_stride, alignment);
101bb289a8a7019cc0b40121e91fe5cd404a76b1fb5George Sapountzis
102007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   nblocksy = util_format_get_nblocksy(format, height);
103625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   size = dri_sw_dt->stride * nblocksy;
104007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
1056cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   dri_sw_dt->data = align_malloc(size, alignment);
1066cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   if(!dri_sw_dt->data)
107007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis      goto no_data;
108007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
109625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   *stride = dri_sw_dt->stride;
1106cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   return (struct sw_displaytarget *)dri_sw_dt;
111007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
112007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisno_data:
1136cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   FREE(dri_sw_dt);
1146cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisno_dt:
115007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   return NULL;
116007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
117007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
118007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic void
1196cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget_destroy(struct sw_winsys *ws,
1206cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                             struct sw_displaytarget *dt)
121007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
1226cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   struct dri_sw_displaytarget *dri_sw_dt = dri_sw_displaytarget(dt);
123007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
1246cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   if (dri_sw_dt->data) {
1256cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis      FREE(dri_sw_dt->data);
126007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   }
127007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
1286cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   FREE(dri_sw_dt);
129007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
130007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
131007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic void *
1326cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget_map(struct sw_winsys *ws,
1336cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                         struct sw_displaytarget *dt,
1346cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                         unsigned flags)
135007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
1366cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   struct dri_sw_displaytarget *dri_sw_dt = dri_sw_displaytarget(dt);
1376cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   dri_sw_dt->mapped = dri_sw_dt->data;
1386cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   return dri_sw_dt->mapped;
139007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
140007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
141007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic void
1426cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget_unmap(struct sw_winsys *ws,
1436cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                           struct sw_displaytarget *dt)
144007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
1456cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   struct dri_sw_displaytarget *dri_sw_dt = dri_sw_displaytarget(dt);
1466cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   dri_sw_dt->mapped = NULL;
147007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
148007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
149007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic struct sw_displaytarget *
1506cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget_from_handle(struct sw_winsys *winsys,
151287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                 const struct pipe_resource *templ,
1526cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                                 struct winsys_handle *whandle,
1536cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                                 unsigned *stride)
154007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
155007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   assert(0);
156007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   return NULL;
157007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
158007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
159007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic boolean
1606cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget_get_handle(struct sw_winsys *winsys,
1616cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                                struct sw_displaytarget *dt,
1626cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                                struct winsys_handle *whandle)
163007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
164007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   assert(0);
165007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   return FALSE;
166007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
167007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
168007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic void
1696cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzisdri_sw_displaytarget_display(struct sw_winsys *ws,
1706cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                             struct sw_displaytarget *dt,
1716cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis                             void *context_private)
172007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
173625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   struct dri_sw_winsys *dri_sw_ws = dri_sw_winsys(ws);
174625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   struct dri_sw_displaytarget *dri_sw_dt = dri_sw_displaytarget(dt);
175625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   struct dri_drawable *dri_drawable = (struct dri_drawable *)context_private;
176625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   unsigned width, height;
177625e024b186829f199458679921916971a5b00cbGeorge Sapountzis
178625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   /* Set the width to 'stride / cpp'.
179625e024b186829f199458679921916971a5b00cbGeorge Sapountzis    *
180625e024b186829f199458679921916971a5b00cbGeorge Sapountzis    * PutImage correctly clips to the width of the dst drawable.
181625e024b186829f199458679921916971a5b00cbGeorge Sapountzis    */
182625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   width = dri_sw_dt->stride / util_format_get_blocksize(dri_sw_dt->format);
183625e024b186829f199458679921916971a5b00cbGeorge Sapountzis
184625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   height = dri_sw_dt->height;
185625e024b186829f199458679921916971a5b00cbGeorge Sapountzis
186625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   dri_sw_ws->lf->put_image(dri_drawable, dri_sw_dt->data, width, height);
187007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
188007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
189007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
190007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstatic void
191007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisdri_destroy_sw_winsys(struct sw_winsys *winsys)
192007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
193007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   FREE(winsys);
194007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
195007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
196007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzisstruct sw_winsys *
197625e024b186829f199458679921916971a5b00cbGeorge Sapountzisdri_create_sw_winsys(struct drisw_loader_funcs *lf)
198007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis{
1996cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   struct dri_sw_winsys *ws;
200007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
2016cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws = CALLOC_STRUCT(dri_sw_winsys);
202007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   if (!ws)
203007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis      return NULL;
204007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
205625e024b186829f199458679921916971a5b00cbGeorge Sapountzis   ws->lf = lf;
2066cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.destroy = dri_destroy_sw_winsys;
207007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
2086cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.is_displaytarget_format_supported = dri_sw_is_displaytarget_format_supported;
209007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
210007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   /* screen texture functions */
2116cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.displaytarget_create = dri_sw_displaytarget_create;
2126cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.displaytarget_destroy = dri_sw_displaytarget_destroy;
2136cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.displaytarget_from_handle = dri_sw_displaytarget_from_handle;
2146cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.displaytarget_get_handle = dri_sw_displaytarget_get_handle;
215007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
216007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis   /* texture functions */
2176cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.displaytarget_map = dri_sw_displaytarget_map;
2186cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.displaytarget_unmap = dri_sw_displaytarget_unmap;
219007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
2206cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   ws->base.displaytarget_display = dri_sw_displaytarget_display;
221007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
2226cc5fbd76b8994da8174c39f8eacb6605f4aa3b2George Sapountzis   return &ws->base;
223007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis}
224007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis
225007e0e3ef90d73f232c463e353da13378ffcef63George Sapountzis/* vim: set sw=3 ts=8 sts=3 expandtab: */
226