Author: greatlrd Date: Sat Mar 17 18:15:27 2007 New Revision: 26122
URL: http://svn.reactos.org/svn/reactos?rev=26122&view=rev Log: Now we can call to the driver createsurface, but we fail create a surface. maybe I miss fill in some value ??
Modified: trunk/reactos/subsystems/win32/win32k/include/intddraw.h trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c
Modified: trunk/reactos/subsystems/win32/win32k/include/intddraw.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/intddraw.h (original) +++ trunk/reactos/subsystems/win32/win32k/include/intddraw.h Sat Mar 17 18:15:27 2007 @@ -14,6 +14,8 @@ typedef struct { /* for the driver */ + PDD_SURFACE_LOCAL lcllist[2]; + DDRAWI_DDRAWSURFACE_LCL lcl;
DDRAWI_DDRAWSURFACE_GBL gpl;
Modified: trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntd... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c Sat Mar 17 18:15:27 2007 @@ -40,13 +40,40 @@ 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); @@ -156,11 +183,12 @@ 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 @@ /* 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 */ - + DPRINT1("GDIOBJ_UnlockObjByPtr\n"); + GDIOBJ_UnlockObjByPtr(DdHandleTable, phsurface); + DPRINT1("GDIOBJ_UnlockObjByPtr\n"); GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); - GDIOBJ_UnlockObjByPtr(DdHandleTable, phsurface); - - + + + DPRINT1("Retun value is %04x and driver return code is %04x\n",ddRVal,phsurface->CreateSurfaceData.ddRVal); return ddRVal; }