Implement GetSurfaceDesc

svn path=/trunk/; revision=21533
This commit is contained in:
Magnus Olsen 2006-04-09 17:05:57 +00:00
parent 6f2a74079c
commit a477c01d94
4 changed files with 72 additions and 54 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;
@ -101,26 +101,26 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
}
else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY)
{
DX_STUB_str( "Can not create overlay surface");
////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;
// 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;
////This->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
//That->Surf->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;
//That->Surf->mddsdOverlay.dwWidth = 100; //pels;
//That->Surf->mddsdOverlay.dwHeight = 100; // lines;
//That->Surf->mddsdOverlay.dwBackBufferCount = 1; //cBuffers;
////This->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
////This->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB;
////This->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32;
//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 = &This->mddsdOverlay; // pDDSD;
//mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay; // pDDSD;
//if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED)
@ -133,40 +133,40 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
// 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(&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 = This->mddsdOverlay.dwBackBufferCount + 1;
//UINT cSurfaces = That->Surf->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(&That->Surf->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
// That->Surf->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) ?
// 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);
// This->mOverlayLocal[i].dwFlags |= DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM| DDRAWISURF_HASPIXELFORMAT| DDRAWISURF_HASOVERLAYDATA;
// That->Surf->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];
// 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(This->mpOverlayLocals[i], This->mpOverlayLocals[j]))
// 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;
@ -175,8 +175,8 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
//mDdCreateSurface.lpDD = &This->mDDrawGlobal;
//mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface;
//mDdCreateSurface.lpDDSurfaceDesc = &This->mddsdOverlay;//pDDSD;
//mDdCreateSurface.lplpSList = This->mpOverlayLocals; //cSurfaces;
//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)
@ -193,7 +193,7 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
//mDdUpdateOverlay.lpDD = &This->mDDrawGlobal;
//mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay;
//mDdUpdateOverlay.lpDDDestSurface = That->Surf->mpPrimaryLocals[0];
//mDdUpdateOverlay.lpDDSrcSurface = This->mpOverlayLocals[0];//pDDSurface;
//mDdUpdateOverlay.lpDDSrcSurface = That->Surf->mpOverlayLocals[0];//pDDSurface;
//mDdUpdateOverlay.dwFlags = DDOVER_SHOW;
//mDdUpdateOverlay.rDest.top = 0;
@ -216,7 +216,7 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
// return mDdUpdateOverlay.ddRVal;
//}
//return DD_OK;
return DD_OK;
return DDERR_INVALIDSURFACETYPE;
}

View file

@ -144,9 +144,7 @@ Main_DirectDraw_Release (LPDIRECTDRAW7 iface)
if (iface!=NULL)
{
ref = InterlockedDecrement(&This->ref);
DX_WINDBG_trace_res((INT)This->mDDrawGlobal.dwRefCnt,(INT)ref,(INT)0);
if (ref == 0)
{
// set resoltion back to the one in registry
@ -481,22 +479,19 @@ HRESULT WINAPI Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDE
pDDSD->dwWidth = This->mDDrawGlobal.vmiData.dwDisplayWidth;
pDDSD->lPitch = This->mDDrawGlobal.vmiData.lDisplayPitch;
pDDSD->dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency;
pDDSD->dwAlphaBitDepth = This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth;
RtlCopyMemory(&pDDSD->ddpfPixelFormat,&This->mDDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT));
RtlCopyMemory(&pDDSD->ddsCaps,&This->mDDrawGlobal.ddCaps,sizeof(DDCORECAPS));
RtlCopyMemory(&pDDSD->ddckCKDestOverlay,&This->mDDrawGlobal.ddckCKDestOverlay,sizeof(DDCOLORKEY));
RtlCopyMemory(&pDDSD->ddckCKSrcOverlay,&This->mDDrawGlobal.ddckCKSrcOverlay,sizeof(DDCOLORKEY));
/* have not check where I should get hold of this info yet
DWORD dwBackBufferCount;
DWORD dwAlphaBitDepth;
DWORD dwBackBufferCount;
DWORD dwReserved;
LPVOID lpSurface;
union
{
DDCOLORKEY ddckCKDestOverlay;
DWORD dwEmptyFaceColor;
}
DDCOLORKEY ddckCKDestBlt;
DDCOLORKEY ddckCKSrcOverlay;
LPVOID lpSurface;
DDCOLORKEY ddckCKDestBlt;
DDCOLORKEY ddckCKSrcBlt;
DWORD dwTextureStage;
*/

View file

@ -406,9 +406,24 @@ HRESULT WINAPI
Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
LPDDSURFACEDESC2 pDDSD)
{
DWORD dwSize;
DX_WINDBG_trace();
DX_STUB;
IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
dwSize = pDDSD->dwSize;
if ((dwSize != sizeof(DDSURFACEDESC)) &&
(dwSize != sizeof(DDSURFACEDESC2)))
{
return DDERR_GENERIC;
}
RtlZeroMemory(pDDSD,dwSize);
memcpy(pDDSD, &This->Surf->mddsdPrimary, sizeof(DDSURFACEDESC));
pDDSD->dwSize = dwSize;
return DD_OK;
}
HRESULT WINAPI

View file

@ -92,6 +92,14 @@ typedef struct
DDRAWI_DDRAWCLIPPER_GBL mPrimaryClipperGlobal;
DDSURFACEDESC mddsdPrimary;
DDRAWI_DDRAWSURFACE_GBL mOverlayGlobal;
DDRAWI_DDRAWSURFACE_LCL mOverlayLocal[6];
DDRAWI_DDRAWSURFACE_LCL *mpOverlayLocals[6];
DDRAWI_DDRAWSURFACE_MORE mOverlayMore[6];
DDSURFACEDESC mddsdOverlay;
} DxSurf;
typedef struct
@ -229,7 +237,7 @@ DWORD CALLBACK HelDdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA pccsd);
char buffer[1024]; \
sprintf ( buffer, "Enter Function %s (%s:%d)\n", __FUNCTION__,__FILE__,__LINE__ ); \
OutputDebugStringA(buffer); \
firstcallx = FALSE; \
firstcallx = TRUE; \
}
#define DX_WINDBG_trace_res(width,height,bpp) \