fixing some problem with backbuffer, we still can not draw to primary or backbuffer...
authorMagnus Olsen <magnus@greatlord.com>
Sun, 17 Dec 2006 13:53:19 +0000 (13:53 +0000)
committerMagnus Olsen <magnus@greatlord.com>
Sun, 17 Dec 2006 13:53:19 +0000 (13:53 +0000)
svn path=/trunk/; revision=25184

reactos/dll/directx/ddraw/createsurface.c
reactos/dll/directx/ddraw/ddraw.rbuild
reactos/dll/directx/ddraw/main/ddraw_main.c
reactos/dll/directx/ddraw/main/surface_main.c
reactos/dll/directx/ddraw/rosdraw.h
reactos/dll/directx/ddraw/startup.c

index d72ecad..c80a19e 100644 (file)
@@ -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;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;
index 84f2733..ca59494 100644 (file)
@@ -15,6 +15,7 @@
        <library>ole32</library>
        <library>user32</library>
        <library>advapi32</library>
+       <library>msvcrt</library>
 
        <file>ddraw.rc</file>
        <file>main.c</file>
index c942360..f02cc87 100644 (file)
@@ -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,6 +198,39 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
         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)
     {
@@ -218,7 +251,7 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
         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));
@@ -228,6 +261,17 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
             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));
     }
 
 
@@ -237,40 +281,11 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
     * 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);
     }
@@ -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");
index 59e0715..3c07bb4 100644 (file)
@@ -415,7 +415,7 @@ Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
     *ppSurface = (LPDIRECTDRAWSURFACE7) This->lpLcl->lpGbl->lpDD->dsList;
    
 
-    return DDERR_ALREADYINITIALIZED;
+    return DD_OK;
 }
 
 HRESULT WINAPI
index afcddfb..e9b55a0 100644 (file)
@@ -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 
index 2f3da65..ab4e44d 100644 (file)
@@ -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