Commit 044a989d authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

dxgi: Add a separate function for swapchain initialization.

parent d588d2b4
...@@ -291,10 +291,12 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_create_surface(IWineDXGIDevice *ifa ...@@ -291,10 +291,12 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_create_surface(IWineDXGIDevice *ifa
static HRESULT STDMETHODCALLTYPE dxgi_device_create_swapchain(IWineDXGIDevice *iface, static HRESULT STDMETHODCALLTYPE dxgi_device_create_swapchain(IWineDXGIDevice *iface,
WINED3DPRESENT_PARAMETERS *present_parameters, IWineD3DSwapChain **wined3d_swapchain) WINED3DPRESENT_PARAMETERS *present_parameters, IWineD3DSwapChain **wined3d_swapchain)
{ {
struct dxgi_device *This = (struct dxgi_device *)iface;
struct dxgi_swapchain *object; struct dxgi_swapchain *object;
HRESULT hr; HRESULT hr;
TRACE("iface %p, present_parameters %p, wined3d_swapchain %p.\n",
iface, present_parameters, wined3d_swapchain);
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object) if (!object)
{ {
...@@ -302,20 +304,16 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_create_swapchain(IWineDXGIDevice *i ...@@ -302,20 +304,16 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_create_swapchain(IWineDXGIDevice *i
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
object->vtbl = &dxgi_swapchain_vtbl; hr = dxgi_swapchain_init(object, (struct dxgi_device *)iface, present_parameters);
object->refcount = 1;
hr = IWineD3DDevice_CreateSwapChain(This->wined3d_device, present_parameters,
&object->wined3d_swapchain, (IUnknown *)object, SURFACE_OPENGL);
if (FAILED(hr)) if (FAILED(hr))
{ {
WARN("Failed to create a swapchain, returning %#x\n", hr); WARN("Failed to initialize swapchain, hr %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, object); HeapFree(GetProcessHeap(), 0, object);
return hr; return hr;
} }
*wined3d_swapchain = object->wined3d_swapchain;
TRACE("Created IDXGISwapChain %p\n", object); TRACE("Created IDXGISwapChain %p\n", object);
*wined3d_swapchain = object->wined3d_swapchain;
return S_OK; return S_OK;
} }
......
...@@ -121,7 +121,6 @@ struct dxgi_adapter ...@@ -121,7 +121,6 @@ struct dxgi_adapter
HRESULT dxgi_adapter_init(struct dxgi_adapter *adapter, IWineDXGIFactory *parent, UINT ordinal) DECLSPEC_HIDDEN; HRESULT dxgi_adapter_init(struct dxgi_adapter *adapter, IWineDXGIFactory *parent, UINT ordinal) DECLSPEC_HIDDEN;
/* IDXGISwapChain */ /* IDXGISwapChain */
extern const struct IDXGISwapChainVtbl dxgi_swapchain_vtbl DECLSPEC_HIDDEN;
struct dxgi_swapchain struct dxgi_swapchain
{ {
const struct IDXGISwapChainVtbl *vtbl; const struct IDXGISwapChainVtbl *vtbl;
...@@ -129,6 +128,9 @@ struct dxgi_swapchain ...@@ -129,6 +128,9 @@ struct dxgi_swapchain
IWineD3DSwapChain *wined3d_swapchain; IWineD3DSwapChain *wined3d_swapchain;
}; };
HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device *device,
WINED3DPRESENT_PARAMETERS *present_parameters) DECLSPEC_HIDDEN;
/* IDXGISurface */ /* IDXGISurface */
struct dxgi_surface struct dxgi_surface
{ {
......
...@@ -249,7 +249,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetLastPresentCount(IDXGISwapCha ...@@ -249,7 +249,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetLastPresentCount(IDXGISwapCha
return E_NOTIMPL; return E_NOTIMPL;
} }
const struct IDXGISwapChainVtbl dxgi_swapchain_vtbl = static const struct IDXGISwapChainVtbl dxgi_swapchain_vtbl =
{ {
/* IUnknown methods */ /* IUnknown methods */
dxgi_swapchain_QueryInterface, dxgi_swapchain_QueryInterface,
...@@ -274,3 +274,22 @@ const struct IDXGISwapChainVtbl dxgi_swapchain_vtbl = ...@@ -274,3 +274,22 @@ const struct IDXGISwapChainVtbl dxgi_swapchain_vtbl =
dxgi_swapchain_GetFrameStatistics, dxgi_swapchain_GetFrameStatistics,
dxgi_swapchain_GetLastPresentCount, dxgi_swapchain_GetLastPresentCount,
}; };
HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device *device,
WINED3DPRESENT_PARAMETERS *present_parameters)
{
HRESULT hr;
swapchain->vtbl = &dxgi_swapchain_vtbl;
swapchain->refcount = 1;
hr = IWineD3DDevice_CreateSwapChain(device->wined3d_device, present_parameters,
&swapchain->wined3d_swapchain, (IUnknown *)swapchain, SURFACE_OPENGL);
if (FAILED(hr))
{
WARN("Failed to create wined3d swapchain, hr %#x.\n", hr);
return hr;
}
return S_OK;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment