fix a bug and some warnings in ddraw
[reactos.git] / reactos / dll / directx / ddraw / startup.c
1 /* $Id: main.c 21434 2006-04-01 19:12:56Z greatlrd $
2 *
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)
8 *
9 */
10
11 #include <windows.h>
12 #include "rosdraw.h"
13 #include "d3dhal.h"
14 #include "ddrawgdi.h"
15
16 DDRAWI_DIRECTDRAW_GBL ddgbl;
17 DDRAWI_DDRAWSURFACE_GBL ddSurfGbl;
18
19
20 HRESULT WINAPI
21 StartDirectDraw(LPDIRECTDRAW* iface, LPGUID lpGuid, BOOL reenable)
22 {
23 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
24 DWORD hal_ret = DD_FALSE;
25 DWORD hel_ret = DD_FALSE;
26 DEVMODE devmode;
27 HBITMAP hbmp;
28 const UINT bmiSize = sizeof(BITMAPINFOHEADER) + 0x10;
29 UCHAR *pbmiData;
30 BITMAPINFO *pbmi;
31 DWORD *pMasks;
32 INT devicetypes = 0;
33 DWORD dwFlags = 0;
34
35 DX_WINDBG_trace();
36
37 if (reenable == FALSE)
38 {
39 if (This->lpLink == NULL)
40 {
41 RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
42 This->lpLcl->lpGbl->dwRefCnt++;
43 if (ddgbl.lpDDCBtmp == NULL)
44 {
45 ddgbl.lpDDCBtmp = (LPDDHAL_CALLBACKS) DxHeapMemAlloc(sizeof(DDHAL_CALLBACKS));
46 if (ddgbl.lpDDCBtmp == NULL)
47 {
48 DX_STUB_str("Out of memmory");
49 return DD_FALSE;
50 }
51 }
52 }
53 }
54
55 /*
56 Visual studio think this code is a break point if we call
57 second time to this function, press on continue in visual
58 studio the program will work. No real bug. gcc 3.4.5 genreate
59 code that look like MS visual studio break point.
60 */
61
62 This->lpLcl->lpDDCB = ddgbl.lpDDCBtmp;
63
64 /* Same for HEL and HAL */
65
66 if (ddgbl.lpModeInfo == NULL)
67 {
68 ddgbl.lpModeInfo = (DDHALMODEINFO*) DxHeapMemAlloc(1 * sizeof(DDHALMODEINFO));
69 if (ddgbl.lpModeInfo == NULL)
70 {
71 DX_STUB_str("DD_FALSE");
72 return DD_FALSE;
73 }
74 }
75
76 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);
77
78 This->lpLcl->lpGbl->lpModeInfo[0].dwWidth = devmode.dmPelsWidth;
79 This->lpLcl->lpGbl->lpModeInfo[0].dwHeight = devmode.dmPelsHeight;
80 This->lpLcl->lpGbl->lpModeInfo[0].dwBPP = devmode.dmBitsPerPel;
81 This->lpLcl->lpGbl->lpModeInfo[0].lPitch = (devmode.dmPelsWidth*devmode.dmBitsPerPel)/8;
82 This->lpLcl->lpGbl->lpModeInfo[0].wRefreshRate = (WORD)devmode.dmDisplayFrequency;
83
84
85 if (reenable == FALSE)
86 {
87 if (lpGuid == NULL)
88 {
89 devicetypes = 1;
90
91 /* Create HDC for default, hal and hel driver */
92 This->lpLcl->hDC = (ULONG_PTR) CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL);
93
94 /* cObsolete is undoc in msdn it being use in CreateDCA */
95 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
96 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
97
98 dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
99 }
100 else if (lpGuid == (LPGUID) DDCREATE_HARDWAREONLY)
101 {
102 devicetypes = 2;
103 /* Create HDC for default, hal and hel driver */
104 This->lpLcl->hDC = (ULONG_PTR)CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL);
105
106 /* cObsolete is undoc in msdn it being use in CreateDCA */
107 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
108 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
109 dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
110 }
111 else if (lpGuid == (LPGUID) DDCREATE_EMULATIONONLY)
112 {
113 devicetypes = 3;
114
115 /* Create HDC for default, hal and hel driver */
116 This->lpLcl->hDC = (ULONG_PTR) CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL);
117
118 /* cObsolete is undoc in msdn it being use in CreateDCA */
119 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
120 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
121
122 dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
123 }
124 else
125 {
126 /* FIXME : need getting driver from the GUID that have been pass in from
127 * the register. we do not support that yet
128 */
129 devicetypes = 4;
130 This->lpLcl->hDC = (ULONG_PTR) NULL ;
131 }
132
133 if ( (HDC)This->lpLcl->hDC == NULL)
134 {
135 DX_STUB_str("DDERR_OUTOFMEMORY");
136 return DDERR_OUTOFMEMORY ;
137 }
138 }
139
140 hbmp = CreateCompatibleBitmap((HDC) This->lpLcl->hDC, 1, 1);
141 if (hbmp==NULL)
142 {
143 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
144 DeleteDC((HDC) This->lpLcl->hDC);
145 DX_STUB_str("DDERR_OUTOFMEMORY");
146 return DDERR_OUTOFMEMORY;
147 }
148
149 pbmiData = (UCHAR *) DxHeapMemAlloc(bmiSize);
150 pbmi = (BITMAPINFO*)pbmiData;
151
152 if (pbmiData==NULL)
153 {
154 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
155 DeleteDC((HDC) This->lpLcl->hDC);
156 DeleteObject(hbmp);
157 DX_STUB_str("DDERR_OUTOFMEMORY");
158 return DDERR_OUTOFMEMORY;
159 }
160
161 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
162 pbmi->bmiHeader.biBitCount = (WORD)devmode.dmBitsPerPel;
163 pbmi->bmiHeader.biCompression = BI_BITFIELDS;
164 pbmi->bmiHeader.biWidth = 1;
165 pbmi->bmiHeader.biHeight = 1;
166
167 GetDIBits((HDC) This->lpLcl->hDC, hbmp, 0, 0, NULL, pbmi, 0);
168 DeleteObject(hbmp);
169
170 pMasks = (DWORD*)(pbmiData + sizeof(BITMAPINFOHEADER));
171 This->lpLcl->lpGbl->lpModeInfo[0].dwRBitMask = pMasks[0];
172 This->lpLcl->lpGbl->lpModeInfo[0].dwGBitMask = pMasks[1];
173 This->lpLcl->lpGbl->lpModeInfo[0].dwBBitMask = pMasks[2];
174 This->lpLcl->lpGbl->lpModeInfo[0].dwAlphaBitMask = pMasks[3];
175
176 DxHeapMemFree(pbmiData);
177
178 /* Startup HEL and HAL */
179 // RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
180
181 This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
182 This->lpLcl->dwProcessId = GetCurrentProcessId();
183
184 switch (devicetypes)
185 {
186 case 2:
187 hal_ret = StartDirectDrawHal(iface, reenable);
188 This->lpLcl->lpDDCB->HELDD.dwFlags = 0;
189 break;
190
191 case 3:
192 hel_ret = StartDirectDrawHel(iface, reenable);
193 This->lpLcl->lpDDCB->HALDD.dwFlags = 0;
194 break;
195
196 default:
197 hal_ret = StartDirectDrawHal(iface, reenable);
198 hel_ret = StartDirectDrawHel(iface, reenable);
199 }
200
201 if (hal_ret!=DD_OK)
202 {
203 if (hel_ret!=DD_OK)
204 {
205 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
206 return DDERR_NODIRECTDRAWSUPPORT;
207 }
208 dwFlags |= DDRAWI_NOHARDWARE;
209 }
210
211 if (hel_ret!=DD_OK)
212 {
213 dwFlags |= DDRAWI_NOEMULATION;
214
215 }
216 else
217 {
218 dwFlags |= DDRAWI_EMULATIONINITIALIZED;
219 }
220
221 This->lpLcl->lpGbl->dwFlags = dwFlags | DDRAWI_ATTACHEDTODESKTOP;
222
223 This->lpLcl->hDD = This->lpLcl->lpGbl->hDD;
224
225 /* Mix the DDCALLBACKS */
226 This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
227
228 This->lpLcl->lpDDCB->cbDDCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDCallbacks);
229
230 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) && (devicetypes !=3))
231 {
232 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CANCREATESURFACE;
233 This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface = This->lpLcl->lpDDCB->HALDD.CanCreateSurface;
234 }
235 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) && (devicetypes !=2))
236 {
237 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CANCREATESURFACE;
238 This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface = This->lpLcl->lpDDCB->HELDD.CanCreateSurface;
239 }
240
241 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) && (devicetypes !=3))
242 {
243 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATESURFACE;
244 This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface = This->lpLcl->lpDDCB->HALDD.CreateSurface;
245 }
246 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CREATESURFACE) && (devicetypes !=2))
247 {
248 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATESURFACE;
249 This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface = This->lpLcl->lpDDCB->HELDD.CreateSurface;
250 }
251
252 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CREATEPALETTE) && (devicetypes !=3))
253 {
254 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATEPALETTE;
255 This->lpLcl->lpDDCB->cbDDCallbacks.CreatePalette = This->lpLcl->lpDDCB->HALDD.CreatePalette;
256 }
257 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CREATEPALETTE) && (devicetypes !=2))
258 {
259 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATEPALETTE;
260 This->lpLcl->lpDDCB->cbDDCallbacks.CreatePalette = This->lpLcl->lpDDCB->HELDD.CreatePalette;
261 }
262 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_DESTROYDRIVER) && (devicetypes !=3))
263 {
264 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_DESTROYDRIVER;
265 This->lpLcl->lpDDCB->cbDDCallbacks.DestroyDriver = This->lpLcl->lpDDCB->HALDD.DestroyDriver;
266 }
267 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_DESTROYDRIVER) && (devicetypes !=2))
268 {
269 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_DESTROYDRIVER;
270 This->lpLcl->lpDDCB->cbDDCallbacks.DestroyDriver = This->lpLcl->lpDDCB->HELDD.DestroyDriver;
271 }
272 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_FLIPTOGDISURFACE) && (devicetypes !=3))
273 {
274 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_FLIPTOGDISURFACE;
275 This->lpLcl->lpDDCB->cbDDCallbacks.FlipToGDISurface = This->lpLcl->lpDDCB->HALDD.FlipToGDISurface;
276 }
277 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_FLIPTOGDISURFACE) && (devicetypes !=2))
278 {
279 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_FLIPTOGDISURFACE;
280 This->lpLcl->lpDDCB->cbDDCallbacks.FlipToGDISurface = This->lpLcl->lpDDCB->HELDD.FlipToGDISurface;
281 }
282 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_GETSCANLINE) && (devicetypes !=3))
283 {
284 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_GETSCANLINE;
285 This->lpLcl->lpDDCB->cbDDCallbacks.GetScanLine = This->lpLcl->lpDDCB->HALDD.GetScanLine;
286 }
287 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_GETSCANLINE) && (devicetypes !=2))
288 {
289 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_GETSCANLINE;
290 This->lpLcl->lpDDCB->cbDDCallbacks.GetScanLine = This->lpLcl->lpDDCB->HELDD.GetScanLine;
291 }
292 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETCOLORKEY) && (devicetypes !=3))
293 {
294 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETCOLORKEY;
295 This->lpLcl->lpDDCB->cbDDCallbacks.SetColorKey = This->lpLcl->lpDDCB->HALDD.SetColorKey;
296 }
297 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETCOLORKEY) && (devicetypes !=2))
298 {
299 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETCOLORKEY;
300 This->lpLcl->lpDDCB->cbDDCallbacks.SetColorKey = This->lpLcl->lpDDCB->HELDD.SetColorKey;
301 }
302 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE) && (devicetypes !=3))
303 {
304 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETEXCLUSIVEMODE;
305 This->lpLcl->lpDDCB->cbDDCallbacks.SetExclusiveMode = This->lpLcl->lpDDCB->HALDD.SetExclusiveMode;
306 }
307 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE) && (devicetypes !=2))
308 {
309 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETEXCLUSIVEMODE;
310 This->lpLcl->lpDDCB->cbDDCallbacks.SetExclusiveMode = This->lpLcl->lpDDCB->HELDD.SetExclusiveMode;
311 }
312 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETMODE) && (devicetypes !=3))
313 {
314 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETMODE;
315 This->lpLcl->lpDDCB->cbDDCallbacks.SetMode = This->lpLcl->lpDDCB->HALDD.SetMode;
316 }
317 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETMODE) && (devicetypes !=2))
318 {
319 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETMODE;
320 This->lpLcl->lpDDCB->cbDDCallbacks.SetMode = This->lpLcl->lpDDCB->HELDD.SetMode;
321 }
322 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK) && (devicetypes !=3))
323 {
324 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_WAITFORVERTICALBLANK;
325 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank =
326 This->lpLcl->lpDDCB->HALDD.WaitForVerticalBlank;
327 }
328 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK) && (devicetypes !=2))
329 {
330 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_WAITFORVERTICALBLANK;
331 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank =
332 This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank;
333 }
334
335 /* Mix the DDSURFACE CALLBACKS */
336 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDSurfaceCallbacks);
337
338 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=3))
339 {
340 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE;
341 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface =
342 This->lpLcl->lpDDCB->HALDDSurface.AddAttachedSurface;
343 }
344 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=2))
345 {
346 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE;
347
348 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface =
349 This->lpLcl->lpDDCB->HELDDSurface.AddAttachedSurface;
350 }
351
352 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=3))
353 {
354 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT;
355 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt = This->lpLcl->lpDDCB->HALDDSurface.Blt;
356 }
357 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=2))
358 {
359 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT;
360 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt = This->lpLcl->lpDDCB->HELDDSurface.Blt;
361 }
362
363 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=3))
364 {
365 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE;
366 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface = This->lpLcl->lpDDCB->HALDDSurface.DestroySurface;
367 }
368 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=2))
369 {
370 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE;
371 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface = This->lpLcl->lpDDCB->HELDDSurface.DestroySurface;
372 }
373
374 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=3))
375 {
376 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP;
377 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip = This->lpLcl->lpDDCB->HALDDSurface.Flip;
378 }
379 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=2))
380 {
381 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP;
382 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip = This->lpLcl->lpDDCB->HELDDSurface.Flip;
383 }
384
385 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=3))
386 {
387 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS;
388 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus =
389 This->lpLcl->lpDDCB->HALDDSurface.GetBltStatus;
390 }
391 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=2))
392 {
393 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS;
394 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus = This->lpLcl->lpDDCB->HELDDSurface.GetBltStatus;
395 }
396
397 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=3))
398 {
399 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS;
400 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus = This->lpLcl->lpDDCB->HALDDSurface.GetFlipStatus;
401 }
402 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=2))
403 {
404 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS;
405 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus = This->lpLcl->lpDDCB->HELDDSurface.GetFlipStatus;
406 }
407
408 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=3))
409 {
410 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK;
411 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock = This->lpLcl->lpDDCB->HALDDSurface.Lock;
412 }
413 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=2))
414 {
415 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK;
416 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock = This->lpLcl->lpDDCB->HELDDSurface.Lock;
417 }
418
419 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=3))
420 {
421 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4;
422 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 = This->lpLcl->lpDDCB->HALDDSurface.reserved4;
423 }
424 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=2))
425 {
426 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4;
427 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 = This->lpLcl->lpDDCB->HELDDSurface.reserved4;
428 }
429
430 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=3))
431 {
432 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST;
433 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList = This->lpLcl->lpDDCB->HALDDSurface.SetClipList;
434 }
435 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=2))
436 {
437 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST;
438 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList = This->lpLcl->lpDDCB->HELDDSurface.SetClipList;
439 }
440
441 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=3))
442 {
443 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY;
444 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey = This->lpLcl->lpDDCB->HALDDSurface.SetColorKey;
445 }
446 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=2))
447 {
448 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY;
449 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey = This->lpLcl->lpDDCB->HELDDSurface.SetColorKey;
450 }
451
452 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=3))
453 {
454 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION;
455 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition =
456 This->lpLcl->lpDDCB->HALDDSurface.SetOverlayPosition;
457 }
458 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=2))
459 {
460 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION;
461 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition =
462 This->lpLcl->lpDDCB->HELDDSurface.SetOverlayPosition;
463 }
464
465 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=3))
466 {
467 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE;
468 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette = This->lpLcl->lpDDCB->HALDDSurface.SetPalette;
469 }
470 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=2))
471 {
472 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE;
473 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette = This->lpLcl->lpDDCB->HELDDSurface.SetPalette;
474 }
475
476 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=3))
477 {
478 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK;
479 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock = This->lpLcl->lpDDCB->HALDDSurface.Unlock;
480 }
481 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=2))
482 {
483 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK;
484 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock = This->lpLcl->lpDDCB->HELDDSurface.Unlock;
485 }
486
487 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=3))
488 {
489 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY;
490 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay = This->lpLcl->lpDDCB->HALDDSurface.UpdateOverlay;
491 }
492 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=2))
493 {
494 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY;
495 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay = This->lpLcl->lpDDCB->HELDDSurface.UpdateOverlay;
496 }
497
498 /* Mix the DDPALETTE CALLBACKS */
499 This->lpLcl->lpDDCB->HALDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HALDDPalette);
500
501 if ((This->lpLcl->lpDDCB->HALDDPalette.dwFlags & DDHAL_PALCB32_DESTROYPALETTE) && (devicetypes !=3))
502 {
503 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
504 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.DestroyPalette =
505 This->lpLcl->lpDDCB->HALDDPalette.DestroyPalette;
506 }
507 else if ((This->lpLcl->lpDDCB->HELDDPalette.dwFlags & DDHAL_PALCB32_DESTROYPALETTE) && (devicetypes !=2))
508 {
509 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_DESTROYPALETTE;
510 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.DestroyPalette =
511 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette;
512 }
513
514 if ((This->lpLcl->lpDDCB->HALDDPalette.dwFlags & DDHAL_PALCB32_SETENTRIES) && (devicetypes !=3))
515 {
516 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
517 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.SetEntries =
518 This->lpLcl->lpDDCB->HALDDPalette.SetEntries;
519 }
520 else if ((This->lpLcl->lpDDCB->HELDDPalette.dwFlags & DDHAL_PALCB32_SETENTRIES) && (devicetypes !=2))
521 {
522 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
523 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.SetEntries =
524 This->lpLcl->lpDDCB->HELDDPalette.SetEntries;
525 }
526
527 /* Mix the DDExeBuf CALLBACKS */
528 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDExeBufCallbacks);
529
530 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) && (devicetypes !=3))
531 {
532 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer =
533 This->lpLcl->lpDDCB->HALDDExeBuf.CanCreateExecuteBuffer;
534 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF;
535 }
536 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) && (devicetypes !=2))
537 {
538 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer =
539 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer;
540 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF;
541 }
542
543 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) && (devicetypes !=3))
544 {
545 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer =
546 This->lpLcl->lpDDCB->HALDDExeBuf.CreateExecuteBuffer;
547 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF;
548 }
549 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) && (devicetypes !=2))
550 {
551 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer =
552 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer;
553 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF;
554 }
555
556 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) && (devicetypes !=3))
557 {
558 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer =
559 This->lpLcl->lpDDCB->HALDDExeBuf.DestroyExecuteBuffer;
560 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF;
561 }
562 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) && (devicetypes !=2))
563 {
564 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer =
565 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer;
566 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF;
567 }
568
569 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) && (devicetypes !=3))
570 {
571 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer =
572 This->lpLcl->lpDDCB->HALDDExeBuf.LockExecuteBuffer;
573 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF;
574 }
575 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) && (devicetypes !=2))
576 {
577 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer =
578 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer;
579 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF;
580 }
581
582 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) && (devicetypes !=3))
583 {
584 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer =
585 This->lpLcl->lpDDCB->HALDDExeBuf.UnlockExecuteBuffer;
586 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF;
587 }
588 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) && (devicetypes !=2))
589 {
590 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer =
591 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer;
592 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF;
593 }
594
595 /* Fill some basic info for Surface */
596
597 /* FIXME
598 We need setup this also
599 This->lpLcl->lpDDCB->cbDDColorControlCallbacks
600 This->lpLcl->lpDDCB->cbDDKernelCallbacks
601 This->lpLcl->lpDDCB->cbDDMiscellaneousCallbacks
602 This->lpLcl->lpDDCB->cbDDMotionCompCallbacks
603 This->lpLcl->lpDDCB->cbDDVideoPortCallbacks
604 */
605
606 This->lpLcl->hDD = ddgbl.hDD;
607
608 return DD_OK;
609 }
610
611
612 HRESULT WINAPI
613 StartDirectDrawHal(LPDIRECTDRAW* iface, BOOL reenable)
614 {
615 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
616 DDHAL_GETDRIVERINFODATA DriverInfo;
617
618 DDHALINFO mHALInfo;
619 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks;
620 D3DHAL_CALLBACKS mD3dCallbacks;
621 D3DHAL_GLOBALDRIVERDATA mD3dDriverData;
622 UINT mcvmList;
623 VIDMEM *mpvmList;
624
625 UINT mcFourCC;
626 DWORD *mpFourCC;
627 UINT mcTextures;
628 DDSURFACEDESC *mpTextures;
629
630 /* HAL Startup process */
631 BOOL newmode = FALSE;
632 RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO));
633
634 if (reenable == FALSE)
635 {
636 ddgbl.lpDDCBtmp = DxHeapMemAlloc(sizeof(DDHAL_CALLBACKS));
637 if ( ddgbl.lpDDCBtmp == NULL)
638 {
639 return DD_FALSE;
640 }
641 }
642 else
643 {
644 RtlZeroMemory(ddgbl.lpDDCBtmp,sizeof(DDHAL_CALLBACKS));
645 }
646
647 /*
648 Startup DX HAL step one of three
649 */
650 if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC))
651 {
652 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
653 DeleteDC((HDC)This->lpLcl->hDC);
654 return DD_FALSE;
655 }
656
657 // Do not relase HDC it have been map in kernel mode
658 // DeleteDC(hdc);
659
660 if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode))
661 {
662 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
663 DeleteDC((HDC)This->lpLcl->hDC);
664 return DD_FALSE;
665 }
666
667
668 /*
669 Startup DX HAL step two of three
670 */
671
672 if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl,
673 &mHALInfo,
674 &ddgbl.lpDDCBtmp->HALDD,
675 &ddgbl.lpDDCBtmp->HALDDSurface,
676 &ddgbl.lpDDCBtmp->HALDDPalette,
677 &mD3dCallbacks,
678 &mD3dDriverData,
679 &mD3dBufferCallbacks,
680 NULL,
681 NULL,
682 NULL))
683 {
684 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
685 DeleteDC((HDC)This->lpLcl->hDC);
686 // FIXME Close DX fristcall and second call
687 return DD_FALSE;
688 }
689
690 mcvmList = mHALInfo.vmiData.dwNumHeaps;
691 mpvmList = (VIDMEM*) DxHeapMemAlloc(sizeof(VIDMEM) * mcvmList);
692 if (mpvmList == NULL)
693 {
694 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
695 DeleteDC((HDC)This->lpLcl->hDC);
696 // FIXME Close DX fristcall and second call
697 return DD_FALSE;
698 }
699
700 mcFourCC = mHALInfo.ddCaps.dwNumFourCCCodes;
701 mpFourCC = (DWORD *) DxHeapMemAlloc(sizeof(DWORD) * mcFourCC);
702 if (mpFourCC == NULL)
703 {
704 DxHeapMemFree(mpvmList);
705 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
706 DeleteDC((HDC)This->lpLcl->hDC);
707 // FIXME Close DX fristcall and second call
708 return DD_FALSE;
709 }
710
711 mcTextures = mD3dDriverData.dwNumTextureFormats;
712 mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mcTextures);
713 if (mpTextures == NULL)
714 {
715 DxHeapMemFree( mpFourCC);
716 DxHeapMemFree( mpvmList);
717 DxHeapMemFree( This->lpLcl->lpGbl->lpModeInfo);
718 DeleteDC((HDC)This->lpLcl->hDC);
719 // FIXME Close DX fristcall and second call
720 return DD_FALSE;
721 }
722
723 mHALInfo.vmiData.pvmList = mpvmList;
724 mHALInfo.lpdwFourCC = mpFourCC;
725 mD3dDriverData.lpTextureFormats = (DDSURFACEDESC*) mpTextures;
726
727 if (!DdQueryDirectDrawObject(
728 This->lpLcl->lpGbl,
729 &mHALInfo,
730 &ddgbl.lpDDCBtmp->HALDD,
731 &ddgbl.lpDDCBtmp->HALDDSurface,
732 &ddgbl.lpDDCBtmp->HALDDPalette,
733 &mD3dCallbacks,
734 &mD3dDriverData,
735 &ddgbl.lpDDCBtmp->HALDDExeBuf,
736 (DDSURFACEDESC*)mpTextures,
737 mpFourCC,
738 mpvmList))
739
740 {
741 DxHeapMemFree(mpTextures);
742 DxHeapMemFree(mpFourCC);
743 DxHeapMemFree(mpvmList);
744 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
745 DeleteDC((HDC)This->lpLcl->hDC);
746 // FIXME Close DX fristcall and second call
747 return DD_FALSE;
748 }
749
750
751 /*
752 Copy over from HalInfo to DirectDrawGlobal
753 */
754
755 // this is wrong, cDriverName need be in ASC code not UNICODE
756 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
757
758 memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO));
759 memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS));
760
761 mHALInfo.dwNumModes = 1;
762 mHALInfo.lpModeInfo = This->lpLcl->lpGbl->lpModeInfo;
763 mHALInfo.dwMonitorFrequency = This->lpLcl->lpGbl->lpModeInfo[0].wRefreshRate;
764
765 This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency;
766 This->lpLcl->lpGbl->dwModeIndex = mHALInfo.dwModeIndex;
767 This->lpLcl->lpGbl->dwNumModes = mHALInfo.dwNumModes;
768 This->lpLcl->lpGbl->lpModeInfo = mHALInfo.lpModeInfo;
769 This->lpLcl->lpGbl->hInstance = mHALInfo.hInstance;
770
771 This->lpLcl->lpGbl->lp16DD = This->lpLcl->lpGbl;
772
773
774 memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA));
775 DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA);
776 DriverInfo.dwContext = This->lpLcl->lpGbl->hDD;
777
778 /* Get the MiscellaneousCallbacks */
779 DriverInfo.guidInfo = GUID_MiscellaneousCallbacks;
780 DriverInfo.lpvData = &ddgbl.lpDDCBtmp->HALDDMiscellaneous;
781 DriverInfo.dwExpectedSize = sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS);
782 mHALInfo.GetDriverInfo(&DriverInfo);
783
784
785 /* FIXME
786 The 3d and private data are not save at moment
787
788 we need lest the private data being setup
789 for some driver are puting kmode memory there
790 the memory often contain the private struct +
791 surface, see MS DDK how MS example driver using
792 it
793
794 the 3d interface are not so improten if u do not
795 want the 3d, and we are not writing 3d code yet
796 so we be okay for now.
797 */
798
799
800 return DD_OK;
801 }
802
803 HRESULT WINAPI
804 StartDirectDrawHel(LPDIRECTDRAW* iface, BOOL reenable)
805 {
806 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
807
808 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.CanCreateSurface = HelDdCanCreateSurface;
809 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.CreateSurface = HelDdCreateSurface;
810 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.CreatePalette = HelDdCreatePalette;
811 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.DestroyDriver = HelDdDestroyDriver;
812 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.FlipToGDISurface = HelDdFlipToGDISurface;
813 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.GetScanLine = HelDdGetScanLine;
814 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.SetColorKey = HelDdSetColorKey;
815 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.SetExclusiveMode = HelDdSetExclusiveMode;
816 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.SetMode = HelDdSetMode;
817 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank;
818
819 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.dwFlags = DDHAL_CB32_CANCREATESURFACE |
820 DDHAL_CB32_CREATESURFACE |
821 DDHAL_CB32_CREATEPALETTE |
822 DDHAL_CB32_DESTROYDRIVER |
823 DDHAL_CB32_FLIPTOGDISURFACE |
824 DDHAL_CB32_GETSCANLINE |
825 DDHAL_CB32_SETCOLORKEY |
826 DDHAL_CB32_SETEXCLUSIVEMODE |
827 DDHAL_CB32_SETMODE |
828 DDHAL_CB32_WAITFORVERTICALBLANK ;
829
830 This->lpLcl->lpGbl->lpDDCBtmp->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD);
831
832 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.AddAttachedSurface = HelDdSurfAddAttachedSurface;
833 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Blt = HelDdSurfBlt;
834 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.DestroySurface = HelDdSurfDestroySurface;
835 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Flip = HelDdSurfFlip;
836 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.GetBltStatus = HelDdSurfGetBltStatus;
837 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.GetFlipStatus = HelDdSurfGetFlipStatus;
838 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Lock = HelDdSurfLock;
839 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.reserved4 = HelDdSurfreserved4;
840 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetClipList = HelDdSurfSetClipList;
841 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetColorKey = HelDdSurfSetColorKey;
842 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetOverlayPosition = HelDdSurfSetOverlayPosition;
843 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetPalette = HelDdSurfSetPalette;
844 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Unlock = HelDdSurfUnlock;
845 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.UpdateOverlay = HelDdSurfUpdateOverlay;
846 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.dwFlags = DDHAL_SURFCB32_ADDATTACHEDSURFACE |
847 DDHAL_SURFCB32_BLT |
848 DDHAL_SURFCB32_DESTROYSURFACE |
849 DDHAL_SURFCB32_FLIP |
850 DDHAL_SURFCB32_GETBLTSTATUS |
851 DDHAL_SURFCB32_GETFLIPSTATUS |
852 DDHAL_SURFCB32_LOCK |
853 DDHAL_SURFCB32_RESERVED4 |
854 DDHAL_SURFCB32_SETCLIPLIST |
855 DDHAL_SURFCB32_SETCOLORKEY |
856 DDHAL_SURFCB32_SETOVERLAYPOSITION |
857 DDHAL_SURFCB32_SETPALETTE |
858 DDHAL_SURFCB32_UNLOCK |
859 DDHAL_SURFCB32_UPDATEOVERLAY;
860
861 This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDSurface);
862
863 /*
864 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette;
865 This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
866 This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
867 */
868
869 /*
870 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
871 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
872 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
873 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
874 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
875 */
876
877 return DD_OK;
878 }
879
880 HRESULT
881 WINAPI
882 Create_DirectDraw (LPGUID pGUID,
883 LPDIRECTDRAW* pIface,
884 REFIID id,
885 BOOL ex)
886 {
887 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)*pIface;
888
889 DX_WINDBG_trace();
890
891 if (!IsEqualGUID(&IID_IDirectDraw7, id))
892 {
893 return DDERR_INVALIDDIRECTDRAWGUID;
894 }
895
896 if (This == NULL)
897 {
898 LPDDRAWI_DIRECTDRAW_INT memThis;
899
900 /* We do not have any DirectDraw interface alloc
901 * or a idot send in pIface as NULL
902 */
903 memThis = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
904 This = memThis;
905 if (This == NULL)
906 {
907 if (memThis != NULL)
908 {
909 /* do not create memmory leak if some
910 * idot send in pIface as NULL
911 */
912 DxHeapMemFree(memThis);
913 }
914 return DDERR_OUTOFMEMORY;
915 }
916 }
917 else
918 {
919 /* We got the DirectDraw interface alloc and we need create the link */
920
921 LPDDRAWI_DIRECTDRAW_INT newThis;
922 newThis = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
923 if (newThis == NULL)
924 {
925 return DDERR_OUTOFMEMORY;
926 }
927
928 /* we need check the GUID lpGUID what type it is */
929 if (pGUID != (LPGUID)DDCREATE_HARDWAREONLY)
930 {
931 if (pGUID !=NULL)
932 {
933 This = newThis;
934 return DDERR_INVALIDDIRECTDRAWGUID;
935 }
936 }
937
938 newThis->lpLink = This;
939 This = newThis;
940 }
941
942 This->lpLcl = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
943
944 if (This->lpLcl == NULL)
945 {
946 /* FIXME cleanup */
947 return DDERR_OUTOFMEMORY;
948 }
949
950 /*
951 FIXME
952 read dwAppHackFlags flag from the system register instead for hard code it
953 */
954 This->lpLcl->dwAppHackFlags = 0;
955 This->lpLcl->dwHotTracking = 0;
956 This->lpLcl->dwIMEState = 0;
957 This->lpLcl->dwLocalFlags = DDRAWILCL_DIRECTDRAW7;
958 This->lpLcl->dwLocalRefCnt = 0;
959 /*
960 do not rest this flag to NULL it need be unistae for some reason other wise
961 somet thing will crash dwObsolete1 seam being use for something this was a
962 supriese for me
963 */
964 //This->lpLcl->dwObsolete1 = 0;
965 This->lpLcl->dwProcessId = 0;
966 This->lpLcl->dwUnused0 = 0;
967 This->lpLcl->hD3DInstance = NULL;
968 This->lpLcl->hDC = 0;
969 This->lpLcl->hDDVxd = 0;
970 This->lpLcl->hFocusWnd = 0;
971 This->lpLcl->hGammaCalibrator = 0;
972 /* Do mot inistate this value if we do we can not open the HAL interface */
973 //This->lpLcl->hWnd = 0;
974 This->lpLcl->hWndPopup = 0;
975 This->lpLcl->lpCB = NULL;
976 This->lpLcl->lpDDCB = NULL;
977 This->lpLcl->lpDDMore = 0;
978 This->lpLcl->lpGammaCalibrator = 0;
979 This->lpLcl->lpGbl = &ddgbl;
980
981 /* Do mot inistate this value if we do we can not open the HAL interface */
982 //This->lpLcl->lpPrimary = NULL;
983 This->lpLcl->pD3DIUnknown = NULL;
984 This->lpLcl->pUnkOuter = NULL;
985
986 *pIface = (LPDIRECTDRAW)This;
987
988 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK)
989 {
990 return DDERR_INVALIDPARAMS;
991 }
992
993 if (StartDirectDraw((LPDIRECTDRAW*)This, pGUID, FALSE) == DD_OK);
994 {
995 return DD_OK;
996 }
997 return DDERR_INVALIDPARAMS;
998 }
999
1000
1001
1002 HRESULT WINAPI
1003 ReCreateDirectDraw(LPDIRECTDRAW* iface)
1004 {
1005 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
1006
1007 DdDeleteDirectDrawObject(This->lpLcl->lpGbl);
1008
1009 if ((This->lpLcl->lpGbl->dwFlags & DDRAWI_NOHARDWARE) != DDRAWI_NOHARDWARE)
1010 {
1011 if (This->lpLcl->lpGbl->dwFlags & DDRAWI_EMULATIONINITIALIZED)
1012 {
1013 return StartDirectDraw(iface,NULL, TRUE);
1014 }
1015 else
1016 {
1017 return StartDirectDraw(iface,(LPGUID)DDCREATE_HARDWAREONLY, TRUE);
1018 }
1019 }
1020 else
1021 {
1022 return StartDirectDraw(iface,(LPGUID)DDCREATE_EMULATIONONLY, TRUE);
1023 }
1024
1025 return DD_FALSE;
1026 }
1027
1028