started adding support for more that one surface in DdCreateSurface

svn path=/trunk/; revision=32543
This commit is contained in:
Magnus Olsen 2008-03-02 16:28:54 +00:00
parent a6791bac5d
commit 934349678c

View file

@ -274,6 +274,10 @@ DdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA CanCreateSurface)
(PDD_CANCREATESURFACEDATA)CanCreateSurface); (PDD_CANCREATESURFACEDATA)CanCreateSurface);
} }
/* TODO : finish all fixme */ /* TODO : finish all fixme */
DWORD DWORD
WINAPI WINAPI
@ -287,7 +291,6 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
HANDLE hPrevSurface, hSurface; HANDLE hPrevSurface, hSurface;
PDD_SURFACE_LOCAL pDdSurfaceLocal = NULL; PDD_SURFACE_LOCAL pDdSurfaceLocal = NULL;
PDD_SURFACE_MORE pDdSurfaceMore = NULL; PDD_SURFACE_MORE pDdSurfaceMore = NULL;
PDD_SURFACE_GLOBAL pDdSurfaceGlobal = NULL; PDD_SURFACE_GLOBAL pDdSurfaceGlobal = NULL;
@ -302,8 +305,40 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
/* Check how many surfaces there are */ /* Check how many surfaces there are */
if (SurfaceCount != 1) if (SurfaceCount != 1)
{ {
/* We'll have to allocate more data, our stack isn't big enough */ /* We got more that one surface so we need alloc memory for them */
pDdSurfaceLocal = (PDD_SURFACE_LOCAL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_LOCAL) * SurfaceCount ));
pDdSurfaceMore = (PDD_SURFACE_MORE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_MORE) * SurfaceCount ));
pDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_GLOBAL) * SurfaceCount ));
phSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount ));
puhSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount ));
/* check if we sueese alloc all memory we need */
if ((pDdSurfaceLocal == NULL) || (pDdSurfaceMore == NULL) || (pDdSurfaceGlobal == NULL) || (phSurface == NULL) || (puhSurface == NULL))
{
pCreateSurface->ddRVal = DDERR_OUTOFMEMORY;
if ( pDdSurfaceLocal != NULL )
{
HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal);
}
if ( pDdSurfaceMore != NULL )
{
HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
}
if ( phSurface != NULL )
{
HeapFree(GetProcessHeap(), 0, phSurface);
}
if ( puhSurface != NULL )
{
HeapFree(GetProcessHeap(), 0, puhSurface);
}
return DDHAL_DRIVER_HANDLED;
}
} }
else else
{ {
@ -455,7 +490,25 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
/* Check if we have to free all our local allocations */ /* Check if we have to free all our local allocations */
if (SurfaceCount > 1) if (SurfaceCount > 1)
{ {
/* FIXME: */ if ( pDdSurfaceLocal != NULL )
{
HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal);
}
if ( pDdSurfaceMore != NULL )
{
HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
}
if ( phSurface != NULL )
{
HeapFree(GetProcessHeap(), 0, phSurface);
}
if ( puhSurface != NULL )
{
HeapFree(GetProcessHeap(), 0, puhSurface);
}
} }
/* Return */ /* Return */
@ -1095,8 +1148,6 @@ DdGetDriverInfo(LPDDHAL_GETDRIVERINFODATA pData)
* Windows XP * Windows XP
*/ */
pData->ddRVal = retValue; pData->ddRVal = retValue;
} }
/* D3D Callbacks version 2 check and setup for DirectX/ ReactX */ /* D3D Callbacks version 2 check and setup for DirectX/ ReactX */