From: Magnus Olsen Date: Wed, 14 Mar 2007 16:33:36 +0000 (+0000) Subject: Bug fix DdCreateSurface, it can now create one surface, the code are tested in window... X-Git-Tag: backups/ddk2003@36850~1031 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=3738b97003c79f833e67550a330bf1e91493a6ed Bug fix DdCreateSurface, it can now create one surface, the code are tested in windows, in my syscall demo for win32k. We do not support create more that one surface. mulit surface create will be add later. But code path to implement it, exist svn path=/trunk/; revision=26093 --- diff --git a/reactos/dll/win32/gdi32/misc/gdientry.c b/reactos/dll/win32/gdi32/misc/gdientry.c index dd03536dbc8..7471470d92a 100644 --- a/reactos/dll/win32/gdi32/misc/gdientry.c +++ b/reactos/dll/win32/gdi32/misc/gdientry.c @@ -209,16 +209,20 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface) DD_SURFACE_LOCAL DdSurfaceLocal; DD_SURFACE_MORE DdSurfaceMore; DD_SURFACE_GLOBAL DdSurfaceGlobal; + HANDLE hPrevSurface, hSurface; - DD_SURFACE_LOCAL* pDdSurfaceLocal; - DD_SURFACE_MORE* pDdSurfaceMore; - DD_SURFACE_GLOBAL* pDdSurfaceGlobal; - LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal; - //LPDDRAWI_DDRAWSURFACE_MORE pSurfaceMore; - LPDDRAWI_DDRAWSURFACE_GBL pSurfaceGlobal; + + + PDD_SURFACE_LOCAL pDdSurfaceLocal = NULL; + PDD_SURFACE_MORE pDdSurfaceMore = NULL; + PDD_SURFACE_GLOBAL pDdSurfaceGlobal = NULL; + + PDD_SURFACE_LOCAL ptmpDdSurfaceLocal = NULL; + PDD_SURFACE_MORE ptmpDdSurfaceMore = NULL; + PDD_SURFACE_GLOBAL ptmpDdSurfaceGlobal = NULL; PHANDLE phSurface = NULL, puhSurface = NULL; ULONG i; - LPDDSURFACEDESC pSurfaceDesc; + LPDDSURFACEDESC pSurfaceDesc = NULL; /* Check how many surfaces there are */ if (SurfaceCount != 1) @@ -241,67 +245,142 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface) RtlZeroMemory(&DdSurfaceMore, sizeof(DdSurfaceMore)); } - /* Loop for each surface */ - for (i = 0; i < pCreateSurface->dwSCnt; i++) + /* check if we got a surface or not */ + if (SurfaceCount!=0) { - /* Get data */ - pSurfaceLocal = pCreateSurface->lplpSList[i]; - pSurfaceGlobal = pSurfaceLocal->lpGbl; + /* Loop for each surface */ + ptmpDdSurfaceGlobal = pDdSurfaceGlobal; + ptmpDdSurfaceLocal = pDdSurfaceLocal; + ptmpDdSurfaceMore = pDdSurfaceMore; pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc; - /* Check if it has pixel data */ - if (pSurfaceDesc->dwFlags & DDRAWISURF_HASPIXELFORMAT) + for (i = 0; i < SurfaceCount; i++) { - /* Use its pixel data */ - DdSurfaceGlobal.ddpfSurface = pSurfaceDesc->ddpfPixelFormat; - DdSurfaceGlobal.ddpfSurface.dwSize = sizeof(DDPIXELFORMAT); - } - else - { - /* Use the one from the global surface */ - DdSurfaceGlobal.ddpfSurface = pSurfaceGlobal->lpDD->vmiData.ddpfDisplay; + LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i]; + LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl; + + phSurface[i] = (HANDLE)lcl->hDDSurface; + ptmpDdSurfaceLocal->ddsCaps.dwCaps = lcl->ddsCaps.dwCaps; + + ptmpDdSurfaceLocal->dwFlags = (ptmpDdSurfaceLocal->dwFlags & + (0xB0000000 | DDRAWISURF_INMASTERSPRITELIST | + DDRAWISURF_HELCB | DDRAWISURF_FRONTBUFFER | + DDRAWISURF_BACKBUFFER | DDRAWISURF_INVALID | + DDRAWISURF_DCIBUSY | DDRAWISURF_DCILOCK)) | + (lcl->dwFlags & DDRAWISURF_DRIVERMANAGED); + + ptmpDdSurfaceGlobal->wWidth = gpl->wWidth; + ptmpDdSurfaceGlobal->wHeight = gpl->wHeight; + ptmpDdSurfaceGlobal->lPitch = gpl->fpVidMem; + ptmpDdSurfaceGlobal->fpVidMem = gpl->fpVidMem; + ptmpDdSurfaceGlobal->dwBlockSizeX = gpl->dwBlockSizeX; + ptmpDdSurfaceGlobal->dwBlockSizeY = gpl->dwBlockSizeY; + + if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT) + { + RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface , + &gpl->ddpfSurface, + sizeof(DDPIXELFORMAT)); + + ptmpDdSurfaceGlobal->ddpfSurface.dwSize = sizeof(DDPIXELFORMAT); + } + else + { + RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface , + &gpl->lpDD->vmiData.ddpfDisplay, + sizeof(DDPIXELFORMAT)); + } + + if (lcl->lpSurfMore) + { + ptmpDdSurfaceMore->ddsCapsEx.dwCaps2 = lcl->lpSurfMore->ddsCapsEx.dwCaps2; + ptmpDdSurfaceMore->ddsCapsEx.dwCaps3 = lcl->lpSurfMore->ddsCapsEx.dwCaps3; + ptmpDdSurfaceMore->ddsCapsEx.dwCaps4 = lcl->lpSurfMore->ddsCapsEx.dwCaps4; + ptmpDdSurfaceMore->dwSurfaceHandle = (DWORD) pCreateSurface->lplpSList[i]->dbnOverlayNode.object_int; + } + + /* FIXME count to next SurfaceCount for + ptmpDdSurfaceGlobal = pDdSurfaceGlobal; + ptmpDdSurfaceLocal = pDdSurfaceLocal; + ptmpDdSurfaceMore = pDdSurfaceMore; + + we only support one surface create at moment + */ } + } + + /* Call win32k now */ + pCreateSurface->ddRVal = DDERR_GENERIC; - /* Convert data */ - DdSurfaceGlobal.wWidth = pSurfaceGlobal->wWidth; - DdSurfaceGlobal.wHeight = pSurfaceGlobal->wHeight; - DdSurfaceGlobal.lPitch = pSurfaceGlobal->lPitch; - DdSurfaceGlobal.fpVidMem = pSurfaceGlobal->fpVidMem; - DdSurfaceGlobal.dwBlockSizeX = pSurfaceGlobal->dwBlockSizeX; - DdSurfaceGlobal.dwBlockSizeY = pSurfaceGlobal->dwBlockSizeY; - // DdSurfaceGlobal.ddsCaps = pSurfaceLocal->ddsCaps | 0xBF0000; - - /* FIXME: Ddscapsex stuff missing */ - - /* Call win32k now */ - pCreateSurface->ddRVal = E_FAIL; - - Return = NtGdiDdCreateSurface(GetDdHandle(pCreateSurface->lpDD->hDD), - (HANDLE *)phSurface, + Return = NtGdiDdCreateSurface(GetDdHandle(pCreateSurface->lpDD->hDD), + (HANDLE *)phSurface, pSurfaceDesc, - &DdSurfaceGlobal, - &DdSurfaceLocal, - &DdSurfaceMore, + pDdSurfaceGlobal, + pDdSurfaceLocal, + pDdSurfaceMore, (PDD_CREATESURFACEDATA)pCreateSurface, puhSurface); - - - /* FIXME: Ddscapsex stuff missing */ - - /* Convert the data back */ - pSurfaceGlobal->lPitch = DdSurfaceGlobal.lPitch; - pSurfaceGlobal->fpVidMem = DdSurfaceGlobal.fpVidMem; - pSurfaceGlobal->dwBlockSizeX = DdSurfaceGlobal.dwBlockSizeX; - pSurfaceGlobal->dwBlockSizeY = DdSurfaceGlobal.dwBlockSizeY; - pCreateSurface->lplpSList[i]->hDDSurface = (DWORD) hSurface; - - /* FIXME: Ddscapsex stuff missing */ + + if (SurfaceCount == 0) + { + pCreateSurface->ddRVal = DDERR_GENERIC; } - + else + { + ptmpDdSurfaceMore = pDdSurfaceMore; + ptmpDdSurfaceGlobal = pDdSurfaceGlobal; + ptmpDdSurfaceLocal = pDdSurfaceLocal; + + for (i=0;ilplpSList[i]; + LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl; + + gpl->lPitch = ptmpDdSurfaceGlobal->lPitch; + gpl->fpVidMem = ptmpDdSurfaceGlobal->fpVidMem; + gpl->dwBlockSizeX = ptmpDdSurfaceGlobal->dwBlockSizeX; + gpl->dwBlockSizeY = ptmpDdSurfaceGlobal->dwBlockSizeY; + + if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT) + { + RtlCopyMemory( &gpl->ddpfSurface, &ptmpDdSurfaceGlobal->ddpfSurface , sizeof(DDPIXELFORMAT)); + } + + if (pCreateSurface->ddRVal != DD_OK) + { + gpl->fpVidMem = 0; + if (lcl->hDDSurface) + { + NtGdiDdDeleteSurfaceObject( (HANDLE)lcl->hDDSurface); + } + lcl->hDDSurface = 0; + } + else + { + + lcl->hDDSurface = (ULONG_PTR) puhSurface[i]; + } + + lcl->ddsCaps.dwCaps = ptmpDdSurfaceLocal->ddsCaps.dwCaps; + if (lcl->lpSurfMore) + { + lcl->lpSurfMore->ddsCapsEx.dwCaps2 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps2; + lcl->lpSurfMore->ddsCapsEx.dwCaps3 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps3; + lcl->lpSurfMore->ddsCapsEx.dwCaps4 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps4; + } + /* FIXME count to next SurfaceCount for + ptmpDdSurfaceGlobal = pDdSurfaceGlobal; + ptmpDdSurfaceLocal = pDdSurfaceLocal; + ptmpDdSurfaceMore = pDdSurfaceMore; + we only support one surface create at moment + */ + } + } + /* Check if we have to free all our local allocations */ if (SurfaceCount > 1) { - /* FIXME: */ + /* FIXME: */ } /* Return */