1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: dll/directx/ddraw/startup.c
5 * PURPOSE: DirectDraw Library
6 * PROGRAMMER: Magnus Olsen (greatlrd)
7 *
8 */
9
10 #include "rosdraw.h"
11
12 DDRAWI_DIRECTDRAW_GBL ddgbl;
13 DDRAWI_DDRAWSURFACE_GBL ddSurfGbl;
14
15 WCHAR classname[128];
16 WNDCLASSW wnd_class;
17
18
19 HRESULT WINAPI
Create_DirectDraw(LPGUID pGUID,LPDIRECTDRAW * pIface,REFIID id,BOOL reenable)20 Create_DirectDraw (LPGUID pGUID, LPDIRECTDRAW* pIface,
21 REFIID id, BOOL reenable)
22 {
23 LPDDRAWI_DIRECTDRAW_INT This;
24
25 DX_WINDBG_trace();
26 BOOL linking = FALSE;
27
28 if (pIface == NULL)
29 {
30 return DDERR_INVALIDPARAMS;
31 }
32
33 This = (LPDDRAWI_DIRECTDRAW_INT)*pIface;
34
35 DX_STUB_str("Linking?\n")
36
37 _SEH2_TRY
38 {
39 linking = This->lpLcl ? TRUE:FALSE;
40 }
41 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
42 {
43 linking = FALSE;
44 }
45 _SEH2_END;
46
47 /* fixme linking too second link when we shall not doing it */
48 if (!linking)
49 {
50 /* We do not have a DirectDraw interface, we need alloc it*/
51 LPDDRAWI_DIRECTDRAW_INT memThis;
52
53 DX_STUB_str("1. no linking\n");
54
55 DxHeapMemAlloc(memThis, sizeof(DDRAWI_DIRECTDRAW_INT));
56 if (memThis == NULL)
57 {
58 return DDERR_OUTOFMEMORY;
59 }
60
61 This = memThis;
62
63 /* Fixme release memory alloc if we fail */
64
65 DxHeapMemAlloc(This->lpLcl, sizeof(DDRAWI_DIRECTDRAW_LCL));
66 if (This->lpLcl == NULL)
67 {
68 return DDERR_OUTOFMEMORY;
69 }
70 }
71 else
72 {
73 /* We got the DirectDraw interface alloc and we need create the link */
74 LPDDRAWI_DIRECTDRAW_INT newThis;
75
76 DX_STUB_str("2.linking\n");
77
78 /* step 1.Alloc the new DDRAWI_DIRECTDRAW_INT for the link */
79 DxHeapMemAlloc(newThis, sizeof(DDRAWI_DIRECTDRAW_INT));
80 if (newThis == NULL)
81 {
82 return DDERR_OUTOFMEMORY;
83 }
84
85 /* step 2 check if it not DDCREATE_HARDWAREONLY we got if so we fail */
86 if ((pGUID) && (pGUID != (LPGUID)DDCREATE_HARDWAREONLY))
87 {
88 if (pGUID !=NULL)
89 {
90 This = newThis;
91 return DDERR_INVALIDDIRECTDRAWGUID;
92 }
93 }
94
95 /* step 3 do the link the old interface are store in the new one */
96 newThis->lpLink = This;
97
98 /* step 4 we need create new local directdraw struct for the new linked interface */
99 DxHeapMemAlloc(newThis->lpLcl, sizeof(DDRAWI_DIRECTDRAW_LCL));
100 if (newThis->lpLcl == NULL)
101 {
102 This = newThis;
103 return DDERR_OUTOFMEMORY;
104 }
105
106 This = newThis;
107 }
108
109 This->lpLcl->lpGbl = &ddgbl;
110
111 *pIface = (LPDIRECTDRAW)This;
112
113 /* Get right interface we whant */
114
115 This->lpVtbl = 0;
116 if (IsEqualGUID(&IID_IDirectDraw7, id))
117 {
118 /* DirectDraw7 Vtable */
119 This->lpVtbl = &DirectDraw7_Vtable;
120 This->lpLcl->dwLocalFlags = This->lpLcl->dwLocalFlags + DDRAWILCL_DIRECTDRAW7;
121 *pIface = (LPDIRECTDRAW)&This->lpVtbl;
122 Main_DirectDraw_AddRef(This);
123 }
124 else if (IsEqualGUID(&IID_IDirectDraw4, id))
125 {
126 /* DirectDraw4 Vtable */
127 This->lpVtbl = &DirectDraw4_Vtable;
128 *pIface = (LPDIRECTDRAW)&This->lpVtbl;
129 Main_DirectDraw_AddRef(This);
130 }
131 else if (IsEqualGUID(&IID_IDirectDraw2, id))
132 {
133 /* DirectDraw2 Vtable */
134 This->lpVtbl = &DirectDraw2_Vtable;
135 *pIface = (LPDIRECTDRAW)&This->lpVtbl;
136 Main_DirectDraw_AddRef(This);
137 }
138 else if (IsEqualGUID(&IID_IDirectDraw, id))
139 {
140 /* DirectDraw Vtable */
141 This->lpVtbl = &DirectDraw_Vtable;
142 *pIface = (LPDIRECTDRAW)&This->lpVtbl;
143 Main_DirectDraw_AddRef(This);
144 }
145
146 if ( This->lpVtbl != 0)
147 {
148 DX_STUB_str("Got iface\n");
149
150 if (StartDirectDraw((LPDIRECTDRAW)This, pGUID, FALSE) == DD_OK)
151 {
152 /*
153 RtlZeroMemory(&wnd_class, sizeof(wnd_class));
154 wnd_class.style = CS_HREDRAW | CS_VREDRAW;
155 wnd_class.lpfnWndProc = DefWindowProcW;
156 wnd_class.cbClsExtra = 0;
157 wnd_class.cbWndExtra = 0;
158 wnd_class.hInstance = GetModuleHandleW(0);
159 wnd_class.hIcon = 0;
160 wnd_class.hCursor = 0;
161 wnd_class.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
162 wnd_class.lpszMenuName = NULL;
163 wnd_class.lpszClassName = classname;
164 if(!RegisterClassW(&wnd_class))
165 {
166 DX_STUB_str("DDERR_GENERIC");
167 return DDERR_GENERIC;
168 }
169 */
170 This->lpLcl->hDD = ddgbl.hDD;
171 return DD_OK;
172 }
173 }
174
175 return DDERR_INVALIDPARAMS;
176 }
177
178
179 HRESULT WINAPI
StartDirectDraw(LPDIRECTDRAW iface,LPGUID lpGuid,BOOL reenable)180 StartDirectDraw(LPDIRECTDRAW iface, LPGUID lpGuid, BOOL reenable)
181 {
182 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
183 DWORD hal_ret = DD_FALSE;
184 DWORD hel_ret = DD_FALSE;
185 DWORD devicetypes = 0;
186 DWORD dwFlags = 0;
187
188
189 DX_WINDBG_trace();
190
191
192 /*
193 * ddgbl.dwPDevice is not longer in use in windows 2000 and higher
194 * I am using it for device type
195 * devicetypes = 1 : both hal and hel are enable
196 * devicetypes = 2 : both hal are enable
197 * devicetypes = 3 : both hel are enable
198 * devicetypes = 4 :loading a guid drv from the register
199 */
200
201 ddgbl.lpDriverHandle = &ddgbl;
202 ddgbl.hDDVxd = -1;
203
204 if (reenable == FALSE)
205 {
206 if ((!IsBadReadPtr(This->lpLink,sizeof(LPDIRECTDRAW))) && (This->lpLink == NULL))
207 {
208 RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
209 This->lpLcl->lpGbl->dwRefCnt++;
210 if (ddgbl.lpDDCBtmp == NULL)
211 {
212 // LPDDHAL_CALLBACKS
213 DxHeapMemAlloc( ddgbl.lpDDCBtmp , sizeof(DDHAL_CALLBACKS));
214 if (ddgbl.lpDDCBtmp == NULL)
215 {
216 DX_STUB_str("Out of memory\n");
217 return DD_FALSE;
218 }
219 }
220 }
221
222 DxHeapMemAlloc(ddgbl.lpModeInfo, sizeof(DDHALMODEINFO));
223 if (!ddgbl.lpModeInfo)
224 {
225 return DDERR_OUTOFMEMORY;
226 }
227
228 }
229 /* Windows handler are by set of SetCooperLevel
230 * so do not set it
231 */
232
233 if (reenable == FALSE)
234 {
235 if (lpGuid == NULL)
236 {
237 devicetypes= 1;
238
239 /* Create HDC for default, hal and hel driver */
240 // This->lpLcl->hWnd = (ULONG_PTR) GetActiveWindow();
241 This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
242
243 /* cObsolete is undoc in msdn it being use in CreateDCA */
244 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
245 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
246 dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
247 }
248 else if (lpGuid == (LPGUID) DDCREATE_HARDWAREONLY)
249 {
250 devicetypes = 2;
251 /* Create HDC for default, hal driver */
252 // This->lpLcl->hWnd =(ULONG_PTR) GetActiveWindow();
253 This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
254
255 /* cObsolete is undoc in msdn it being use in CreateDCA */
256 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
257 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
258 dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
259 }
260 else if (lpGuid == (LPGUID) DDCREATE_EMULATIONONLY)
261 {
262 devicetypes = 3;
263
264 /* Create HDC for default, hal and hel driver */
265 //This->lpLcl->hWnd = (ULONG_PTR) GetActiveWindow();
266 This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
267
268 /* cObsolete is undoc in msdn it being use in CreateDCA */
269 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
270 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
271
272 dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
273 }
274 else
275 {
276 /* FIXME : need getting driver from the GUID that have been pass in from
277 * the register. we do not support that yet
278 */
279 devicetypes = 4;
280 //This->lpLcl->hDC = (ULONG_PTR) NULL ;
281 //This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
282 }
283
284 /*
285 if ( (HDC)This->lpLcl->hDC == NULL)
286 {
287 DX_STUB_str("DDERR_OUTOFMEMORY\n");
288 return DDERR_OUTOFMEMORY ;
289 }
290 */
291 }
292
293 This->lpLcl->lpDDCB = ddgbl.lpDDCBtmp;
294
295 /* Startup HEL and HAL */
296 This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
297 This->lpLcl->dwProcessId = GetCurrentProcessId();
298 switch (devicetypes)
299 {
300 case 2:
301 hal_ret = StartDirectDrawHal(iface, reenable);
302 This->lpLcl->lpDDCB->HELDD.dwFlags = 0;
303 break;
304
305 case 3:
306 hel_ret = StartDirectDrawHel(iface, reenable);
307 This->lpLcl->lpDDCB->HALDD.dwFlags = 0;
308 break;
309
310 default:
311 hal_ret = StartDirectDrawHal(iface, reenable);
312 hel_ret = StartDirectDrawHel(iface, reenable);
313 break;
314 }
315
316 if (hal_ret!=DD_OK)
317 {
318 if (hel_ret!=DD_OK)
319 {
320 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT\n");
321 return DDERR_NODIRECTDRAWSUPPORT;
322 }
323 dwFlags |= DDRAWI_NOHARDWARE;
324 DX_STUB_str("No hardware support\n");
325 }
326
327 if (hel_ret!=DD_OK)
328 {
329 dwFlags |= DDRAWI_NOEMULATION;
330
331 }
332 else
333 {
334 dwFlags |= DDRAWI_EMULATIONINITIALIZED;
335 }
336
337 /* Fill some basic info for Surface */
338 This->lpLcl->lpGbl->dwFlags = This->lpLcl->lpGbl->dwFlags | dwFlags | DDRAWI_ATTACHEDTODESKTOP;
339 This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
340 This->lpLcl->hDD = ddgbl.hDD;
341
342 ddgbl.rectDevice.top = 0;
343 ddgbl.rectDevice.left = 0;
344 ddgbl.rectDevice.right = ddgbl.vmiData.dwDisplayWidth;
345 ddgbl.rectDevice.bottom = ddgbl.vmiData.dwDisplayHeight;
346
347 ddgbl.rectDesktop.top = 0;
348 ddgbl.rectDesktop.left = 0;
349 ddgbl.rectDesktop.right = ddgbl.vmiData.dwDisplayWidth;
350 ddgbl.rectDesktop.bottom = ddgbl.vmiData.dwDisplayHeight;
351
352 ddgbl.dwMonitorFrequency = GetDeviceCaps(GetWindowDC(NULL),VREFRESH);
353 ddgbl.lpModeInfo->dwWidth = ddgbl.vmiData.dwDisplayWidth;
354 ddgbl.lpModeInfo->dwHeight = ddgbl.vmiData.dwDisplayHeight;
355 ddgbl.lpModeInfo->dwBPP = ddgbl.vmiData.ddpfDisplay.dwRGBBitCount;
356 ddgbl.lpModeInfo->lPitch = ddgbl.vmiData.lDisplayPitch;
357 ddgbl.lpModeInfo->wRefreshRate = ddgbl.dwMonitorFrequency;
358 ddgbl.lpModeInfo->dwRBitMask = ddgbl.vmiData.ddpfDisplay.dwRBitMask;
359 ddgbl.lpModeInfo->dwGBitMask = ddgbl.vmiData.ddpfDisplay.dwGBitMask;
360 ddgbl.lpModeInfo->dwBBitMask = ddgbl.vmiData.ddpfDisplay.dwBBitMask;
361 ddgbl.lpModeInfo->dwAlphaBitMask = ddgbl.vmiData.ddpfDisplay.dwRGBAlphaBitMask;
362
363 return DD_OK;
364 }
365
366
367 HRESULT WINAPI
StartDirectDrawHel(LPDIRECTDRAW iface,BOOL reenable)368 StartDirectDrawHel(LPDIRECTDRAW iface, BOOL reenable)
369 {
370 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
371
372 if (reenable == FALSE)
373 {
374 if (ddgbl.lpDDCBtmp == NULL)
375 {
376 DxHeapMemAlloc(ddgbl.lpDDCBtmp, sizeof(DDHAL_CALLBACKS));
377 if ( ddgbl.lpDDCBtmp == NULL)
378 {
379 return DD_FALSE;
380 }
381 }
382 }
383
384 ddgbl.lpDDCBtmp->HELDD.CanCreateSurface = HelDdCanCreateSurface;
385 ddgbl.lpDDCBtmp->HELDD.CreateSurface = HelDdCreateSurface;
386 ddgbl.lpDDCBtmp->HELDD.CreatePalette = HelDdCreatePalette;
387 ddgbl.lpDDCBtmp->HELDD.DestroyDriver = HelDdDestroyDriver;
388 ddgbl.lpDDCBtmp->HELDD.FlipToGDISurface = HelDdFlipToGDISurface;
389 ddgbl.lpDDCBtmp->HELDD.GetScanLine = HelDdGetScanLine;
390 ddgbl.lpDDCBtmp->HELDD.SetColorKey = HelDdSetColorKey;
391 ddgbl.lpDDCBtmp->HELDD.SetExclusiveMode = HelDdSetExclusiveMode;
392 ddgbl.lpDDCBtmp->HELDD.SetMode = HelDdSetMode;
393 ddgbl.lpDDCBtmp->HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank;
394
395 ddgbl.lpDDCBtmp->HELDD.dwFlags = DDHAL_CB32_CANCREATESURFACE |
396 DDHAL_CB32_CREATESURFACE |
397 DDHAL_CB32_CREATEPALETTE |
398 DDHAL_CB32_DESTROYDRIVER |
399 DDHAL_CB32_FLIPTOGDISURFACE |
400 DDHAL_CB32_GETSCANLINE |
401 DDHAL_CB32_SETCOLORKEY |
402 DDHAL_CB32_SETEXCLUSIVEMODE |
403 DDHAL_CB32_SETMODE |
404 DDHAL_CB32_WAITFORVERTICALBLANK ;
405
406 ddgbl.lpDDCBtmp->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD);
407
408 ddgbl.lpDDCBtmp->HELDDSurface.AddAttachedSurface = HelDdSurfAddAttachedSurface;
409 ddgbl.lpDDCBtmp->HELDDSurface.Blt = HelDdSurfBlt;
410 ddgbl.lpDDCBtmp->HELDDSurface.DestroySurface = HelDdSurfDestroySurface;
411 ddgbl.lpDDCBtmp->HELDDSurface.Flip = HelDdSurfFlip;
412 ddgbl.lpDDCBtmp->HELDDSurface.GetBltStatus = HelDdSurfGetBltStatus;
413 ddgbl.lpDDCBtmp->HELDDSurface.GetFlipStatus = HelDdSurfGetFlipStatus;
414 ddgbl.lpDDCBtmp->HELDDSurface.Lock = HelDdSurfLock;
415 ddgbl.lpDDCBtmp->HELDDSurface.reserved4 = HelDdSurfreserved4;
416 ddgbl.lpDDCBtmp->HELDDSurface.SetClipList = HelDdSurfSetClipList;
417 ddgbl.lpDDCBtmp->HELDDSurface.SetColorKey = HelDdSurfSetColorKey;
418 ddgbl.lpDDCBtmp->HELDDSurface.SetOverlayPosition = HelDdSurfSetOverlayPosition;
419 ddgbl.lpDDCBtmp->HELDDSurface.SetPalette = HelDdSurfSetPalette;
420 ddgbl.lpDDCBtmp->HELDDSurface.Unlock = HelDdSurfUnlock;
421 ddgbl.lpDDCBtmp->HELDDSurface.UpdateOverlay = HelDdSurfUpdateOverlay;
422 ddgbl.lpDDCBtmp->HELDDSurface.dwFlags = DDHAL_SURFCB32_ADDATTACHEDSURFACE |
423 DDHAL_SURFCB32_BLT |
424 DDHAL_SURFCB32_DESTROYSURFACE |
425 DDHAL_SURFCB32_FLIP |
426 DDHAL_SURFCB32_GETBLTSTATUS |
427 DDHAL_SURFCB32_GETFLIPSTATUS |
428 DDHAL_SURFCB32_LOCK |
429 DDHAL_SURFCB32_RESERVED4 |
430 DDHAL_SURFCB32_SETCLIPLIST |
431 DDHAL_SURFCB32_SETCOLORKEY |
432 DDHAL_SURFCB32_SETOVERLAYPOSITION |
433 DDHAL_SURFCB32_SETPALETTE |
434 DDHAL_SURFCB32_UNLOCK |
435 DDHAL_SURFCB32_UPDATEOVERLAY;
436
437 ddgbl.lpDDCBtmp->HELDDSurface.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDSurface);
438
439 /*
440 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette;
441 This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
442 This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
443 */
444
445 /*
446 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
447 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
448 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
449 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
450 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
451 */
452
453 return DD_OK;
454 }
455
456
457 HRESULT WINAPI
StartDirectDrawHal(LPDIRECTDRAW iface,BOOL reenable)458 StartDirectDrawHal(LPDIRECTDRAW iface, BOOL reenable)
459 {
460 LPDWORD mpFourCC = NULL;
461 DDHALINFO mHALInfo;
462 BOOL newmode = FALSE;
463 LPDDSURFACEDESC mpTextures;
464 D3DHAL_CALLBACKS mD3dCallbacks;
465 D3DHAL_GLOBALDRIVERDATA mD3dDriverData;
466 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks;
467 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
468 DDHAL_GETDRIVERINFODATA DdGetDriverInfo = { 0 };
469
470 DX_WINDBG_trace();
471
472 RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO));
473 RtlZeroMemory(&mD3dCallbacks, sizeof(D3DHAL_CALLBACKS));
474 RtlZeroMemory(&mD3dDriverData, sizeof(D3DHAL_GLOBALDRIVERDATA));
475 RtlZeroMemory(&mD3dBufferCallbacks, sizeof(DDHAL_DDEXEBUFCALLBACKS));
476
477 if (reenable == FALSE)
478 {
479 if (ddgbl.lpDDCBtmp == NULL)
480 {
481 DxHeapMemAlloc(ddgbl.lpDDCBtmp, sizeof(DDHAL_CALLBACKS));
482 if ( ddgbl.lpDDCBtmp == NULL)
483 {
484 return DD_FALSE;
485 }
486 }
487 }
488 else
489 {
490 RtlZeroMemory(ddgbl.lpDDCBtmp,sizeof(DDHAL_CALLBACKS));
491 }
492
493 /*
494 * Startup DX HAL step one of three
495 */
496 if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC))
497 {
498 DxHeapMemFree(ddgbl.lpDDCBtmp);
499 return DD_FALSE;
500 }
501
502 /* Some card disable the dx after it have been created so
503 * we are force reenabling it
504 */
505 if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode))
506 {
507 DxHeapMemFree(ddgbl.lpDDCBtmp);
508 return DD_FALSE;
509 }
510
511 if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl,
512 &mHALInfo,
513 &ddgbl.lpDDCBtmp->HALDD,
514 &ddgbl.lpDDCBtmp->HALDDSurface,
515 &ddgbl.lpDDCBtmp->HALDDPalette,
516 &mD3dCallbacks,
517 &mD3dDriverData,
518 &mD3dBufferCallbacks,
519 NULL,
520 mpFourCC,
521 NULL))
522 {
523 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
524 DxHeapMemFree(ddgbl.lpDDCBtmp);
525 // FIXME Close DX first and second call
526 return DD_FALSE;
527 }
528
529 /* Alloc mpFourCC */
530 if (This->lpLcl->lpGbl->lpdwFourCC != NULL)
531 {
532 DxHeapMemFree(This->lpLcl->lpGbl->lpdwFourCC);
533 }
534
535 if (mHALInfo.ddCaps.dwNumFourCCCodes > 0 )
536 {
537
538 DxHeapMemAlloc(mpFourCC, sizeof(DWORD) * (mHALInfo.ddCaps.dwNumFourCCCodes + 2));
539
540 if (mpFourCC == NULL)
541 {
542 DxHeapMemFree(ddgbl.lpDDCBtmp);
543 // FIXME Close DX first and second call
544 return DD_FALSE;
545 }
546 }
547
548 /* Alloc mpTextures */
549 #if 0
550 DX_STUB_str("1 Here\n");
551
552 if (This->lpLcl->lpGbl->texture != NULL)
553 {
554 DxHeapMemFree(This->lpLcl->lpGbl->texture;
555 }
556
557 mpTextures = NULL;
558 if (mD3dDriverData.dwNumTextureFormats > 0)
559 {
560 mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mD3dDriverData.dwNumTextureFormats);
561 if (mpTextures == NULL)
562 {
563 DxHeapMemFree(mpFourCC);
564 DxHeapMemFree(ddgbl.lpDDCBtmp);
565 // FIXME Close DX first and second call
566 }
567 }
568
569 DX_STUB_str("2 Here\n");
570
571 #else
572 mpTextures = NULL;
573 #endif
574
575
576 /* Get all basic data from the driver */
577 if (!DdQueryDirectDrawObject(
578 This->lpLcl->lpGbl,
579 &mHALInfo,
580 &ddgbl.lpDDCBtmp->HALDD,
581 &ddgbl.lpDDCBtmp->HALDDSurface,
582 &ddgbl.lpDDCBtmp->HALDDPalette,
583 &mD3dCallbacks,
584 &mD3dDriverData,
585 &ddgbl.lpDDCBtmp->HALDDExeBuf,
586 (DDSURFACEDESC*)mpTextures,
587 mpFourCC,
588 NULL))
589 {
590 DxHeapMemFree(mpFourCC);
591 DxHeapMemFree(mpTextures);
592 DxHeapMemFree(ddgbl.lpDDCBtmp);
593 // FIXME Close DX first and second call
594 return DD_FALSE;
595 }
596
597 memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO));
598
599
600 memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS));
601
602 This->lpLcl->lpGbl->dwNumFourCC = mHALInfo.ddCaps.dwNumFourCCCodes;
603 This->lpLcl->lpGbl->lpdwFourCC = mpFourCC;
604 // This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency; // 0
605 This->lpLcl->lpGbl->dwModeIndex = mHALInfo.dwModeIndex;
606 // This->lpLcl->lpGbl->dwNumModes = mHALInfo.dwNumModes;
607 // This->lpLcl->lpGbl->lpModeInfo = mHALInfo.lpModeInfo;
608
609 /* FIXME convert mpTextures to DDHALMODEINFO */
610 // DxHeapMemFree( mpTextures);
611
612 /* FIXME D3D setup mD3dCallbacks and mD3dDriverData */
613
614
615
616
617 if (mHALInfo.dwFlags & DDHALINFO_GETDRIVERINFOSET)
618 {
619 DdGetDriverInfo.dwSize = sizeof (DDHAL_GETDRIVERINFODATA);
620 DdGetDriverInfo.guidInfo = GUID_MiscellaneousCallbacks;
621 DdGetDriverInfo.lpvData = (PVOID)&ddgbl.lpDDCBtmp->HALDDMiscellaneous;
622 DdGetDriverInfo.dwExpectedSize = sizeof (DDHAL_DDMISCELLANEOUSCALLBACKS);
623
624 if(mHALInfo.GetDriverInfo (&DdGetDriverInfo) == DDHAL_DRIVER_NOTHANDLED || DdGetDriverInfo.ddRVal != DD_OK)
625 {
626 DxHeapMemFree(mpFourCC);
627 DxHeapMemFree(mpTextures);
628 DxHeapMemFree(ddgbl.lpDDCBtmp);
629 // FIXME Close DX fristcall and second call
630 return DD_FALSE;
631 }
632
633 RtlZeroMemory(&DdGetDriverInfo, sizeof(DDHAL_GETDRIVERINFODATA));
634 DdGetDriverInfo.dwSize = sizeof (DDHAL_GETDRIVERINFODATA);
635 DdGetDriverInfo.guidInfo = GUID_Miscellaneous2Callbacks;
636
637 /* FIXME
638 DdGetDriverInfo.lpvData = (PVOID)&ddgbl.lpDDCBtmp->HALDDMiscellaneous;
639 DdGetDriverInfo.dwExpectedSize = sizeof (DDHAL_DDMISCELLANEOUS2CALLBACKS);
640
641 if(mHALInfo.GetDriverInfo (&DdGetDriverInfo) == DDHAL_DRIVER_NOTHANDLED || DdGetDriverInfo.ddRVal != DD_OK)
642 {
643 DxHeapMemFree(mpFourCC);
644 DxHeapMemFree(mpTextures);
645 DxHeapMemFree(ddgbl.lpDDCBtmp);
646 // FIXME Close DX fristcall and second call
647 return DD_FALSE;
648 }
649 DD_MISCELLANEOUS2CALLBACKS
650 {
651 DWORD dwSize;
652 DWORD dwFlags;
653 PDD_ALPHABLT AlphaBlt; // unsuse according to msdn and always set to NULL
654 PDD_CREATESURFACEEX CreateSurfaceEx;
655 PDD_GETDRIVERSTATE GetDriverState;
656 PDD_DESTROYDDLOCAL DestroyDDLocal;
657 }
658 DDHAL_MISC2CB32_CREATESURFACEEX
659 DDHAL_MISC2CB32_GETDRIVERSTATE
660 DDHAL_MISC2CB32_DESTROYDDLOCAL
661 */
662 }
663
664 if (mHALInfo.dwFlags & DDHALINFO_GETDRIVERINFO2)
665 {
666 This->lpLcl->lpGbl->dwFlags = This->lpLcl->lpGbl->dwFlags | DDRAWI_DRIVERINFO2;
667 }
668
669
670 return DD_OK;
671 }
672