* Sync up to trunk head (r64377).
[reactos.git] / dll / directx / wine / dxgi / device.c
index e775272..4adb851 100644 (file)
@@ -75,9 +75,10 @@ static ULONG STDMETHODCALLTYPE dxgi_device_Release(IWineDXGIDevice *iface)
     {
         if (This->child_layer) IUnknown_Release(This->child_layer);
         EnterCriticalSection(&dxgi_cs);
+        wined3d_device_uninit_3d(This->wined3d_device);
         wined3d_device_decref(This->wined3d_device);
         LeaveCriticalSection(&dxgi_cs);
-        IWineDXGIFactory_Release(This->factory);
+        IDXGIFactory1_Release(This->factory);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -143,7 +144,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_GetAdapter(IWineDXGIDevice *iface,
     wined3d_device_get_creation_parameters(This->wined3d_device, &create_parameters);
     LeaveCriticalSection(&dxgi_cs);
 
-    return IWineDXGIFactory_EnumAdapters(This->factory, create_parameters.adapter_idx, adapter);
+    return IDXGIFactory1_EnumAdapters(This->factory, create_parameters.adapter_idx, adapter);
 }
 
 static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *iface,
@@ -243,18 +244,6 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_GetGPUThreadPriority(IWineDXGIDevic
 
 /* IWineDXGIDevice methods */
 
-static struct wined3d_device * STDMETHODCALLTYPE dxgi_device_get_wined3d_device(IWineDXGIDevice *iface)
-{
-    struct dxgi_device *This = impl_from_IWineDXGIDevice(iface);
-
-    TRACE("iface %p\n", iface);
-
-    EnterCriticalSection(&dxgi_cs);
-    wined3d_device_incref(This->wined3d_device);
-    LeaveCriticalSection(&dxgi_cs);
-    return This->wined3d_device;
-}
-
 static HRESULT STDMETHODCALLTYPE dxgi_device_create_surface(IWineDXGIDevice *iface, const DXGI_SURFACE_DESC *desc,
         DXGI_USAGE usage, const DXGI_SHARED_RESOURCE *shared_resource, IUnknown *outer, void **surface)
 {
@@ -271,8 +260,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_create_surface(IWineDXGIDevice *ifa
         return E_OUTOFMEMORY;
     }
 
-    hr = dxgi_surface_init(object, (IDXGIDevice *)iface, outer);
-    if (FAILED(hr))
+    if (FAILED(hr = dxgi_surface_init(object, (IDXGIDevice *)iface, outer, desc)))
     {
         WARN("Failed to initialize surface, hr %#x.\n", hr);
         HeapFree(GetProcessHeap(), 0, object);
@@ -334,7 +322,6 @@ static const struct IWineDXGIDeviceVtbl dxgi_device_vtbl =
     dxgi_device_SetGPUThreadPriority,
     dxgi_device_GetGPUThreadPriority,
     /* IWineDXGIAdapter methods */
-    dxgi_device_get_wined3d_device,
     dxgi_device_create_surface,
     dxgi_device_create_swapchain,
 };
@@ -343,90 +330,85 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
         IDXGIFactory *factory, IDXGIAdapter *adapter)
 {
     struct wined3d_device_parent *wined3d_device_parent;
+    struct wined3d_swapchain_desc swapchain_desc;
     IWineDXGIDeviceParent *dxgi_device_parent;
-    IWineDXGIAdapter *wine_adapter;
-    UINT adapter_ordinal;
-    struct wined3d *wined3d;
+    struct dxgi_adapter *dxgi_adapter;
+    struct dxgi_factory *dxgi_factory;
     void *layer_base;
     HRESULT hr;
     WINED3DCAPS caps;
 
-    device->IWineDXGIDevice_iface.lpVtbl = &dxgi_device_vtbl;
-    device->refcount = 1;
-
-    layer_base = device + 1;
-
-    hr = layer->create(layer->id, &layer_base, 0,
-            device, &IID_IUnknown, (void **)&device->child_layer);
-    if (FAILED(hr))
+    if (!(dxgi_factory = unsafe_impl_from_IDXGIFactory1((IDXGIFactory1 *)factory)))
     {
-        WARN("Failed to create device, returning %#x.\n", hr);
-        goto fail;
+        WARN("This is not the factory we're looking for.\n");
+        return E_FAIL;
     }
 
-    hr = IDXGIFactory_QueryInterface(factory, &IID_IWineDXGIFactory, (void **)&device->factory);
-    if (FAILED(hr))
+    if (!(dxgi_adapter = unsafe_impl_from_IDXGIAdapter1((IDXGIAdapter1 *)adapter)))
     {
-        WARN("This is not the factory we're looking for, returning %#x.\n", hr);
-        goto fail;
+        WARN("This is not the adapter we're looking for.\n");
+        return E_FAIL;
     }
-    wined3d = IWineDXGIFactory_get_wined3d(device->factory);
 
-    hr = IDXGIAdapter_QueryInterface(adapter, &IID_IWineDXGIAdapter, (void **)&wine_adapter);
-    if (FAILED(hr))
+    device->IWineDXGIDevice_iface.lpVtbl = &dxgi_device_vtbl;
+    device->refcount = 1;
+
+    layer_base = device + 1;
+
+    if (FAILED(hr = layer->create(layer->id, &layer_base, 0,
+            device, &IID_IUnknown, (void **)&device->child_layer)))
     {
-        WARN("This is not the adapter we're looking for, returning %#x.\n", hr);
-        EnterCriticalSection(&dxgi_cs);
-        wined3d_decref(wined3d);
-        LeaveCriticalSection(&dxgi_cs);
-        goto fail;
+        WARN("Failed to create device, returning %#x.\n", hr);
+        return hr;
     }
-    adapter_ordinal = IWineDXGIAdapter_get_ordinal(wine_adapter);
-    IWineDXGIAdapter_Release(wine_adapter);
 
-    hr = IWineDXGIDevice_QueryInterface(&device->IWineDXGIDevice_iface, &IID_IWineDXGIDeviceParent,
-            (void **)&dxgi_device_parent);
-    if (FAILED(hr))
+    if (FAILED(hr = IWineDXGIDevice_QueryInterface(&device->IWineDXGIDevice_iface,
+            &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent)))
     {
         ERR("DXGI device should implement IWineD3DDeviceParent.\n");
-        goto fail;
+        IUnknown_Release(device->child_layer);
+        return hr;
     }
-
     wined3d_device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent);
+    IWineDXGIDeviceParent_Release(dxgi_device_parent);
 
     FIXME("Ignoring adapter type.\n");
 
-    hr = wined3d_get_device_caps(wined3d, adapter_ordinal, WINED3D_DEVICE_TYPE_HAL, &caps);
+    hr = wined3d_get_device_caps(dxgi_factory->wined3d, dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, &caps);
     if (FAILED(hr) || caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4)
     {
         WARN("Direct3D 10 is not supported on this GPU with the current shader backend.\n");
         if (SUCCEEDED(hr))
             hr = E_FAIL;
-        goto fail;
+        IUnknown_Release(device->child_layer);
+        return hr;
     }
 
     EnterCriticalSection(&dxgi_cs);
-    hr = wined3d_device_create(wined3d, adapter_ordinal, WINED3D_DEVICE_TYPE_HAL, NULL, 0, 4,
-            wined3d_device_parent, &device->wined3d_device);
-    IWineDXGIDeviceParent_Release(dxgi_device_parent);
-    wined3d_decref(wined3d);
+    hr = wined3d_device_create(dxgi_factory->wined3d, dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL,
+            NULL, 0, 4, wined3d_device_parent, &device->wined3d_device);
     LeaveCriticalSection(&dxgi_cs);
     if (FAILED(hr))
     {
         WARN("Failed to create a wined3d device, returning %#x.\n", hr);
-        goto fail;
+        IUnknown_Release(device->child_layer);
+        return hr;
     }
 
-    return S_OK;
-
-fail:
-    if (device->wined3d_device)
+    memset(&swapchain_desc, 0, sizeof(swapchain_desc));
+    swapchain_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
+    swapchain_desc.device_window = dxgi_factory_get_device_window(dxgi_factory);
+    swapchain_desc.windowed = TRUE;
+    if (FAILED(hr = wined3d_device_init_3d(device->wined3d_device, &swapchain_desc)))
     {
-        EnterCriticalSection(&dxgi_cs);
+        ERR("Failed to initialize 3D, hr %#x.\n", hr);
         wined3d_device_decref(device->wined3d_device);
-        LeaveCriticalSection(&dxgi_cs);
+        IUnknown_Release(device->child_layer);
+        return hr;
     }
-    if (device->factory) IWineDXGIFactory_Release(device->factory);
-    if (device->child_layer) IUnknown_Release(device->child_layer);
-    return hr;
+
+    device->factory = &dxgi_factory->IDXGIFactory1_iface;
+    IDXGIFactory1_AddRef(device->factory);
+
+    return S_OK;
 }