Author: greatlrd Date: Wed Nov 29 21:51:04 2006 New Revision: 24970
URL: http://svn.reactos.org/svn/reactos?rev=24970&view=rev Log: fixing some of the mix betwin hel and hal. (still not complete) fixing some of dections of DDCREATE_HARDWAREONLY and DDCREATE_EMULATIONONLY, we are now swicting betwin mix HEL and HAL, only HAL, or only HEL. But this is not complete yet adding more comment so i do not forget in startuphal
Modified: trunk/reactos/dll/directx/ddraw/startup.c
Modified: trunk/reactos/dll/directx/ddraw/startup.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/startup.c... ============================================================================== --- trunk/reactos/dll/directx/ddraw/startup.c (original) +++ trunk/reactos/dll/directx/ddraw/startup.c Wed Nov 29 21:51:04 2006 @@ -170,9 +170,9 @@ This->lpLcl->hDD = This->lpLcl->lpGbl->hDD;
- /* Fixme the mix betwin hel and hal */ + /* Mix the DDCALLBACKS */ + This->lpLcl->lpDDCB->cbDDCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDCallbacks); -
if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) && (devicetypes !=3)) { @@ -277,7 +277,520 @@ This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank; }
- + /* Mix the DDSURFACE CALLBACKS */ + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDSurfaceCallbacks); + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface = + This->lpLcl->lpDDCB->HALDDSurface.AddAttachedSurface; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface = + This->lpLcl->lpDDCB->HELDDSurface.AddAttachedSurface; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt = + This->lpLcl->lpDDCB->HALDDSurface.Blt; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt = + This->lpLcl->lpDDCB->HELDDSurface.Blt; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface = + This->lpLcl->lpDDCB->HALDDSurface.DestroySurface; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface = + This->lpLcl->lpDDCB->HELDDSurface.DestroySurface; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip = + This->lpLcl->lpDDCB->HALDDSurface.Flip; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip = + This->lpLcl->lpDDCB->HELDDSurface.Flip; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus = + This->lpLcl->lpDDCB->HALDDSurface.GetBltStatus; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus = + This->lpLcl->lpDDCB->HELDDSurface.GetBltStatus; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus = + This->lpLcl->lpDDCB->HALDDSurface.GetFlipStatus; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus = + This->lpLcl->lpDDCB->HELDDSurface.GetFlipStatus; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock = + This->lpLcl->lpDDCB->HALDDSurface.Lock; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock = + This->lpLcl->lpDDCB->HELDDSurface.Lock; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 = + This->lpLcl->lpDDCB->HALDDSurface.reserved4; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 = + This->lpLcl->lpDDCB->HELDDSurface.reserved4; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList = + This->lpLcl->lpDDCB->HALDDSurface.SetClipList; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList = + This->lpLcl->lpDDCB->HELDDSurface.SetClipList; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey = + This->lpLcl->lpDDCB->HALDDSurface.SetColorKey; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey = + This->lpLcl->lpDDCB->HELDDSurface.SetColorKey; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition = + This->lpLcl->lpDDCB->HALDDSurface.SetOverlayPosition; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition = + This->lpLcl->lpDDCB->HELDDSurface.SetOverlayPosition; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette = + This->lpLcl->lpDDCB->HALDDSurface.SetPalette; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette = + This->lpLcl->lpDDCB->HELDDSurface.SetPalette; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock = + This->lpLcl->lpDDCB->HALDDSurface.Unlock; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock = + This->lpLcl->lpDDCB->HELDDSurface.Unlock; + } + + if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=3)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay = + This->lpLcl->lpDDCB->HALDDSurface.UpdateOverlay; + } + else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=2)) + { + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY; + + This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay = + This->lpLcl->lpDDCB->HELDDSurface.UpdateOverlay; + } + + + /* Mix the DDPALETTE CALLBACKS + This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette; + This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries; + This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette); + */ + + /* Mix the DDExeBuf CALLBACKS */ + + if (This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer = + This->lpLcl->lpDDCB->HALDDExeBuf.CanCreateExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF; + } + else if (This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer = + This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF; + } + + if (This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer = + This->lpLcl->lpDDCB->HALDDExeBuf.CreateExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF; + } + else if (This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer = + This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF; + } + + if (This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer = + This->lpLcl->lpDDCB->HALDDExeBuf.DestroyExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF; + } + else if (This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer = + This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF; + } + + if (This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer = + This->lpLcl->lpDDCB->HALDDExeBuf.LockExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF; + } + else if (This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer = + This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF; + } + + if (This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer = + This->lpLcl->lpDDCB->HALDDExeBuf.UnlockExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF; + } + else if (This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) + { + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer = + This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer; + This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF; + } + + /* Fill some basic info for Surface */ + ddSurfGbl.lpDD = &ddgbl; + + /* FIXME + We need setup this also + This->lpLcl->lpDDCB->cbDDColorControlCallbacks + This->lpLcl->lpDDCB->cbDDKernelCallbacks + This->lpLcl->lpDDCB->cbDDMiscellaneousCallbacks + This->lpLcl->lpDDCB->cbDDMotionCompCallbacks + This->lpLcl->lpDDCB->cbDDVideoPortCallbacks + */ + + return DD_OK; +} + + +HRESULT WINAPI +StartDirectDrawHal(LPDIRECTDRAW* iface) +{ + LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; + DDHAL_GETDRIVERINFODATA DriverInfo; + + DDHALINFO mHALInfo; + DDHAL_CALLBACKS mCallbacks; + DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks; + D3DHAL_CALLBACKS mD3dCallbacks; + D3DHAL_GLOBALDRIVERDATA mD3dDriverData; + UINT mcvmList; + VIDMEM *mpvmList; + + UINT mcFourCC; + DWORD *mpFourCC; + UINT mcTextures; + DDSURFACEDESC *mpTextures; + + /* HAL Startup process */ + BOOL newmode = FALSE; + + + RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO)); + RtlZeroMemory(&mCallbacks, sizeof(DDHAL_CALLBACKS)); + + /* + Startup DX HAL step one of three + */ + if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC)) + { + DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); + DeleteDC((HDC)This->lpLcl->hDC); + return DD_FALSE; + } + + // Do not relase HDC it have been map in kernel mode + // DeleteDC(hdc); + + if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode)) + { + DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); + DeleteDC((HDC)This->lpLcl->hDC); + return DD_FALSE; + } + + + /* + Startup DX HAL step two of three + */ + + if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl, + &mHALInfo, + &mCallbacks.HALDD, + &mCallbacks.HALDDSurface, + &mCallbacks.HALDDPalette, + &mD3dCallbacks, + &mD3dDriverData, + &mD3dBufferCallbacks, + NULL, + NULL, + NULL)) + { + DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); + DeleteDC((HDC)This->lpLcl->hDC); + // FIXME Close DX fristcall and second call + return DD_FALSE; + } + + mcvmList = mHALInfo.vmiData.dwNumHeaps; + mpvmList = (VIDMEM*) DxHeapMemAlloc(sizeof(VIDMEM) * mcvmList); + if (mpvmList == NULL) + { + DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); + DeleteDC((HDC)This->lpLcl->hDC); + // FIXME Close DX fristcall and second call + return DD_FALSE; + } + + mcFourCC = mHALInfo.ddCaps.dwNumFourCCCodes; + mpFourCC = (DWORD *) DxHeapMemAlloc(sizeof(DWORD) * mcFourCC); + if (mpFourCC == NULL) + { + DxHeapMemFree(mpvmList); + DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); + DeleteDC((HDC)This->lpLcl->hDC); + // FIXME Close DX fristcall and second call + return DD_FALSE; + } + + mcTextures = mD3dDriverData.dwNumTextureFormats; + mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mcTextures); + if (mpTextures == NULL) + { + DxHeapMemFree( mpFourCC); + DxHeapMemFree( mpvmList); + DxHeapMemFree( This->lpLcl->lpGbl->lpModeInfo); + DeleteDC((HDC)This->lpLcl->hDC); + // FIXME Close DX fristcall and second call + return DD_FALSE; + } + + mHALInfo.vmiData.pvmList = mpvmList; + mHALInfo.lpdwFourCC = mpFourCC; + mD3dDriverData.lpTextureFormats = (DDSURFACEDESC*) mpTextures; + + if (!DdQueryDirectDrawObject( + This->lpLcl->lpGbl, + &mHALInfo, + &mCallbacks.HALDD, + &mCallbacks.HALDDSurface, + &mCallbacks.HALDDPalette, + &mD3dCallbacks, + &mD3dDriverData, + &mCallbacks.HALDDExeBuf, + (DDSURFACEDESC*)mpTextures, + mpFourCC, + mpvmList)) + + { + DxHeapMemFree(mpTextures); + DxHeapMemFree(mpFourCC); + DxHeapMemFree(mpvmList); + DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); + DeleteDC((HDC)This->lpLcl->hDC); + // FIXME Close DX fristcall and second call + return DD_FALSE; + } + + /* + Copy over from HalInfo to DirectDrawGlobal + */ + + // this is wrong, cDriverName need be in ASC code not UNICODE + //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME); + + memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO)); + memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS)); + + mHALInfo.dwNumModes = 1; + mHALInfo.lpModeInfo = This->lpLcl->lpGbl->lpModeInfo; + mHALInfo.dwMonitorFrequency = This->lpLcl->lpGbl->lpModeInfo[0].wRefreshRate; + + This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency; + This->lpLcl->lpGbl->dwModeIndex = mHALInfo.dwModeIndex; + This->lpLcl->lpGbl->dwNumModes = mHALInfo.dwNumModes; + This->lpLcl->lpGbl->lpModeInfo = mHALInfo.lpModeInfo; + This->lpLcl->lpGbl->hInstance = mHALInfo.hInstance; + + This->lpLcl->lpGbl->lp16DD = This->lpLcl->lpGbl; + + + memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA)); + DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA); + DriverInfo.dwContext = This->lpLcl->lpGbl->hDD; + + /* Get the MiscellaneousCallbacks */ + DriverInfo.guidInfo = GUID_MiscellaneousCallbacks; + DriverInfo.lpvData = &ddgbl.lpDDCBtmp->HALDDMiscellaneous; + DriverInfo.dwExpectedSize = sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS); + mHALInfo.GetDriverInfo(&DriverInfo); + + + /* FIXME + The 3d and private data are not save at moment + + we need lest the private data being setup + for some driver are puting kmode memory there + the memory often contain the private struct + + surface, see MS DDK how MS example driver using + it + + the 3d interface are not so improten if u do not + want the 3d, and we are not writing 3d code yet + so we be okay for now. + */ + + + return DD_OK; +} + +HRESULT WINAPI +StartDirectDrawHel(LPDIRECTDRAW* iface) +{ + LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; + + This->lpLcl->lpDDCB->HELDD.CanCreateSurface = HelDdCanCreateSurface; + This->lpLcl->lpDDCB->HELDD.CreateSurface = HelDdCreateSurface; + This->lpLcl->lpDDCB->HELDD.CreatePalette = HelDdCreatePalette; + This->lpLcl->lpDDCB->HELDD.DestroyDriver = HelDdDestroyDriver; + //This->lpLcl->lpDDCB->HELDD.FlipToGDISurface = HelDdFlipToGDISurface + This->lpLcl->lpDDCB->HELDD.GetScanLine = HelDdGetScanLine; + // This->lpLcl->lpDDCB->HELDD.SetColorKey = HelDdSetColorKey; + This->lpLcl->lpDDCB->HELDD.SetExclusiveMode = HelDdSetExclusiveMode; + This->lpLcl->lpDDCB->HELDD.SetMode = HelDdSetMode; + This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank; + + This->lpLcl->lpDDCB->HELDD.dwFlags = DDHAL_CB32_CANCREATESURFACE | + DDHAL_CB32_CREATESURFACE | + DDHAL_CB32_CREATEPALETTE | + DDHAL_CB32_DESTROYDRIVER | + // DDHAL_CB32_FLIPTOGDISURFACE | + DDHAL_CB32_GETSCANLINE | + // DDHAL_CB32_SETCOLORKEY | + DDHAL_CB32_SETEXCLUSIVEMODE | + DDHAL_CB32_SETMODE | + DDHAL_CB32_WAITFORVERTICALBLANK ; + + + This->lpLcl->lpDDCB->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD); + /* This->lpLcl->lpDDCB->HELDDSurface.AddAttachedSurface = HelDdSurfAddAttachedSurface; This->lpLcl->lpDDCB->HELDDSurface.Blt = HelDdSurfBlt; @@ -301,298 +814,6 @@ This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette); */
- if (This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer = - This->lpLcl->lpDDCB->HALDDExeBuf.CanCreateExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF; - } - else if (This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer = - This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF; - } - - if (This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer = - This->lpLcl->lpDDCB->HALDDExeBuf.CreateExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF; - } - else if (This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer = - This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF; - } - - if (This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer = - This->lpLcl->lpDDCB->HALDDExeBuf.DestroyExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF; - } - else if (This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer = - This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF; - } - - if (This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer = - This->lpLcl->lpDDCB->HALDDExeBuf.LockExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF; - } - else if (This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer = - This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF; - } - - if (This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer = - This->lpLcl->lpDDCB->HALDDExeBuf.UnlockExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF; - } - else if (This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) - { - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer = - This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer; - This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF; - } - - /* Fill some basic info for Surface */ - ddSurfGbl.lpDD = &ddgbl; - - - return DD_OK; -} - - -HRESULT WINAPI -StartDirectDrawHal(LPDIRECTDRAW* iface) -{ - LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; - DDHAL_GETDRIVERINFODATA DriverInfo; - - DDHALINFO mHALInfo; - DDHAL_CALLBACKS mCallbacks; - DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks; - D3DHAL_CALLBACKS mD3dCallbacks; - D3DHAL_GLOBALDRIVERDATA mD3dDriverData; - UINT mcvmList; - VIDMEM *mpvmList; - - UINT mcFourCC; - DWORD *mpFourCC; - UINT mcTextures; - DDSURFACEDESC *mpTextures; - - /* HAL Startup process */ - BOOL newmode = FALSE; - - - RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO)); - RtlZeroMemory(&mCallbacks, sizeof(DDHAL_CALLBACKS)); - - /* - Startup DX HAL step one of three - */ - if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC)) - { - DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); - DeleteDC((HDC)This->lpLcl->hDC); - return DD_FALSE; - } - - // Do not relase HDC it have been map in kernel mode - // DeleteDC(hdc); - - if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode)) - { - DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); - DeleteDC((HDC)This->lpLcl->hDC); - return DD_FALSE; - } - - - /* - Startup DX HAL step two of three - */ - - if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl, - &mHALInfo, - &mCallbacks.HALDD, - &mCallbacks.HALDDSurface, - &mCallbacks.HALDDPalette, - &mD3dCallbacks, - &mD3dDriverData, - &mD3dBufferCallbacks, - NULL, - NULL, - NULL)) - { - DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); - DeleteDC((HDC)This->lpLcl->hDC); - // FIXME Close DX fristcall and second call - return DD_FALSE; - } - - mcvmList = mHALInfo.vmiData.dwNumHeaps; - mpvmList = (VIDMEM*) DxHeapMemAlloc(sizeof(VIDMEM) * mcvmList); - if (mpvmList == NULL) - { - DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); - DeleteDC((HDC)This->lpLcl->hDC); - // FIXME Close DX fristcall and second call - return DD_FALSE; - } - - mcFourCC = mHALInfo.ddCaps.dwNumFourCCCodes; - mpFourCC = (DWORD *) DxHeapMemAlloc(sizeof(DWORD) * mcFourCC); - if (mpFourCC == NULL) - { - DxHeapMemFree(mpvmList); - DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); - DeleteDC((HDC)This->lpLcl->hDC); - // FIXME Close DX fristcall and second call - return DD_FALSE; - } - - mcTextures = mD3dDriverData.dwNumTextureFormats; - mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mcTextures); - if (mpTextures == NULL) - { - DxHeapMemFree( mpFourCC); - DxHeapMemFree( mpvmList); - DxHeapMemFree( This->lpLcl->lpGbl->lpModeInfo); - DeleteDC((HDC)This->lpLcl->hDC); - // FIXME Close DX fristcall and second call - return DD_FALSE; - } - - mHALInfo.vmiData.pvmList = mpvmList; - mHALInfo.lpdwFourCC = mpFourCC; - mD3dDriverData.lpTextureFormats = (DDSURFACEDESC*) mpTextures; - - if (!DdQueryDirectDrawObject( - This->lpLcl->lpGbl, - &mHALInfo, - &mCallbacks.HALDD, - &mCallbacks.HALDDSurface, - &mCallbacks.HALDDPalette, - &mD3dCallbacks, - &mD3dDriverData, - &mCallbacks.HALDDExeBuf, - (DDSURFACEDESC*)mpTextures, - mpFourCC, - mpvmList)) - - { - DxHeapMemFree(mpTextures); - DxHeapMemFree(mpFourCC); - DxHeapMemFree(mpvmList); - DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo); - DeleteDC((HDC)This->lpLcl->hDC); - // FIXME Close DX fristcall and second call - return DD_FALSE; - } - - /* - Copy over from HalInfo to DirectDrawGlobal - */ - - // this is wrong, cDriverName need be in ASC code not UNICODE - //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME); - - memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO)); - memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS)); - - mHALInfo.dwNumModes = 1; - mHALInfo.lpModeInfo = This->lpLcl->lpGbl->lpModeInfo; - mHALInfo.dwMonitorFrequency = This->lpLcl->lpGbl->lpModeInfo[0].wRefreshRate; - - This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency; - This->lpLcl->lpGbl->dwModeIndex = mHALInfo.dwModeIndex; - This->lpLcl->lpGbl->dwNumModes = mHALInfo.dwNumModes; - This->lpLcl->lpGbl->lpModeInfo = mHALInfo.lpModeInfo; - This->lpLcl->lpGbl->hInstance = mHALInfo.hInstance; - - This->lpLcl->lpGbl->lp16DD = This->lpLcl->lpGbl; - - - memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA)); - DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA); - DriverInfo.dwContext = This->lpLcl->lpGbl->hDD; - - /* Get the MiscellaneousCallbacks */ - DriverInfo.guidInfo = GUID_MiscellaneousCallbacks; - DriverInfo.lpvData = &ddgbl.lpDDCBtmp->HALDDMiscellaneous; - DriverInfo.dwExpectedSize = sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS); - mHALInfo.GetDriverInfo(&DriverInfo); - - - return DD_OK; -} - -HRESULT WINAPI -StartDirectDrawHel(LPDIRECTDRAW* iface) -{ - LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; - - This->lpLcl->lpDDCB->HELDD.CanCreateSurface = HelDdCanCreateSurface; - This->lpLcl->lpDDCB->HELDD.CreateSurface = HelDdCreateSurface; - This->lpLcl->lpDDCB->HELDD.CreatePalette = HelDdCreatePalette; - This->lpLcl->lpDDCB->HELDD.DestroyDriver = HelDdDestroyDriver; - //This->lpLcl->lpDDCB->HELDD.FlipToGDISurface = HelDdFlipToGDISurface - This->lpLcl->lpDDCB->HELDD.GetScanLine = HelDdGetScanLine; - // This->lpLcl->lpDDCB->HELDD.SetColorKey = HelDdSetColorKey; - This->lpLcl->lpDDCB->HELDD.SetExclusiveMode = HelDdSetExclusiveMode; - This->lpLcl->lpDDCB->HELDD.SetMode = HelDdSetMode; - This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank; - - This->lpLcl->lpDDCB->HELDD.dwFlags = DDHAL_CB32_CANCREATESURFACE | - DDHAL_CB32_CREATESURFACE | - DDHAL_CB32_CREATEPALETTE | - DDHAL_CB32_DESTROYDRIVER | - // DDHAL_CB32_FLIPTOGDISURFACE | - DDHAL_CB32_GETSCANLINE | - // DDHAL_CB32_SETCOLORKEY | - DDHAL_CB32_SETEXCLUSIVEMODE | - DDHAL_CB32_SETMODE | - DDHAL_CB32_WAITFORVERTICALBLANK ; - - - This->lpLcl->lpDDCB->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD); - - /* - This->lpLcl->lpDDCB->HELDDSurface.AddAttachedSurface = HelDdSurfAddAttachedSurface; - This->lpLcl->lpDDCB->HELDDSurface.Blt = HelDdSurfBlt; - This->lpLcl->lpDDCB->HELDDSurface.DestroySurface = HelDdSurfDestroySurface; - This->lpLcl->lpDDCB->HELDDSurface.Flip = HelDdSurfFlip; - This->lpLcl->lpDDCB->HELDDSurface.GetBltStatus = HelDdSurfGetBltStatus; - This->lpLcl->lpDDCB->HELDDSurface.GetFlipStatus = HelDdSurfGetFlipStatus; - This->lpLcl->lpDDCB->HELDDSurface.Lock = HelDdSurfLock; - This->lpLcl->lpDDCB->HELDDSurface.reserved4 = HelDdSurfreserved4; - This->lpLcl->lpDDCB->HELDDSurface.SetClipList = HelDdSurfSetClipList; - This->lpLcl->lpDDCB->HELDDSurface.SetColorKey = HelDdSurfSetColorKey; - This->lpLcl->lpDDCB->HELDDSurface.SetOverlayPosition = HelDdSurfSetOverlayPosition; - This->lpLcl->lpDDCB->HELDDSurface.SetPalette = HelDdSurfSetPalette; - This->lpLcl->lpDDCB->HELDDSurface.Unlock = HelDdSurfUnlock; - This->lpLcl->lpDDCB->HELDDSurface.UpdateOverlay = HelDdSurfUpdateOverlay; - */ - - /* - This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette; - This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries; - This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette); - */ - /* This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer; This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;