d3d9: Present parameters are an array when D3DCREATE_ADAPTERGROUP_DEVICE is specified.

Henri Verbeet hverbeet at codeweavers.com
Wed Mar 11 04:15:10 CDT 2009


---
 dlls/d3d9/directx.c |   80 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 48 insertions(+), 32 deletions(-)

diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index 371e6f7..e74a83f 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -376,7 +376,8 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9EX iface, UINT Adap
 
     IDirect3D9Impl       *This   = (IDirect3D9Impl *)iface;
     IDirect3DDevice9Impl *object = NULL;
-    WINED3DPRESENT_PARAMETERS localParameters;
+    WINED3DPRESENT_PARAMETERS *localParameters;
+    UINT i, count = 1;
     HRESULT hr;
     TRACE("(%p) Relay\n", This);
 
@@ -412,49 +413,64 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9EX iface, UINT Adap
 
     TRACE("(%p) : Created Device %p\n", This, object);
 
-    localParameters.BackBufferWidth                     = pPresentationParameters->BackBufferWidth;
-    localParameters.BackBufferHeight                    = pPresentationParameters->BackBufferHeight;
-    localParameters.BackBufferFormat                    = wined3dformat_from_d3dformat(pPresentationParameters->BackBufferFormat);
-    localParameters.BackBufferCount                     = pPresentationParameters->BackBufferCount;
-    localParameters.MultiSampleType                     = pPresentationParameters->MultiSampleType;
-    localParameters.MultiSampleQuality                  = pPresentationParameters->MultiSampleQuality;
-    localParameters.SwapEffect                          = pPresentationParameters->SwapEffect;
-    localParameters.hDeviceWindow                       = pPresentationParameters->hDeviceWindow;
-    localParameters.Windowed                            = pPresentationParameters->Windowed;
-    localParameters.EnableAutoDepthStencil              = pPresentationParameters->EnableAutoDepthStencil;
-    localParameters.AutoDepthStencilFormat              = wined3dformat_from_d3dformat(pPresentationParameters->AutoDepthStencilFormat);
-    localParameters.Flags                               = pPresentationParameters->Flags;
-    localParameters.FullScreen_RefreshRateInHz          = pPresentationParameters->FullScreen_RefreshRateInHz;
-    localParameters.PresentationInterval                = pPresentationParameters->PresentationInterval;
-    localParameters.AutoRestoreDisplayMode              = TRUE;
+    if (BehaviourFlags & D3DCREATE_ADAPTERGROUP_DEVICE)
+    {
+        WINED3DCAPS caps;
+
+        IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, &caps);
+        count = caps.NumberOfAdaptersInGroup;
+    }
 
     if(BehaviourFlags & D3DCREATE_MULTITHREADED) {
         IWineD3DDevice_SetMultithreaded(object->WineD3DDevice);
     }
 
-    hr = IWineD3DDevice_Init3D(object->WineD3DDevice, &localParameters);
-
-    pPresentationParameters->BackBufferWidth            = localParameters.BackBufferWidth;
-    pPresentationParameters->BackBufferHeight           = localParameters.BackBufferHeight;
-    pPresentationParameters->BackBufferFormat           = d3dformat_from_wined3dformat(localParameters.BackBufferFormat);
-    pPresentationParameters->BackBufferCount            = localParameters.BackBufferCount;
-    pPresentationParameters->MultiSampleType            = localParameters.MultiSampleType;
-    pPresentationParameters->MultiSampleQuality         = localParameters.MultiSampleQuality;
-    pPresentationParameters->SwapEffect                 = localParameters.SwapEffect;
-    pPresentationParameters->hDeviceWindow              = localParameters.hDeviceWindow;
-    pPresentationParameters->Windowed                   = localParameters.Windowed;
-    pPresentationParameters->EnableAutoDepthStencil     = localParameters.EnableAutoDepthStencil;
-    pPresentationParameters->AutoDepthStencilFormat     = d3dformat_from_wined3dformat(localParameters.AutoDepthStencilFormat);
-    pPresentationParameters->Flags                      = localParameters.Flags;
-    pPresentationParameters->FullScreen_RefreshRateInHz = localParameters.FullScreen_RefreshRateInHz;
-    pPresentationParameters->PresentationInterval       = localParameters.PresentationInterval;
+    localParameters = HeapAlloc(GetProcessHeap(), 0, sizeof(*localParameters) * count);
+    for (i = 0; i < count; ++i)
+    {
+        localParameters[i].BackBufferWidth = pPresentationParameters[i].BackBufferWidth;
+        localParameters[i].BackBufferHeight = pPresentationParameters[i].BackBufferHeight;
+        localParameters[i].BackBufferFormat = wined3dformat_from_d3dformat(pPresentationParameters[i].BackBufferFormat);
+        localParameters[i].BackBufferCount = pPresentationParameters[i].BackBufferCount;
+        localParameters[i].MultiSampleType = pPresentationParameters[i].MultiSampleType;
+        localParameters[i].MultiSampleQuality = pPresentationParameters[i].MultiSampleQuality;
+        localParameters[i].SwapEffect = pPresentationParameters[i].SwapEffect;
+        localParameters[i].hDeviceWindow = pPresentationParameters[i].hDeviceWindow;
+        localParameters[i].Windowed = pPresentationParameters[i].Windowed;
+        localParameters[i].EnableAutoDepthStencil = pPresentationParameters[i].EnableAutoDepthStencil;
+        localParameters[i].AutoDepthStencilFormat = wined3dformat_from_d3dformat(pPresentationParameters[i].AutoDepthStencilFormat);
+        localParameters[i].Flags = pPresentationParameters[i].Flags;
+        localParameters[i].FullScreen_RefreshRateInHz = pPresentationParameters[i].FullScreen_RefreshRateInHz;
+        localParameters[i].PresentationInterval = pPresentationParameters[i].PresentationInterval;
+        localParameters[i].AutoRestoreDisplayMode = TRUE;
+    }
 
+    hr = IWineD3DDevice_Init3D(object->WineD3DDevice, localParameters);
     if (hr != D3D_OK) {
         FIXME("(%p) D3D Initialization failed for WineD3DDevice %p\n", This, object->WineD3DDevice);
         HeapFree(GetProcessHeap(), 0, object);
         *ppReturnedDeviceInterface = NULL;
     }
 
+    for (i = 0; i < count; ++i)
+    {
+        pPresentationParameters[i].BackBufferWidth = localParameters[i].BackBufferWidth;
+        pPresentationParameters[i].BackBufferHeight = localParameters[i].BackBufferHeight;
+        pPresentationParameters[i].BackBufferFormat = d3dformat_from_wined3dformat(localParameters[i].BackBufferFormat);
+        pPresentationParameters[i].BackBufferCount = localParameters[i].BackBufferCount;
+        pPresentationParameters[i].MultiSampleType = localParameters[i].MultiSampleType;
+        pPresentationParameters[i].MultiSampleQuality = localParameters[i].MultiSampleQuality;
+        pPresentationParameters[i].SwapEffect = localParameters[i].SwapEffect;
+        pPresentationParameters[i].hDeviceWindow = localParameters[i].hDeviceWindow;
+        pPresentationParameters[i].Windowed = localParameters[i].Windowed;
+        pPresentationParameters[i].EnableAutoDepthStencil = localParameters[i].EnableAutoDepthStencil;
+        pPresentationParameters[i].AutoDepthStencilFormat = d3dformat_from_wined3dformat(localParameters[i].AutoDepthStencilFormat);
+        pPresentationParameters[i].Flags = localParameters[i].Flags;
+        pPresentationParameters[i].FullScreen_RefreshRateInHz = localParameters[i].FullScreen_RefreshRateInHz;
+        pPresentationParameters[i].PresentationInterval = localParameters[i].PresentationInterval;
+    }
+    HeapFree(GetProcessHeap(), 0, localParameters);
+
     /* Initialize the converted declaration array. This creates a valid pointer and when adding decls HeapReAlloc
      * can be used without further checking
      */
-- 
1.6.0.6



--------------010205070808060803080007--



More information about the wine-patches mailing list