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