Commit 74ed5c70 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

d2d1: Added support for ID2D1GdiInteropRenderTarget interface.

parent 826b1e9c
...@@ -32,6 +32,8 @@ static inline struct d2d_bitmap_render_target *impl_from_ID2D1BitmapRenderTarget ...@@ -32,6 +32,8 @@ static inline struct d2d_bitmap_render_target *impl_from_ID2D1BitmapRenderTarget
static HRESULT STDMETHODCALLTYPE d2d_bitmap_render_target_QueryInterface(ID2D1BitmapRenderTarget *iface, static HRESULT STDMETHODCALLTYPE d2d_bitmap_render_target_QueryInterface(ID2D1BitmapRenderTarget *iface,
REFIID iid, void **out) REFIID iid, void **out)
{ {
struct d2d_bitmap_render_target *render_target = impl_from_ID2D1BitmapRenderTarget(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_ID2D1BitmapRenderTarget) if (IsEqualGUID(iid, &IID_ID2D1BitmapRenderTarget)
...@@ -43,6 +45,8 @@ static HRESULT STDMETHODCALLTYPE d2d_bitmap_render_target_QueryInterface(ID2D1Bi ...@@ -43,6 +45,8 @@ static HRESULT STDMETHODCALLTYPE d2d_bitmap_render_target_QueryInterface(ID2D1Bi
*out = iface; *out = iface;
return S_OK; return S_OK;
} }
else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
...@@ -806,8 +810,8 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta ...@@ -806,8 +810,8 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
return hr; return hr;
} }
if (FAILED(hr = ID2D1Factory_CreateDxgiSurfaceRenderTarget(parent_target->factory, dxgi_surface, &dxgi_rt_desc, if (FAILED(hr = d2d_d3d_create_render_target(parent_target->factory, dxgi_surface,
&render_target->dxgi_target))) (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface, &dxgi_rt_desc, &render_target->dxgi_target)))
{ {
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr); WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
IDXGISurface_Release(dxgi_surface); IDXGISurface_Release(dxgi_surface);
......
...@@ -69,9 +69,12 @@ struct d2d_shape_resources ...@@ -69,9 +69,12 @@ struct d2d_shape_resources
struct d2d_d3d_render_target struct d2d_d3d_render_target
{ {
ID2D1RenderTarget ID2D1RenderTarget_iface; ID2D1RenderTarget ID2D1RenderTarget_iface;
ID2D1GdiInteropRenderTarget ID2D1GdiInteropRenderTarget_iface;
IDWriteTextRenderer IDWriteTextRenderer_iface; IDWriteTextRenderer IDWriteTextRenderer_iface;
LONG refcount; LONG refcount;
IUnknown *outer_unknown;
ID2D1Factory *factory; ID2D1Factory *factory;
ID3D10Device *device; ID3D10Device *device;
ID3D10RenderTargetView *view; ID3D10RenderTargetView *view;
...@@ -93,8 +96,8 @@ struct d2d_d3d_render_target ...@@ -93,8 +96,8 @@ struct d2d_d3d_render_target
struct d2d_clip_stack clip_stack; struct d2d_clip_stack clip_stack;
}; };
HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory, HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, IUnknown *outer_unknown,
IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc) DECLSPEC_HIDDEN; const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target) DECLSPEC_HIDDEN;
HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *render_target, IDXGISurface1 *surface) DECLSPEC_HIDDEN; HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *render_target, IDXGISurface1 *surface) DECLSPEC_HIDDEN;
struct d2d_wic_render_target struct d2d_wic_render_target
......
...@@ -51,6 +51,8 @@ static inline struct d2d_dc_render_target *impl_from_ID2D1DCRenderTarget(ID2D1DC ...@@ -51,6 +51,8 @@ static inline struct d2d_dc_render_target *impl_from_ID2D1DCRenderTarget(ID2D1DC
static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_QueryInterface(ID2D1DCRenderTarget *iface, REFIID iid, void **out) static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_QueryInterface(ID2D1DCRenderTarget *iface, REFIID iid, void **out)
{ {
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_ID2D1DCRenderTarget) if (IsEqualGUID(iid, &IID_ID2D1DCRenderTarget)
...@@ -62,6 +64,8 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_QueryInterface(ID2D1DCRend ...@@ -62,6 +64,8 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_QueryInterface(ID2D1DCRend
*out = iface; *out = iface;
return S_OK; return S_OK;
} }
else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
...@@ -863,8 +867,8 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID ...@@ -863,8 +867,8 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
return hr; return hr;
} }
if (FAILED(hr = ID2D1Factory_CreateDxgiSurfaceRenderTarget(factory, if (FAILED(hr = d2d_d3d_create_render_target(factory, (IDXGISurface *)render_target->dxgi_surface,
(IDXGISurface *)render_target->dxgi_surface, desc, &render_target->dxgi_target))) (IUnknown *)&render_target->ID2D1DCRenderTarget_iface, desc, &render_target->dxgi_target)))
{ {
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr); WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
IDXGISurface1_Release(render_target->dxgi_surface); IDXGISurface1_Release(render_target->dxgi_surface);
......
...@@ -331,25 +331,9 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateHwndRenderTarget(ID2D1Factory ...@@ -331,25 +331,9 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateHwndRenderTarget(ID2D1Factory
static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDxgiSurfaceRenderTarget(ID2D1Factory *iface, static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDxgiSurfaceRenderTarget(ID2D1Factory *iface,
IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target) IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target)
{ {
struct d2d_d3d_render_target *object;
HRESULT hr;
TRACE("iface %p, surface %p, desc %p, render_target %p.\n", iface, surface, desc, render_target); TRACE("iface %p, surface %p, desc %p, render_target %p.\n", iface, surface, desc, render_target);
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return d2d_d3d_create_render_target(iface, surface, NULL, desc, render_target);
return E_OUTOFMEMORY;
if (FAILED(hr = d2d_d3d_render_target_init(object, iface, surface, desc)))
{
WARN("Failed to initialize render target, hr %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, object);
return hr;
}
TRACE("Created render target %p.\n", object);
*render_target = &object->ID2D1RenderTarget_iface;
return S_OK;
} }
static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDCRenderTarget(ID2D1Factory *iface, static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDCRenderTarget(ID2D1Factory *iface,
......
...@@ -40,6 +40,8 @@ static inline struct d2d_hwnd_render_target *impl_from_ID2D1HwndRenderTarget(ID2 ...@@ -40,6 +40,8 @@ static inline struct d2d_hwnd_render_target *impl_from_ID2D1HwndRenderTarget(ID2
static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_QueryInterface(ID2D1HwndRenderTarget *iface, static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_QueryInterface(ID2D1HwndRenderTarget *iface,
REFIID iid, void **out) REFIID iid, void **out)
{ {
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_ID2D1HwndRenderTarget) if (IsEqualGUID(iid, &IID_ID2D1HwndRenderTarget)
...@@ -51,6 +53,8 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_QueryInterface(ID2D1Hwnd ...@@ -51,6 +53,8 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_QueryInterface(ID2D1Hwnd
*out = iface; *out = iface;
return S_OK; return S_OK;
} }
else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
...@@ -856,7 +860,9 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target ...@@ -856,7 +860,9 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target
return hr; return hr;
} }
hr = ID2D1Factory_CreateDxgiSurfaceRenderTarget(factory, dxgi_surface, &dxgi_rt_desc, &render_target->dxgi_target); render_target->ID2D1HwndRenderTarget_iface.lpVtbl = &d2d_hwnd_render_target_vtbl;
hr = d2d_d3d_create_render_target(factory, dxgi_surface, (IUnknown *)&render_target->ID2D1HwndRenderTarget_iface,
&dxgi_rt_desc, &render_target->dxgi_target);
IDXGISurface_Release(dxgi_surface); IDXGISurface_Release(dxgi_surface);
if (FAILED(hr)) if (FAILED(hr))
{ {
......
...@@ -207,6 +207,8 @@ static inline struct d2d_d3d_render_target *impl_from_ID2D1RenderTarget(ID2D1Ren ...@@ -207,6 +207,8 @@ static inline struct d2d_d3d_render_target *impl_from_ID2D1RenderTarget(ID2D1Ren
static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_QueryInterface(ID2D1RenderTarget *iface, REFIID iid, void **out) static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_QueryInterface(ID2D1RenderTarget *iface, REFIID iid, void **out)
{ {
struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_ID2D1RenderTarget) if (IsEqualGUID(iid, &IID_ID2D1RenderTarget)
...@@ -217,6 +219,12 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_QueryInterface(ID2D1Rende ...@@ -217,6 +219,12 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_QueryInterface(ID2D1Rende
*out = iface; *out = iface;
return S_OK; return S_OK;
} }
else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
{
ID2D1GdiInteropRenderTarget_AddRef(&render_target->ID2D1GdiInteropRenderTarget_iface);
*out = &render_target->ID2D1GdiInteropRenderTarget_iface;
return S_OK;
}
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
...@@ -1866,8 +1874,107 @@ static const struct IDWriteTextRendererVtbl d2d_text_renderer_vtbl = ...@@ -1866,8 +1874,107 @@ static const struct IDWriteTextRendererVtbl d2d_text_renderer_vtbl =
d2d_text_renderer_DrawInlineObject, d2d_text_renderer_DrawInlineObject,
}; };
HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory, static inline struct d2d_d3d_render_target *impl_from_ID2D1GdiInteropRenderTarget(ID2D1GdiInteropRenderTarget *iface)
IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc) {
return CONTAINING_RECORD(iface, struct d2d_d3d_render_target, ID2D1GdiInteropRenderTarget_iface);
}
static HRESULT STDMETHODCALLTYPE d2d_gdi_interop_render_target_QueryInterface(ID2D1GdiInteropRenderTarget *iface,
REFIID iid, void **out)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1GdiInteropRenderTarget(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
return IUnknown_QueryInterface(render_target->outer_unknown, iid, out);
}
static ULONG STDMETHODCALLTYPE d2d_gdi_interop_render_target_AddRef(ID2D1GdiInteropRenderTarget *iface)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1GdiInteropRenderTarget(iface);
TRACE("iface %p.\n", iface);
return IUnknown_AddRef(render_target->outer_unknown);
}
static ULONG STDMETHODCALLTYPE d2d_gdi_interop_render_target_Release(ID2D1GdiInteropRenderTarget *iface)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1GdiInteropRenderTarget(iface);
TRACE("iface %p.\n", iface);
return IUnknown_Release(render_target->outer_unknown);
}
static HRESULT d2d_d3d_render_target_get_surface(struct d2d_d3d_render_target *render_target, IDXGISurface1 **surface)
{
ID3D10Resource *resource;
HRESULT hr;
ID3D10RenderTargetView_GetResource(render_target->view, &resource);
hr = ID3D10Resource_QueryInterface(resource, &IID_IDXGISurface1, (void **)surface);
ID3D10Resource_Release(resource);
if (FAILED(hr))
{
*surface = NULL;
WARN("Failed to get DXGI surface, %#x.\n", hr);
return hr;
}
return hr;
}
static HRESULT STDMETHODCALLTYPE d2d_gdi_interop_render_target_GetDC(ID2D1GdiInteropRenderTarget *iface,
D2D1_DC_INITIALIZE_MODE mode, HDC *dc)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1GdiInteropRenderTarget(iface);
IDXGISurface1 *surface;
HRESULT hr;
TRACE("iface %p, mode %d, dc %p.\n", iface, mode, dc);
if (FAILED(hr = d2d_d3d_render_target_get_surface(render_target, &surface)))
return hr;
hr = IDXGISurface1_GetDC(surface, mode != D2D1_DC_INITIALIZE_MODE_COPY, dc);
IDXGISurface1_Release(surface);
return hr;
}
static HRESULT STDMETHODCALLTYPE d2d_gdi_interop_render_target_ReleaseDC(ID2D1GdiInteropRenderTarget *iface,
const RECT *update)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1GdiInteropRenderTarget(iface);
IDXGISurface1 *surface;
RECT update_rect;
HRESULT hr;
TRACE("iface %p, update rect %s.\n", iface, wine_dbgstr_rect(update));
if (FAILED(hr = d2d_d3d_render_target_get_surface(render_target, &surface)))
return hr;
if (update)
update_rect = *update;
hr = IDXGISurface1_ReleaseDC(surface, update ? &update_rect : NULL);
IDXGISurface1_Release(surface);
return hr;
}
static const struct ID2D1GdiInteropRenderTargetVtbl d2d_gdi_interop_render_target_vtbl =
{
d2d_gdi_interop_render_target_QueryInterface,
d2d_gdi_interop_render_target_AddRef,
d2d_gdi_interop_render_target_Release,
d2d_gdi_interop_render_target_GetDC,
d2d_gdi_interop_render_target_ReleaseDC,
};
static HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory,
IDXGISurface *surface, IUnknown *outer_unknown, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{ {
D3D10_SUBRESOURCE_DATA buffer_data; D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_STATE_BLOCK_MASK state_mask; D3D10_STATE_BLOCK_MASK state_mask;
...@@ -2308,11 +2415,15 @@ HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ...@@ -2308,11 +2415,15 @@ HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target,
WARN("Ignoring feature level %#x.\n", desc->minLevel); WARN("Ignoring feature level %#x.\n", desc->minLevel);
render_target->ID2D1RenderTarget_iface.lpVtbl = &d2d_d3d_render_target_vtbl; render_target->ID2D1RenderTarget_iface.lpVtbl = &d2d_d3d_render_target_vtbl;
render_target->ID2D1GdiInteropRenderTarget_iface.lpVtbl = &d2d_gdi_interop_render_target_vtbl;
render_target->IDWriteTextRenderer_iface.lpVtbl = &d2d_text_renderer_vtbl; render_target->IDWriteTextRenderer_iface.lpVtbl = &d2d_text_renderer_vtbl;
render_target->refcount = 1; render_target->refcount = 1;
render_target->factory = factory; render_target->factory = factory;
ID2D1Factory_AddRef(render_target->factory); ID2D1Factory_AddRef(render_target->factory);
render_target->outer_unknown = outer_unknown ? outer_unknown :
(IUnknown *)&render_target->ID2D1RenderTarget_iface;
if (FAILED(hr = IDXGISurface_GetDevice(surface, &IID_ID3D10Device, (void **)&render_target->device))) if (FAILED(hr = IDXGISurface_GetDevice(surface, &IID_ID3D10Device, (void **)&render_target->device)))
{ {
WARN("Failed to get device interface, hr %#x.\n", hr); WARN("Failed to get device interface, hr %#x.\n", hr);
...@@ -2557,6 +2668,28 @@ err: ...@@ -2557,6 +2668,28 @@ err:
return hr; return hr;
} }
HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, IUnknown *outer_unknown,
const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target)
{
struct d2d_d3d_render_target *object;
HRESULT hr;
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
return E_OUTOFMEMORY;
if (FAILED(hr = d2d_d3d_render_target_init(object, factory, surface, outer_unknown, desc)))
{
WARN("Failed to initialize render target, hr %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, object);
return hr;
}
TRACE("Created render target %p.\n", object);
*render_target = &object->ID2D1RenderTarget_iface;
return S_OK;
}
HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *iface, IDXGISurface1 *surface) HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *iface, IDXGISurface1 *surface)
{ {
struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface); struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
......
...@@ -100,6 +100,8 @@ static inline struct d2d_wic_render_target *impl_from_ID2D1RenderTarget(ID2D1Ren ...@@ -100,6 +100,8 @@ static inline struct d2d_wic_render_target *impl_from_ID2D1RenderTarget(ID2D1Ren
static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(ID2D1RenderTarget *iface, REFIID iid, void **out) static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(ID2D1RenderTarget *iface, REFIID iid, void **out)
{ {
struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_ID2D1RenderTarget) if (IsEqualGUID(iid, &IID_ID2D1RenderTarget)
...@@ -110,6 +112,8 @@ static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(ID2D1Rende ...@@ -110,6 +112,8 @@ static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(ID2D1Rende
*out = iface; *out = iface;
return S_OK; return S_OK;
} }
else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
...@@ -870,8 +874,8 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, ...@@ -870,8 +874,8 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target,
return hr; return hr;
} }
if (FAILED(hr = ID2D1Factory_CreateDxgiSurfaceRenderTarget(factory, if (FAILED(hr = d2d_d3d_create_render_target(factory, render_target->dxgi_surface,
render_target->dxgi_surface, desc, &render_target->dxgi_target))) (IUnknown *)&render_target->ID2D1RenderTarget_iface, desc, &render_target->dxgi_target)))
{ {
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr); WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
ID3D10Texture2D_Release(render_target->readback_texture); ID3D10Texture2D_Release(render_target->readback_texture);
......
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