mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
Now we can call to the driver createsurface, but we fail create a surface. maybe I miss fill in some value ??
svn path=/trunk/; revision=26122
This commit is contained in:
parent
d157ccaa15
commit
287d86906b
2 changed files with 90 additions and 7 deletions
|
@ -14,6 +14,8 @@
|
|||
typedef struct
|
||||
{
|
||||
/* for the driver */
|
||||
PDD_SURFACE_LOCAL lcllist[2];
|
||||
|
||||
DDRAWI_DDRAWSURFACE_LCL lcl;
|
||||
|
||||
DDRAWI_DDRAWSURFACE_GBL gpl;
|
||||
|
|
|
@ -40,14 +40,41 @@ DWORD STDCALL NtGdiDdCreateSurface(
|
|||
HANDLE *puhSurface
|
||||
)
|
||||
{
|
||||
INT i;
|
||||
DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED;
|
||||
NTSTATUS Status = FALSE;
|
||||
PDD_DIRECTDRAW pDirectDraw;
|
||||
HANDLE hsurface;
|
||||
PDD_SURFACE phsurface;
|
||||
|
||||
PDD_SURFACE_LOCAL pLocal;
|
||||
PDD_SURFACE_MORE pMore;
|
||||
PDD_SURFACE_GLOBAL pGlobal;
|
||||
|
||||
/* FIXME alloc so mayne we need */
|
||||
PHANDLE *myhSurface[1];
|
||||
|
||||
|
||||
DPRINT1("NtGdiDdCreateSurface\n");
|
||||
|
||||
_SEH_TRY
|
||||
{
|
||||
ProbeForRead(hSurface, sizeof(HANDLE), 1);
|
||||
ProbeForRead(hSurface[0], sizeof(HANDLE), 1);
|
||||
myhSurface[0] = hSurface[0];
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastNtError(Status);
|
||||
return ddRVal;
|
||||
}
|
||||
|
||||
|
||||
/* Create a surface */
|
||||
hsurface = GDIOBJ_AllocObj(DdHandleTable, GDI_OBJECT_TYPE_DD_SURFACE);
|
||||
if (!hsurface)
|
||||
|
@ -156,11 +183,12 @@ DWORD STDCALL NtGdiDdCreateSurface(
|
|||
return ddRVal;
|
||||
}
|
||||
|
||||
DPRINT1("Lock hDirectDrawLocal \n");
|
||||
phsurface->hDirectDrawLocal = hDirectDrawLocal;
|
||||
|
||||
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
|
||||
if (!phsurface)
|
||||
if (!pDirectDraw)
|
||||
{
|
||||
DPRINT1("fail \n");
|
||||
GDIOBJ_UnlockObjByPtr(DdHandleTable, phsurface);
|
||||
return ddRVal;
|
||||
}
|
||||
|
@ -169,35 +197,88 @@ DWORD STDCALL NtGdiDdCreateSurface(
|
|||
/* FIXME unlock phsurface free phsurface at fail*/
|
||||
/* FIXME unlock hsurface free phsurface at fail*/
|
||||
/* FIXME add support for more that one surface create */
|
||||
/* FIXME alloc memory if it more that one surface */
|
||||
|
||||
pLocal = &phsurface->Local;
|
||||
pMore = &phsurface->More;
|
||||
pGlobal = &phsurface->Global;
|
||||
|
||||
/* FIXME we only support one surface for now */
|
||||
phsurface->CreateSurfaceData.dwSCnt = 1;
|
||||
|
||||
|
||||
phsurface->lcllist[0] = 0;
|
||||
phsurface->lcllist[1] = 0;
|
||||
phsurface->CreateSurfaceData.lplpSList = (PDD_SURFACE_LOCAL *) &phsurface->lcllist;
|
||||
|
||||
i = 0;
|
||||
// for (i = 0; i < phsurface->CreateSurfaceData.dwSCnt; i++)
|
||||
//{
|
||||
phsurface->lcl.hDDSurface = (ULONG_PTR)myhSurface[i];
|
||||
phsurface->lcl.ddsCaps.dwCaps = pLocal->ddsCaps.dwCaps;
|
||||
phsurface->lcl.dwFlags =pLocal->dwFlags;
|
||||
|
||||
phsurface->gpl.wWidth = pGlobal->wWidth;
|
||||
phsurface->gpl.wHeight = pGlobal->wHeight;
|
||||
phsurface->gpl.lPitch = pGlobal->lPitch;
|
||||
phsurface->gpl.fpVidMem = pGlobal->fpVidMem;
|
||||
phsurface->gpl.dwBlockSizeX = pGlobal->dwBlockSizeX;
|
||||
phsurface->gpl.dwBlockSizeY = pGlobal->dwBlockSizeY;
|
||||
RtlCopyMemory( &phsurface->gpl.ddpfSurface , &pGlobal->ddpfSurface, sizeof(DDPIXELFORMAT));
|
||||
|
||||
/* FIXME more ?? */
|
||||
if (pMore)
|
||||
{
|
||||
phsurface->more.ddsCapsEx.dwCaps2 = pMore->ddsCapsEx.dwCaps2;
|
||||
phsurface->more.ddsCapsEx.dwCaps3 = pMore->ddsCapsEx.dwCaps3;
|
||||
phsurface->more.ddsCapsEx.dwCaps4 = pMore->ddsCapsEx.dwCaps4;
|
||||
phsurface->lcl.dbnOverlayNode.object_int = (LPDDRAWI_DDRAWSURFACE_INT)pMore->dwSurfaceHandle;
|
||||
}
|
||||
|
||||
phsurface->lcllist[0] = (PDD_SURFACE_LOCAL)&phsurface->lcl;
|
||||
/* FIXME count up everthing to next position */
|
||||
// }
|
||||
|
||||
|
||||
/* FIXME support for more that one surface */
|
||||
|
||||
DPRINT1("setup CreateSurfaceData \n");
|
||||
/* setup DD_CREATESURFACEDATA CreateSurfaceData for the driver */
|
||||
phsurface->lcl.lpGbl = &phsurface->gpl;
|
||||
phsurface->lcl.lpSurfMore = &phsurface->more;
|
||||
|
||||
/* FIXME all phsurface->lcl should be in a array then add to lplpSList */
|
||||
phsurface->CreateSurfaceData.lplpSList = (PDD_SURFACE_LOCAL *)&phsurface->lcl;
|
||||
//phsurface->CreateSurfaceData.lplpSList = (PDD_SURFACE_LOCAL *)&phsurface->lcl;
|
||||
phsurface->CreateSurfaceData.lpDDSurfaceDesc = &phsurface->desc;
|
||||
phsurface->CreateSurfaceData.CreateSurface = NULL;
|
||||
phsurface->CreateSurfaceData.dwSCnt = 1;
|
||||
phsurface->CreateSurfaceData.ddRVal = DDERR_GENERIC;
|
||||
phsurface->CreateSurfaceData.lpDD = &pDirectDraw->Global;
|
||||
|
||||
/* FIXME copy data from DD_ sturct to DDRAWI_ struct */
|
||||
/* is this correct the 3d drv whant this data */
|
||||
// phsurface->lcl.lpGbl->lpDD = &pDirectDraw->Global;
|
||||
|
||||
|
||||
|
||||
|
||||
/* the CreateSurface crash with lcl convering */
|
||||
DPRINT1("DDHAL_CB32_CREATESURFACE\n");
|
||||
if ((pDirectDraw->DD.dwFlags & DDHAL_CB32_CREATESURFACE))
|
||||
{
|
||||
DPRINT1("0x%04x",pDirectDraw->DD.CreateSurface);
|
||||
|
||||
ddRVal = pDirectDraw->DD.CreateSurface(&phsurface->CreateSurfaceData);
|
||||
}
|
||||
|
||||
/* FIXME copy data from DDRAWI_ sturct to DD_ struct */
|
||||
|
||||
/* FIXME fillin the return handler */
|
||||
|
||||
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
||||
DPRINT1("GDIOBJ_UnlockObjByPtr\n");
|
||||
GDIOBJ_UnlockObjByPtr(DdHandleTable, phsurface);
|
||||
DPRINT1("GDIOBJ_UnlockObjByPtr\n");
|
||||
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
||||
|
||||
|
||||
DPRINT1("Retun value is %04x and driver return code is %04x\n",ddRVal,phsurface->CreateSurfaceData.ddRVal);
|
||||
return ddRVal;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue