1. Implement almost full dx hal DdBlt into ddraw

we only need adding clipper or not set it to 
   true or false. Then ddraw dx hal blt is complete
 
2. Split complete each surface getting own memory 

3. Remove create for overlay for now the code need be 
   more tested


svn path=/trunk/; revision=21510
This commit is contained in:
Magnus Olsen 2006-04-07 18:03:21 +00:00
parent ef869b1127
commit 407b2b297d
2 changed files with 128 additions and 132 deletions

View file

@ -13,7 +13,7 @@
HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, IDirectDrawSurfaceImpl *ppSurf, IUnknown *pUnkOuter)
{
UINT i;
//UINT i;
IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
IDirectDrawSurfaceImpl* That = ppSurf;
@ -28,11 +28,12 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface;
if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
{
memcpy(&This->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC));
This->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC);
{
memcpy(&That->Surf->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC));
That->Surf->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC);
mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE;
mDdCanCreateSurface.lpDDSurfaceDesc = &This->mddsdPrimary;
mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary;
if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED)
{
@ -44,31 +45,31 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
return DDERR_NOTINITIALIZED;
}
memset(&This->mPrimaryGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL));
This->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE;
This->mPrimaryGlobal.lpDD = &This->mDDrawGlobal;
This->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal;
This->mPrimaryGlobal.wWidth = (WORD)This->mpModeInfos[0].dwWidth;
This->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight;
This->mPrimaryGlobal.lPitch = This->mpModeInfos[0].lPitch;
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(&This->mPrimaryMore, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
This->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
memset(&That->Surf->mPrimaryMore, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
That->Surf->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
memset(&This->mPrimaryLocal, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
This->mPrimaryLocal.lpGbl = &This->mPrimaryGlobal;
This->mPrimaryLocal.lpSurfMore = &This->mPrimaryMore;
This->mPrimaryLocal.dwProcessId = GetCurrentProcessId();
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
*/
//This->mPrimaryLocal.dwFlags = DDRAWISURF_PARTOFPRIMARYCHAIN|DDRAWISURF_HASOVERLAYDATA;
This->mPrimaryLocal.ddsCaps.dwCaps = This->mddsdPrimary.ddsCaps.dwCaps;
That->Surf->mpPrimaryLocals[0] = &This->mPrimaryLocal;
//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 = &This->mddsdPrimary;
mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary;
mDdCreateSurface.lplpSList = That->Surf->mpPrimaryLocals;
mDdCreateSurface.dwSCnt = This->mDDrawGlobal.dsList->dwIntRefCnt ;
@ -87,121 +88,122 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
}
else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY)
{
//memset(&This->mddsdOverlay, 0, sizeof(DDSURFACEDESC));
memcpy(&This->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC));
This->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC);
//This->mddsdOverlay.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT | DDSD_WIDTH | DDSD_HEIGHT;
////memset(&This->mddsdOverlay, 0, sizeof(DDSURFACEDESC));
//memcpy(&This->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC));
//This->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC);
////This->mddsdOverlay.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT | DDSD_WIDTH | DDSD_HEIGHT;
//This->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
////This->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
//This->mddsdOverlay.dwWidth = 100; //pels;
//This->mddsdOverlay.dwHeight = 100; // lines;
//This->mddsdOverlay.dwBackBufferCount = 1; //cBuffers;
////This->mddsdOverlay.dwWidth = 100; //pels;
////This->mddsdOverlay.dwHeight = 100; // lines;
////This->mddsdOverlay.dwBackBufferCount = 1; //cBuffers;
//This->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
//This->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB;
//This->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32;
////This->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
////This->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB;
////This->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32;
mDdCanCreateSurface.lpDD = &This->mDDrawGlobal;
mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface;
mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat;
mDdCanCreateSurface.lpDDSurfaceDesc = &This->mddsdOverlay; // pDDSD;
//mDdCanCreateSurface.lpDD = &This->mDDrawGlobal;
//mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface;
//mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat;
//mDdCanCreateSurface.lpDDSurfaceDesc = &This->mddsdOverlay; // pDDSD;
if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED)
{
return DDERR_NOTINITIALIZED;
}
//if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED)
//{
// return DDERR_NOTINITIALIZED;
//}
if (mDdCanCreateSurface.ddRVal != DD_OK)
{
return DDERR_NOTINITIALIZED;
}
//if (mDdCanCreateSurface.ddRVal != DD_OK)
//{
// return DDERR_NOTINITIALIZED;
//}
memset(&This->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL));
This->mOverlayGlobal.dwGlobalFlags = 0;
This->mOverlayGlobal.lpDD = &This->mDDrawGlobal;
This->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal;
This->mOverlayGlobal.wWidth = (WORD)This->mddsdOverlay.dwWidth;
This->mOverlayGlobal.wHeight = (WORD)This->mddsdOverlay.dwHeight;
This->mOverlayGlobal.lPitch = -1;
This->mOverlayGlobal.ddpfSurface = This->mddsdOverlay.ddpfPixelFormat;
//memset(&This->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL));
//This->mOverlayGlobal.dwGlobalFlags = 0;
//This->mOverlayGlobal.lpDD = &This->mDDrawGlobal;
//This->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal;
//This->mOverlayGlobal.wWidth = (WORD)This->mddsdOverlay.dwWidth;
//This->mOverlayGlobal.wHeight = (WORD)This->mddsdOverlay.dwHeight;
//This->mOverlayGlobal.lPitch = -1;
//This->mOverlayGlobal.ddpfSurface = This->mddsdOverlay.ddpfPixelFormat;
// setup front- and backbuffer surfaces
UINT cSurfaces = This->mddsdOverlay.dwBackBufferCount + 1;
for (i = 0; i < cSurfaces; i++)
{
memset(&This->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
This->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
//// setup front- and backbuffer surfaces
//UINT cSurfaces = This->mddsdOverlay.dwBackBufferCount + 1;
//for (i = 0; i < cSurfaces; i++)
//{
// memset(&This->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
// This->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
memset(&This->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
This->mOverlayLocal[i].lpGbl = &This->mOverlayGlobal;
This->mOverlayLocal[i].lpSurfMore = &This->mOverlayMore[i];
This->mOverlayLocal[i].dwProcessId = GetCurrentProcessId();
This->mOverlayLocal[i].dwFlags = (i == 0) ?
(DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER):
(DDRAWISURF_IMPLICITCREATE|DDRAWISURF_BACKBUFFER);
// memset(&This->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
// This->mOverlayLocal[i].lpGbl = &This->mOverlayGlobal;
// This->mOverlayLocal[i].lpSurfMore = &This->mOverlayMore[i];
// This->mOverlayLocal[i].dwProcessId = GetCurrentProcessId();
// This->mOverlayLocal[i].dwFlags = (i == 0) ?
// (DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER):
// (DDRAWISURF_IMPLICITCREATE|DDRAWISURF_BACKBUFFER);
This->mOverlayLocal[i].dwFlags |= DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM| DDRAWISURF_HASPIXELFORMAT| DDRAWISURF_HASOVERLAYDATA;
// This->mOverlayLocal[i].dwFlags |= DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM| DDRAWISURF_HASPIXELFORMAT| DDRAWISURF_HASOVERLAYDATA;
This->mOverlayLocal[i].ddsCaps.dwCaps = This->mddsdOverlay.ddsCaps.dwCaps;
This->mpOverlayLocals[i] = &This->mOverlayLocal[i];
}
// This->mOverlayLocal[i].ddsCaps.dwCaps = This->mddsdOverlay.ddsCaps.dwCaps;
// This->mpOverlayLocals[i] = &This->mOverlayLocal[i];
//}
for (i = 0; i < cSurfaces; i++)
{
UINT j = (i + 1) % cSurfaces;
if (!DdAttachSurface(This->mpOverlayLocals[i], This->mpOverlayLocals[j]))
{
// derr(L"DirectDrawImpl[%08x]::__setupDevice DdAttachSurface(%d, %d) failed", this, i, j);
return DD_FALSE;
}
}
//for (i = 0; i < cSurfaces; i++)
//{
// UINT j = (i + 1) % cSurfaces;
// if (!DdAttachSurface(This->mpOverlayLocals[i], This->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 = &This->mddsdOverlay;//pDDSD;
mDdCreateSurface.lplpSList = This->mpOverlayLocals; //cSurfaces;
mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces;
//mDdCreateSurface.lpDD = &This->mDDrawGlobal;
//mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface;
//mDdCreateSurface.lpDDSurfaceDesc = &This->mddsdOverlay;//pDDSD;
//mDdCreateSurface.lplpSList = This->mpOverlayLocals; //cSurfaces;
//mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces;
if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED)
{
return DDERR_NOTINITIALIZED;
}
//if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED)
//{
// return DDERR_NOTINITIALIZED;
//}
if (mDdCreateSurface.ddRVal != DD_OK)
{
return mDdCreateSurface.ddRVal;
}
//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 = This->mpOverlayLocals[0];//pDDSurface;
mDdUpdateOverlay.dwFlags = DDOVER_SHOW;
//DDHAL_UPDATEOVERLAYDATA mDdUpdateOverlay;
//mDdUpdateOverlay.lpDD = &This->mDDrawGlobal;
//mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay;
//mDdUpdateOverlay.lpDDDestSurface = That->Surf->mpPrimaryLocals[0];
//mDdUpdateOverlay.lpDDSrcSurface = This->mpOverlayLocals[0];//pDDSurface;
//mDdUpdateOverlay.dwFlags = DDOVER_SHOW;
mDdUpdateOverlay.rDest.top = 0;
mDdUpdateOverlay.rDest.left = 0;
mDdUpdateOverlay.rDest.right = 50;
mDdUpdateOverlay.rDest.bottom = 50;
//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;
//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.UpdateOverlay(&mDdUpdateOverlay) == DDHAL_DRIVER_NOTHANDLED)
//{
// return DDERR_NOTINITIALIZED;
//}
if (mDdUpdateOverlay.ddRVal != DD_OK)
{
return mDdUpdateOverlay.ddRVal;
}
//if (mDdUpdateOverlay.ddRVal != DD_OK)
//{
// return mDdUpdateOverlay.ddRVal;
//}
return DD_OK;
//return DD_OK;
return DDERR_INVALIDSURFACETYPE;
}
else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER)
@ -277,7 +279,7 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest,
mDdBlt.dwFlags = dwFlags;
This->Surf->mpPrimaryLocals[0]->hDC = This->owner->mDDrawGlobal.lpExclusiveOwner->hDC;
// This->Surf->mpPrimaryLocals[0]->hDC = This->owner->mDDrawGlobal.lpExclusiveOwner->hDC;
// FIXME dectect if it clipped or not
mDdBlt.IsClipped = FALSE;

View file

@ -46,21 +46,7 @@ typedef struct
UINT mcTextures;
DDSURFACEDESC *mpTextures;
/* Surface */
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;
//DDRAWI_DDRAWCLIPPER_INT mPrimaryClipperInterface;
DDSURFACEDESC mddsdPrimary;
DDSURFACEDESC mddsdOverlay;
DDRAWI_DDRAWSURFACE_GBL mOverlayGlobal;
DDRAWI_DDRAWSURFACE_LCL mOverlayLocal[6];
DDRAWI_DDRAWSURFACE_LCL *mpOverlayLocals[6];
DDRAWI_DDRAWSURFACE_MORE mOverlayMore[6];
/* ExclusiveOwner */
@ -77,8 +63,16 @@ typedef struct
/******** 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;
} DxSurf;
typedef struct