Directx 从Direct2D渲染目标获取Direct3D设备

Directx 从Direct2D渲染目标获取Direct3D设备,directx,directx-11,direct2d,Directx,Directx 11,Direct2d,我正在使用Direct2D呈现我的用户界面 我希望能够更轻松地分析我的ui呈现(因为我使用图形调试器使用多个面板有点麻烦) 因为我知道Direct2D在引擎盖下使用Direct3D设备(确切地说是使用10_0功能级别的d3d11设备),所以我想知道是否可以从ID2D1RenderTarget或ID2D1Factory对象检索ID310Device或ID3D11Device实例 在这种情况下,我可以很容易地在BeginDraw/EndDraw调用上附加一个时间戳查询 我尝试了几个QueryInte

我正在使用Direct2D呈现我的用户界面

我希望能够更轻松地分析我的ui呈现(因为我使用图形调试器使用多个面板有点麻烦)

因为我知道Direct2D在引擎盖下使用Direct3D设备(确切地说是使用10_0功能级别的d3d11设备),所以我想知道是否可以从ID2D1RenderTarget或ID2D1Factory对象检索ID310Device或ID3D11Device实例

在这种情况下,我可以很容易地在BeginDraw/EndDraw调用上附加一个时间戳查询


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

一个有趣的未记录的秘密是,从
ID2D1Factory
获得的任何
ID2D1RenderTarget
也将是
ID2D1DeviceContext
(从我收集的内容来看,这似乎是有意的,只是意外的未记录?)。只要调用
IUnknown::QueryInterface()
就可以了。从那里,你可以玩弄像
GetDevice()
GetTarget()
这样的方法。如果您可以获得目标,那么您就可以通过迂回的方式获得支持
idxgideviessubobject::GetDevice()
(我还没有验证此部分)的
IDXGISurface


在Win10中,它看起来像是
ID2D1Device2
精确地提供了您想要的:
GetDxgiDevice()
。因此,在这种情况下,您的
ID2D1RenderTarget
通过
IUnknown::QueryInterface()
被强制转换为
ID2D1DeviceContext
,然后通过
ID2D1DeviceContext::GetDevice()
获得
ID2D1Device2
,然后通过另一个调用
IUnknown::QueryInterface()将其强制转换为
ID2D1Device2

我已经检查了这个链接,但遗憾的是它没有为我的用例提供解决方案,没有任何东西允许从渲染目标检索d3d设备。我认为这是不可能的。但也可以反过来做。设置D3D并在其中渲染D2D。在Windows 8.1上,您可以轻松地将D3D11与D2D1进行互操作。您说得很对,我在渲染面板中采用了这种方式,创建了dx11交换链,并为曲面指定了d2d设备上下文。太容易了,甚至让人尴尬我以前没做过;)现在的工作方式就像一个魔咒,可以混合dx11渲染和运行查询。