1760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org/**************************************************************************
2760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org *
3760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * Copyright 2009 VMware, Inc.
4760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * All Rights Reserved.
5760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org *
6760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * copy of this software and associated documentation files (the
8760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * "Software"), to deal in the Software without restriction, including
9760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * the following conditions:
13760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org *
14760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE.
21760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org *
22760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * The above copyright notice and this permission notice (including the
23760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
24760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * of the Software.
25760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org *
26760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org *
27760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org **************************************************************************/
28760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
29760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org/**
30760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * @file
31760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * GDI software rasterizer support.
32760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org *
33760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org * @author Jose Fonseca <jfonseca@vmware.com>
34760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org */
35760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
36760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
37760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include <windows.h>
38760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
39760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "pipe/p_format.h"
40760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "pipe/p_context.h"
41760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_inlines.h"
42760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_format.h"
43760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_math.h"
44760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_memory.h"
45760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "state_tracker/sw_winsys.h"
46760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "gdi_sw_winsys.h"
47760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
48760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
49760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstruct gdi_sw_displaytarget
50760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
51760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   enum pipe_format format;
52760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   unsigned width;
53760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   unsigned height;
54760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   unsigned stride;
55760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
56760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   unsigned size;
57760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
58760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   void *data;
59760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
60760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   BITMAPINFO bmi;
61760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org};
62760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
63760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
64760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org/** Cast wrapper */
65760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic INLINE struct gdi_sw_displaytarget *
66760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget( struct sw_displaytarget *buf )
67760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
68760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   return (struct gdi_sw_displaytarget *)buf;
69760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
70760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
71760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
72760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic boolean
73760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_is_displaytarget_format_supported( struct sw_winsys *ws,
74760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                                unsigned tex_usage,
75760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                                enum pipe_format format )
76760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
77760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   switch(format) {
78760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   case PIPE_FORMAT_B8G8R8X8_UNORM:
79760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   case PIPE_FORMAT_B8G8R8A8_UNORM:
80760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      return TRUE;
81760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
82760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   /* TODO: Support other formats possible with BMPs, as described in
83760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    * http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx */
84760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
85760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   default:
86760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      return FALSE;
87760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   }
88760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
89760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
90760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
91760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic void *
92760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget_map(struct sw_winsys *ws,
93760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                               struct sw_displaytarget *dt,
94760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                               unsigned flags )
95760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
96760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   struct gdi_sw_displaytarget *gdt = gdi_sw_displaytarget(dt);
97760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
98760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   return gdt->data;
99760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
100760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
101760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
102760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic void
103760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget_unmap(struct sw_winsys *ws,
104760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                 struct sw_displaytarget *dt )
105760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
106760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
107760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
108760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
109760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
110760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic void
111760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget_destroy(struct sw_winsys *winsys,
112760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                   struct sw_displaytarget *dt)
113760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
114760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   struct gdi_sw_displaytarget *gdt = gdi_sw_displaytarget(dt);
115760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
116760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   align_free(gdt->data);
117760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   FREE(gdt);
118760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
119760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
120760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
121760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic struct sw_displaytarget *
122760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget_create(struct sw_winsys *winsys,
123760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  unsigned tex_usage,
124760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  enum pipe_format format,
125760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  unsigned width, unsigned height,
126760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  unsigned alignment,
127760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                  unsigned *stride)
128760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
129760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   struct gdi_sw_displaytarget *gdt;
130760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   unsigned cpp;
131760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   unsigned bpp;
132760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
133760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt = CALLOC_STRUCT(gdi_sw_displaytarget);
134760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   if(!gdt)
135760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      goto no_gdt;
136760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
137760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->format = format;
138760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->width = width;
139760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->height = height;
140760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
141760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   bpp = util_format_get_blocksizebits(format);
142760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   cpp = util_format_get_blocksize(format);
143760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
144760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->stride = align(width * cpp, alignment);
145760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->size = gdt->stride * height;
146760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
147760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->data = align_malloc(gdt->size, alignment);
148760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   if(!gdt->data)
149760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      goto no_data;
150760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
151760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
152760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biWidth = gdt->stride / cpp;
153760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biHeight= -(long)height;
154760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biPlanes = 1;
155760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biBitCount = bpp;
156760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biCompression = BI_RGB;
157760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biSizeImage = 0;
158760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biXPelsPerMeter = 0;
159760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biYPelsPerMeter = 0;
160760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biClrUsed = 0;
161760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   gdt->bmi.bmiHeader.biClrImportant = 0;
162760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
163760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   *stride = gdt->stride;
164760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   return (struct sw_displaytarget *)gdt;
165760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
166760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgno_data:
167760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   FREE(gdt);
168760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgno_gdt:
169760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   return NULL;
170760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
171760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
172760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
173760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic struct sw_displaytarget *
174760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget_from_handle(struct sw_winsys *winsys,
175760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                 const struct pipe_resource *templet,
176760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                 struct winsys_handle *whandle,
177760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                 unsigned *stride)
178760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
179760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   assert(0);
180760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   return NULL;
181760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
182760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
183760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
184760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic boolean
185760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget_get_handle(struct sw_winsys *winsys,
186760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                struct sw_displaytarget *dt,
187760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                struct winsys_handle *whandle)
188760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
189760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   assert(0);
190760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   return FALSE;
191760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
192760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
193760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
194760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid
195760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_display( struct sw_winsys *winsys,
196760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                struct sw_displaytarget *dt,
197760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                HDC hDC )
198760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
199760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    struct gdi_sw_displaytarget *gdt = gdi_sw_displaytarget(dt);
200760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
201760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    StretchDIBits(hDC,
202760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                  0, 0, gdt->width, gdt->height,
203760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                  0, 0, gdt->width, gdt->height,
204760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                  gdt->data, &gdt->bmi, 0, SRCCOPY);
205760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
206760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
207760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic void
208760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_displaytarget_display(struct sw_winsys *winsys,
209760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                             struct sw_displaytarget *dt,
210760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                             void *context_private)
211760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
212760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    /* nasty:
213760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org     */
214760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    HDC hDC = (HDC)context_private;
215760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
216760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    gdi_sw_display(winsys, dt, hDC);
217760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
218760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
219760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
220760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic void
221760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_sw_destroy(struct sw_winsys *winsys)
222760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
223760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   FREE(winsys);
224760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
225760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
226760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstruct sw_winsys *
227760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orggdi_create_sw_winsys(void)
228760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{
229760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   static struct sw_winsys *winsys;
230760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
231760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys = CALLOC_STRUCT(sw_winsys);
232760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   if(!winsys)
233760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      return NULL;
234760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
235760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->destroy = gdi_sw_destroy;
236760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->is_displaytarget_format_supported = gdi_sw_is_displaytarget_format_supported;
237760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->displaytarget_create = gdi_sw_displaytarget_create;
238760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->displaytarget_from_handle = gdi_sw_displaytarget_from_handle;
239760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->displaytarget_get_handle = gdi_sw_displaytarget_get_handle;
240760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->displaytarget_map = gdi_sw_displaytarget_map;
241760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->displaytarget_unmap = gdi_sw_displaytarget_unmap;
242760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->displaytarget_display = gdi_sw_displaytarget_display;
243760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   winsys->displaytarget_destroy = gdi_sw_displaytarget_destroy;
244760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
245760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   return winsys;
246760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org}
247760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
248