ISurfaceImageSourceNativeWithD2D
COM公式ドキュメント
SurfaceImageSource または VirtualSurfaceImageSource に表示される、共有 Microsoft DirectX サーフェスの実装を提供します。
解説(Remarks)
ISurfaceImageSourceNativeWithD2D インターフェイスは、SurfaceImageSource クラスのネイティブ実装を提供します。ISurfaceImageSourceNativeWithD2D インターフェイスへのポインターを取得するには、SurfaceImageSource インスタンスを IInspectable または IUnknown にキャストし、QueryInterface メソッドを呼び出す必要があります。
Microsoft::WRL::ComPtr<ISurfaceImageSourceNativeWithD2D> m_sisD2DNative;
// ...
IInspectable* sisInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(surfaceImageSource);
sisInspectable->QueryInterface(__uuidof(ISurfaceImageSourceNative), (void **)&m_sisD2DNative)
ISurfaceImageSourceNativeWithD2D インターフェイスは、高パフォーマンスなバッチ化された Direct2D 描画を提供します。これにより、同じ Direct2D デバイスを共有している限り、複数の異なる SurfaceImageSource または VirtualSurfaceImageSource オブジェクトへの描画を同一バッチで実行できます。複数のサーフェスを同時に更新する場合、バッチ化によってパフォーマンスを向上させることができます。
ISurfaceImageSourceNativeWithD2D インターフェイスを使用すると、1 つ以上のバックグラウンドスレッドから SurfaceImageSource または VirtualSurfaceImageSource へ描画でき、UI スレッド外での高パフォーマンスな DirectX レンダリングが可能になります。
SetDevice、BeginDraw、EndDraw の各メソッドは、ISurfaceImageSourceNative や IVirtualSurfaceImageSourceNative インターフェイスではなく、ISurfaceImageSourceNativeWithD2D インターフェイスでのみ呼び出してください。
具体的には、SetDevice、BeginDraw、EndDraw の各メソッドが該当します。
複数のサーフェスへの更新をバッチ化してパフォーマンスを向上させるには、SetDevice メソッドに ID3D11Device の代わりに ID2D1Device を渡すことができます。その場合、BeginDraw メソッドは共有の ID2D1DeviceContext を任意で返すことができ、アプリはその更新のすべてのコンテンツをこのコンテキストを使って描画します。
バックグラウンドスレッドからサーフェスへ描画するには、Microsoft Direct3D デバイス、Direct3D デバイスコンテキスト、Direct2D デバイス、Direct2D デバイスコンテキストを含むすべての DirectX リソースを、マルチスレッドサポートが有効になるように設定する必要があります。
BeginDraw、SuspendDraw、ResumeDraw の各メソッドは任意のバックグラウンドスレッドから呼び出すことができ、高パフォーマンスなマルチスレッド描画が可能になります。
DirectX コンテンツの更新を現在の XAML UI スレッドフレームと同期させるため、EndDraw メソッドは常に UI スレッドで呼び出してください。BeginDraw をバックグラウンドスレッドで呼び出し、バックグラウンドスレッドでの描画が完了したら SuspendDraw を呼び出し、EndDraw を UI スレッドで呼び出す、という流れが可能です。
任意のバックグラウンドスレッドまたは UI スレッドで描画を中断・再開するには、SuspendDraw と ResumeDraw を使用します。
システムが GPU をリセットした際に失われる可能性のあるコンテンツを再作成する必要があるタイミングを判断するには、SurfaceContentsLost イベントを処理します。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
サーフェスを描画する、D3D11_CREATE_DEVICE_BGRA_SUPPORT で作成された Microsoft DirectX Graphics Infrastructure (DXGI) デバイスまたは Direct2D デバイスを設定します。
| device | IUnknown* | in | DXGI デバイスインターフェイスへのポインター。ID2D1Device を渡すことで、このサーフェスが Direct2D のバッチ化に参加し、複数のサーフェスにまたがる Direct2D コンテンツの更新時にパフォーマンスを向上させることを示せます。アプリがバックグラウンドスレッドからサーフェスへ描画する場合、デバイスはマルチスレッドサポートが有効になっている必要があります。 |
戻り値
このメソッドは、SurfaceImageSource が Direct3D デバイスでサポートされる最大テクスチャサイズより大きい場合に失敗します。Direct3D デバイスでサポートされる最大テクスチャサイズより大きいサーフェスには、VirtualSurfaceImageSource を使用してください。
関連付けられた SurfaceImageSource または VirtualSurfaceImageSource への更新を開始します。
| updateRect | RECT* | in | 描画対象となるサーフェスの領域。 |
| iid | GUID* | in | 描画用オブジェクトを検索するために使用する IID。 |
| updateObject | void** | out | 描画オブジェクトへの COM ポインターを受け取ります。iid に応じて、バッチ描画を使用しない場合は IDXGISurface、複数のサーフェスにまたがる Direct2D コンテンツの更新時にパフォーマンスを向上させるためバッチ化された Direct2D 描画を使用する場合は共有の ID2D1DeviceContext のいずれかになります。 |
| offset | POINT* | out | 描画対象となるサーフェスの点 (x,y) オフセットを受け取ります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ISurfaceImageSourceNativeWithD2D::EndDraw メソッド (windows.ui.xaml.media.dxinterop.h) は、サーフェスの描画操作を終了します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Microsoft DirectX コンテンツの更新を現在の XAML UI スレッドフレームと同期させるため、EndDraw メソッドは常に UI スレッドで呼び出してください。
描画操作を中断します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
描画操作を再開します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ISurfaceImageSourceNativeWithD2D "{54298223-41E1-4A41-9C08-02E8256864A1}" #usecom global ISurfaceImageSourceNativeWithD2D IID_ISurfaceImageSourceNativeWithD2D "{}" #comfunc global ISurfaceImageSourceNativeWithD2D_SetDevice 3 sptr #comfunc global ISurfaceImageSourceNativeWithD2D_BeginDraw 4 var,var,sptr,var #comfunc global ISurfaceImageSourceNativeWithD2D_EndDraw 5 #comfunc global ISurfaceImageSourceNativeWithD2D_SuspendDraw 6 #comfunc global ISurfaceImageSourceNativeWithD2D_ResumeDraw 7 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ISurfaceImageSourceNativeWithD2D "{54298223-41E1-4A41-9C08-02E8256864A1}" #usecom global ISurfaceImageSourceNativeWithD2D IID_ISurfaceImageSourceNativeWithD2D "{}" #comfunc global ISurfaceImageSourceNativeWithD2D_SetDevice 3 sptr #comfunc global ISurfaceImageSourceNativeWithD2D_BeginDraw 4 sptr,sptr,sptr,sptr #comfunc global ISurfaceImageSourceNativeWithD2D_EndDraw 5 #comfunc global ISurfaceImageSourceNativeWithD2D_SuspendDraw 6 #comfunc global ISurfaceImageSourceNativeWithD2D_ResumeDraw 7 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。