从 Direct2D 渲染目标获取 Direct3D 设备

3

我正在使用Direct2D来渲染我的用户界面。

我希望能够更轻松地对我的UI渲染进行分析(因为我使用了几个面板,使用Graphics debugger有点麻烦)。

由于我知道Direct2D在底层使用了一个Direct3D设备(确切地说是使用10_0特性级别的d3d11设备),所以我想知道是否可以从ID2D1RenderTarget或ID2D1Factory对象中检索到ID310Device或ID3D11Device实例。

如果可以的话,我将很容易地在BeginDraw/EndDraw调用上附加时间戳查询。

我尝试了几次QueryInterface调用,但迄今为止都没有成功。


我已经检查了这个链接,但遗憾的是它没有提供我的用例的解决方案,那里没有任何东西可以从渲染目标中检索d3d设备。 - mrvux
3
我认为这是不可能的。但可以采用另一种方式完成。设置D3D并在其中渲染D2D。在Windows 8.1上,您可以轻松地将D3D11与D2D1互操作。 - CodeAngry
你说得基本上没错,我在我的渲染面板中也是这样做的,创建了一个DX11交换链并将D2D设备上下文分配给表面。这么简单,甚至有点尴尬我以前没有这样做;)现在完美运行,可以混合DX11渲染和运行查询。 - mrvux
1个回答

3
一个有趣的未记录的秘密是,从 ID2D1Factory 获取的任何 ID2D1RenderTarget 也将是一个 ID2D1DeviceContext(根据我收集到的信息,这似乎是故意的,只是无意中未记录?)。只需调用 IUnknown::QueryInterface() 即可获取它。从那里,您可以玩弄像 GetDevice()GetTarget() 这样的方法。如果您可以获得目标,则可能能够以某种方式获得支持 IDXGISurfaceIDXGIDeviceSubObject::GetDevice() https://msdn.microsoft.com/en-us/library/windows/desktop/bb174529(v=vs.85).aspx(我还没有验证这一部分)。
在Win10中,看起来ID2D1Device2恰好提供了你想要的内容:GetDxgiDevice()https://msdn.microsoft.com/en-us/library/windows/desktop/dn917489(v=vs.85).aspx。因此,在这种情况下,通过IUnknown::QueryInterface()将你的ID2D1RenderTarget转换为ID2D1DeviceContext,然后通过ID2D1DeviceContext::GetDevice()获得一个ID2D1Device,再通过另一个调用IUnknown::QueryInterface()将其转换为ID2D1Device2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接