From d5c6b8650c16a78faeead460de96709ee1461563 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Wed, 12 Apr 2006 20:09:09 +0000 Subject: [PATCH] Implement DX HAL Lock it works now. we getting back user mode pointer of kernel mode memode pointer. it is mapen now. it did make next test apps working with our ddraw.dll in windows. lest 4 dx draw apps I got is working. svn path=/trunk/; revision=21569 --- reactos/dll/directx/ddraw/hal/surface_hal.c | 42 ++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/reactos/dll/directx/ddraw/hal/surface_hal.c b/reactos/dll/directx/ddraw/hal/surface_hal.c index 0417ccd755d..fec41e96fac 100644 --- a/reactos/dll/directx/ddraw/hal/surface_hal.c +++ b/reactos/dll/directx/ddraw/hal/surface_hal.c @@ -65,18 +65,14 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, mDdBlt.lpDDSrcSurface = That->Surf->mpPrimaryLocals[0]; } - //mDdBlt.lpDDSrcSurface = NULL; //src-> - mDdBlt.lpDD = &This->owner->mDDrawGlobal; mDdBlt.Blt = This->owner->mCallbacks.HALDDSurface.Blt; mDdBlt.lpDDDestSurface = This->Surf->mpPrimaryLocals[0]; mDdBlt.dwFlags = dwFlags; - - // This->Surf->mpPrimaryLocals[0]->hDC = This->owner->mDDrawGlobal.lpExclusiveOwner->hDC; + // FIXME dectect if it clipped or not - DX_STUB_str( "Can not create offscreenplain surface"); mDdBlt.IsClipped = FALSE; if (mDdBlt.Blt(&mDdBlt) != DDHAL_DRIVER_HANDLED) @@ -84,7 +80,6 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, return DDHAL_DRIVER_HANDLED; } - if (mDdBlt.ddRVal!=DD_OK) { return mDdBlt.ddRVal; @@ -97,10 +92,9 @@ HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURF pDDSD, DWORD flags, HANDLE event) { - IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - - - DDHAL_LOCKDATA Lock; + IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + + DDHAL_LOCKDATA Lock; if (prect!=NULL) { @@ -115,26 +109,32 @@ HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURF Lock.ddRVal = DDERR_NOTPALETTIZED; Lock.Lock = This->owner->mCallbacks.HALDDSurface.Lock; Lock.dwFlags = flags; - Lock.lpDDSurface = This->Surf->mpPrimaryLocals[0]; + Lock.lpDDSurface = &This->Surf->mPrimaryLocal; Lock.lpDD = &This->owner->mDDrawGlobal; Lock.lpSurfData = NULL; - - // FIXME some how lock goes wrong; - return DD_FALSE; - if (This->owner->mCallbacks.HALDDSurface.Lock(&Lock)!= DDHAL_DRIVER_HANDLED) + + if (!DdResetVisrgn(&This->Surf->mPrimaryLocal, NULL)) { + // derr(L"DirectDrawImpl[%08x]::_clear DdResetVisrgn failed", this); + } + + if (Lock.Lock(&Lock)!= DDHAL_DRIVER_HANDLED) + { + return DDERR_LOCKEDSURFACES; + } + + if (Lock.ddRVal!= DD_OK) + { return Lock.ddRVal; } + // FIXME ??? is this right ?? RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC2)); memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC)); pDDSD->dwSize = sizeof(DDSURFACEDESC2); - - pDDSD->lpSurface = Lock.lpSurfData; - - - // FIXME some things is wrong it does not show the data on screen ?? - + + pDDSD->lpSurface = (LPVOID) Lock.lpSurfData; + return DD_OK; } HRESULT Hal_DDrawSurface_Unlock(LPDIRECTDRAWSURFACE7 iface, LPRECT pRect)