mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
d2d1: Use the same device for all WIC render targets from the same factory.
This commit is contained in:
parent
da47b214cd
commit
f0bf9e81fa
3 changed files with 18 additions and 16 deletions
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue