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;
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;
* and create the backbuffer surface and set it up
*/
- for (t=1;t<pDDSD->dwBackBufferCount+1;t++)
+ That[0]->lpLcl->dwBackBufferCount = pDDSD->dwBackBufferCount;
+
+ for (t=0;t<pDDSD->dwBackBufferCount+1;t++)
{
- That[t]->lpLcl->lpSurfMore = DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_MORE));
- if (That[t]->lpLcl->lpSurfMore == NULL)
- {
- 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->lpGbl = DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_GBL));
- if (That[t]->lpLcl->lpGbl == NULL)
- {
- return DDERR_OUTOFMEMORY;
- }
-
- 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();
-
- 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();
-
- if (pDDSD->dwFlags & DDSD_PIXELFORMAT)
- {
- That[t]->lpLcl->dwFlags |= DDRAWISURF_HASPIXELFORMAT;
- }
-
- 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;
- }
-
- That[t]->lpLcl->ddsCaps.dwCaps = pDDSD->ddsCaps.dwCaps;
-
- mDdCanCreateSurface.lpDDSurfaceDesc = (LPDDSURFACEDESC) pDDSD;
- mDdCanCreateSurface.CanCreateSurface = This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface;
- mDdCanCreateSurface.ddRVal = DDERR_GENERIC;
-
- 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;
-
- mDdCreateSurface.lplpSList = That[t]->lpLcl->lpSurfMore->slist;
-
- 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 = DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_MORE));
+ if (That[t]->lpLcl->lpSurfMore == NULL)
+ {
+ DxHeapMemFree(That);
+ return DDERR_OUTOFMEMORY;
+ }
+
+ That[t]->lpLcl->lpSurfMore->slist = lpLcl;
+
+ 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;
+
+ 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;
+
+ mDdCreateSurface.lplpSList = That[t]->lpLcl->lpSurfMore->slist;
+
+ That[t]->lpLcl->ddsCaps.dwCaps = pDDSD->ddsCaps.dwCaps;
+
+ This->lpLcl->lpPrimary = That[0];
+ 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;
LPDDRAWI_DDRAWSURFACE_LCL *lpLcl;
DWORD dwHowManySurface = 1;
DWORD i;
-
+ LPDDRAWI_DDRAWSURFACE_LCL *xlpLcl;
if (pUnkOuter!=NULL)
{
return CLASS_E_NOAGGREGATION;
return DDERR_INVALIDCAPS;
}
+
+ /* this two line should be move to startup code */
+ ddSurfGbl.lpDD = &ddgbl;
+ ddSurfGbl.lpDDHandle = &ddgbl;
+
+ /* Detecte if we are in fullscreen or not and extract thuse data */
+ if (This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN)
+ {
+ ddSurfGbl.wWidth = This->lpLcl->lpGbl->vmiData.dwDisplayWidth;
+ ddSurfGbl.wHeight = This->lpLcl->lpGbl->vmiData.dwDisplayHeight;
+ ddSurfGbl.lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
+ }
+ else
+ {
+ RECT rect;
+ if(GetWindowRect((HWND)This->lpLcl->hWnd, &rect))
+ {
+ ddSurfGbl.wWidth = rect.right - rect.left;
+ ddSurfGbl.wHeight = rect.bottom - rect.top;
+ ddSurfGbl.lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
+ }
+ }
+
+ /* setup diffent pixel format */
+ if (pDDSD->dwFlags & DDSD_PIXELFORMAT)
+ {
+ if (pDDSD->ddpfPixelFormat.dwSize != sizeof(DDPIXELFORMAT))
+ {
+ return DDERR_INVALIDPIXELFORMAT;
+ }
+ memcpy(&ddSurfGbl.ddpfSurface,&pDDSD->ddpfPixelFormat, sizeof(DDPIXELFORMAT));
+ }
+
/* Calc how many surface we need setup */
if (pDDSD->ddsCaps.dwCaps &DDSD_BACKBUFFERCOUNT)
{
return DDERR_OUTOFMEMORY;
}
- for (i=0;i<dwHowManySurface;i++)
+ for (i=0;i<dwHowManySurface+1;i++)
{
That[i] = (LPDDRAWI_DDRAWSURFACE_INT) DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_INT));
lpLcl[i] = (LPDDRAWI_DDRAWSURFACE_LCL) DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_LCL));
return DDERR_OUTOFMEMORY;
}
That[i]->lpLcl = 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));
}
* checked how ms ddraw behivor
*/
- /* this two line should be move to startup code */
- ddSurfGbl.lpDD = &ddgbl;
- ddSurfGbl.lpDDHandle = &ddgbl;
- /* Detecte if we are in fullscreen or not and extract thuse data */
- if (This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN)
- {
- ddSurfGbl.wWidth = This->lpLcl->lpGbl->vmiData.dwDisplayWidth;
- ddSurfGbl.wHeight = This->lpLcl->lpGbl->vmiData.dwDisplayHeight;
- ddSurfGbl.lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
- }
- else
- {
- RECT rect;
- if(GetWindowRect((HWND)This->lpLcl->hWnd, &rect))
- {
- ddSurfGbl.wWidth = rect.right - rect.left;
- ddSurfGbl.wHeight = rect.bottom - rect.top;
- ddSurfGbl.lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
- }
- }
-
- /* setup diffent pixel format */
- if (pDDSD->dwFlags & DDSD_PIXELFORMAT)
- {
- if (pDDSD->ddpfPixelFormat.dwSize != sizeof(DDPIXELFORMAT))
- {
- return DDERR_INVALIDPIXELFORMAT;
- }
- memcpy(&ddSurfGbl.ddpfSurface,&pDDSD->ddpfPixelFormat, sizeof(DDPIXELFORMAT));
- }
/* 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);
}
{
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");