From: Henri Verbeet Subject: [PATCH 2/5] d2d1: Use the same device for all WIC render targets from the same factory. Message-Id: <1438671209-27903-2-git-send-email-hverbeet@codeweavers.com> Date: Tue, 4 Aug 2015 08:53:26 +0200 --- dlls/d2d1/d2d1_private.h | 2 +- dlls/d2d1/factory.c | 16 +++++++++++++++- dlls/d2d1/wic_render_target.c | 16 ++-------------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index d3c0117..08e0b3f 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -105,7 +105,7 @@ struct d2d_wic_render_target }; HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, ID2D1Factory *factory, - IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc) DECLSPEC_HIDDEN; + ID3D10Device1 *device, IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc) DECLSPEC_HIDDEN; struct d2d_gradient { diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c index 91534ce..0d15548 100644 --- a/dlls/d2d1/factory.c +++ b/dlls/d2d1/factory.c @@ -28,6 +28,8 @@ struct d2d_factory { ID2D1Factory ID2D1Factory_iface; LONG refcount; + + ID3D10Device1 *wic_device; }; static inline struct d2d_factory *impl_from_ID2D1Factory(ID2D1Factory *iface) @@ -71,7 +73,11 @@ static ULONG STDMETHODCALLTYPE d2d_factory_Release(ID2D1Factory *iface) TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) + { + if (factory->wic_device) + ID3D10Device1_Release(factory->wic_device); HeapFree(GetProcessHeap(), 0, factory); + } return refcount; } @@ -210,6 +216,7 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDrawingStateBlock(ID2D1Factor static HRESULT STDMETHODCALLTYPE d2d_factory_CreateWicBitmapRenderTarget(ID2D1Factory *iface, IWICBitmap *target, const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target) { + struct d2d_factory *factory = impl_from_ID2D1Factory(iface); struct d2d_wic_render_target *object; HRESULT hr; @@ -218,7 +225,14 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateWicBitmapRenderTarget(ID2D1Fa if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; - if (FAILED(hr = d2d_wic_render_target_init(object, iface, target, desc))) + if (!factory->wic_device && FAILED(hr = D3D10CreateDevice1(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, + D3D10_CREATE_DEVICE_BGRA_SUPPORT, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &factory->wic_device))) + { + WARN("Failed to create device, hr %#x.\n", hr); + return hr; + } + + if (FAILED(hr = d2d_wic_render_target_init(object, iface, factory->wic_device, target, desc))) { WARN("Failed to initialize render target, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); diff --git a/dlls/d2d1/wic_render_target.c b/dlls/d2d1/wic_render_target.c index a2ad73a..973303c 100644 --- a/dlls/d2d1/wic_render_target.c +++ b/dlls/d2d1/wic_render_target.c @@ -782,11 +782,10 @@ static const struct ID2D1RenderTargetVtbl d2d_wic_render_target_vtbl = }; HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, ID2D1Factory *factory, - IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc) + ID3D10Device1 *device, IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc) { D3D10_TEXTURE2D_DESC texture_desc; ID3D10Texture2D *texture; - ID3D10Device1 *device; HRESULT hr; FIXME("Ignoring render target properties.\n"); @@ -846,17 +845,9 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, texture_desc.CPUAccessFlags = 0; texture_desc.MiscFlags = 0; - if (FAILED(hr = D3D10CreateDevice1(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, - D3D10_CREATE_DEVICE_BGRA_SUPPORT, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &device))) - { - WARN("Failed to create device, hr %#x.\n", hr); - return hr; - } - if (FAILED(hr = ID3D10Device1_CreateTexture2D(device, &texture_desc, NULL, &texture))) { WARN("Failed to create texture, hr %#x.\n", hr); - ID3D10Device1_Release(device); return hr; } @@ -865,7 +856,6 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, if (FAILED(hr)) { WARN("Failed to get DXGI surface interface, hr %#x.\n", hr); - ID3D10Device1_Release(device); return hr; } @@ -873,9 +863,7 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, texture_desc.BindFlags = 0; texture_desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ; - hr = ID3D10Device1_CreateTexture2D(device, &texture_desc, NULL, &render_target->readback_texture); - ID3D10Device1_Release(device); - if (FAILED(hr)) + if (FAILED(hr = ID3D10Device1_CreateTexture2D(device, &texture_desc, NULL, &render_target->readback_texture))) { WARN("Failed to create readback texture, hr %#x.\n", hr); IDXGISurface_Release(render_target->dxgi_surface); -- 2.1.4