Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/d2d1/d2d1_private.h | 1 + dlls/d2d1/device.c | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index 436c4b0f245..7211029d920 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -539,6 +539,7 @@ struct d2d_device LONG refcount; ID2D1Factory1 *factory; IDXGIDevice *dxgi_device; + ID3D10Device *d3d10_device; };
void d2d_device_init(struct d2d_device *device, ID2D1Factory1 *factory, IDXGIDevice *dxgi_device) DECLSPEC_HIDDEN; diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c index 5f04c3aa833..3c33fba0e56 100644 --- a/dlls/d2d1/device.c +++ b/dlls/d2d1/device.c @@ -3875,13 +3875,13 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target, render_target->ops = ops;
device_impl = unsafe_impl_from_ID2D1Device(device); - if (FAILED(hr = IDXGIDevice_QueryInterface(device_impl->dxgi_device, - &IID_ID3D10Device, (void **)&render_target->d3d_device))) + if (!device_impl->d3d10_device) { - WARN("Failed to get device interface, hr %#x.\n", hr); + WARN("Failed to get device interface.\n"); ID2D1Factory_Release(render_target->factory); - return hr; + return E_NOINTERFACE; } + ID3D10Device_AddRef(render_target->d3d_device = device_impl->d3d10_device);
if (FAILED(hr = D3D10StateBlockMaskEnableAll(&state_mask))) { @@ -4126,6 +4126,7 @@ static ULONG WINAPI d2d_device_Release(ID2D1Device *iface)
if (!refcount) { + if (device->d3d10_device) ID3D10Device_Release(device->d3d10_device); IDXGIDevice_Release(device->dxgi_device); ID2D1Factory1_Release(device->factory); heap_free(device); @@ -4223,10 +4224,19 @@ static struct d2d_device *unsafe_impl_from_ID2D1Device(ID2D1Device *iface)
void d2d_device_init(struct d2d_device *device, ID2D1Factory1 *iface, IDXGIDevice *dxgi_device) { + HRESULT hr; + device->ID2D1Device_iface.lpVtbl = &d2d_device_vtbl; device->refcount = 1; device->factory = iface; ID2D1Factory1_AddRef(device->factory); device->dxgi_device = dxgi_device; IDXGIDevice_AddRef(device->dxgi_device); + + if (FAILED(hr = IDXGIDevice_QueryInterface(device->dxgi_device, + &IID_ID3D10Device, (void **)&device->d3d10_device))) + { + WARN("Failed to get device interface, hr %#x.\n", hr); + device->d3d10_device = NULL; + } }