diff --git a/reactos/dll/directx/ddraw/hal/ddraw_hal.c b/reactos/dll/directx/ddraw/hal/ddraw_hal.c index 53bb126436d..b03d8d6523e 100644 --- a/reactos/dll/directx/ddraw/hal/ddraw_hal.c +++ b/reactos/dll/directx/ddraw/hal/ddraw_hal.c @@ -79,29 +79,7 @@ Hal_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps, return mem.ddRVal; } -HRESULT Hal_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,HANDLE h) -{ - IDirectDrawImpl* This = (IDirectDrawImpl*)iface; - DDHAL_WAITFORVERTICALBLANKDATA WaitVectorData; - - if (!(This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK)) - { - return DDERR_NODRIVERSUPPORT; - } - - WaitVectorData.lpDD = &This->mDDrawGlobal; - WaitVectorData.dwFlags = dwFlags; - WaitVectorData.hEvent = (DWORD)h; - WaitVectorData.ddRVal = DDERR_NOTPALETTIZED; - - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.WaitForVerticalBlank(&WaitVectorData) != DDHAL_DRIVER_HANDLED) - { - return DDERR_NODRIVERSUPPORT; - } - - return WaitVectorData.ddRVal; -} HRESULT Hal_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine) { @@ -151,32 +129,6 @@ HRESULT Hal_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface) -HRESULT Hal_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, - DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) -{ - IDirectDrawImpl* This = (IDirectDrawImpl*)iface; - DDHAL_SETMODEDATA mode; - - if (!(This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_SETMODE)) - { - return DDERR_NODRIVERSUPPORT; - } - - mode.lpDD = &This->mDDrawGlobal; - mode.ddRVal = DDERR_NODRIVERSUPPORT; - - - - // FIXME : add search for which mode.ModeIndex we should use - // FIXME : fill the mode.inexcl; - // FIXME : fill the mode.useRefreshRate; - - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.SetMode(&mode) != DDHAL_DRIVER_HANDLED) - { - return DDERR_NODRIVERSUPPORT; - } - - return mode.ddRVal; -} + diff --git a/reactos/dll/directx/ddraw/main/ddraw_main.c b/reactos/dll/directx/ddraw/main/ddraw_main.c index 7730fac7fcf..f5e187eea22 100644 --- a/reactos/dll/directx/ddraw/main/ddraw_main.c +++ b/reactos/dll/directx/ddraw/main/ddraw_main.c @@ -218,8 +218,8 @@ HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidt DX_WINDBG_trace(); IDirectDrawImpl* This = (IDirectDrawImpl*)iface; - BOOL dummy = TRUE; - DWORD ret; + BOOL dummy = TRUE; + //DDHAL_SETMODEDATA mode; /* FIXME check the refresrate if it same if it not same do the mode switch */ if ((This->mDDrawGlobal.vmiData.dwDisplayHeight == dwHeight) && @@ -230,29 +230,30 @@ HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidt return DD_OK; } - /* Check use the Hal or Hel for SetMode */ - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_SETMODE) + if (This->mDdSetMode.SetMode == NULL ) { - ret = Hal_DirectDraw_SetDisplayMode(iface, dwWidth, dwHeight, dwBPP, dwRefreshRate, dwFlags); - - } - else - { - ret = Hel_DirectDraw_SetDisplayMode(iface, dwWidth, dwHeight, dwBPP, dwRefreshRate, dwFlags); + return DDERR_NODRIVERSUPPORT; } - - if (ret == DD_OK) + + + This->mDdSetMode.ddRVal = DDERR_NODRIVERSUPPORT; + + // FIXME : add search for which mode.ModeIndex we should use + // FIXME : fill the mode.inexcl; + // FIXME : fill the mode.useRefreshRate; + + if (This->mDdSetMode.SetMode(&This->mDdSetMode)!=DDHAL_DRIVER_HANDLED); + { + This->mDdSetMode.ddRVal = DDERR_NODRIVERSUPPORT; + } + + if (This->mDdSetMode.ddRVal == DD_OK) { DdReenableDirectDrawObject(&This->mDDrawGlobal, &dummy); /* FIXME fill the This->DirectDrawGlobal.vmiData right */ } - //This->mDDrawGlobal.lpExclusiveOwner->hDC = (ULONG_PTR)GetDC( (HWND)This->mDDrawGlobal.lpExclusiveOwner->hWnd); - - - - - return ret; + return This->mDdSetMode.ddRVal; } @@ -751,12 +752,21 @@ HRESULT WINAPI Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD d IDirectDrawImpl* This = (IDirectDrawImpl*)iface; - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK) + if (This->mDdWaitForVerticalBlank.WaitForVerticalBlank == NULL) { - return Hal_DirectDraw_WaitForVerticalBlank( iface, dwFlags, h); + return DDERR_NODRIVERSUPPORT; + } + + This->mDdWaitForVerticalBlank.dwFlags = dwFlags; + This->mDdWaitForVerticalBlank.hEvent = (DWORD)h; + This->mDdWaitForVerticalBlank.ddRVal = DDERR_NOTPALETTIZED; + + if (This->mDdWaitForVerticalBlank.WaitForVerticalBlank(&This->mDdWaitForVerticalBlank) != DDHAL_DRIVER_HANDLED) + { + return DDERR_NODRIVERSUPPORT; } - return Hel_DirectDraw_WaitForVerticalBlank( iface, dwFlags, h); + return This->mDdWaitForVerticalBlank.ddRVal; } HRESULT WINAPI Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps, diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index 663934e071d..657c68d0356 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -68,9 +68,17 @@ typedef struct /* internal counter */ ULONG ref; - /* Callbacks info */ + /* DD Callbacks info */ + DDHAL_DESTROYDRIVERDATA mDdDestroyDriver; DDHAL_CREATESURFACEDATA mDdCreateSurface; - DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; + DDHAL_SETCOLORKEYDATA mDdSetColorKey; + DDHAL_SETMODEDATA mDdSetMode; + DDHAL_WAITFORVERTICALBLANKDATA mDdWaitForVerticalBlank; + DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; + DDHAL_CREATEPALETTEDATA mDdCreatePalette; + DDHAL_GETSCANLINEDATA mDdGetScanLine; + DDHAL_SETEXCLUSIVEMODEDATA mDdSetExclusiveMode; + DDHAL_FLIPTOGDISURFACEDATA mDdFlipToGDISurface; /* Primarey surface we must reach it from every where */ DDRAWI_DDRAWSURFACE_GBL mPrimaryGlobal; diff --git a/reactos/dll/directx/ddraw/startup.c b/reactos/dll/directx/ddraw/startup.c index 5cec747a999..58039323373 100644 --- a/reactos/dll/directx/ddraw/startup.c +++ b/reactos/dll/directx/ddraw/startup.c @@ -25,6 +25,7 @@ StartDirectDraw(LPDIRECTDRAW* iface) UCHAR *pbmiData; BITMAPINFO *pbmi; DWORD *pMasks; + DWORD Flags; DX_WINDBG_trace(); @@ -119,29 +120,88 @@ StartDirectDraw(LPDIRECTDRAW* iface) } /* - Try figout which api we shall use, first we try see if HAL exits - if it does not we select HEL instead + Setup HEL or HAL for DD_CALLBACKS */ - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) - { - This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; - } - else - { - This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface; - } - - This->mDdCreateSurface.lpDD = &This->mDDrawGlobal; - - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) - { - This->mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; - } - else - { - This->mDdCreateSurface.CreateSurface = This->mCallbacks.HELDD.CreateSurface; - } + This->mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; + This->mDdCreatePalette.lpDD = &This->mDDrawGlobal; + This->mDdCreateSurface.lpDD = &This->mDDrawGlobal; + This->mDdFlipToGDISurface.lpDD = &This->mDDrawGlobal; + This->mDdDestroyDriver.lpDD = &This->mDDrawGlobal; + This->mDdGetScanLine.lpDD = &This->mDDrawGlobal; + This->mDdSetExclusiveMode.lpDD = &This->mDDrawGlobal; + This->mDdSetMode.lpDD = &This->mDDrawGlobal; + This->mDdWaitForVerticalBlank.lpDD = &This->mDDrawGlobal; + This->mDdSetColorKey.lpDD = &This->mDDrawGlobal; + + This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface; + This->mDdCreatePalette.CreatePalette = This->mCallbacks.HELDD.CreatePalette; + This->mDdCreateSurface.CreateSurface = This->mCallbacks.HELDD.CreateSurface; + This->mDdDestroyDriver.DestroyDriver = This->mCallbacks.HELDD.DestroyDriver; + This->mDdFlipToGDISurface.FlipToGDISurface = This->mCallbacks.HELDD.FlipToGDISurface; + This->mDdGetScanLine.GetScanLine = This->mCallbacks.HELDD.GetScanLine; + This->mDdSetExclusiveMode.SetExclusiveMode = This->mCallbacks.HELDD.SetExclusiveMode; + This->mDdSetMode.SetMode = This->mCallbacks.HELDD.SetMode; + This->mDdWaitForVerticalBlank.WaitForVerticalBlank = This->mCallbacks.HELDD.WaitForVerticalBlank; + // This->mDdSetColorKey.SetColorKey = This->mCallbacks.HELDD.SetColorKey; + + Flags = This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags; + + if (Flags & DDHAL_CB32_CANCREATESURFACE) + { + This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; + } + + if (Flags & DDHAL_CB32_CREATEPALETTE) + { + This->mDdCreatePalette.CreatePalette = This->mCallbacks.HALDD.CreatePalette; + } + + if (Flags & DDHAL_CB32_CREATESURFACE) + { + This->mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; + } + + if (Flags & DDHAL_CB32_DESTROYDRIVER) + { + This->mDdDestroyDriver.DestroyDriver = This->mCallbacks.HALDD.DestroyDriver; + } + + if (Flags & DDHAL_CB32_FLIPTOGDISURFACE) + { + This->mDdFlipToGDISurface.FlipToGDISurface = This->mCallbacks.HALDD.FlipToGDISurface; + } + + if (Flags & DDHAL_CB32_GETSCANLINE) + { + This->mDdGetScanLine.GetScanLine = This->mCallbacks.HALDD.GetScanLine; + } + + if (Flags & DDHAL_CB32_SETEXCLUSIVEMODE) + { + This->mDdSetExclusiveMode.SetExclusiveMode = This->mCallbacks.HALDD.SetExclusiveMode; + } + + if (Flags & DDHAL_CB32_SETMODE) + { + This->mDdSetMode.SetMode = This->mCallbacks.HALDD.SetMode; + } + + if (Flags & DDHAL_CB32_WAITFORVERTICALBLANK) + { + This->mDdWaitForVerticalBlank.WaitForVerticalBlank = This->mCallbacks.HALDD.WaitForVerticalBlank; + } + + if (Flags & DDHAL_CB32_SETCOLORKEY) + { + // This->mDdSetColorKey.SetColorKey = This->mCallbacks.HALDD.SetColorKey; + } + + /* + Setup HEL or HAL for SURFACE CALLBACK + */ + + // FIXME /* Setup calback struct so we do not need refill same info again */ This->mDdCreateSurface.lpDD = &This->mDDrawGlobal;