1 /* $Id: main.c 21434 2006-04-01 19:12:56Z greatlrd $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: lib/ddraw/ddraw.c
6 * PURPOSE: DirectDraw Library
7 * PROGRAMMER: Magnus Olsen (greatlrd)
16 DDRAWI_DIRECTDRAW_GBL ddgbl
;
17 DDRAWI_DDRAWSURFACE_GBL ddSurfGbl
;
21 StartDirectDraw(LPDIRECTDRAW
* iface
, LPGUID lpGuid
)
23 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
28 const UINT bmiSize
= sizeof(BITMAPINFOHEADER
) + 0x10;
37 if (This
->lpLink
== NULL
)
39 RtlZeroMemory(&ddgbl
, sizeof(DDRAWI_DIRECTDRAW_GBL
));
41 if (ddgbl
.lpDDCBtmp
== NULL
)
43 ddgbl
.lpDDCBtmp
= (LPDDHAL_CALLBACKS
) DxHeapMemAlloc(sizeof(DDHAL_CALLBACKS
));
44 if (ddgbl
.lpDDCBtmp
== NULL
)
46 DX_STUB_str("Out of memmory");
55 Visual studio think this code is a break point if we call
56 second time to this function, press on continue in visual
57 studio the program will work. No real bug. gcc 3.4.5 genreate
58 code that look like MS visual studio break point.
61 This
->lpLcl
->lpDDCB
= ddgbl
.lpDDCBtmp
;
63 /* Same for HEL and HAL */
65 if (ddgbl
.lpModeInfo
== NULL
)
67 ddgbl
.lpModeInfo
= (DDHALMODEINFO
*) DxHeapMemAlloc(1 * sizeof(DDHALMODEINFO
));
68 if (ddgbl
.lpModeInfo
== NULL
)
70 DX_STUB_str("DD_FALSE");
75 EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
77 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwWidth
= devmode
.dmPelsWidth
;
78 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwHeight
= devmode
.dmPelsHeight
;
79 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwBPP
= devmode
.dmBitsPerPel
;
80 This
->lpLcl
->lpGbl
->lpModeInfo
[0].lPitch
= (devmode
.dmPelsWidth
*devmode
.dmBitsPerPel
)/8;
81 This
->lpLcl
->lpGbl
->lpModeInfo
[0].wRefreshRate
= (WORD
)devmode
.dmDisplayFrequency
;
87 /* Create HDC for default, hal and hel driver */
88 This
->lpLcl
->hDC
= (ULONG_PTR
) CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
90 /* cObsolete is undoc in msdn it being use in CreateDCA */
91 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
92 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
95 else if (lpGuid
== (LPGUID
) DDCREATE_HARDWAREONLY
)
99 /* Create HDC for default, hal and hel driver */
100 This
->lpLcl
->hDC
= (ULONG_PTR
)CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
102 /* cObsolete is undoc in msdn it being use in CreateDCA */
103 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
104 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
107 else if (lpGuid
== (LPGUID
) DDCREATE_EMULATIONONLY
)
111 /* Create HDC for default, hal and hel driver */
112 This
->lpLcl
->hDC
= (ULONG_PTR
) CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
114 /* cObsolete is undoc in msdn it being use in CreateDCA */
115 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
116 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
120 /* FIXME : need getting driver from the GUID that have been pass in from
121 the register. we do not support that yet
124 This
->lpLcl
->hDC
= (ULONG_PTR
) NULL
;
127 if ( (HDC
)This
->lpLcl
->hDC
== NULL
)
129 DX_STUB_str("DDERR_OUTOFMEMORY");
130 return DDERR_OUTOFMEMORY
;
133 hbmp
= CreateCompatibleBitmap((HDC
) This
->lpLcl
->hDC
, 1, 1);
136 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
137 DeleteDC((HDC
) This
->lpLcl
->hDC
);
138 DX_STUB_str("DDERR_OUTOFMEMORY");
139 return DDERR_OUTOFMEMORY
;
142 pbmiData
= (UCHAR
*) DxHeapMemAlloc(bmiSize
);
143 pbmi
= (BITMAPINFO
*)pbmiData
;
147 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
148 DeleteDC((HDC
) This
->lpLcl
->hDC
);
150 DX_STUB_str("DDERR_OUTOFMEMORY");
151 return DDERR_OUTOFMEMORY
;
154 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
155 pbmi
->bmiHeader
.biBitCount
= (WORD
)devmode
.dmBitsPerPel
;
156 pbmi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
157 pbmi
->bmiHeader
.biWidth
= 1;
158 pbmi
->bmiHeader
.biHeight
= 1;
160 GetDIBits((HDC
) This
->lpLcl
->hDC
, hbmp
, 0, 0, NULL
, pbmi
, 0);
163 pMasks
= (DWORD
*)(pbmiData
+ sizeof(BITMAPINFOHEADER
));
164 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwRBitMask
= pMasks
[0];
165 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwGBitMask
= pMasks
[1];
166 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwBBitMask
= pMasks
[2];
167 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwAlphaBitMask
= pMasks
[3];
169 DxHeapMemFree(pbmiData
);
171 /* Startup HEL and HAL */
172 // RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
174 This
->lpLcl
->lpDDCB
= This
->lpLcl
->lpGbl
->lpDDCBtmp
;
175 This
->lpLcl
->dwProcessId
= GetCurrentProcessId();
177 hel_ret
= StartDirectDrawHel(iface
);
178 hal_ret
= StartDirectDrawHal(iface
);
180 if ((hal_ret
!=DD_OK
) && (hel_ret
!=DD_OK
))
182 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
183 return DDERR_NODIRECTDRAWSUPPORT
;
186 This
->lpLcl
->hDD
= This
->lpLcl
->lpGbl
->hDD
;
188 /* Mix the DDCALLBACKS */
189 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDCallbacks
);
191 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=3))
193 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
194 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CanCreateSurface
;
196 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=2))
198 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
199 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CanCreateSurface
;
201 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=3))
203 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
204 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CreateSurface
;
206 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=2))
208 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
209 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CreateSurface
;
211 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=3))
213 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
214 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HALDD
.CreatePalette
;
216 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=2))
218 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
219 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HELDD
.CreatePalette
;
221 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=3))
223 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
224 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HALDD
.DestroyDriver
;
226 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=2))
228 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
229 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HELDD
.DestroyDriver
;
231 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=3))
233 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
234 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HALDD
.FlipToGDISurface
;
236 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=2))
238 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
239 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HELDD
.FlipToGDISurface
;
241 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=3))
243 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
244 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HALDD
.GetScanLine
;
246 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=2))
248 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
249 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HELDD
.GetScanLine
;
251 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=3))
253 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
254 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HALDD
.SetColorKey
;
256 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=2))
258 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
259 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HELDD
.SetColorKey
;
261 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=3))
263 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
264 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetExclusiveMode
;
266 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=2))
268 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
269 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetExclusiveMode
;
271 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=3))
273 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
274 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetMode
;
276 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=2))
278 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
279 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetMode
;
281 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=3))
283 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
284 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
285 This
->lpLcl
->lpDDCB
->HALDD
.WaitForVerticalBlank
;
287 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=2))
289 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
290 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
291 This
->lpLcl
->lpDDCB
->HELDD
.WaitForVerticalBlank
;
294 /* Mix the DDSURFACE CALLBACKS */
295 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
);
297 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=3))
299 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
301 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
302 This
->lpLcl
->lpDDCB
->HALDDSurface
.AddAttachedSurface
;
304 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=2))
306 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
308 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
309 This
->lpLcl
->lpDDCB
->HELDDSurface
.AddAttachedSurface
;
312 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=3))
314 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
316 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
=
317 This
->lpLcl
->lpDDCB
->HALDDSurface
.Blt
;
319 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=2))
321 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
323 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
=
324 This
->lpLcl
->lpDDCB
->HELDDSurface
.Blt
;
327 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=3))
329 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
331 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
=
332 This
->lpLcl
->lpDDCB
->HALDDSurface
.DestroySurface
;
334 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=2))
336 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
338 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
=
339 This
->lpLcl
->lpDDCB
->HELDDSurface
.DestroySurface
;
342 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=3))
344 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
346 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
=
347 This
->lpLcl
->lpDDCB
->HALDDSurface
.Flip
;
349 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=2))
351 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
353 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
=
354 This
->lpLcl
->lpDDCB
->HELDDSurface
.Flip
;
357 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=3))
359 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
361 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
=
362 This
->lpLcl
->lpDDCB
->HALDDSurface
.GetBltStatus
;
364 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=2))
366 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
368 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
=
369 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetBltStatus
;
372 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=3))
374 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
376 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
=
377 This
->lpLcl
->lpDDCB
->HALDDSurface
.GetFlipStatus
;
379 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=2))
381 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
383 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
=
384 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetFlipStatus
;
387 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=3))
389 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
391 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
=
392 This
->lpLcl
->lpDDCB
->HALDDSurface
.Lock
;
394 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=2))
396 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
398 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
=
399 This
->lpLcl
->lpDDCB
->HELDDSurface
.Lock
;
402 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=3))
404 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
406 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
=
407 This
->lpLcl
->lpDDCB
->HALDDSurface
.reserved4
;
409 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=2))
411 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
413 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
=
414 This
->lpLcl
->lpDDCB
->HELDDSurface
.reserved4
;
417 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=3))
419 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
421 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
=
422 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetClipList
;
424 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=2))
426 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
428 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
=
429 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetClipList
;
432 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=3))
434 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
436 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
=
437 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetColorKey
;
439 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=2))
441 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
443 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
=
444 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetColorKey
;
447 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=3))
449 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
451 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
452 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetOverlayPosition
;
454 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=2))
456 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
458 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
459 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetOverlayPosition
;
462 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=3))
464 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
466 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
=
467 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetPalette
;
469 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=2))
471 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
473 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
=
474 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetPalette
;
477 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=3))
479 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
481 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
=
482 This
->lpLcl
->lpDDCB
->HALDDSurface
.Unlock
;
484 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=2))
486 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
488 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
=
489 This
->lpLcl
->lpDDCB
->HELDDSurface
.Unlock
;
492 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=3))
494 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
496 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
=
497 This
->lpLcl
->lpDDCB
->HALDDSurface
.UpdateOverlay
;
499 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=2))
501 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
503 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
=
504 This
->lpLcl
->lpDDCB
->HELDDSurface
.UpdateOverlay
;
507 /* Mix the DDPALETTE CALLBACKS */
508 This
->lpLcl
->lpDDCB
->HALDDPalette
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HALDDPalette
);
510 if ((This
->lpLcl
->lpDDCB
->HALDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=3))
512 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
514 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.DestroyPalette
=
515 This
->lpLcl
->lpDDCB
->HALDDPalette
.DestroyPalette
;
517 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=2))
519 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_DESTROYPALETTE
;
521 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.DestroyPalette
=
522 This
->lpLcl
->lpDDCB
->HELDDPalette
.DestroyPalette
;
525 if ((This
->lpLcl
->lpDDCB
->HALDDPalette
.dwFlags
& DDHAL_PALCB32_SETENTRIES
) && (devicetypes
!=3))
527 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
529 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
530 This
->lpLcl
->lpDDCB
->HALDDPalette
.SetEntries
;
532 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_SETENTRIES
) && (devicetypes
!=2))
534 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
536 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
537 This
->lpLcl
->lpDDCB
->HELDDPalette
.SetEntries
;
540 /* Mix the DDExeBuf CALLBACKS */
541 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
);
543 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=3))
545 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
546 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CanCreateExecuteBuffer
;
547 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
549 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=2))
551 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
552 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CanCreateExecuteBuffer
;
553 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
556 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=3))
558 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
559 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CreateExecuteBuffer
;
560 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
562 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=2))
564 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
565 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CreateExecuteBuffer
;
566 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
569 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=3))
571 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
572 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.DestroyExecuteBuffer
;
573 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
575 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=2))
577 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
578 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.DestroyExecuteBuffer
;
579 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
582 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=3))
584 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
585 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.LockExecuteBuffer
;
586 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
588 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=2))
590 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
591 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.LockExecuteBuffer
;
592 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
595 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=3))
597 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
598 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.UnlockExecuteBuffer
;
599 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
601 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=2))
603 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
604 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.UnlockExecuteBuffer
;
605 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
608 /* Fill some basic info for Surface */
609 ddSurfGbl
.lpDD
= &ddgbl
;
612 We need setup this also
613 This->lpLcl->lpDDCB->cbDDColorControlCallbacks
614 This->lpLcl->lpDDCB->cbDDKernelCallbacks
615 This->lpLcl->lpDDCB->cbDDMiscellaneousCallbacks
616 This->lpLcl->lpDDCB->cbDDMotionCompCallbacks
617 This->lpLcl->lpDDCB->cbDDVideoPortCallbacks
625 StartDirectDrawHal(LPDIRECTDRAW
* iface
)
627 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
628 DDHAL_GETDRIVERINFODATA DriverInfo
;
631 DDHAL_CALLBACKS mCallbacks
;
632 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks
;
633 D3DHAL_CALLBACKS mD3dCallbacks
;
634 D3DHAL_GLOBALDRIVERDATA mD3dDriverData
;
641 DDSURFACEDESC
*mpTextures
;
643 /* HAL Startup process */
644 BOOL newmode
= FALSE
;
647 RtlZeroMemory(&mHALInfo
, sizeof(DDHALINFO
));
648 RtlZeroMemory(&mCallbacks
, sizeof(DDHAL_CALLBACKS
));
651 Startup DX HAL step one of three
653 if (!DdCreateDirectDrawObject(This
->lpLcl
->lpGbl
, (HDC
)This
->lpLcl
->hDC
))
655 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
656 DeleteDC((HDC
)This
->lpLcl
->hDC
);
662 // Do not relase HDC it have been map in kernel mode
665 if (!DdReenableDirectDrawObject(This
->lpLcl
->lpGbl
, &newmode
))
667 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
668 DeleteDC((HDC
)This
->lpLcl
->hDC
);
674 Startup DX HAL step two of three
677 if (!DdQueryDirectDrawObject(This
->lpLcl
->lpGbl
,
680 &mCallbacks
.HALDDSurface
,
681 &mCallbacks
.HALDDPalette
,
684 &mD3dBufferCallbacks
,
689 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
690 DeleteDC((HDC
)This
->lpLcl
->hDC
);
691 // FIXME Close DX fristcall and second call
695 mcvmList
= mHALInfo
.vmiData
.dwNumHeaps
;
696 mpvmList
= (VIDMEM
*) DxHeapMemAlloc(sizeof(VIDMEM
) * mcvmList
);
697 if (mpvmList
== NULL
)
699 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
700 DeleteDC((HDC
)This
->lpLcl
->hDC
);
701 // FIXME Close DX fristcall and second call
705 mcFourCC
= mHALInfo
.ddCaps
.dwNumFourCCCodes
;
706 mpFourCC
= (DWORD
*) DxHeapMemAlloc(sizeof(DWORD
) * mcFourCC
);
707 if (mpFourCC
== NULL
)
709 DxHeapMemFree(mpvmList
);
710 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
711 DeleteDC((HDC
)This
->lpLcl
->hDC
);
712 // FIXME Close DX fristcall and second call
716 mcTextures
= mD3dDriverData
.dwNumTextureFormats
;
717 mpTextures
= (DDSURFACEDESC
*) DxHeapMemAlloc(sizeof(DDSURFACEDESC
) * mcTextures
);
718 if (mpTextures
== NULL
)
720 DxHeapMemFree( mpFourCC
);
721 DxHeapMemFree( mpvmList
);
722 DxHeapMemFree( This
->lpLcl
->lpGbl
->lpModeInfo
);
723 DeleteDC((HDC
)This
->lpLcl
->hDC
);
724 // FIXME Close DX fristcall and second call
728 mHALInfo
.vmiData
.pvmList
= mpvmList
;
729 mHALInfo
.lpdwFourCC
= mpFourCC
;
730 mD3dDriverData
.lpTextureFormats
= (DDSURFACEDESC
*) mpTextures
;
732 if (!DdQueryDirectDrawObject(
736 &mCallbacks
.HALDDSurface
,
737 &mCallbacks
.HALDDPalette
,
740 &mCallbacks
.HALDDExeBuf
,
741 (DDSURFACEDESC
*)mpTextures
,
746 DxHeapMemFree(mpTextures
);
747 DxHeapMemFree(mpFourCC
);
748 DxHeapMemFree(mpvmList
);
749 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
750 DeleteDC((HDC
)This
->lpLcl
->hDC
);
751 // FIXME Close DX fristcall and second call
756 Copy over from HalInfo to DirectDrawGlobal
759 // this is wrong, cDriverName need be in ASC code not UNICODE
760 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
762 memcpy(&ddgbl
.vmiData
, &mHALInfo
.vmiData
,sizeof(VIDMEMINFO
));
763 memcpy(&ddgbl
.ddCaps
, &mHALInfo
.ddCaps
,sizeof(DDCORECAPS
));
765 mHALInfo
.dwNumModes
= 1;
766 mHALInfo
.lpModeInfo
= This
->lpLcl
->lpGbl
->lpModeInfo
;
767 mHALInfo
.dwMonitorFrequency
= This
->lpLcl
->lpGbl
->lpModeInfo
[0].wRefreshRate
;
769 This
->lpLcl
->lpGbl
->dwMonitorFrequency
= mHALInfo
.dwMonitorFrequency
;
770 This
->lpLcl
->lpGbl
->dwModeIndex
= mHALInfo
.dwModeIndex
;
771 This
->lpLcl
->lpGbl
->dwNumModes
= mHALInfo
.dwNumModes
;
772 This
->lpLcl
->lpGbl
->lpModeInfo
= mHALInfo
.lpModeInfo
;
773 This
->lpLcl
->lpGbl
->hInstance
= mHALInfo
.hInstance
;
775 This
->lpLcl
->lpGbl
->lp16DD
= This
->lpLcl
->lpGbl
;
778 memset(&DriverInfo
,0, sizeof(DDHAL_GETDRIVERINFODATA
));
779 DriverInfo
.dwSize
= sizeof(DDHAL_GETDRIVERINFODATA
);
780 DriverInfo
.dwContext
= This
->lpLcl
->lpGbl
->hDD
;
782 /* Get the MiscellaneousCallbacks */
783 DriverInfo
.guidInfo
= GUID_MiscellaneousCallbacks
;
784 DriverInfo
.lpvData
= &ddgbl
.lpDDCBtmp
->HALDDMiscellaneous
;
785 DriverInfo
.dwExpectedSize
= sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS
);
786 mHALInfo
.GetDriverInfo(&DriverInfo
);
790 The 3d and private data are not save at moment
792 we need lest the private data being setup
793 for some driver are puting kmode memory there
794 the memory often contain the private struct +
795 surface, see MS DDK how MS example driver using
798 the 3d interface are not so improten if u do not
799 want the 3d, and we are not writing 3d code yet
800 so we be okay for now.
808 StartDirectDrawHel(LPDIRECTDRAW
* iface
)
810 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
812 This
->lpLcl
->lpDDCB
->HELDD
.CanCreateSurface
= HelDdCanCreateSurface
;
813 This
->lpLcl
->lpDDCB
->HELDD
.CreateSurface
= HelDdCreateSurface
;
814 This
->lpLcl
->lpDDCB
->HELDD
.CreatePalette
= HelDdCreatePalette
;
815 This
->lpLcl
->lpDDCB
->HELDD
.DestroyDriver
= HelDdDestroyDriver
;
816 This
->lpLcl
->lpDDCB
->HELDD
.FlipToGDISurface
= HelDdFlipToGDISurface
;
817 This
->lpLcl
->lpDDCB
->HELDD
.GetScanLine
= HelDdGetScanLine
;
818 This
->lpLcl
->lpDDCB
->HELDD
.SetColorKey
= HelDdSetColorKey
;
819 This
->lpLcl
->lpDDCB
->HELDD
.SetExclusiveMode
= HelDdSetExclusiveMode
;
820 This
->lpLcl
->lpDDCB
->HELDD
.SetMode
= HelDdSetMode
;
821 This
->lpLcl
->lpDDCB
->HELDD
.WaitForVerticalBlank
= HelDdWaitForVerticalBlank
;
825 This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
= DDHAL_CB32_CANCREATESURFACE
|
826 DDHAL_CB32_CREATESURFACE
|
827 DDHAL_CB32_CREATEPALETTE
|
828 DDHAL_CB32_DESTROYDRIVER
|
829 DDHAL_CB32_FLIPTOGDISURFACE
|
830 DDHAL_CB32_GETSCANLINE
|
831 DDHAL_CB32_SETCOLORKEY
|
832 DDHAL_CB32_SETEXCLUSIVEMODE
|
834 DDHAL_CB32_WAITFORVERTICALBLANK
;
836 This
->lpLcl
->lpDDCB
->HELDD
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDD
);
838 This
->lpLcl
->lpDDCB
->HELDDSurface
.AddAttachedSurface
= HelDdSurfAddAttachedSurface
;
839 This
->lpLcl
->lpDDCB
->HELDDSurface
.Blt
= HelDdSurfBlt
;
840 This
->lpLcl
->lpDDCB
->HELDDSurface
.DestroySurface
= HelDdSurfDestroySurface
;
841 This
->lpLcl
->lpDDCB
->HELDDSurface
.Flip
= HelDdSurfFlip
;
842 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetBltStatus
= HelDdSurfGetBltStatus
;
843 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetFlipStatus
= HelDdSurfGetFlipStatus
;
844 This
->lpLcl
->lpDDCB
->HELDDSurface
.Lock
= HelDdSurfLock
;
845 This
->lpLcl
->lpDDCB
->HELDDSurface
.reserved4
= HelDdSurfreserved4
;
846 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetClipList
= HelDdSurfSetClipList
;
847 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetColorKey
= HelDdSurfSetColorKey
;
848 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetOverlayPosition
= HelDdSurfSetOverlayPosition
;
849 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetPalette
= HelDdSurfSetPalette
;
850 This
->lpLcl
->lpDDCB
->HELDDSurface
.Unlock
= HelDdSurfUnlock
;
851 This
->lpLcl
->lpDDCB
->HELDDSurface
.UpdateOverlay
= HelDdSurfUpdateOverlay
;
853 This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
= DDHAL_SURFCB32_ADDATTACHEDSURFACE
|
855 DDHAL_SURFCB32_DESTROYSURFACE
|
856 DDHAL_SURFCB32_FLIP
|
857 DDHAL_SURFCB32_GETBLTSTATUS
|
858 DDHAL_SURFCB32_GETFLIPSTATUS
|
859 DDHAL_SURFCB32_LOCK
|
860 DDHAL_SURFCB32_RESERVED4
|
861 DDHAL_SURFCB32_SETCLIPLIST
|
862 DDHAL_SURFCB32_SETCOLORKEY
|
863 DDHAL_SURFCB32_SETOVERLAYPOSITION
|
864 DDHAL_SURFCB32_SETPALETTE
|
865 DDHAL_SURFCB32_UNLOCK
|
866 DDHAL_SURFCB32_UPDATEOVERLAY
;
868 This
->lpLcl
->lpDDCB
->HELDDSurface
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDDSurface
);
871 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette;
872 This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
873 This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
877 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
878 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
879 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
880 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
881 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
889 Create_DirectDraw (LPGUID pGUID
,
890 LPDIRECTDRAW
* pIface
,
894 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)*pIface
;
898 if (!IsEqualGUID(&IID_IDirectDraw7
, id
))
900 return DDERR_INVALIDDIRECTDRAWGUID
;
905 /* We do not have any DirectDraw interface alloc */
906 This
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
909 return DDERR_OUTOFMEMORY
;
914 /* We got the DirectDraw interface alloc and we need create the link */
916 LPDDRAWI_DIRECTDRAW_INT newThis
;
917 newThis
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
920 return DDERR_OUTOFMEMORY
;
923 /* we need check the GUID lpGUID what type it is */
924 if (pGUID
!= DDCREATE_HARDWAREONLY
)
929 return DDERR_INVALIDDIRECTDRAWGUID
;
933 newThis
->lpLink
= This
;
937 This
->lpLcl
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
939 if (This
->lpLcl
== NULL
)
942 return DDERR_OUTOFMEMORY
;
945 This
->lpLcl
->lpGbl
= &ddgbl
;
946 This
->lpLcl
->dwLocalRefCnt
= 0;
947 This
->lpLcl
->dwLocalFlags
= DDRAWILCL_DIRECTDRAW7
;
949 *pIface
= (LPDIRECTDRAW
)This
;
951 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7
)This
, id
, (void**)&pIface
) != S_OK
)
953 return DDERR_INVALIDPARAMS
;
956 if (StartDirectDraw((LPDIRECTDRAW
*)This
, pGUID
) == DD_OK
);
962 return DDERR_INVALIDPARAMS
;