1 /* DirectDrawSurface XF86DGA implementation
3 * Copyright 1997-2000 Marcus Meissner
4 * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff)
16 #include "debugtools.h"
17 #include "dga_private.h"
19 DEFAULT_DEBUG_CHANNEL(ddraw);
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)
25 /******************************************************************************
26 * IDirectDrawSurface methods
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)
33 HRESULT WINAPI DGA_IDirectDrawSurface4Impl_Flip(
34 LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
36 ICOM_THIS(IDirectDrawSurface4Impl,iface);
38 dga_ds_private *fspriv;
39 IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
43 TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
44 iflipto = _common_find_flipto(This,iflipto);
47 fspriv = (dga_ds_private*)iflipto->private;
48 TSXF86DGASetViewPort(display,DefaultScreen(display),0,fspriv->fb_height);
49 if (iflipto->s.palette) {
53 TSXF86DGAInstallColormap(display,DefaultScreen(display),dppriv->cm);
55 while (!TSXF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
58 /* We need to switch the lowlevel surfaces, for DGA this is: */
60 /* The height within the framebuffer */
61 xheight = dspriv->fb_height;
62 dspriv->fb_height = fspriv->fb_height;
63 fspriv->fb_height = xheight;
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;
72 #ifdef HAVE_LIBXXF86DGA2
73 HRESULT WINAPI DGA2_IDirectDrawSurface4Impl_Flip(
74 LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
76 ICOM_THIS(IDirectDrawSurface4Impl,iface);
77 IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
80 dga_ds_private *fspriv;
83 TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
84 iflipto = _common_find_flipto(This,iflipto);
87 fspriv = (dga_ds_private*)iflipto->private;
88 TSXDGASetViewport(display,DefaultScreen(display),0,fspriv->fb_height, XDGAFlipRetrace);
89 TSXDGASync(display,DefaultScreen(display));
91 if (iflipto->s.palette) {
92 DPPRIVATE(iflipto->s.palette);
94 TSXDGAInstallColormap(display,DefaultScreen(display),dppriv->cm);
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;
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;
110 #endif /* defined(HAVE_LIBXXF86DGA2) */
112 HRESULT WINAPI DGA_IDirectDrawSurface4Impl_SetPalette(
113 LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal
115 ICOM_THIS(IDirectDrawSurface4Impl,iface);
116 DDPRIVATE(This->s.ddraw);
117 IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal;
119 TRACE("(%p)->(%p)\n",This,ipal);
121 /* According to spec, we are only supposed to
122 * AddRef if this is not the same palette.
124 if( This->s.palette != ipal ) {
125 dga_dp_private *fppriv;
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);
136 #endif /* defined(HAVE_LIBXXF86DGA2) */
137 TSXF86DGAInstallColormap(display,DefaultScreen(display),fppriv->cm);
142 ULONG WINAPI DGA_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) {
143 ICOM_THIS(IDirectDrawSurface4Impl,iface);
144 DDPRIVATE(This->s.ddraw);
147 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
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);
157 ddpriv->vpmask &= ~(1<<(dspriv->fb_height/ddpriv->fb_height));
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);
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);
172 ICOM_VTABLE(IDirectDrawSurface4) dga_dds4vt =
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
222 #ifdef HAVE_LIBXXF86DGA2
223 ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt =
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
272 #endif /* defined(HAVE_LIBXXF86DGA2) */