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)
17 StartDirectDraw(LPDIRECTDRAW
* iface
)
19 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
24 const UINT bmiSize
= sizeof(BITMAPINFOHEADER
) + 0x10;
32 RtlZeroMemory(&This
->mDDrawGlobal
, sizeof(DDRAWI_DIRECTDRAW_GBL
));
34 /* cObsolete is undoc in msdn it being use in CreateDCA */
35 RtlCopyMemory(&This
->mDDrawGlobal
.cObsolete
,&"DISPLAY",7);
36 RtlCopyMemory(&This
->mDDrawGlobal
.cDriverName
,&"DISPLAY",7);
38 /* Same for HEL and HAL */
39 This
->mcModeInfos
= 1;
40 This
->mpModeInfos
= (DDHALMODEINFO
*) DxHeapMemAlloc(This
->mcModeInfos
* sizeof(DDHALMODEINFO
));
42 if (This
->mpModeInfos
== NULL
)
44 DX_STUB_str("DD_FALSE");
48 EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
50 This
->mpModeInfos
[0].dwWidth
= devmode
.dmPelsWidth
;
51 This
->mpModeInfos
[0].dwHeight
= devmode
.dmPelsHeight
;
52 This
->mpModeInfos
[0].dwBPP
= devmode
.dmBitsPerPel
;
53 This
->mpModeInfos
[0].lPitch
= (devmode
.dmPelsWidth
*devmode
.dmBitsPerPel
)/8;
54 This
->mpModeInfos
[0].wRefreshRate
= (WORD
)devmode
.dmDisplayFrequency
;
56 This
->hdc
= CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
58 if (This
->hdc
== NULL
)
60 DX_STUB_str("DDERR_OUTOFMEMORY");
61 return DDERR_OUTOFMEMORY
;
64 hbmp
= CreateCompatibleBitmap(This
->hdc
, 1, 1);
67 DxHeapMemFree(This
->mpModeInfos
);
69 DX_STUB_str("DDERR_OUTOFMEMORY");
70 return DDERR_OUTOFMEMORY
;
73 pbmiData
= (UCHAR
*) DxHeapMemAlloc(bmiSize
);
74 pbmi
= (BITMAPINFO
*)pbmiData
;
78 DxHeapMemFree(This
->mpModeInfos
);
81 DX_STUB_str("DDERR_OUTOFMEMORY");
82 return DDERR_OUTOFMEMORY
;
85 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
86 pbmi
->bmiHeader
.biBitCount
= (WORD
)devmode
.dmBitsPerPel
;
87 pbmi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
88 pbmi
->bmiHeader
.biWidth
= 1;
89 pbmi
->bmiHeader
.biHeight
= 1;
91 GetDIBits(This
->hdc
, hbmp
, 0, 0, NULL
, pbmi
, 0);
94 pMasks
= (DWORD
*)(pbmiData
+ sizeof(BITMAPINFOHEADER
));
95 This
->mpModeInfos
[0].dwRBitMask
= pMasks
[0];
96 This
->mpModeInfos
[0].dwGBitMask
= pMasks
[1];
97 This
->mpModeInfos
[0].dwBBitMask
= pMasks
[2];
98 This
->mpModeInfos
[0].dwAlphaBitMask
= pMasks
[3];
100 DxHeapMemFree(pbmiData
);
102 /* Startup HEL and HAL */
103 RtlZeroMemory(&This
->mDDrawGlobal
, sizeof(DDRAWI_DIRECTDRAW_GBL
));
104 RtlZeroMemory(&This
->mHALInfo
, sizeof(DDHALINFO
));
105 RtlZeroMemory(&This
->mCallbacks
, sizeof(DDHAL_CALLBACKS
));
107 This
->mDDrawLocal
.lpDDCB
= &This
->mCallbacks
;
108 This
->mDDrawLocal
.lpGbl
= &This
->mDDrawGlobal
;
109 This
->mDDrawLocal
.dwProcessId
= GetCurrentProcessId();
111 This
->mDDrawGlobal
.lpDDCBtmp
= &This
->mCallbacks
;
112 This
->mDDrawGlobal
.lpExclusiveOwner
= &This
->mDDrawLocal
;
114 hal_ret
= StartDirectDrawHal(iface
);
115 hel_ret
= StartDirectDrawHel(iface
);
116 if ((hal_ret
!=DD_OK
) && (hel_ret
!=DD_OK
))
118 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
119 return DDERR_NODIRECTDRAWSUPPORT
;
123 Setup HEL or HAL for DD_CALLBACKS
126 This
->mDdCanCreateSurface
.lpDD
= &This
->mDDrawGlobal
;
127 This
->mDdCreatePalette
.lpDD
= &This
->mDDrawGlobal
;
128 This
->mDdCreateSurface
.lpDD
= &This
->mDDrawGlobal
;
129 This
->mDdFlipToGDISurface
.lpDD
= &This
->mDDrawGlobal
;
130 This
->mDdDestroyDriver
.lpDD
= &This
->mDDrawGlobal
;
131 This
->mDdGetScanLine
.lpDD
= &This
->mDDrawGlobal
;
132 This
->mDdSetExclusiveMode
.lpDD
= &This
->mDDrawGlobal
;
133 This
->mDdSetMode
.lpDD
= &This
->mDDrawGlobal
;
134 This
->mDdWaitForVerticalBlank
.lpDD
= &This
->mDDrawGlobal
;
135 This
->mDdSetColorKey
.lpDD
= &This
->mDDrawGlobal
;
137 if (This
->devicetype
!=1)
139 /* both or only hel */
140 This
->mDdCanCreateSurface
.CanCreateSurface
= This
->mCallbacks
.HELDD
.CanCreateSurface
;
141 This
->mDdCreatePalette
.CreatePalette
= This
->mCallbacks
.HELDD
.CreatePalette
;
142 This
->mDdCreateSurface
.CreateSurface
= This
->mCallbacks
.HELDD
.CreateSurface
;
143 This
->mDdDestroyDriver
.DestroyDriver
= This
->mCallbacks
.HELDD
.DestroyDriver
;
144 This
->mDdFlipToGDISurface
.FlipToGDISurface
= This
->mCallbacks
.HELDD
.FlipToGDISurface
;
145 This
->mDdGetScanLine
.GetScanLine
= This
->mCallbacks
.HELDD
.GetScanLine
;
146 This
->mDdSetExclusiveMode
.SetExclusiveMode
= This
->mCallbacks
.HELDD
.SetExclusiveMode
;
147 This
->mDdSetMode
.SetMode
= This
->mCallbacks
.HELDD
.SetMode
;
148 This
->mDdWaitForVerticalBlank
.WaitForVerticalBlank
= This
->mCallbacks
.HELDD
.WaitForVerticalBlank
;
149 // This->mDdSetColorKey.SetColorKey = This->mCallbacks.HELDD.SetColorKey;
152 if (This
->devicetype
!=2)
154 Flags
= This
->mDDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
;
155 if (Flags
& DDHAL_CB32_CANCREATESURFACE
)
157 This
->mDdCanCreateSurface
.CanCreateSurface
= This
->mCallbacks
.HALDD
.CanCreateSurface
;
160 if (Flags
& DDHAL_CB32_CREATEPALETTE
)
162 This
->mDdCreatePalette
.CreatePalette
= This
->mCallbacks
.HALDD
.CreatePalette
;
165 if (Flags
& DDHAL_CB32_CREATESURFACE
)
167 This
->mDdCreateSurface
.CreateSurface
= This
->mCallbacks
.HALDD
.CreateSurface
;
170 if (Flags
& DDHAL_CB32_DESTROYDRIVER
)
172 This
->mDdDestroyDriver
.DestroyDriver
= This
->mCallbacks
.HALDD
.DestroyDriver
;
175 if (Flags
& DDHAL_CB32_FLIPTOGDISURFACE
)
177 This
->mDdFlipToGDISurface
.FlipToGDISurface
= This
->mCallbacks
.HALDD
.FlipToGDISurface
;
180 if (Flags
& DDHAL_CB32_GETSCANLINE
)
182 This
->mDdGetScanLine
.GetScanLine
= This
->mCallbacks
.HALDD
.GetScanLine
;
185 if (Flags
& DDHAL_CB32_SETEXCLUSIVEMODE
)
187 This
->mDdSetExclusiveMode
.SetExclusiveMode
= This
->mCallbacks
.HALDD
.SetExclusiveMode
;
190 if (Flags
& DDHAL_CB32_SETMODE
)
192 This
->mDdSetMode
.SetMode
= This
->mCallbacks
.HALDD
.SetMode
;
195 if (Flags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
197 This
->mDdWaitForVerticalBlank
.WaitForVerticalBlank
= This
->mCallbacks
.HALDD
.WaitForVerticalBlank
;
200 if (Flags
& DDHAL_CB32_SETCOLORKEY
)
202 // This->mDdSetColorKey.SetColorKey = This->mCallbacks.HALDD.SetColorKey;
207 Setup HEL or HAL for SURFACE CALLBACK
212 /* Setup calback struct so we do not need refill same info again */
213 This
->mDdCreateSurface
.lpDD
= &This
->mDDrawGlobal
;
214 This
->mDdCanCreateSurface
.lpDD
= &This
->mDDrawGlobal
;
221 StartDirectDrawHal(LPDIRECTDRAW
* iface
)
223 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
225 /* HAL Startup process */
226 BOOL newmode
= FALSE
;
230 Startup DX HAL step one of three
232 if (!DdCreateDirectDrawObject(&This
->mDDrawGlobal
, This
->hdc
))
234 DxHeapMemFree(This
->mpModeInfos
);
239 // Do not relase HDC it have been map in kernel mode
242 if (!DdReenableDirectDrawObject(&This
->mDDrawGlobal
, &newmode
))
244 DxHeapMemFree(This
->mpModeInfos
);
251 Startup DX HAL step two of three
254 if (!DdQueryDirectDrawObject(&This
->mDDrawGlobal
,
256 &This
->mCallbacks
.HALDD
,
257 &This
->mCallbacks
.HALDDSurface
,
258 &This
->mCallbacks
.HALDDPalette
,
259 &This
->mD3dCallbacks
,
260 &This
->mD3dDriverData
,
261 &This
->mD3dBufferCallbacks
,
266 DxHeapMemFree(This
->mpModeInfos
);
268 // FIXME Close DX fristcall and second call
272 This
->mcvmList
= This
->mHALInfo
.vmiData
.dwNumHeaps
;
273 This
->mpvmList
= (VIDMEM
*) DxHeapMemAlloc(sizeof(VIDMEM
) * This
->mcvmList
);
274 if (This
->mpvmList
== NULL
)
276 DxHeapMemFree(This
->mpModeInfos
);
278 // FIXME Close DX fristcall and second call
282 This
->mcFourCC
= This
->mHALInfo
.ddCaps
.dwNumFourCCCodes
;
283 This
->mpFourCC
= (DWORD
*) DxHeapMemAlloc(sizeof(DWORD
) * This
->mcFourCC
);
284 if (This
->mpFourCC
== NULL
)
286 DxHeapMemFree(This
->mpvmList
);
287 DxHeapMemFree(This
->mpModeInfos
);
289 // FIXME Close DX fristcall and second call
293 This
->mcTextures
= This
->mD3dDriverData
.dwNumTextureFormats
;
294 This
->mpTextures
= (DDSURFACEDESC
*) DxHeapMemAlloc(sizeof(DDSURFACEDESC
) * This
->mcTextures
);
295 if (This
->mpTextures
== NULL
)
297 DxHeapMemFree( This
->mpFourCC
);
298 DxHeapMemFree( This
->mpvmList
);
299 DxHeapMemFree( This
->mpModeInfos
);
301 // FIXME Close DX fristcall and second call
305 This
->mHALInfo
.vmiData
.pvmList
= This
->mpvmList
;
306 This
->mHALInfo
.lpdwFourCC
= This
->mpFourCC
;
307 This
->mD3dDriverData
.lpTextureFormats
= (DDSURFACEDESC
*) This
->mpTextures
;
309 if (!DdQueryDirectDrawObject(
312 &This
->mCallbacks
.HALDD
,
313 &This
->mCallbacks
.HALDDSurface
,
314 &This
->mCallbacks
.HALDDPalette
,
315 &This
->mD3dCallbacks
,
316 &This
->mD3dDriverData
,
317 &This
->mCallbacks
.HALDDExeBuf
,
318 (DDSURFACEDESC
*)This
->mpTextures
,
323 DxHeapMemFree(This
->mpTextures
);
324 DxHeapMemFree(This
->mpFourCC
);
325 DxHeapMemFree(This
->mpvmList
);
326 DxHeapMemFree(This
->mpModeInfos
);
328 // FIXME Close DX fristcall and second call
333 Copy over from HalInfo to DirectDrawGlobal
336 // this is wrong, cDriverName need be in ASC code not UNICODE
337 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
339 memcpy(&This
->mDDrawGlobal
.vmiData
, &This
->mHALInfo
.vmiData
,sizeof(VIDMEMINFO
));
340 memcpy(&This
->mDDrawGlobal
.ddCaps
, &This
->mHALInfo
.ddCaps
,sizeof(DDCORECAPS
));
342 This
->mHALInfo
.dwNumModes
= This
->mcModeInfos
;
343 This
->mHALInfo
.lpModeInfo
= This
->mpModeInfos
;
344 This
->mHALInfo
.dwMonitorFrequency
= This
->mpModeInfos
[0].wRefreshRate
;
346 This
->mDDrawGlobal
.dwMonitorFrequency
= This
->mHALInfo
.dwMonitorFrequency
;
347 This
->mDDrawGlobal
.dwModeIndex
= This
->mHALInfo
.dwModeIndex
;
348 This
->mDDrawGlobal
.dwNumModes
= This
->mHALInfo
.dwNumModes
;
349 This
->mDDrawGlobal
.lpModeInfo
= This
->mHALInfo
.lpModeInfo
;
350 This
->mDDrawGlobal
.hInstance
= This
->mHALInfo
.hInstance
;
352 This
->mDDrawGlobal
.lp16DD
= &This
->mDDrawGlobal
;
354 //DeleteDC(This->hdc);
356 DDHAL_GETDRIVERINFODATA DriverInfo
;
357 memset(&DriverInfo
,0, sizeof(DDHAL_GETDRIVERINFODATA
));
358 DriverInfo
.dwSize
= sizeof(DDHAL_GETDRIVERINFODATA
);
359 DriverInfo
.dwContext
= This
->mDDrawGlobal
.hDD
;
361 /* Get the MiscellaneousCallbacks */
362 DriverInfo
.guidInfo
= GUID_MiscellaneousCallbacks
;
363 DriverInfo
.lpvData
= &This
->mDDrawGlobal
.lpDDCBtmp
->HALDDMiscellaneous
;
364 DriverInfo
.dwExpectedSize
= sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS
);
365 This
->mHALInfo
.GetDriverInfo(&DriverInfo
);
367 /* Setup global surface */
368 /*This->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE;
369 This->mPrimaryGlobal.lpDD = &This->mDDrawGlobal;
370 This->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal;
371 This->mPrimaryGlobal.wWidth = (WORD)This->mpModeInfos[0].dwWidth;
372 This->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight;
373 This->mPrimaryGlobal.lPitch = This->mpModeInfos[0].lPitch;*/
375 /* FIXME free it in cleanup */
376 // This->mDDrawGlobal.dsList = (LPDDRAWI_DDRAWSURFACE_INT)DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_INT));
381 StartDirectDrawHel(LPDIRECTDRAW
* iface
)
383 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
385 This
->HELMemoryAvilable
= HEL_GRAPHIC_MEMORY_MAX
;
387 This
->mCallbacks
.HELDD
.dwFlags
= DDHAL_CB32_DESTROYDRIVER
;
388 This
->mCallbacks
.HELDD
.DestroyDriver
= HelDdDestroyDriver
;
390 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_CREATESURFACE
;
391 This
->mCallbacks
.HELDD
.CreateSurface
= HelDdCreateSurface
;
394 //This->mCallbacks.HELDD.SetColorKey = HelDdSetColorKey;
396 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_SETMODE
;
397 This
->mCallbacks
.HELDD
.SetMode
= HelDdSetMode
;
399 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_WAITFORVERTICALBLANK
;
400 This
->mCallbacks
.HELDD
.WaitForVerticalBlank
= HelDdWaitForVerticalBlank
;
402 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_CANCREATESURFACE
;
403 This
->mCallbacks
.HELDD
.CanCreateSurface
= HelDdCanCreateSurface
;
405 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_CREATEPALETTE
;
406 This
->mCallbacks
.HELDD
.CreatePalette
= HelDdCreatePalette
;
408 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_GETSCANLINE
;
409 This
->mCallbacks
.HELDD
.GetScanLine
= HelDdGetScanLine
;
411 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_SETEXCLUSIVEMODE
;
412 This
->mCallbacks
.HELDD
.SetExclusiveMode
= HelDdSetExclusiveMode
;
414 This
->mCallbacks
.HELDD
.dwFlags
+= DDHAL_CB32_FLIPTOGDISURFACE
;
415 This
->mCallbacks
.HELDD
.FlipToGDISurface
= HelDdFlipToGDISurface
;
422 Create_DirectDraw (LPGUID pGUID
,
423 LPDIRECTDRAW
* pIface
,
427 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectDrawImpl
));
433 return E_OUTOFMEMORY
;
436 ZeroMemory(This
,sizeof(IDirectDrawImpl
));
438 This
->lpVtbl
= &DirectDraw7_Vtable
;
439 This
->lpVtbl_v1
= &DDRAW_IDirectDraw_VTable
;
440 This
->lpVtbl_v2
= &DDRAW_IDirectDraw2_VTable
;
441 This
->lpVtbl_v4
= &DDRAW_IDirectDraw4_VTable
;
443 *pIface
= (LPDIRECTDRAW
)This
;
445 This
->devicetype
= 0;
447 if (pGUID
== (LPGUID
) DDCREATE_HARDWAREONLY
)
449 This
->devicetype
= 1; /* hal only */
452 if (pGUID
== (LPGUID
) DDCREATE_EMULATIONONLY
)
454 This
->devicetype
= 2; /* hel only */
457 if(This
->lpVtbl
->QueryInterface ((LPDIRECTDRAW7
)This
, id
, (void**)&pIface
) != S_OK
)
459 return DDERR_INVALIDPARAMS
;
462 if (StartDirectDraw((LPDIRECTDRAW
*)This
) == DD_OK
);
464 return This
->lpVtbl
->Initialize ((LPDIRECTDRAW7
)This
, pGUID
);
467 return DDERR_INVALIDPARAMS
;