From ee9c7a73ffa37eef388edccbafba2b20232f9a24 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Tue, 11 Apr 2006 06:24:29 +0000 Subject: [PATCH] Start redesgin ddraw. so we can resue code betwin HEL and HAL interface. Todo so we create HEL Callbacks in HEL Callbacks shall the software version of the api be implement. svn path=/trunk/; revision=21545 --- reactos/dll/directx/ddraw/hal/surface_hal.c | 275 ---------------- reactos/dll/directx/ddraw/main/ddraw_main.c | 296 +++++++++++++++++- reactos/dll/directx/ddraw/rosdraw.h | 3 +- reactos/dll/directx/ddraw/soft/ddraw_hel.c | 3 +- .../ddraw/soft/surface_callbacks_hel.c | 5 + reactos/dll/directx/ddraw/soft/surface_hel.c | 5 +- 6 files changed, 291 insertions(+), 296 deletions(-) diff --git a/reactos/dll/directx/ddraw/hal/surface_hal.c b/reactos/dll/directx/ddraw/hal/surface_hal.c index d0d40465d19..0417ccd755d 100644 --- a/reactos/dll/directx/ddraw/hal/surface_hal.c +++ b/reactos/dll/directx/ddraw/hal/surface_hal.c @@ -11,282 +11,7 @@ #include "rosdraw.h" -HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, IDirectDrawSurfaceImpl *ppSurf, IUnknown *pUnkOuter) -{ - // UINT i; - IDirectDrawImpl* This = (IDirectDrawImpl*)iface; - IDirectDrawSurfaceImpl* That = ppSurf; - DDHAL_CREATESURFACEDATA mDdCreateSurface; - DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; - - - mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; - - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) - { - mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; - } - else - { - mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface; - } - - mDdCreateSurface.lpDD = &This->mDDrawGlobal; - mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; - - if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) - { - - memcpy(&That->Surf->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC)); - That->Surf->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC); - mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE; - mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary; - - if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) - { - return DDERR_NOTINITIALIZED; - } - - if (mDdCanCreateSurface.ddRVal != DD_OK) - { - return DDERR_NOTINITIALIZED; - } - - memset(&That->Surf->mPrimaryGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); - That->Surf->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE; - That->Surf->mPrimaryGlobal.lpDD = &This->mDDrawGlobal; - That->Surf->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal; - That->Surf->mPrimaryGlobal.wWidth = (WORD)This->mpModeInfos[0].dwWidth; - That->Surf->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight; - That->Surf->mPrimaryGlobal.lPitch = This->mpModeInfos[0].lPitch; - - memset(&That->Surf->mPrimaryMore, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); - That->Surf->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); - - memset(&That->Surf->mPrimaryLocal, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); - That->Surf->mPrimaryLocal.lpGbl = &That->Surf->mPrimaryGlobal; - That->Surf->mPrimaryLocal.lpSurfMore = &That->Surf->mPrimaryMore; - That->Surf->mPrimaryLocal.dwProcessId = GetCurrentProcessId(); - - /* - FIXME Check the flags if we shall create a primaresurface for overlay or something else - Examine windows which flags are being set for we assume this is right unsue I think - */ - //That->Surf->mPrimaryLocal.dwFlags = DDRAWISURF_PARTOFPRIMARYCHAIN|DDRAWISURF_HASOVERLAYDATA; - That->Surf->mPrimaryLocal.ddsCaps.dwCaps = That->Surf->mddsdPrimary.ddsCaps.dwCaps; - That->Surf->mpPrimaryLocals[0] = &That->Surf->mPrimaryLocal; - - - - mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary; - mDdCreateSurface.lplpSList = That->Surf->mpPrimaryLocals; - mDdCreateSurface.dwSCnt = This->mDDrawGlobal.dsList->dwIntRefCnt ; - - - if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) - { - return DDERR_NOTINITIALIZED; - } - - if (mDdCreateSurface.ddRVal != DD_OK) - { - return mDdCreateSurface.ddRVal; - } - - - /* FIXME fill in this if they are avali - DDSD_BACKBUFFERCOUNT - DDSD_CKDESTBLT - DDSD_CKDESTOVERLAY - DDSD_CKSRCBLT - DDSD_CKSRCOVERLAY - DDSD_LINEARSIZE - DDSD_LPSURFACE - DDSD_MIPMAPCOUNT - DDSD_ZBUFFERBITDEPTH - */ - - That->Surf->mddsdPrimary.dwFlags = DDSD_CAPS + DDSD_PIXELFORMAT; - RtlCopyMemory(&That->Surf->mddsdPrimary.ddpfPixelFormat,&This->mDDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT)); - RtlCopyMemory(&That->Surf->mddsdPrimary.ddsCaps,&This->mDDrawGlobal.ddCaps,sizeof(DDCORECAPS)); - - //RtlCopyMemory(&pDDSD->ddckCKDestOverlay,&This->mDDrawGlobal.ddckCKDestOverlay,sizeof(DDCOLORKEY)); - //RtlCopyMemory(&pDDSD->ddckCKSrcOverlay,&This->mDDrawGlobal.ddckCKSrcOverlay,sizeof(DDCOLORKEY)); - - if (This->mDDrawGlobal.vmiData.dwDisplayHeight != 0) - { - That->Surf->mddsdPrimary.dwFlags += DDSD_HEIGHT ; - That->Surf->mddsdPrimary.dwHeight = This->mDDrawGlobal.vmiData.dwDisplayHeight; - } - - if (This->mDDrawGlobal.vmiData.dwDisplayWidth != 0) - { - That->Surf->mddsdPrimary.dwFlags += DDSD_WIDTH ; - That->Surf->mddsdPrimary.dwWidth = This->mDDrawGlobal.vmiData.dwDisplayWidth; - } - - if (This->mDDrawGlobal.vmiData.lDisplayPitch != 0) - { - That->Surf->mddsdPrimary.dwFlags += DDSD_PITCH ; - That->Surf->mddsdPrimary.lPitch = This->mDDrawGlobal.vmiData.lDisplayPitch; - } - - if ( This->mDDrawGlobal.dwMonitorFrequency != 0) - { - That->Surf->mddsdPrimary.dwFlags += DDSD_REFRESHRATE ; - That->Surf->mddsdPrimary.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency; - } - - if (This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth != 0) - { - That->Surf->mddsdPrimary.dwFlags += DDSD_ALPHABITDEPTH ; - That->Surf->mddsdPrimary.dwAlphaBitDepth = This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth; - } - - return DD_OK; - - } - else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY) - { - // DX_STUB_str( "Can not create overlay surface"); - // memset(&That->Surf->mddsdOverlay, 0, sizeof(DDSURFACEDESC)); - // memcpy(&That->Surf->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC)); - // That->Surf->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC); - //That->Surf->mddsdOverlay.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT | DDSD_WIDTH | DDSD_HEIGHT; - - //That->Surf->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP; - - //That->Surf->mddsdOverlay.dwWidth = 100; //pels; - //That->Surf->mddsdOverlay.dwHeight = 100; // lines; - //That->Surf->mddsdOverlay.dwBackBufferCount = 1; //cBuffers; - - //That->Surf->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - //That->Surf->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB; - //That->Surf->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32; - - //mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; - //mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; - //mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; - //mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay; // pDDSD; - - - //if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) - //{ - // return DDERR_NOTINITIALIZED; - //} - - //if (mDdCanCreateSurface.ddRVal != DD_OK) - //{ - // return DDERR_NOTINITIALIZED; - //} - - //memset(&That->Surf->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); - //That->Surf->mOverlayGlobal.dwGlobalFlags = 0; - //That->Surf->mOverlayGlobal.lpDD = &This->mDDrawGlobal; - //That->Surf->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal; - //That->Surf->mOverlayGlobal.wWidth = (WORD)That->Surf->mddsdOverlay.dwWidth; - //That->Surf->mOverlayGlobal.wHeight = (WORD)That->Surf->mddsdOverlay.dwHeight; - //That->Surf->mOverlayGlobal.lPitch = -1; - //That->Surf->mOverlayGlobal.ddpfSurface = That->Surf->mddsdOverlay.ddpfPixelFormat; - - //// setup front- and backbuffer surfaces - //UINT cSurfaces = That->Surf->mddsdOverlay.dwBackBufferCount + 1; - //for (i = 0; i < cSurfaces; i++) - //{ - // memset(&That->Surf->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); - // That->Surf->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); - - // memset(&That->Surf->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); - // That->Surf->mOverlayLocal[i].lpGbl = &That->Surf->mOverlayGlobal; - // That->Surf->mOverlayLocal[i].lpSurfMore = &That->Surf->mOverlayMore[i]; - // That->Surf->mOverlayLocal[i].dwProcessId = GetCurrentProcessId(); - // That->Surf->mOverlayLocal[i].dwFlags = (i == 0) ? - // (DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER): - // (DDRAWISURF_IMPLICITCREATE|DDRAWISURF_BACKBUFFER); - - // That->Surf->mOverlayLocal[i].dwFlags |= DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM| DDRAWISURF_HASPIXELFORMAT| DDRAWISURF_HASOVERLAYDATA; - - // That->Surf->mOverlayLocal[i].ddsCaps.dwCaps = That->Surf->mddsdOverlay.ddsCaps.dwCaps; - // That->Surf->mpOverlayLocals[i] = &That->Surf->mOverlayLocal[i]; - //} - - //for (i = 0; i < cSurfaces; i++) - //{ - // UINT j = (i + 1) % cSurfaces; - // if (!DdAttachSurface(That->Surf->mpOverlayLocals[i], That->Surf->mpOverlayLocals[j])) - // { - // // derr(L"DirectDrawImpl[%08x]::__setupDevice DdAttachSurface(%d, %d) failed", this, i, j); - // return DD_FALSE; - // } - //} - - //mDdCreateSurface.lpDD = &This->mDDrawGlobal; - //mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; - //mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay;//pDDSD; - //mDdCreateSurface.lplpSList = That->Surf->mpOverlayLocals; //cSurfaces; - //mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces; - - //if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) - //{ - // return DDERR_NOTINITIALIZED; - //} - - //if (mDdCreateSurface.ddRVal != DD_OK) - //{ - // return mDdCreateSurface.ddRVal; - //} - - //DDHAL_UPDATEOVERLAYDATA mDdUpdateOverlay; - //mDdUpdateOverlay.lpDD = &This->mDDrawGlobal; - //mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay; - //mDdUpdateOverlay.lpDDDestSurface = That->Surf->mpPrimaryLocals[0]; - //mDdUpdateOverlay.lpDDSrcSurface = That->Surf->mpOverlayLocals[0];//pDDSurface; - //mDdUpdateOverlay.dwFlags = DDOVER_SHOW; - - //mDdUpdateOverlay.rDest.top = 0; - //mDdUpdateOverlay.rDest.left = 0; - //mDdUpdateOverlay.rDest.right = 50; - //mDdUpdateOverlay.rDest.bottom = 50; - - //mDdUpdateOverlay.rSrc.top = 0; - //mDdUpdateOverlay.rSrc.left = 0; - //mDdUpdateOverlay.rSrc.right = 50; - //mDdUpdateOverlay.rSrc.bottom = 50; - - //if (mDdUpdateOverlay.UpdateOverlay(&mDdUpdateOverlay) == DDHAL_DRIVER_NOTHANDLED) - //{ - // return DDERR_NOTINITIALIZED; - //} - - //if (mDdUpdateOverlay.ddRVal != DD_OK) - //{ - // return mDdUpdateOverlay.ddRVal; - //} - - return DD_OK; - return DDERR_INVALIDSURFACETYPE; - - } - else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) - { - DX_STUB_str( "Can not create backbuffer surface"); - } - else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_TEXTURE) - { - DX_STUB_str( "Can not create texture surface"); - } - else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) - { - DX_STUB_str( "Can not create zbuffer surface"); - } - else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) - { - DX_STUB_str( "Can not create offscreenplain surface"); - } - - return DDERR_INVALIDSURFACETYPE; -} HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, LPDIRECTDRAWSURFACE7 src, LPRECT rSrc, DWORD dwFlags, LPDDBLTFX lpbltfx) diff --git a/reactos/dll/directx/ddraw/main/ddraw_main.c b/reactos/dll/directx/ddraw/main/ddraw_main.c index a40b0dce48f..51106b41b9f 100644 --- a/reactos/dll/directx/ddraw/main/ddraw_main.c +++ b/reactos/dll/directx/ddraw/main/ddraw_main.c @@ -298,7 +298,6 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE { DX_WINDBG_trace(); - HRESULT ret; DxSurf *surf; if (pUnkOuter!=NULL) @@ -328,8 +327,7 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE return E_OUTOFMEMORY; } - - + That->lpVtbl = &DirectDrawSurface7_Vtable; That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable; *ppSurf = (LPDIRECTDRAWSURFACE7)That; @@ -346,20 +344,290 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE That->Surf = surf; - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) - { - ret = Hal_DirectDraw_CreateSurface (iface, pDDSD, That, pUnkOuter); - } - else - { - ret = Hel_DirectDraw_CreateSurface (iface, pDDSD, ppSurf, pUnkOuter); - } + // UINT i; + //IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + //IDirectDrawSurfaceImpl* That = ppSurf; - //This->mDDrawGlobal.dsList = (LPDDRAWI_DDRAWSURFACE_INT)&This->mPrimaryLocal; + DDHAL_CREATESURFACEDATA mDdCreateSurface; + DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; + + mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; + + if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) + { + mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; + } + else + { + mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface; + } + + mDdCreateSurface.lpDD = &This->mDDrawGlobal; + + if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) + { + mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; + } + else + { + mDdCreateSurface.CreateSurface = This->mCallbacks.HELDD.CreateSurface; + } + + mDdCreateSurface.lpDD = &This->mDDrawGlobal; + mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; + + if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + + memcpy(&That->Surf->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC)); + That->Surf->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC); + mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE; + mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary; - // the real surface object creation + if (mDdCanCreateSurface.CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) + { + return DDERR_NOTINITIALIZED; + } + + if (mDdCanCreateSurface.ddRVal != DD_OK) + { + return DDERR_NOTINITIALIZED; + } + + memset(&That->Surf->mPrimaryGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); + That->Surf->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE; + That->Surf->mPrimaryGlobal.lpDD = &This->mDDrawGlobal; + That->Surf->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal; + That->Surf->mPrimaryGlobal.wWidth = (WORD)This->mpModeInfos[0].dwWidth; + That->Surf->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight; + That->Surf->mPrimaryGlobal.lPitch = This->mpModeInfos[0].lPitch; + + memset(&That->Surf->mPrimaryMore, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); + That->Surf->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); + + memset(&That->Surf->mPrimaryLocal, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); + That->Surf->mPrimaryLocal.lpGbl = &That->Surf->mPrimaryGlobal; + That->Surf->mPrimaryLocal.lpSurfMore = &That->Surf->mPrimaryMore; + That->Surf->mPrimaryLocal.dwProcessId = GetCurrentProcessId(); + + /* + FIXME Check the flags if we shall create a primaresurface for overlay or something else + Examine windows which flags are being set for we assume this is right unsue I think + */ + //That->Surf->mPrimaryLocal.dwFlags = DDRAWISURF_PARTOFPRIMARYCHAIN|DDRAWISURF_HASOVERLAYDATA; + That->Surf->mPrimaryLocal.ddsCaps.dwCaps = That->Surf->mddsdPrimary.ddsCaps.dwCaps; + That->Surf->mpPrimaryLocals[0] = &That->Surf->mPrimaryLocal; + + + + mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary; + mDdCreateSurface.lplpSList = That->Surf->mpPrimaryLocals; + mDdCreateSurface.dwSCnt = This->mDDrawGlobal.dsList->dwIntRefCnt ; + + + if (mDdCreateSurface.CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) + { + return DDERR_NOTINITIALIZED; + } + + if (mDdCreateSurface.ddRVal != DD_OK) + { + return mDdCreateSurface.ddRVal; + } + + + /* FIXME fill in this if they are avali + DDSD_BACKBUFFERCOUNT + DDSD_CKDESTBLT + DDSD_CKDESTOVERLAY + DDSD_CKSRCBLT + DDSD_CKSRCOVERLAY + DDSD_LINEARSIZE + DDSD_LPSURFACE + DDSD_MIPMAPCOUNT + DDSD_ZBUFFERBITDEPTH + */ + + That->Surf->mddsdPrimary.dwFlags = DDSD_CAPS + DDSD_PIXELFORMAT; + RtlCopyMemory(&That->Surf->mddsdPrimary.ddpfPixelFormat,&This->mDDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT)); + RtlCopyMemory(&That->Surf->mddsdPrimary.ddsCaps,&This->mDDrawGlobal.ddCaps,sizeof(DDCORECAPS)); + + //RtlCopyMemory(&pDDSD->ddckCKDestOverlay,&This->mDDrawGlobal.ddckCKDestOverlay,sizeof(DDCOLORKEY)); + //RtlCopyMemory(&pDDSD->ddckCKSrcOverlay,&This->mDDrawGlobal.ddckCKSrcOverlay,sizeof(DDCOLORKEY)); + + if (This->mDDrawGlobal.vmiData.dwDisplayHeight != 0) + { + That->Surf->mddsdPrimary.dwFlags += DDSD_HEIGHT ; + That->Surf->mddsdPrimary.dwHeight = This->mDDrawGlobal.vmiData.dwDisplayHeight; + } + + if (This->mDDrawGlobal.vmiData.dwDisplayWidth != 0) + { + That->Surf->mddsdPrimary.dwFlags += DDSD_WIDTH ; + That->Surf->mddsdPrimary.dwWidth = This->mDDrawGlobal.vmiData.dwDisplayWidth; + } + + if (This->mDDrawGlobal.vmiData.lDisplayPitch != 0) + { + That->Surf->mddsdPrimary.dwFlags += DDSD_PITCH ; + That->Surf->mddsdPrimary.lPitch = This->mDDrawGlobal.vmiData.lDisplayPitch; + } + + if ( This->mDDrawGlobal.dwMonitorFrequency != 0) + { + That->Surf->mddsdPrimary.dwFlags += DDSD_REFRESHRATE ; + That->Surf->mddsdPrimary.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency; + } + + if (This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth != 0) + { + That->Surf->mddsdPrimary.dwFlags += DDSD_ALPHABITDEPTH ; + That->Surf->mddsdPrimary.dwAlphaBitDepth = This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth; + } + + return DD_OK; + + } + else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY) + { + // DX_STUB_str( "Can not create overlay surface"); + // memset(&That->Surf->mddsdOverlay, 0, sizeof(DDSURFACEDESC)); + // memcpy(&That->Surf->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC)); + // That->Surf->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC); + //That->Surf->mddsdOverlay.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT | DDSD_WIDTH | DDSD_HEIGHT; + + //That->Surf->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP; + + //That->Surf->mddsdOverlay.dwWidth = 100; //pels; + //That->Surf->mddsdOverlay.dwHeight = 100; // lines; + //That->Surf->mddsdOverlay.dwBackBufferCount = 1; //cBuffers; + + //That->Surf->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + //That->Surf->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB; + //That->Surf->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32; + + //mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; + //mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; + //mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; + //mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay; // pDDSD; + + + //if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) + //{ + // return DDERR_NOTINITIALIZED; + //} + + //if (mDdCanCreateSurface.ddRVal != DD_OK) + //{ + // return DDERR_NOTINITIALIZED; + //} + + //memset(&That->Surf->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); + //That->Surf->mOverlayGlobal.dwGlobalFlags = 0; + //That->Surf->mOverlayGlobal.lpDD = &This->mDDrawGlobal; + //That->Surf->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal; + //That->Surf->mOverlayGlobal.wWidth = (WORD)That->Surf->mddsdOverlay.dwWidth; + //That->Surf->mOverlayGlobal.wHeight = (WORD)That->Surf->mddsdOverlay.dwHeight; + //That->Surf->mOverlayGlobal.lPitch = -1; + //That->Surf->mOverlayGlobal.ddpfSurface = That->Surf->mddsdOverlay.ddpfPixelFormat; + + //// setup front- and backbuffer surfaces + //UINT cSurfaces = That->Surf->mddsdOverlay.dwBackBufferCount + 1; + //for (i = 0; i < cSurfaces; i++) + //{ + // memset(&That->Surf->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); + // That->Surf->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); + + // memset(&That->Surf->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); + // That->Surf->mOverlayLocal[i].lpGbl = &That->Surf->mOverlayGlobal; + // That->Surf->mOverlayLocal[i].lpSurfMore = &That->Surf->mOverlayMore[i]; + // That->Surf->mOverlayLocal[i].dwProcessId = GetCurrentProcessId(); + // That->Surf->mOverlayLocal[i].dwFlags = (i == 0) ? + // (DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER): + // (DDRAWISURF_IMPLICITCREATE|DDRAWISURF_BACKBUFFER); + + // That->Surf->mOverlayLocal[i].dwFlags |= DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM| DDRAWISURF_HASPIXELFORMAT| DDRAWISURF_HASOVERLAYDATA; + + // That->Surf->mOverlayLocal[i].ddsCaps.dwCaps = That->Surf->mddsdOverlay.ddsCaps.dwCaps; + // That->Surf->mpOverlayLocals[i] = &That->Surf->mOverlayLocal[i]; + //} + + //for (i = 0; i < cSurfaces; i++) + //{ + // UINT j = (i + 1) % cSurfaces; + // if (!DdAttachSurface(That->Surf->mpOverlayLocals[i], That->Surf->mpOverlayLocals[j])) + // { + // // derr(L"DirectDrawImpl[%08x]::__setupDevice DdAttachSurface(%d, %d) failed", this, i, j); + // return DD_FALSE; + // } + //} + + //mDdCreateSurface.lpDD = &This->mDDrawGlobal; + //mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; + //mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay;//pDDSD; + //mDdCreateSurface.lplpSList = That->Surf->mpOverlayLocals; //cSurfaces; + //mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces; + + //if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) + //{ + // return DDERR_NOTINITIALIZED; + //} + + //if (mDdCreateSurface.ddRVal != DD_OK) + //{ + // return mDdCreateSurface.ddRVal; + //} + + //DDHAL_UPDATEOVERLAYDATA mDdUpdateOverlay; + //mDdUpdateOverlay.lpDD = &This->mDDrawGlobal; + //mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay; + //mDdUpdateOverlay.lpDDDestSurface = That->Surf->mpPrimaryLocals[0]; + //mDdUpdateOverlay.lpDDSrcSurface = That->Surf->mpOverlayLocals[0];//pDDSurface; + //mDdUpdateOverlay.dwFlags = DDOVER_SHOW; + + //mDdUpdateOverlay.rDest.top = 0; + //mDdUpdateOverlay.rDest.left = 0; + //mDdUpdateOverlay.rDest.right = 50; + //mDdUpdateOverlay.rDest.bottom = 50; + + //mDdUpdateOverlay.rSrc.top = 0; + //mDdUpdateOverlay.rSrc.left = 0; + //mDdUpdateOverlay.rSrc.right = 50; + //mDdUpdateOverlay.rSrc.bottom = 50; + + //if (mDdUpdateOverlay.UpdateOverlay(&mDdUpdateOverlay) == DDHAL_DRIVER_NOTHANDLED) + //{ + // return DDERR_NOTINITIALIZED; + //} + + //if (mDdUpdateOverlay.ddRVal != DD_OK) + //{ + // return mDdUpdateOverlay.ddRVal; + //} + + return DD_OK; + return DDERR_INVALIDSURFACETYPE; + + } + else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) + { + DX_STUB_str( "Can not create backbuffer surface"); + } + else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_TEXTURE) + { + DX_STUB_str( "Can not create texture surface"); + } + else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) + { + DX_STUB_str( "Can not create zbuffer surface"); + } + else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) + { + DX_STUB_str( "Can not create offscreenplain surface"); + } + + return DDERR_INVALIDSURFACETYPE; - return DD_OK; } HRESULT WINAPI Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, DWORD dwFlags, diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index 0037d04bcaa..d838d5f047b 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -173,7 +173,6 @@ HRESULT Hal_DirectDraw_GetScanLine(LPDIRECTDRAW7 , LPDWORD ); HRESULT Hal_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 ); HRESULT Hal_DirectDraw_SetDisplayMode (LPDIRECTDRAW7, DWORD, DWORD, DWORD, DWORD, DWORD ); HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7, LPRECT, LPDIRECTDRAWSURFACE7, LPRECT, DWORD, LPDDBLTFX ); -HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, IDirectDrawSurfaceImpl *ppSurf, IUnknown *pUnkOuter); HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event); HRESULT Hal_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface, LPDIRECTDRAWSURFACE7 override, DWORD dwFlags); HRESULT Hal_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags, LPDDCOLORKEY pCKey); @@ -190,7 +189,6 @@ HRESULT Hel_DirectDraw_GetScanLine(LPDIRECTDRAW7 , LPDWORD ); HRESULT Hel_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 ); HRESULT Hel_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 , DWORD , DWORD ,DWORD , DWORD , DWORD ); HRESULT Hel_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7, LPRECT, LPDIRECTDRAWSURFACE7, LPRECT, DWORD, LPDDBLTFX ); -HRESULT Hel_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter); HRESULT Hel_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event); HRESULT Hel_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags, LPDDCOLORKEY pCKey); HRESULT Hel_DDrawSurface_Unlock(LPDIRECTDRAWSURFACE7 iface, LPRECT pRect); @@ -200,6 +198,7 @@ HRESULT Hel_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface, DWORD /* HEL CALLBACK */ DWORD CALLBACK HelDdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA pccsd); +DWORD CALLBACK HelDdCreateSurface(LPDDHAL_CREATESURFACEDATA lpCreateSurface); /* Setting for HEL should be move to ros special reg key ? */ diff --git a/reactos/dll/directx/ddraw/soft/ddraw_hel.c b/reactos/dll/directx/ddraw/soft/ddraw_hel.c index 0bc8e94b19a..9a53f6ce9c2 100644 --- a/reactos/dll/directx/ddraw/soft/ddraw_hel.c +++ b/reactos/dll/directx/ddraw/soft/ddraw_hel.c @@ -18,10 +18,11 @@ HRESULT Hel_DirectDraw_Initialize (LPDIRECTDRAW7 iface) This->HELMemoryAvilable = HEL_GRAPHIC_MEMORY_MAX; - This->mCallbacks.HELDD.dwFlags = DDHAL_CB32_CANCREATESURFACE; This->mCallbacks.HELDD.CanCreateSurface = HelDdCanCreateSurface; + This->mCallbacks.HELDD.dwFlags = DDHAL_CB32_CREATESURFACE; + This->mCallbacks.HELDD.CreateSurface = HelDdCreateSurface; return DD_OK; } diff --git a/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c b/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c index e5c9edf6558..e0961eab035 100644 --- a/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c +++ b/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c @@ -138,3 +138,8 @@ DWORD CALLBACK HelDdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA pccsd) pccsd->ddRVal = DD_OK; return DDHAL_DRIVER_HANDLED; } + +DWORD CALLBACK HelDdCreateSurface(LPDDHAL_CREATESURFACEDATA lpCreateSurface) +{ + DX_STUB; +} diff --git a/reactos/dll/directx/ddraw/soft/surface_hel.c b/reactos/dll/directx/ddraw/soft/surface_hel.c index 2fab1495d4c..a5913cb1ab2 100644 --- a/reactos/dll/directx/ddraw/soft/surface_hel.c +++ b/reactos/dll/directx/ddraw/soft/surface_hel.c @@ -11,10 +11,7 @@ #include "rosdraw.h" -HRESULT Hel_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) -{ - DX_STUB; -} + HRESULT Hel_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx)