This commit is redesign off ddraw primare surface, we need reach primare surface from every where. We have now a expriment code that show how to create overlay with this new design but we do not set it up right yet.

svn path=/trunk/; revision=21576
This commit is contained in:
Magnus Olsen 2006-04-13 09:14:32 +00:00
parent bbd318bd04
commit 21c7829634
4 changed files with 220 additions and 194 deletions

View file

@ -30,14 +30,14 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest,
return DD_FALSE;
}
if (!(This->owner->mDDrawGlobal.lpDDCBtmp->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT))
if (!(This->Owner->mDDrawGlobal.lpDDCBtmp->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT))
{
return DDERR_NODRIVERSUPPORT;
}
mDdBlt.lpDDDestSurface = This->Surf->mpPrimaryLocals[0];
mDdBlt.lpDDDestSurface = This->Owner->mpPrimaryLocals[0];
if (!DdResetVisrgn(This->Surf->mpPrimaryLocals[0], NULL))
if (!DdResetVisrgn(This->Owner->mpPrimaryLocals[0], NULL))
{
return DDERR_NOGDI;
}
@ -62,12 +62,12 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest,
if (src != NULL)
{
mDdBlt.lpDDSrcSurface = That->Surf->mpPrimaryLocals[0];
mDdBlt.lpDDSrcSurface = That->Surf->mpSurfLocals[0];
}
mDdBlt.lpDD = &This->owner->mDDrawGlobal;
mDdBlt.Blt = This->owner->mCallbacks.HALDDSurface.Blt;
mDdBlt.lpDDDestSurface = This->Surf->mpPrimaryLocals[0];
mDdBlt.lpDD = &This->Owner->mDDrawGlobal;
mDdBlt.Blt = This->Owner->mCallbacks.HALDDSurface.Blt;
mDdBlt.lpDDDestSurface = This->Owner->mpPrimaryLocals[0];
mDdBlt.dwFlags = dwFlags;
@ -107,13 +107,13 @@ HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURF
}
Lock.ddRVal = DDERR_NOTPALETTIZED;
Lock.Lock = This->owner->mCallbacks.HALDDSurface.Lock;
Lock.Lock = This->Owner->mCallbacks.HALDDSurface.Lock;
Lock.dwFlags = flags;
Lock.lpDDSurface = &This->Surf->mPrimaryLocal;
Lock.lpDD = &This->owner->mDDrawGlobal;
Lock.lpDDSurface = &This->Owner->mPrimaryLocal;
Lock.lpDD = &This->Owner->mDDrawGlobal;
Lock.lpSurfData = NULL;
if (!DdResetVisrgn(&This->Surf->mPrimaryLocal, NULL))
if (!DdResetVisrgn(&This->Owner->mPrimaryLocal, NULL))
{
OutputDebugStringA("Here DdResetVisrgn lock");
return DDERR_UNSUPPORTED;
@ -138,13 +138,13 @@ HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURF
{
RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC2));
// FIXME the interanl mddsdPrimary shall be DDSURFACEDESC2
memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC));
memcpy(pDDSD,&This->Owner->mddsdPrimary,sizeof(DDSURFACEDESC));
pDDSD->dwSize = sizeof(DDSURFACEDESC2);
}
if (pDDSD->dwSize == sizeof(DDSURFACEDESC))
{
RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC));
memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC));
memcpy(pDDSD,&This->Owner->mddsdPrimary,sizeof(DDSURFACEDESC));
pDDSD->dwSize = sizeof(DDSURFACEDESC);
}
@ -159,9 +159,9 @@ HRESULT Hal_DDrawSurface_Unlock(LPDIRECTDRAWSURFACE7 iface, LPRECT pRect)
DDHAL_UNLOCKDATA unLock;
unLock.ddRVal = DDERR_NOTPALETTIZED;
unLock.lpDD = &This->owner->mDDrawGlobal;
unLock.lpDDSurface = &This->Surf->mPrimaryLocal;
unLock.Unlock = This->owner->mCallbacks.HALDDSurface.Unlock;
unLock.lpDD = &This->Owner->mDDrawGlobal;
unLock.lpDDSurface = &This->Owner->mPrimaryLocal;
unLock.Unlock = This->Owner->mCallbacks.HALDDSurface.Unlock;

View file

@ -357,6 +357,11 @@ HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidt
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;
}
@ -446,11 +451,11 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
// FIXME free This->mDDrawGlobal.dsList on release
This->mDDrawGlobal.dsList = (LPDDRAWI_DDRAWSURFACE_INT)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(DDRAWI_DDRAWSURFACE_INT));
That->owner = (IDirectDrawImpl *)This;
That->owner->mDDrawGlobal.dsList->dwIntRefCnt =1;
That->Owner = (IDirectDrawImpl *)This;
That->Owner->mDDrawGlobal.dsList->dwIntRefCnt =1;
/* we alwasy set to use the DirectDrawSurface7_Vtable as internel */
That->owner->mDDrawGlobal.dsList->lpVtbl = (PVOID) &DirectDrawSurface7_Vtable;
That->Owner->mDDrawGlobal.dsList->lpVtbl = (PVOID) &DirectDrawSurface7_Vtable;
That->Surf = surf;
@ -465,11 +470,11 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
{
memcpy(&That->Surf->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC));
That->Surf->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC);
OutputDebugStringA("Create DDSCAPS_PRIMARYSURFACE\n");
memcpy(&That->Owner->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC));
That->Owner->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC);
This->mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE;
This->mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary;
This->mDdCanCreateSurface.lpDDSurfaceDesc = &That->Owner->mddsdPrimary;
if (This->mDdCanCreateSurface.CanCreateSurface(&This->mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED)
{
@ -481,34 +486,34 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
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->Owner->mPrimaryGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL));
That->Owner->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE;
That->Owner->mPrimaryGlobal.lpDD = &This->mDDrawGlobal;
That->Owner->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal;
That->Owner->mPrimaryGlobal.wWidth = (WORD)This->mpModeInfos[0].dwWidth;
That->Owner->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight;
That->Owner->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->Owner->mPrimaryMore, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
That->Owner->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();
memset(&That->Owner->mPrimaryLocal, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
That->Owner->mPrimaryLocal.lpGbl = &That->Owner->mPrimaryGlobal;
That->Owner->mPrimaryLocal.lpSurfMore = &That->Owner->mPrimaryMore;
That->Owner->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;
That->Owner->mPrimaryLocal.ddsCaps.dwCaps = That->Owner->mddsdPrimary.ddsCaps.dwCaps;
That->Owner->mpPrimaryLocals[0] = &That->Owner->mPrimaryLocal;
This->mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary;
This->mDdCreateSurface.lplpSList = That->Surf->mpPrimaryLocals;
This->mDdCreateSurface.lpDDSurfaceDesc = &That->Owner->mddsdPrimary;
This->mDdCreateSurface.lplpSList = That->Owner->mpPrimaryLocals;
This->mDdCreateSurface.dwSCnt = This->mDDrawGlobal.dsList->dwIntRefCnt ;
@ -535,41 +540,41 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
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));
That->Owner->mddsdPrimary.dwFlags = DDSD_CAPS + DDSD_PIXELFORMAT;
RtlCopyMemory(&That->Owner->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;
That->Owner->mddsdPrimary.dwFlags += DDSD_HEIGHT ;
That->Owner->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;
That->Owner->mddsdPrimary.dwFlags += DDSD_WIDTH ;
That->Owner->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;
That->Owner->mddsdPrimary.dwFlags += DDSD_PITCH ;
That->Owner->mddsdPrimary.lPitch = This->mDDrawGlobal.vmiData.lDisplayPitch;
}
if ( This->mDDrawGlobal.dwMonitorFrequency != 0)
{
That->Surf->mddsdPrimary.dwFlags += DDSD_REFRESHRATE ;
That->Surf->mddsdPrimary.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency;
That->Owner->mddsdPrimary.dwFlags += DDSD_REFRESHRATE ;
That->Owner->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;
That->Owner->mddsdPrimary.dwFlags += DDSD_ALPHABITDEPTH ;
That->Owner->mddsdPrimary.dwAlphaBitDepth = This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth;
}
return DD_OK;
@ -578,123 +583,136 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
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;
OutputDebugStringA("Create DDSCAPS_OVERLAY\n");
//That->Surf->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
memset(&That->Surf->mddsdOverlay, 0, 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.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;
//
//
DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface;
mDdCanCreateSurface.lpDD = &This->mDDrawGlobal;
mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface;
mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat;
mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay; // pDDSD;
//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 (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED)
{
// derr(L"DirectDrawImpl[%08x]::__createPrimary Cannot create primary [%08x]", this, rv);
return DDERR_NOTINITIALIZED;
}
//if (mDdCanCreateSurface.ddRVal != DD_OK)
//{
// 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;
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;
UINT i;
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]))
{
return DD_FALSE;
}
}
DDHAL_CREATESURFACEDATA mDdCreateSurface;
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 = This->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;
}
else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER)
{

View file

@ -32,14 +32,14 @@ ULONG WINAPI Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface)
DX_WINDBG_trace();
return InterlockedIncrement((PLONG)&This->owner->mDDrawGlobal.dsList->dwIntRefCnt);
return InterlockedIncrement((PLONG)&This->Owner->mDDrawGlobal.dsList->dwIntRefCnt);
}
ULONG WINAPI Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface)
{
IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
ULONG ref = InterlockedDecrement((PLONG)&This->owner->mDDrawGlobal.dsList->dwIntRefCnt);
ULONG ref = InterlockedDecrement((PLONG)&This->Owner->mDDrawGlobal.dsList->dwIntRefCnt);
if (ref == 0)
HeapFree(GetProcessHeap(), 0, This);
@ -66,7 +66,7 @@ HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst,
IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT)
if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT)
{
return Hal_DDrawSurface_Blt( iface, rdst, src, rsrc, dwFlags, lpbltfx);
}
@ -87,7 +87,7 @@ HRESULT WINAPI Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface, LPRECT prect,
return DDERR_INVALIDPARAMS;
}
if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK)
if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK)
{
return Hal_DDrawSurface_Lock( iface, prect, pDDSD, flags, event);
}
@ -101,7 +101,7 @@ HRESULT WINAPI Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface, LPRECT pRec
IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK)
if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK)
{
return Hal_DDrawSurface_Unlock( iface, pRect);
}
@ -125,7 +125,7 @@ Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
That = (IDirectDrawSurfaceImpl*)pAttach;
//FIXME Have I put This and That in right order ?? DdAttachSurface(from, to)
return DdAttachSurface( That->Surf->mpPrimaryLocals[0],This->Surf->mpPrimaryLocals[0]);
return DdAttachSurface( That->Owner->mpPrimaryLocals[0],This->Owner->mpPrimaryLocals[0]);
}
/* MSDN: "not currently implemented." */
@ -213,7 +213,7 @@ Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface,
IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP)
if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP)
{
return Hal_DDrawSurface_Flip(iface, override, dwFlags);
}
@ -246,7 +246,7 @@ Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP)
if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP)
{
return Hal_DDrawSurface_GetBltStatus( iface, dwFlags);
}
@ -274,7 +274,7 @@ Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface, LPDDSCAPS2 pCaps)
This = (IDirectDrawSurfaceImpl*)iface;
RtlZeroMemory(pCaps,sizeof(DDSCAPS2));
pCaps->dwCaps = This->Surf->mddsdPrimary.ddsCaps.dwCaps;
pCaps->dwCaps = This->Owner->mddsdPrimary.ddsCaps.dwCaps;
return DD_OK;
}
@ -321,14 +321,14 @@ Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC)
for now we aussme the surface exits and create the hDC for it
*/
if ((HDC)This->Surf->mPrimaryLocal.hDC == NULL)
if ((HDC)This->Owner->mPrimaryLocal.hDC == NULL)
{
This->Surf->mPrimaryLocal.hDC = (ULONG_PTR)GetDC((HWND)This->owner->mDDrawGlobal.lpExclusiveOwner->hWnd);
*phDC = (HDC)This->Surf->mPrimaryLocal.hDC;
This->Owner->mPrimaryLocal.hDC = (ULONG_PTR)GetDC((HWND)This->Owner->mDDrawGlobal.lpExclusiveOwner->hWnd);
*phDC = (HDC)This->Owner->mPrimaryLocal.hDC;
}
else
{
*phDC = (HDC)This->Surf->mpPrimaryLocals[0]->hDC;
*phDC = (HDC)This->Owner->mpPrimaryLocals[0]->hDC;
}
return DD_OK;
@ -420,7 +420,7 @@ Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
}
RtlZeroMemory(pDDSD,dwSize);
memcpy(pDDSD, &This->Surf->mddsdPrimary, sizeof(DDSURFACEDESC));
memcpy(pDDSD, &This->Owner->mddsdPrimary, sizeof(DDSURFACEDESC));
pDDSD->dwSize = dwSize;
return DD_OK;
@ -480,12 +480,12 @@ Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface, HDC hDC)
/* FIXME check if surface exits or not */
if ((HDC)This->Surf->mPrimaryLocal.hDC == NULL)
if ((HDC)This->Owner->mPrimaryLocal.hDC == NULL)
{
return DDERR_GENERIC;
}
ReleaseDC((HWND)This->owner->mDDrawGlobal.lpExclusiveOwner->hWnd,hDC);
ReleaseDC((HWND)This->Owner->mDDrawGlobal.lpExclusiveOwner->hWnd,hDC);
return DD_OK;
}
@ -507,7 +507,7 @@ Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface,
IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY)
if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY)
{
return Hal_DDrawSurface_SetColorKey (iface, dwFlags, pCKey);
}
@ -575,7 +575,7 @@ Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface,
IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY)
if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY)
{
return Hal_DDrawSurface_UpdateOverlayDisplay ( iface, dwFlags);
}

View file

@ -82,20 +82,28 @@ typedef struct
DDHAL_CREATESURFACEDATA mDdCreateSurface;
DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface;
/* Primarey surface we must reach it from every where */
DDRAWI_DDRAWSURFACE_GBL mPrimaryGlobal;
DDRAWI_DDRAWSURFACE_MORE mPrimaryMore;
DDRAWI_DDRAWSURFACE_LCL mPrimaryLocal;
DDRAWI_DDRAWSURFACE_LCL *mpPrimaryLocals[1];
DDRAWI_DDRAWCLIPPER_LCL mPrimaryClipperLocal;
DDRAWI_DDRAWCLIPPER_GBL mPrimaryClipperGlobal;
DDSURFACEDESC mddsdPrimary;
} IDirectDrawImpl;
/******** Surface Object ********/
typedef struct
{
DDRAWI_DDRAWSURFACE_GBL mPrimaryGlobal;
DDRAWI_DDRAWSURFACE_MORE mPrimaryMore;
DDRAWI_DDRAWSURFACE_LCL mPrimaryLocal;
DDRAWI_DDRAWSURFACE_LCL *mpPrimaryLocals[1];
DDRAWI_DDRAWCLIPPER_LCL mPrimaryClipperLocal;
DDRAWI_DDRAWCLIPPER_GBL mPrimaryClipperGlobal;
DDSURFACEDESC mddsdPrimary;
DDRAWI_DDRAWSURFACE_GBL mSurfGlobal;
DDRAWI_DDRAWSURFACE_MORE mSurfMore;
DDRAWI_DDRAWSURFACE_LCL mSurfLocal;
DDRAWI_DDRAWSURFACE_LCL *mpSurfLocals[1];
DDRAWI_DDRAWCLIPPER_LCL mSurfClipperLocal;
DDRAWI_DDRAWCLIPPER_GBL mSurfClipperGlobal;
DDRAWI_DDRAWSURFACE_GBL mOverlayGlobal;
DDRAWI_DDRAWSURFACE_LCL mOverlayLocal[6];
@ -111,7 +119,7 @@ typedef struct
IDirectDrawSurface7Vtbl* lpVtbl;
IDirectDrawSurface3Vtbl* lpVtbl_v3;
IDirectDrawImpl* owner;
IDirectDrawImpl* Owner;
DDRAWI_DDRAWSURFACE_GBL Global;
DDRAWI_DDRAWSURFACE_MORE More;
@ -233,9 +241,9 @@ DWORD CALLBACK HelDdCreateSurface(LPDDHAL_CREATESURFACEDATA lpCreateSurface);
firstcall = FALSE; \
}
#define DX_WINDBG_trace()
//#define DX_WINDBG_trace()
/*
#define DX_WINDBG_trace() \
static BOOL firstcallx = TRUE; \
if (firstcallx) \
@ -245,7 +253,7 @@ DWORD CALLBACK HelDdCreateSurface(LPDDHAL_CREATESURFACEDATA lpCreateSurface);
OutputDebugStringA(buffer); \
firstcallx = TRUE; \
}
*/
#define DX_WINDBG_trace_res(width,height,bpp) \
static BOOL firstcallxx = TRUE; \