从Direct2D渲染目标获取Direct3D设备

时间:2015-02-18 13:15:46

标签: directx directx-11 direct2d

我使用Direct2D渲染我的用户界面。

我想要的是更容易分析我的ui渲染(因为我使用图形调试器使用多个面板有点麻烦)。

由于我知道Direct2D使用Direct3D设备(完全是使用10_0功能级别的d3d11设备),我想知道是否可以从ID2D1RenderTarget或ID2D1Factory对象检索ID310Device或ID3D11Device实例

在这种情况下,我可以轻松地在BeginDraw / EndDraw调用上附加时间戳查询。

我尝试了几个QueryInterface调用,但到目前为止它们都没有成功。

1 个答案:

答案 0 :(得分:1)

一个有趣的未记载的秘密是,ID2D1RenderTarget获得的任何ID2D1Factory也将是ID2D1DeviceContext(它似乎是故意从我收集到的,只是意外没有记录?)。只需致电IUnknown::QueryInterface()即可。从那里你可以玩弄GetDevice()GetTarget()等方法。如果您可以获得目标,那么您可以狡猾地获得支持IDXGISurface https://msdn.microsoft.com/en-us/library/windows/desktop/bb174529(v=vs.85).aspxIDXGIDeviceSubObject::GetDevice()(我还没有对此部分进行验证)

在Win10中看起来ID2D1Device2可以准确地为您提供所需内容:GetDxgiDevice() https://msdn.microsoft.com/en-us/library/windows/desktop/dn917489(v=vs.85).aspx。因此,在这种情况下,ID2D1RenderTarget通过ID2D1DeviceContext投放到IUnknown::QueryInterface(),然后通过ID2D1Device获得ID2D1DeviceContext::GetDevice(),然后将其转换为ID2D1Device2 {1}}通过另一次调用IUnknown::QueryInterface()