{
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);
}
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,
/* 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)
{
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);
dxgi_device_SetGPUThreadPriority,
dxgi_device_GetGPUThreadPriority,
/* IWineDXGIAdapter methods */
- dxgi_device_get_wined3d_device,
dxgi_device_create_surface,
dxgi_device_create_swapchain,
};
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;
}