Make DirectDraw compile with DGA2 present.
[wine] / dlls / ddraw / dsurface / dga.c
1 /*              DirectDrawSurface XF86DGA implementation
2  *
3  * Copyright 1997-2000 Marcus Meissner
4  * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff)
5  */
6 #include "config.h"
7 #include "winerror.h"
8
9 #include <unistd.h>
10 #include <assert.h>
11 #include <fcntl.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #include <stdio.h>
15
16 #include "debugtools.h"
17 #include "dga_private.h"
18
19 DEFAULT_DEBUG_CHANNEL(ddraw);
20
21 #define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->private)
22 #define DPPRIVATE(x) dga_dp_private *dppriv = ((dga_dp_private*)(x)->private)
23 #define DSPRIVATE(x) dga_ds_private *dspriv = ((dga_ds_private*)(x)->private)
24
25 /******************************************************************************
26  *              IDirectDrawSurface methods
27  *
28  * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let
29  * DDS and DDS2 use those functions. (Function calls did not change (except
30  * using different DirectDrawSurfaceX version), just added flags and functions)
31  */
32
33 HRESULT WINAPI DGA_IDirectDrawSurface4Impl_Flip(
34     LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
35 ) {
36     ICOM_THIS(IDirectDrawSurface4Impl,iface);
37     DSPRIVATE(This);
38     dga_ds_private      *fspriv;
39     IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
40     DWORD               xheight;
41     LPBYTE              surf;
42
43     TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
44     iflipto = _common_find_flipto(This,iflipto);
45
46     /* and flip! */
47     fspriv = (dga_ds_private*)iflipto->private;
48     TSXF86DGASetViewPort(display,DefaultScreen(display),0,fspriv->fb_height);
49     if (iflipto->s.palette) {
50         DPPRIVATE(iflipto);
51         
52         if (dppriv->cm)
53             TSXF86DGAInstallColormap(display,DefaultScreen(display),dppriv->cm);
54     }
55     while (!TSXF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
56         /* EMPTY */
57     }
58     /* We need to switch the lowlevel surfaces, for DGA this is: */
59
60     /* The height within the framebuffer */
61     xheight             = dspriv->fb_height;
62     dspriv->fb_height   = fspriv->fb_height;
63     fspriv->fb_height   = xheight;
64
65     /* And the assciated surface pointer */
66     surf                                = This->s.surface_desc.u1.lpSurface;
67     This->s.surface_desc.u1.lpSurface   = iflipto->s.surface_desc.u1.lpSurface;
68     iflipto->s.surface_desc.u1.lpSurface= surf;
69     return DD_OK;
70 }
71
72 #ifdef HAVE_LIBXXF86DGA2
73 HRESULT WINAPI DGA2_IDirectDrawSurface4Impl_Flip(
74     LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
75 ) {
76     ICOM_THIS(IDirectDrawSurface4Impl,iface);
77     IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
78     DWORD       xheight;
79     DSPRIVATE(This);
80     dga_ds_private      *fspriv;
81     LPBYTE      surf;
82
83     TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
84     iflipto = _common_find_flipto(This,iflipto);
85
86     /* and flip! */
87     fspriv = (dga_ds_private*)iflipto->private;
88     TSXDGASetViewport(display,DefaultScreen(display),0,fspriv->fb_height, XDGAFlipRetrace);
89     TSXDGASync(display,DefaultScreen(display));
90     TSXFlush(display);
91     if (iflipto->s.palette) {
92         DPPRIVATE(iflipto->s.palette);
93         if (dppriv->cm)
94             TSXDGAInstallColormap(display,DefaultScreen(display),dppriv->cm);
95     }
96
97     /* We need to switch the lowlevel surfaces, for DGA this is: */
98     /* The height within the framebuffer */
99     xheight             = dspriv->fb_height;
100     dspriv->fb_height   = fspriv->fb_height;
101     fspriv->fb_height   = xheight;
102
103     /* And the assciated surface pointer */
104     surf                                 = This->s.surface_desc.u1.lpSurface;
105     This->s.surface_desc.u1.lpSurface    = iflipto->s.surface_desc.u1.lpSurface;
106     iflipto->s.surface_desc.u1.lpSurface = surf;
107
108     return DD_OK;
109 }
110 #endif /* defined(HAVE_LIBXXF86DGA2) */
111
112 HRESULT WINAPI DGA_IDirectDrawSurface4Impl_SetPalette(
113     LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal
114 ) {
115     ICOM_THIS(IDirectDrawSurface4Impl,iface);
116     DDPRIVATE(This->s.ddraw);
117     IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal;
118
119     TRACE("(%p)->(%p)\n",This,ipal);
120
121     /* According to spec, we are only supposed to 
122      * AddRef if this is not the same palette.
123      */
124     if( This->s.palette != ipal ) {
125         dga_dp_private  *fppriv;
126         if( ipal != NULL )
127             IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal );
128         if( This->s.palette != NULL )
129             IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette );
130         This->s.palette = ipal;
131         fppriv = (dga_dp_private*)This->s.palette->private;
132 #ifdef HAVE_LIBXXF86DGA2
133         if (ddpriv->version == 2)
134             TSXDGAInstallColormap(display,DefaultScreen(display),fppriv->cm);
135         else
136 #endif /* defined(HAVE_LIBXXF86DGA2) */
137             TSXF86DGAInstallColormap(display,DefaultScreen(display),fppriv->cm);
138     }
139     return DD_OK;
140 }
141
142 ULONG WINAPI DGA_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) {
143     ICOM_THIS(IDirectDrawSurface4Impl,iface);
144     DDPRIVATE(This->s.ddraw);
145     DSPRIVATE(This);
146
147     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
148
149     if (--(This->ref))
150         return This->ref;
151
152     IDirectDraw2_Release((IDirectDraw2*)This->s.ddraw);
153     /* clear out of surface list */
154     if (ddpriv->fb_height == -1)
155         HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface);
156     else
157         ddpriv->vpmask &= ~(1<<(dspriv->fb_height/ddpriv->fb_height));
158
159     /* Free the DIBSection (if any) */
160     if (This->s.hdc != 0) {
161         SelectObject(This->s.hdc, This->s.holdbitmap);
162         DeleteDC(This->s.hdc);
163         DeleteObject(This->s.DIBsection);
164     }
165     /* Free the clipper if attached to this surface */
166     if( This->s.lpClipper )
167         IDirectDrawClipper_Release(This->s.lpClipper);
168     HeapFree(GetProcessHeap(),0,This);
169     return S_OK;
170 }
171
172 ICOM_VTABLE(IDirectDrawSurface4) dga_dds4vt = 
173 {
174     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
175     IDirectDrawSurface4Impl_QueryInterface,
176     IDirectDrawSurface4Impl_AddRef,
177     DGA_IDirectDrawSurface4Impl_Release,
178     IDirectDrawSurface4Impl_AddAttachedSurface,
179     IDirectDrawSurface4Impl_AddOverlayDirtyRect,
180     IDirectDrawSurface4Impl_Blt,
181     IDirectDrawSurface4Impl_BltBatch,
182     IDirectDrawSurface4Impl_BltFast,
183     IDirectDrawSurface4Impl_DeleteAttachedSurface,
184     IDirectDrawSurface4Impl_EnumAttachedSurfaces,
185     IDirectDrawSurface4Impl_EnumOverlayZOrders,
186     DGA_IDirectDrawSurface4Impl_Flip,
187     IDirectDrawSurface4Impl_GetAttachedSurface,
188     IDirectDrawSurface4Impl_GetBltStatus,
189     IDirectDrawSurface4Impl_GetCaps,
190     IDirectDrawSurface4Impl_GetClipper,
191     IDirectDrawSurface4Impl_GetColorKey,
192     IDirectDrawSurface4Impl_GetDC,
193     IDirectDrawSurface4Impl_GetFlipStatus,
194     IDirectDrawSurface4Impl_GetOverlayPosition,
195     IDirectDrawSurface4Impl_GetPalette,
196     IDirectDrawSurface4Impl_GetPixelFormat,
197     IDirectDrawSurface4Impl_GetSurfaceDesc,
198     IDirectDrawSurface4Impl_Initialize,
199     IDirectDrawSurface4Impl_IsLost,
200     IDirectDrawSurface4Impl_Lock,
201     IDirectDrawSurface4Impl_ReleaseDC,
202     IDirectDrawSurface4Impl_Restore,
203     IDirectDrawSurface4Impl_SetClipper,
204     IDirectDrawSurface4Impl_SetColorKey,
205     IDirectDrawSurface4Impl_SetOverlayPosition,
206     DGA_IDirectDrawSurface4Impl_SetPalette,
207     IDirectDrawSurface4Impl_Unlock,
208     IDirectDrawSurface4Impl_UpdateOverlay,
209     IDirectDrawSurface4Impl_UpdateOverlayDisplay,
210     IDirectDrawSurface4Impl_UpdateOverlayZOrder,
211     IDirectDrawSurface4Impl_GetDDInterface,
212     IDirectDrawSurface4Impl_PageLock,
213     IDirectDrawSurface4Impl_PageUnlock,
214     IDirectDrawSurface4Impl_SetSurfaceDesc,
215     IDirectDrawSurface4Impl_SetPrivateData,
216     IDirectDrawSurface4Impl_GetPrivateData,
217     IDirectDrawSurface4Impl_FreePrivateData,
218     IDirectDrawSurface4Impl_GetUniquenessValue,
219     IDirectDrawSurface4Impl_ChangeUniquenessValue
220 };
221
222 #ifdef HAVE_LIBXXF86DGA2
223 ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt = 
224 {
225     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
226     IDirectDrawSurface4Impl_QueryInterface,
227     IDirectDrawSurface4Impl_AddRef,
228     DGA_IDirectDrawSurface4Impl_Release,
229     IDirectDrawSurface4Impl_AddAttachedSurface,
230     IDirectDrawSurface4Impl_AddOverlayDirtyRect,
231     IDirectDrawSurface4Impl_Blt,
232     IDirectDrawSurface4Impl_BltBatch,
233     IDirectDrawSurface4Impl_BltFast,
234     IDirectDrawSurface4Impl_DeleteAttachedSurface,
235     IDirectDrawSurface4Impl_EnumAttachedSurfaces,
236     IDirectDrawSurface4Impl_EnumOverlayZOrders,
237     DGA2_IDirectDrawSurface4Impl_Flip,
238     IDirectDrawSurface4Impl_GetAttachedSurface,
239     IDirectDrawSurface4Impl_GetBltStatus,
240     IDirectDrawSurface4Impl_GetCaps,
241     IDirectDrawSurface4Impl_GetClipper,
242     IDirectDrawSurface4Impl_GetColorKey,
243     IDirectDrawSurface4Impl_GetDC,
244     IDirectDrawSurface4Impl_GetFlipStatus,
245     IDirectDrawSurface4Impl_GetOverlayPosition,
246     IDirectDrawSurface4Impl_GetPalette,
247     IDirectDrawSurface4Impl_GetPixelFormat,
248     IDirectDrawSurface4Impl_GetSurfaceDesc,
249     IDirectDrawSurface4Impl_Initialize,
250     IDirectDrawSurface4Impl_IsLost,
251     IDirectDrawSurface4Impl_Lock,
252     IDirectDrawSurface4Impl_ReleaseDC,
253     IDirectDrawSurface4Impl_Restore,
254     IDirectDrawSurface4Impl_SetClipper,
255     IDirectDrawSurface4Impl_SetColorKey,
256     IDirectDrawSurface4Impl_SetOverlayPosition,
257     DGA_IDirectDrawSurface4Impl_SetPalette,
258     IDirectDrawSurface4Impl_Unlock,
259     IDirectDrawSurface4Impl_UpdateOverlay,
260     IDirectDrawSurface4Impl_UpdateOverlayDisplay,
261     IDirectDrawSurface4Impl_UpdateOverlayZOrder,
262     IDirectDrawSurface4Impl_GetDDInterface,
263     IDirectDrawSurface4Impl_PageLock,
264     IDirectDrawSurface4Impl_PageUnlock,
265     IDirectDrawSurface4Impl_SetSurfaceDesc,
266     IDirectDrawSurface4Impl_SetPrivateData,
267     IDirectDrawSurface4Impl_GetPrivateData,
268     IDirectDrawSurface4Impl_FreePrivateData,
269     IDirectDrawSurface4Impl_GetUniquenessValue,
270     IDirectDrawSurface4Impl_ChangeUniquenessValue
271 };
272 #endif /* defined(HAVE_LIBXXF86DGA2) */