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) HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, IDirectDrawSurfaceImpl *ppSurf, IUnknown *pUnkOuter)
{ {
//UINT i; // UINT i;
IDirectDrawImpl* This = (IDirectDrawImpl*)iface; IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
IDirectDrawSurfaceImpl* That = ppSurf; IDirectDrawSurfaceImpl* That = ppSurf;
@ -101,26 +101,26 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
} }
else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY) else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY)
{ {
DX_STUB_str( "Can not create overlay surface"); // DX_STUB_str( "Can not create overlay surface");
////memset(&This->mddsdOverlay, 0, sizeof(DDSURFACEDESC)); // memset(&That->Surf->mddsdOverlay, 0, sizeof(DDSURFACEDESC));
//memcpy(&This->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC)); // memcpy(&That->Surf->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC));
//This->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC); // That->Surf->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC);
////This->mddsdOverlay.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT | DDSD_WIDTH | DDSD_HEIGHT; //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; //That->Surf->mddsdOverlay.dwWidth = 100; //pels;
////This->mddsdOverlay.dwHeight = 100; // lines; //That->Surf->mddsdOverlay.dwHeight = 100; // lines;
////This->mddsdOverlay.dwBackBufferCount = 1; //cBuffers; //That->Surf->mddsdOverlay.dwBackBufferCount = 1; //cBuffers;
////This->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); //That->Surf->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
////This->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB; //That->Surf->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB;
////This->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32; //That->Surf->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32;
//mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; //mDdCanCreateSurface.lpDD = &This->mDDrawGlobal;
//mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; //mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface;
//mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; //mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat;
//mDdCanCreateSurface.lpDDSurfaceDesc = &This->mddsdOverlay; // pDDSD; //mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay; // pDDSD;
//if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) //if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED)
@ -133,40 +133,40 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
// return DDERR_NOTINITIALIZED; // return DDERR_NOTINITIALIZED;
//} //}
//memset(&This->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); //memset(&That->Surf->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL));
//This->mOverlayGlobal.dwGlobalFlags = 0; //That->Surf->mOverlayGlobal.dwGlobalFlags = 0;
//This->mOverlayGlobal.lpDD = &This->mDDrawGlobal; //That->Surf->mOverlayGlobal.lpDD = &This->mDDrawGlobal;
//This->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal; //That->Surf->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal;
//This->mOverlayGlobal.wWidth = (WORD)This->mddsdOverlay.dwWidth; //That->Surf->mOverlayGlobal.wWidth = (WORD)That->Surf->mddsdOverlay.dwWidth;
//This->mOverlayGlobal.wHeight = (WORD)This->mddsdOverlay.dwHeight; //That->Surf->mOverlayGlobal.wHeight = (WORD)That->Surf->mddsdOverlay.dwHeight;
//This->mOverlayGlobal.lPitch = -1; //That->Surf->mOverlayGlobal.lPitch = -1;
//This->mOverlayGlobal.ddpfSurface = This->mddsdOverlay.ddpfPixelFormat; //That->Surf->mOverlayGlobal.ddpfSurface = That->Surf->mddsdOverlay.ddpfPixelFormat;
//// setup front- and backbuffer surfaces //// setup front- and backbuffer surfaces
//UINT cSurfaces = This->mddsdOverlay.dwBackBufferCount + 1; //UINT cSurfaces = That->Surf->mddsdOverlay.dwBackBufferCount + 1;
//for (i = 0; i < cSurfaces; i++) //for (i = 0; i < cSurfaces; i++)
//{ //{
// memset(&This->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); // memset(&That->Surf->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
// This->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); // That->Surf->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
// memset(&This->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); // memset(&That->Surf->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
// This->mOverlayLocal[i].lpGbl = &This->mOverlayGlobal; // That->Surf->mOverlayLocal[i].lpGbl = &That->Surf->mOverlayGlobal;
// This->mOverlayLocal[i].lpSurfMore = &This->mOverlayMore[i]; // That->Surf->mOverlayLocal[i].lpSurfMore = &That->Surf->mOverlayMore[i];
// This->mOverlayLocal[i].dwProcessId = GetCurrentProcessId(); // That->Surf->mOverlayLocal[i].dwProcessId = GetCurrentProcessId();
// This->mOverlayLocal[i].dwFlags = (i == 0) ? // That->Surf->mOverlayLocal[i].dwFlags = (i == 0) ?
// (DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER): // (DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER):
// (DDRAWISURF_IMPLICITCREATE|DDRAWISURF_BACKBUFFER); // (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; // That->Surf->mOverlayLocal[i].ddsCaps.dwCaps = That->Surf->mddsdOverlay.ddsCaps.dwCaps;
// This->mpOverlayLocals[i] = &This->mOverlayLocal[i]; // That->Surf->mpOverlayLocals[i] = &That->Surf->mOverlayLocal[i];
//} //}
//for (i = 0; i < cSurfaces; i++) //for (i = 0; i < cSurfaces; i++)
//{ //{
// UINT j = (i + 1) % cSurfaces; // 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); // // derr(L"DirectDrawImpl[%08x]::__setupDevice DdAttachSurface(%d, %d) failed", this, i, j);
// return DD_FALSE; // return DD_FALSE;
@ -175,8 +175,8 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
//mDdCreateSurface.lpDD = &This->mDDrawGlobal; //mDdCreateSurface.lpDD = &This->mDDrawGlobal;
//mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; //mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface;
//mDdCreateSurface.lpDDSurfaceDesc = &This->mddsdOverlay;//pDDSD; //mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay;//pDDSD;
//mDdCreateSurface.lplpSList = This->mpOverlayLocals; //cSurfaces; //mDdCreateSurface.lplpSList = That->Surf->mpOverlayLocals; //cSurfaces;
//mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces; //mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces;
//if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) //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.lpDD = &This->mDDrawGlobal;
//mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay; //mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay;
//mDdUpdateOverlay.lpDDDestSurface = That->Surf->mpPrimaryLocals[0]; //mDdUpdateOverlay.lpDDDestSurface = That->Surf->mpPrimaryLocals[0];
//mDdUpdateOverlay.lpDDSrcSurface = This->mpOverlayLocals[0];//pDDSurface; //mDdUpdateOverlay.lpDDSrcSurface = That->Surf->mpOverlayLocals[0];//pDDSurface;
//mDdUpdateOverlay.dwFlags = DDOVER_SHOW; //mDdUpdateOverlay.dwFlags = DDOVER_SHOW;
//mDdUpdateOverlay.rDest.top = 0; //mDdUpdateOverlay.rDest.top = 0;
@ -216,7 +216,7 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
// return mDdUpdateOverlay.ddRVal; // return mDdUpdateOverlay.ddRVal;
//} //}
//return DD_OK; return DD_OK;
return DDERR_INVALIDSURFACETYPE; return DDERR_INVALIDSURFACETYPE;
} }

View file

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

View file

@ -406,9 +406,24 @@ HRESULT WINAPI
Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface, Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
LPDDSURFACEDESC2 pDDSD) LPDDSURFACEDESC2 pDDSD)
{ {
DWORD dwSize;
DX_WINDBG_trace(); 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 HRESULT WINAPI

View file

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