ISwapChainPanelNative2
COM公式ドキュメント
ISwapChainPanelNative2 インターフェイス (windows.ui.xaml.media.dxinterop.h) は、XAML と DirectX スワップチェーンとの間の相互運用を提供します。
解説(Remarks)
このインターフェイスは、Windows::UI::XAML::Control::SwapChainPanel Windows ランタイム型のネイティブ実装を提供します。ISwapChainPanelNative へのポインターを取得するには、SwapChainPanel インスタンスを IInspectable または IUnknown にキャストし、QueryInterface を呼び出す必要があります。
Microsoft::WRL::ComPtr<ISwapChainPanelNative2> m_swapChainNative2;
// ...
IInspectable* panelInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(swapChainPanel);
panelInspectable->QueryInterface(__uuidof(ISwapChainPanelNative2), (void **)&m_swapChainNative2);
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
スワップチェーンへのハンドルを使用して、SwapChainPanel に対する DirectX スワップチェーンを設定します。
| swapChainHandle | HANDLE | in | スワップチェーンへの共有ハンドル。 |
戻り値
このメソッドが成功した場合、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
SetSwapChain(HANDLE swapChainHandle) を使用すると、スワップチェーンへの共有ハンドルを参照することで、スワップチェーンをレンダリングできます。これにより、あるプロセスで作成したスワップチェーンを別のプロセスに渡す必要があるシナリオが可能になります。
XAML は、DXGI スワップチェーンを SwapChainPanel 要素のコンテンツとして設定することをサポートしています。アプリはこれを、SwapChainPanel インスタンスから ISwapChainPanelNative インターフェイスをクエリし、SetSwapChain(IDXGISwapChain *swapChain) を呼び出すことで実現します。
この処理は、プロセス内のスワップチェーンへのポインターに対しては機能します。しかし、VoIP アプリでは機能しません。VoIP アプリは、フォアグラウンドプロセスが中断または終了されたときにバックグラウンドプロセスで通話を継続できるようにするために、2 プロセスモデルを使用します。この 2 プロセスの実装では、バックグラウンドプロセスで作成したスワップチェーンを、ポインターではなく共有ハンドルとして、フォアグラウンドアプリの XAML SwapChainPanel でレンダリングするためにフォアグラウンドプロセスに渡す機能が必要です。
<!-- XAML markup -->
<Page>
<SwapChainPanel x:Name=”captureStreamDisplayPanel” />
</Page>
// Definitions
ComPtr<IDXGISwapChain1> m_swapChain;
HANDLE m_swapChainHandle;
ComPtr<ID3D11Device> m_d3dDevice;
ComPtr<IDXGIAdapter> dxgiAdapter;
ComPtr<IDXGIFactory2> dxgiFactory;
ComPtr<IDXGIFactoryMedia> dxgiFactoryMedia;
ComPtr<IDXGIDevice> dxgiDevice;
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
// Get DXGI factory (assume standard boilerplate has created D3D11Device)
m_d3dDevice.As(&dxgiDevice);
dxgiDevice->GetAdapter(&dxgiAdapter);
dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), &dxgiFactory);
// Create swap chain and get handle
DCompositionCreateSurfaceHandle(GENERIC_ALL, nullptr, &m_swapChainHandle);
dxgiFactory.As(&dxgiFactoryMedia);
dxgiFactoryMedia->CreateSwapChainForCompositionSurfaceHandle(
m_d3dDevice.Get(),
m_swapChainHandle,
&swapChainDesc,
nullptr,
&m_swapChain
);
// Set swap chain to display in a SwapChainPanel
ComPtr<ISwapChainPanelNative2> panelNative;
reinterpret_cast<IUnknown*>(captureStreamDisplayPanel)->QueryInterface(IID_PPV_ARGS(&panelNative)));
panelNative->SetSwapChainHandle(m_swapChainHandle);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ISwapChainPanelNative2 "{D5A2F60C-37B2-44A2-937B-8D8EB9726821}"
#usecom global ISwapChainPanelNative2 IID_ISwapChainPanelNative2 "{}"
#comfunc global ISwapChainPanelNative2_SetSwapChainHandle 4 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。