dxgi: Implement dxgi_swapchain_GetParent().
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
5cd719b867
commit
cbf0a1b59a
|
@ -156,6 +156,7 @@ struct dxgi_swapchain
|
||||||
struct wined3d_private_store private_store;
|
struct wined3d_private_store private_store;
|
||||||
struct wined3d_swapchain *wined3d_swapchain;
|
struct wined3d_swapchain *wined3d_swapchain;
|
||||||
IWineDXGIDevice *device;
|
IWineDXGIDevice *device;
|
||||||
|
IDXGIFactory *factory;
|
||||||
};
|
};
|
||||||
|
|
||||||
HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device *device,
|
HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device *device,
|
||||||
|
|
|
@ -78,6 +78,8 @@ static ULONG STDMETHODCALLTYPE dxgi_swapchain_Release(IDXGISwapChain *iface)
|
||||||
if (!refcount)
|
if (!refcount)
|
||||||
{
|
{
|
||||||
IWineDXGIDevice *device = swapchain->device;
|
IWineDXGIDevice *device = swapchain->device;
|
||||||
|
if (swapchain->factory)
|
||||||
|
IDXGIFactory_Release(swapchain->factory);
|
||||||
wined3d_mutex_lock();
|
wined3d_mutex_lock();
|
||||||
wined3d_swapchain_decref(swapchain->wined3d_swapchain);
|
wined3d_swapchain_decref(swapchain->wined3d_swapchain);
|
||||||
wined3d_mutex_unlock();
|
wined3d_mutex_unlock();
|
||||||
|
@ -122,9 +124,18 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetPrivateData(IDXGISwapChain *i
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetParent(IDXGISwapChain *iface, REFIID riid, void **parent)
|
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetParent(IDXGISwapChain *iface, REFIID riid, void **parent)
|
||||||
{
|
{
|
||||||
FIXME("iface %p, riid %s, parent %p stub!\n", iface, debugstr_guid(riid), parent);
|
struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface);
|
||||||
|
|
||||||
return E_NOTIMPL;
|
TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent);
|
||||||
|
|
||||||
|
if (!swapchain->factory)
|
||||||
|
{
|
||||||
|
ERR("Implicit swapchain does not store reference to parent.\n");
|
||||||
|
*parent = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IDXGIFactory_QueryInterface(swapchain->factory, riid, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IDXGIDeviceSubObject methods */
|
/* IDXGIDeviceSubObject methods */
|
||||||
|
@ -373,6 +384,28 @@ HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A reference to the implicit swapchain is held by the wined3d device.
|
||||||
|
* In order to avoid circular references we do not keep a reference
|
||||||
|
* to the device in the implicit swapchain.
|
||||||
|
*/
|
||||||
|
if (!implicit)
|
||||||
|
{
|
||||||
|
if (FAILED(hr = IDXGIAdapter1_GetParent(device->adapter, &IID_IDXGIFactory,
|
||||||
|
(void **)&swapchain->factory)))
|
||||||
|
{
|
||||||
|
WARN("Failed to get adapter parent, hr %#x.\n", hr);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
swapchain->device = &device->IWineDXGIDevice_iface;
|
||||||
|
IWineDXGIDevice_AddRef(swapchain->device);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
swapchain->device = NULL;
|
||||||
|
swapchain->factory = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
swapchain->IDXGISwapChain_iface.lpVtbl = &dxgi_swapchain_vtbl;
|
swapchain->IDXGISwapChain_iface.lpVtbl = &dxgi_swapchain_vtbl;
|
||||||
swapchain->refcount = 1;
|
swapchain->refcount = 1;
|
||||||
wined3d_mutex_lock();
|
wined3d_mutex_lock();
|
||||||
|
@ -384,24 +417,13 @@ HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device
|
||||||
WARN("Failed to create wined3d swapchain, hr %#x.\n", hr);
|
WARN("Failed to create wined3d swapchain, hr %#x.\n", hr);
|
||||||
wined3d_private_store_cleanup(&swapchain->private_store);
|
wined3d_private_store_cleanup(&swapchain->private_store);
|
||||||
wined3d_mutex_unlock();
|
wined3d_mutex_unlock();
|
||||||
|
if (swapchain->factory)
|
||||||
|
IDXGIFactory_Release(swapchain->factory);
|
||||||
|
if (swapchain->device)
|
||||||
|
IWineDXGIDevice_Release(swapchain->device);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
wined3d_mutex_unlock();
|
wined3d_mutex_unlock();
|
||||||
|
|
||||||
/**
|
|
||||||
* A reference to the implicit swapchain is held by the wined3d device.
|
|
||||||
* In order to avoid circular references we do not keep a reference
|
|
||||||
* to the device in the implicit swapchain.
|
|
||||||
*/
|
|
||||||
if (!implicit)
|
|
||||||
{
|
|
||||||
swapchain->device = &device->IWineDXGIDevice_iface;
|
|
||||||
IWineDXGIDevice_AddRef(swapchain->device);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
swapchain->device = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -485,15 +485,15 @@ static void test_create_swapchain(void)
|
||||||
ok(hr == E_INVALIDARG, "GetDesc unexpectedly returned %#x.\n", hr);
|
ok(hr == E_INVALIDARG, "GetDesc unexpectedly returned %#x.\n", hr);
|
||||||
|
|
||||||
hr = IDXGISwapChain_GetParent(swapchain, &IID_IUnknown, (void **)&parent);
|
hr = IDXGISwapChain_GetParent(swapchain, &IID_IUnknown, (void **)&parent);
|
||||||
todo_wine ok(SUCCEEDED(hr), "GetParent failed %#x.\n", hr);
|
ok(SUCCEEDED(hr), "GetParent failed %#x.\n", hr);
|
||||||
todo_wine ok(parent == (IUnknown *)factory, "Got unexpected parent interface pointer %p.\n", parent);
|
ok(parent == (IUnknown *)factory, "Got unexpected parent interface pointer %p.\n", parent);
|
||||||
if (SUCCEEDED(hr)) refcount = IUnknown_Release(parent);
|
refcount = IUnknown_Release(parent);
|
||||||
todo_wine ok(refcount == 4, "Got unexpected refcount %u.\n", refcount);
|
todo_wine ok(refcount == 4, "Got unexpected refcount %u.\n", refcount);
|
||||||
|
|
||||||
hr = IDXGISwapChain_GetParent(swapchain, &IID_IDXGIFactory, (void **)&parent);
|
hr = IDXGISwapChain_GetParent(swapchain, &IID_IDXGIFactory, (void **)&parent);
|
||||||
todo_wine ok(SUCCEEDED(hr), "GetParent failed %#x.\n", hr);
|
ok(SUCCEEDED(hr), "GetParent failed %#x.\n", hr);
|
||||||
todo_wine ok(parent == (IUnknown *)factory, "Got unexpected parent interface pointer %p.\n", parent);
|
ok(parent == (IUnknown *)factory, "Got unexpected parent interface pointer %p.\n", parent);
|
||||||
if (SUCCEEDED(hr)) refcount = IUnknown_Release(parent);
|
refcount = IUnknown_Release(parent);
|
||||||
todo_wine ok(refcount == 4, "Got unexpected refcount %u.\n", refcount);
|
todo_wine ok(refcount == 4, "Got unexpected refcount %u.\n", refcount);
|
||||||
|
|
||||||
IDXGISwapChain_Release(swapchain);
|
IDXGISwapChain_Release(swapchain);
|
||||||
|
|
Loading…
Reference in New Issue