diff --git a/reactos/dll/directx/ddraw/createsurface.c b/reactos/dll/directx/ddraw/createsurface.c index d72ecad164c..c80a19e1867 100644 --- a/reactos/dll/directx/ddraw/createsurface.c +++ b/reactos/dll/directx/ddraw/createsurface.c @@ -22,7 +22,6 @@ CreatePrimarySurface(LPDDRAWI_DIRECTDRAW_INT This, That[0]->lpLcl->lpSurfMore->slist = lpLcl; That[0]->lpVtbl = &DirectDrawSurface7_Vtable; - That[0]->lpLcl->lpGbl = &ddSurfGbl; That[0]->lpLcl->lpSurfMore->dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); That[0]->lpLcl->lpSurfMore->lpDD_int = This; That[0]->lpLcl->lpSurfMore->lpDD_lcl = This->lpLcl; @@ -78,12 +77,16 @@ CreatePrimarySurface(LPDDRAWI_DIRECTDRAW_INT This, That[0]->lpLcl->lpSurfMore->slist = mDdCreateSurface.lplpSList ; + That[0]->lpLink = This->lpLcl->lpGbl->dsList; + This->lpLcl->lpGbl->dsList = That[0]; + return DD_OK; } HRESULT CreateBackBufferSurface(LPDDRAWI_DIRECTDRAW_INT This, LPDDRAWI_DDRAWSURFACE_INT *That, + LPDDRAWI_DDRAWSURFACE_LCL *lpLcl, LPDDSURFACEDESC2 pDDSD) { DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; @@ -95,95 +98,76 @@ CreateBackBufferSurface(LPDDRAWI_DIRECTDRAW_INT This, * and create the backbuffer surface and set it up */ - for (t=1;tdwBackBufferCount+1;t++) + That[0]->lpLcl->dwBackBufferCount = pDDSD->dwBackBufferCount; + + for (t=0;tdwBackBufferCount+1;t++) { - That[t]->lpLcl->lpSurfMore = DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_MORE)); - if (That[t]->lpLcl->lpSurfMore == NULL) - { - return DDERR_OUTOFMEMORY; - } + That[t]->lpLcl->lpSurfMore = DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_MORE)); + if (That[t]->lpLcl->lpSurfMore == NULL) + { + DxHeapMemFree(That); + return DDERR_OUTOFMEMORY; + } - That[t]->lpLcl->lpSurfMore->slist = DxHeapMemAlloc(sizeof(LPDDRAWI_DDRAWSURFACE_LCL)<<1); - if (That[t]->lpLcl->lpSurfMore->slist == NULL) - { - return DDERR_OUTOFMEMORY; - } + That[t]->lpLcl->lpSurfMore->slist = lpLcl; - That[t]->lpLcl->lpGbl = DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_GBL)); - if (That[t]->lpLcl->lpGbl == NULL) - { - return DDERR_OUTOFMEMORY; - } + That[t]->lpVtbl = &DirectDrawSurface7_Vtable; + That[t]->lpLcl->lpSurfMore->dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); + That[t]->lpLcl->lpSurfMore->lpDD_int = This; + That[t]->lpLcl->lpSurfMore->lpDD_lcl = This->lpLcl; + That[t]->lpLcl->lpSurfMore->slist[0] = That[t]->lpLcl; + That[t]->lpLcl->dwProcessId = GetCurrentProcessId(); - memcpy(That[t]->lpLcl->lpGbl, &ddSurfGbl,sizeof(DDRAWI_DDRAWSURFACE_GBL)); - That[t]->lpVtbl = &DirectDrawSurface7_Vtable; - That[t]->lpLcl->lpSurfMore->dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); - That[t]->lpLcl->lpSurfMore->lpDD_int = This; - That[t]->lpLcl->lpSurfMore->lpDD_lcl = This->lpLcl; - That[t]->lpLcl->lpSurfMore->slist[0] = That[t]->lpLcl; - That[t]->lpLcl->dwProcessId = GetCurrentProcessId(); + mDdCanCreateSurface.lpDD = This->lpLcl->lpGbl; + if (pDDSD->dwFlags & DDSD_PIXELFORMAT) + { + That[t]->lpLcl->dwFlags |= DDRAWISURF_HASPIXELFORMAT; + mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; + } + else + { + mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE; //isDifferentPixelFormat; + } + mDdCanCreateSurface.lpDDSurfaceDesc = (LPDDSURFACEDESC) pDDSD; + mDdCanCreateSurface.CanCreateSurface = This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface; + mDdCanCreateSurface.ddRVal = DDERR_GENERIC; - That[t]->lpVtbl = &DirectDrawSurface7_Vtable; - That[t]->lpLcl->lpSurfMore->dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); - That[t]->lpLcl->lpSurfMore->lpDD_int = This; - That[t]->lpLcl->lpSurfMore->lpDD_lcl = This->lpLcl; - That[t]->lpLcl->lpSurfMore->slist[0] = That[t]->lpLcl; - That[t]->lpLcl->dwProcessId = GetCurrentProcessId(); + mDdCreateSurface.lpDD = This->lpLcl->lpGbl; + mDdCreateSurface.CreateSurface = This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface; + mDdCreateSurface.ddRVal = DDERR_GENERIC; + mDdCreateSurface.dwSCnt = That[t]->dwIntRefCnt + 1; // is this correct + mDdCreateSurface.lpDDSurfaceDesc = (LPDDSURFACEDESC) pDDSD; - if (pDDSD->dwFlags & DDSD_PIXELFORMAT) - { - That[t]->lpLcl->dwFlags |= DDRAWISURF_HASPIXELFORMAT; - } + mDdCreateSurface.lplpSList = That[t]->lpLcl->lpSurfMore->slist; - mDdCanCreateSurface.lpDD = This->lpLcl->lpGbl; + That[t]->lpLcl->ddsCaps.dwCaps = pDDSD->ddsCaps.dwCaps; - if (pDDSD->dwFlags & DDSD_PIXELFORMAT) - { - That[t]->lpLcl->dwFlags |= DDRAWISURF_HASPIXELFORMAT; - mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; - } - else - { - mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE; //isDifferentPixelFormat; - } + This->lpLcl->lpPrimary = That[0]; + if (mDdCanCreateSurface.CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) + { + return DDERR_NOTINITIALIZED; + } - That[t]->lpLcl->ddsCaps.dwCaps = pDDSD->ddsCaps.dwCaps; + if (mDdCanCreateSurface.ddRVal != DD_OK) + { + return DDERR_NOTINITIALIZED; + } - mDdCanCreateSurface.lpDDSurfaceDesc = (LPDDSURFACEDESC) pDDSD; - mDdCanCreateSurface.CanCreateSurface = This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface; - mDdCanCreateSurface.ddRVal = DDERR_GENERIC; + mDdCreateSurface.lplpSList = That[t]->lpLcl->lpSurfMore->slist; - mDdCreateSurface.lpDD = This->lpLcl->lpGbl; - mDdCreateSurface.CreateSurface = This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface; - mDdCreateSurface.ddRVal = DDERR_GENERIC; - mDdCreateSurface.dwSCnt = That[t]->dwIntRefCnt + 1; // is this correct - mDdCreateSurface.lpDDSurfaceDesc = (LPDDSURFACEDESC) pDDSD; + if (mDdCreateSurface.CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) + { + return DDERR_NOTINITIALIZED; + } - mDdCreateSurface.lplpSList = That[t]->lpLcl->lpSurfMore->slist; + if (mDdCreateSurface.ddRVal != DD_OK) + { + return mDdCreateSurface.ddRVal; + } - if (mDdCanCreateSurface.CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) - { - return DDERR_NOTINITIALIZED; - } - - if (mDdCanCreateSurface.ddRVal != DD_OK) - { - return DDERR_NOTINITIALIZED; - } - - mDdCreateSurface.lplpSList = That[t]->lpLcl->lpSurfMore->slist; - - if (mDdCreateSurface.CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) - { - return DDERR_NOTINITIALIZED; - } - - if (mDdCreateSurface.ddRVal != DD_OK) - { - return mDdCreateSurface.ddRVal; - } + That[t]->lpLcl->lpSurfMore->slist = mDdCreateSurface.lplpSList ; /* Build the linking buffer */ That[t]->lpLink = This->lpLcl->lpGbl->dsList; diff --git a/reactos/dll/directx/ddraw/ddraw.rbuild b/reactos/dll/directx/ddraw/ddraw.rbuild index 84f2733e37a..ca594945325 100644 --- a/reactos/dll/directx/ddraw/ddraw.rbuild +++ b/reactos/dll/directx/ddraw/ddraw.rbuild @@ -15,6 +15,7 @@ ole32 user32 advapi32 + msvcrt ddraw.rc main.c diff --git a/reactos/dll/directx/ddraw/main/ddraw_main.c b/reactos/dll/directx/ddraw/main/ddraw_main.c index c942360b147..f02cc876063 100644 --- a/reactos/dll/directx/ddraw/main/ddraw_main.c +++ b/reactos/dll/directx/ddraw/main/ddraw_main.c @@ -171,7 +171,7 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE LPDDRAWI_DDRAWSURFACE_LCL *lpLcl; DWORD dwHowManySurface = 1; DWORD i; - + LPDDRAWI_DDRAWSURFACE_LCL *xlpLcl; if (pUnkOuter!=NULL) { return CLASS_E_NOAGGREGATION; @@ -198,44 +198,6 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE return DDERR_INVALIDCAPS; } - /* Calc how many surface we need setup */ - if (pDDSD->ddsCaps.dwCaps &DDSD_BACKBUFFERCOUNT) - { - /* One primary + xx backbuffer */ - dwHowManySurface |= pDDSD->dwBackBufferCount; - } - - /* Alloc all memory we need for all createsurface here */ - lpLcl = DxHeapMemAlloc(sizeof(LPDDRAWI_DDRAWSURFACE_LCL) * dwHowManySurface); - if (lpLcl == NULL) - { - return DDERR_OUTOFMEMORY; - } - - That = DxHeapMemAlloc(sizeof(LPDDRAWI_DDRAWSURFACE_INT) * dwHowManySurface); - if (That == NULL) - { - return DDERR_OUTOFMEMORY; - } - - for (i=0;ilpLcl = lpLcl[i]; - } - - - - /* here we need start fixing bugs - * the code above is 100% correct behovir - * checked how ms ddraw behivor - */ /* this two line should be move to startup code */ ddSurfGbl.lpDD = &ddgbl; @@ -269,8 +231,61 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE memcpy(&ddSurfGbl.ddpfSurface,&pDDSD->ddpfPixelFormat, sizeof(DDPIXELFORMAT)); } + /* Calc how many surface we need setup */ + if (pDDSD->ddsCaps.dwCaps &DDSD_BACKBUFFERCOUNT) + { + /* One primary + xx backbuffer */ + dwHowManySurface |= pDDSD->dwBackBufferCount; + } + + /* Alloc all memory we need for all createsurface here */ + lpLcl = DxHeapMemAlloc(sizeof(LPDDRAWI_DDRAWSURFACE_LCL) * dwHowManySurface); + if (lpLcl == NULL) + { + return DDERR_OUTOFMEMORY; + } + + That = DxHeapMemAlloc(sizeof(LPDDRAWI_DDRAWSURFACE_INT) * dwHowManySurface); + if (That == NULL) + { + return DDERR_OUTOFMEMORY; + } + + for (i=0;ilpLcl = lpLcl[i]; + + That[i]->lpLcl->lpGbl = &ddSurfGbl; + //That[i]->lpLcl->lpGbl = (LPDDRAWI_DDRAWSURFACE_GBL) DxHeapMemAlloc(sizeof(LPDDRAWI_DDRAWSURFACE_GBL)); + //if (That[i]->lpLcl->lpGbl == NULL) + //{ + // return DDERR_OUTOFMEMORY; + //} + + //That[i]->lpLcl->lpGbl->lpDD = &ddgbl; + //That[i]->lpLcl->lpGbl->lpDDHandle = This->lpLcl->lpGbl; + //memmove(That[i]->lpLcl->lpGbl,&ddSurfGbl,sizeof(LPDDRAWI_DDRAWSURFACE_GBL)); + } + + + + /* here we need start fixing bugs + * the code above is 100% correct behovir + * checked how ms ddraw behivor + */ + + + /* Create the surface */ - if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + if (((pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) + && (!(pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER))) { CreatePrimarySurface(This,That,lpLcl,pDDSD); } @@ -301,7 +316,8 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE { return DDERR_INVALIDSURFACETYPE; } - retValue = CreateBackBufferSurface(This,That,pDDSD); + retValue = CreateBackBufferSurface(This,That,lpLcl,pDDSD); + //CreatePrimarySurface(This,That,lpLcl,pDDSD); if (retValue != DD_OK) { DX_STUB_str( "Fail to create backbuffer surface"); diff --git a/reactos/dll/directx/ddraw/main/surface_main.c b/reactos/dll/directx/ddraw/main/surface_main.c index 59e0715415e..3c07bb48ba9 100644 --- a/reactos/dll/directx/ddraw/main/surface_main.c +++ b/reactos/dll/directx/ddraw/main/surface_main.c @@ -415,7 +415,7 @@ Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface, *ppSurface = (LPDIRECTDRAWSURFACE7) This->lpLcl->lpGbl->lpDD->dsList; - return DDERR_ALREADYINITIALIZED; + return DD_OK; } HRESULT WINAPI diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index afcddfb4e08..e9b55a0243f 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -128,7 +128,7 @@ HRESULT WINAPI DirectDrawClipper_Initialize( LPDIRECTDRAWCLIPPER iface, LPDIREC HRESULT CreateOverlaySurface(LPDDRAWI_DIRECTDRAW_INT This, LPDDRAWI_DDRAWSURFACE_INT *That, LPDDSURFACEDESC2 pDDSD); -HRESULT CreateBackBufferSurface(LPDDRAWI_DIRECTDRAW_INT This, LPDDRAWI_DDRAWSURFACE_INT *That, LPDDSURFACEDESC2 pDDSD); +HRESULT CreateBackBufferSurface(LPDDRAWI_DIRECTDRAW_INT This, LPDDRAWI_DDRAWSURFACE_INT *That, LPDDRAWI_DDRAWSURFACE_LCL *lpLcl, LPDDSURFACEDESC2 pDDSD); HRESULT CreatePrimarySurface(LPDDRAWI_DIRECTDRAW_INT This, LPDDRAWI_DDRAWSURFACE_INT *That,LPDDRAWI_DDRAWSURFACE_LCL *lpLcl, LPDDSURFACEDESC2 pDDSD); /* DirectDraw Object struct diff --git a/reactos/dll/directx/ddraw/startup.c b/reactos/dll/directx/ddraw/startup.c index 2f3da6598c3..ab4e44d60b6 100644 --- a/reactos/dll/directx/ddraw/startup.c +++ b/reactos/dll/directx/ddraw/startup.c @@ -593,7 +593,6 @@ StartDirectDraw(LPDIRECTDRAW* iface, LPGUID lpGuid, BOOL reenable) } /* Fill some basic info for Surface */ - ddSurfGbl.lpDD = &ddgbl; /* FIXME We need setup this also