ID3D11Multithread
COM公式ドキュメント
マルチスレッドアプリケーションのクリティカルセクションに対するスレッド保護を提供します。
解説(Remarks)
このインターフェイスは、ID3D11DeviceContext(またはそれ以降のバージョン)インターフェイスで作成されたイミディエイトデバイスコンテキストに対して、IUnknown::QueryInterface を使用して問い合わせることで取得します。
D3D10 とは異なり、D3D11 にはマルチスレッド層がありません。既定ではマルチスレッド保護は無効になっています。SetMultithreadProtected を使用して有効にし、特定の順序で実行する必要のあるグラフィックスコマンドを Enter と Leave で囲みます。
D3D11 では既定で、アプリケーションは一度に 1 つのスレッドからのみイミディエイトコンテキストを使用できます。しかし、このインターフェイスを使用すればその制限を変更できます。このインターフェイスによりイミディエイトコンテキストのスレッド保護を有効にできますが、1 つのコンテキストを複数のスレッドで共有するために、イミディエイトコンテキストの各呼び出しのオーバーヘッドは増加します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
デバイスのクリティカルセクションに入ります。(ID3D11Multithread.Enter)
解説(Remarks)
SetMultithreadProtected が true に設定されている場合、デバイスのクリティカルセクションに入ると、他のスレッドが同時にそのデバイスのメソッド、DXGI のメソッド、およびすべてのリソース、ビュー、シェーダー、ステート、非同期の各インターフェイスのメソッドを呼び出すことを防止します。
この関数は、マルチスレッドアプリケーションにおいて、順序どおりに実行しなければならない一連のグラフィックスコマンドがある場合に使用します。通常、この関数は一連のグラフィックスコマンドの開始時に呼び出し、それらのグラフィックスコマンドの後に Leave を呼び出します。
デバイスのクリティカルセクションから出ます。(ID3D11Multithread.Leave)
解説(Remarks)
この関数は通常、マルチスレッドアプリケーションにおいて、順序どおりに実行しなければならない一連のグラフィックスコマンドがある場合に使用します。通常、一連のグラフィックスコマンドの開始時に Enter を呼び出し、それらのグラフィックスコマンドの後にこの関数を呼び出します。
マルチスレッド保護の有効/無効を切り替えます。
| bMTProtect | BOOL | in | マルチスレッド保護を有効にする場合は true、無効にする場合は false を指定します。 |
戻り値
型: BOOL
このメソッドを呼び出す前にすでにマルチスレッド保護が有効になっていた場合は true、それ以外の場合は false を返します。
マルチスレッド保護が有効かどうかを調べます。
戻り値
型: BOOL
マルチスレッド保護が有効な場合は true、それ以外の場合は false を返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D11Multithread "{9B7E4E00-342C-4106-A19F-4F2704F689F0}"
#usecom global ID3D11Multithread IID_ID3D11Multithread "{}"
#comfunc global ID3D11Multithread_Enter 3
#comfunc global ID3D11Multithread_Leave 4
#comfunc global ID3D11Multithread_SetMultithreadProtected 5 int
#comfunc global ID3D11Multithread_GetMultithreadProtected 6
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。