ID3D11Device1
COM公式ドキュメント
デバイスインターフェイスは仮想アダプターを表し、リソースの作成に使用します。ID3D11Device1 は ID3D11Device のメソッドに加えて、新しいメソッドを追加します。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コマンドリストを再生できるイミディエイトコンテキストを取得します。(ID3D11Device1.GetImmediateContext1)
| ppImmediateContext | ID3D11DeviceContext1** | out | メソッドの完了時に、渡された ID3D11DeviceContext1 インターフェイスポインターへのポインターが初期化されます。 |
解説(Remarks)
GetImmediateContext1 は、イミディエイトコンテキストを表す ID3D11DeviceContext1 オブジェクトを返します。このイミディエイトコンテキストを使用すると、デバイスに直ちに送信したいレンダリングを実行できます。ほとんどのアプリケーションでは、イミディエイトコンテキストがシーンの描画に使用する中心的なオブジェクトになります。
GetImmediateContext1 は、イミディエイトコンテキストの参照カウントを 1 つ増やします。そのため、メモリリークを避けるために、使用を終えたら返されたインターフェイスポインターに対して Release を呼び出してください。
コマンドリストを記録できる遅延コンテキストを作成します。(ID3D11Device1.CreateDeferredContext1)
| ContextFlags | DWORD | in | 将来の使用のために予約されています。 0 を指定してください。 |
| ppDeferredContext | ID3D11DeviceContext1** | outoptional | メソッドの完了時に、渡された ID3D11DeviceContext1 インターフェイスポインターへのポインターが初期化されます。 |
戻り値
成功した場合は S_OK を返します。それ以外の場合は、次のいずれかを返します。
- グラフィックスアダプターがコンピューターから物理的に取り外された場合、またはグラフィックスアダプターのドライバーがアップグレードされた場合は DXGI_ERROR_DEVICE_REMOVED を返します。 このエラーが発生した場合は、デバイスを破棄して再作成してください。
- 現在のコンテキストから CreateDeferredContext1 メソッドを呼び出せない場合は DXGI_ERROR_INVALID_CALL を返します。 たとえば、D3D11_CREATE_DEVICE_SINGLETHREADED 値を指定してデバイスを作成した場合、CreateDeferredContext1 は DXGI_ERROR_INVALID_CALL を返します。
- ContextFlags パラメーターが無効な場合は E_INVALIDARG を返します。
- アプリケーションが利用可能なメモリを使い果たした場合は E_OUTOFMEMORY を返します。
解説(Remarks)
遅延コンテキストはスレッドセーフなコンテキストであり、メインのレンダリングスレッド以外のスレッドでグラフィックスコマンドを記録するために使用できます。 遅延コンテキストを使用すると、ID3D11CommandList インターフェイスにカプセル化されたコマンドリストにグラフィックスコマンドを記録できます。 シーンの項目をすべて記録した後、最終的なレンダリングのためにそれらをメインのレンダリングスレッドに送信できます。 この方法により、複数のスレッドで並行してレンダリング処理を実行でき、マルチコア CPU 環境ではパフォーマンスの向上が期待できます。
遅延コンテキストは複数作成できます。
Windows Phone 8: この API はサポートされています。
出力マージャーステージのブレンドステートをカプセル化し、論理演算の構成を可能にするブレンドステートオブジェクトを作成します。
| pBlendStateDesc | D3D11_BLEND_DESC1* | in | ブレンドステートを記述する D3D11_BLEND_DESC1 構造体へのポインター。 |
| ppBlendState | ID3D11BlendState1** | outoptional | 作成されたブレンドステートオブジェクトの ID3D11BlendState1 インターフェイスへのポインターのアドレス。 |
戻り値
ブレンドステートオブジェクトを作成するためのメモリが不足している場合、このメソッドは E_OUTOFMEMORY を返します。
その他の戻り値については、Direct3D 11 の戻り値コード を参照してください。
解説(Remarks)
論理演算 (ピクセルシェーダーの出力とレンダーターゲットの内容との間でビットごとの論理演算を有効にするもの。D3D11_RENDER_TARGET_BLEND_DESC1 を参照) は、特定の機能レベルでのみ使用できます。サポートされているかどうかを確認するには、D3D11_FEATURE_D3D11_OPTIONS を指定して CheckFeatureSupport を呼び出し、D3D11_FEATURE_DATA_D3D11_OPTIONS のブール値フィールド OutputMergerLogicOp を確認してください。
アプリケーションは、一意なブレンドステートオブジェクトを最大 4096 個作成できます。オブジェクトを作成するたびに、ランタイムは同じステートを持つオブジェクトが既に存在するかどうかを確認します。そのようなオブジェクトが既に存在する場合、ランタイムは重複するオブジェクトを作成せず、既存のインスタンスへのポインターを返します。
ラスタライザーステージの動作を指定し、UAV レンダリングまたはラスタライズ時にサンプル数を強制するラスタライザーステートオブジェクトを作成します。(ID3D11Device1.CreateRasterizerState1)
| pRasterizerDesc | D3D11_RASTERIZER_DESC1* | in | ラスタライザーステートを記述する D3D11_RASTERIZER_DESC1 構造体へのポインター。 |
| ppRasterizerState | ID3D11RasterizerState1** | outoptional | 作成されたラスタライザーステートオブジェクトの ID3D11RasterizerState1 インターフェイスへのポインターのアドレス。 |
戻り値
ラスタライザーステートオブジェクトを作成するためのメモリが不足している場合、このメソッドは E_OUTOFMEMORY を返します。その他の戻り値については、Direct3D 11 の戻り値コード を参照してください。
解説(Remarks)
アプリケーションは、一意なラスタライザーステートオブジェクトを最大 4096 個作成できます。オブジェクトを作成するたびに、ランタイムは同じステートを持つオブジェクトが既に存在するかどうかを確認します。そのようなオブジェクトが既に存在する場合、ランタイムは重複するオブジェクトを作成せず、既存のインスタンスへのポインターを返します。
Microsoft Direct3D のすべてのステートと一部の Direct3D の動作を保持するコンテキストステートオブジェクトを作成します。
| Flags | DWORD | in | ビットごとの OR 演算で組み合わせた D3D11_1_CREATE_DEVICE_CONTEXT_STATE_FLAG 値の組み合わせ。 結果の値は、コンテキストステートオブジェクトの作成方法を指定します。 現在定義されているフラグは D3D11_1_CREATE_DEVICE_CONTEXT_STATE_SINGLETHREADED フラグのみです。 元のデバイスを D3D11_CREATE_DEVICE_SINGLETHREADED を指定して作成した場合、そのデバイスから作成するすべてのコンテキストステートオブジェクトには D3D11_1_CREATE_DEVICE_CONTEXT_STATE_SINGLETHREADED フラグを指定する必要があります。 コンテキストステートオブジェクトとデバイスの両方にシングルスレッドフラグを設定した場合、コンテキストのメソッドとデバイスのメソッドの一式を 1 つのスレッドからのみ呼び出すことを保証することになります。 そのため、デバイスコンテキストへのアクセスを同期するためにクリティカルセクションを使用する必要がなくなり、ランタイムはプロセッサー負荷の高いクリティカルセクションの処理を回避できます。 |
| pFeatureLevels | D3D_FEATURE_LEVEL* | in | D3D_FEATURE_LEVEL 値の配列へのポインター。この配列には次の一覧の要素を含めることができ、作成を試みる機能レベルの順序を決定します。 D3D11CreateDevice とは異なり、既定の機能レベル配列が存在しないため、pFeatureLevels に NULL を指定することはできません。 |
| FeatureLevels | DWORD | in | pFeatureLevels の要素数。D3D11CreateDevice とは異なり、pFeatureLevels に NULL を指定できないため、FeatureLevels には 0 より大きい値を設定する必要があります。 |
| SDKVersion | DWORD | in | SDK のバージョン。このパラメーターには D3D11_SDK_VERSION を指定する必要があります。 |
| EmulatedInterface | GUID* | in | エミュレートするインターフェイスのグローバル一意識別子 (GUID)。この値は、コンテキストステートオブジェクトが有効なときのデバイスの動作を指定します。有効な値は、ID3D10Device、ID3D10Device1、ID3D11Device、ID3D11Device1 の各インターフェイスに __uuidof 演算子を使用して取得します。「解説」を参照してください。 |
| pChosenFeatureLevel | D3D_FEATURE_LEVEL* | outoptional | pFeatureLevels 配列から選ばれた D3D_FEATURE_LEVEL 値を受け取る変数へのポインター。これは、CreateDeviceContextState がコンテキストステートオブジェクトの作成に成功した最初の配列値です。CreateDeviceContextState の呼び出しが失敗した場合、pChosenFeatureLevel が指す変数は 0 に設定されます。 |
| ppContextState | ID3DDeviceContextState** | outoptional | Direct3D デバイスのステートを表す ID3DDeviceContextState オブジェクトへのポインターのアドレス。 |
戻り値
型: HRESULT
このメソッドは、Direct3D 11 の戻り値コード のいずれかを返します。
解説(Remarks)
エミュレートするインターフェイスの REFIID 値は、__uuidof 演算子を使用して取得する GUID です。たとえば __uuidof(ID3D11Device) は、Microsoft Direct3D 11 デバイスのインターフェイスの GUID を取得します。
コンテキストステートオブジェクトを有効にするには、ID3D11DeviceContext1::SwapDeviceContextState メソッドを呼び出します。 コンテキストステートオブジェクトが有効な間は、そのコンテキストステートオブジェクトの機能レベルと互換インターフェイスの両方に関連付けられたデバイスの動作が、次に SwapDeviceContextState を呼び出すまで Direct3D デバイス上で有効になります。
コンテキストステートオブジェクトが有効な間、ランタイムはデバイスインターフェイスおよびコンテキストインターフェイスの一部のメソッドを無効にします。たとえば、__uuidof(ID3D11Device) で作成したコンテキストステートオブジェクトでは、ランタイムは Microsoft Direct3D 10 のデバイスインターフェイスのほとんどを無効にします。__uuidof(ID3D10Device1) または __uuidof(ID3D10Device) で作成したコンテキストステートオブジェクトでは、ランタイムは ID3D11DeviceContext のメソッドのほとんどを無効にします。
この動作により、いずれかのエミュレートインターフェイスの利用者が、もう一方のエミュレートインターフェイスでは表現できないデバイスステートを設定できないことが保証されます。この制限によって、ID3D10Device1 エミュレートインターフェイスがパイプラインの状態全体を正確に反映し、本来のインターフェイス定義に反する動作をしないことが保証されます。
たとえば、Direct3D 10 の同等の関数ではなく D3D11CreateDevice または D3D11CreateDeviceAndSwapChain でデバイスを作成し、ID3D11DeviceContext インターフェイスを通じてテセレーションステージを有効にした場合を考えます。 このとき Direct3D 11 のコンテキストが有効であるため、QueryInterface で Direct3D 10 インターフェイスを最初に取得した時点では、そのインターフェイスは無効です。つまり、Direct3D 11 デバイスから取得した Direct3D 10 インターフェイスを、そのまま関数に渡すことはできません。まず SwapDeviceContextState を呼び出して、Direct3D 10 互換のコンテキストステートオブジェクトを有効にする必要があります。
次の表は、エミュレートインターフェイスごとに有効になるメソッドと無効になるメソッドを示しています。
| エミュレートインターフェイス | 有効なデバイスインターフェイスまたはイミディエイトコンテキストインターフェイス | 無効なデバイスインターフェイスまたはイミディエイトコンテキストインターフェイス |
|---|---|---|
|
ID3D11Device or |
ID3D10Device | |
|
ID3D11DeviceContext (イミディエイトコンテキストが公開するもの。Direct3D 10 または Microsoft Direct3D 10.1 のエミュレートインターフェイスは、遅延コンテキストには影響しません。) |
次の表は、指定したコンテキストステートオブジェクトが有効なときにランタイムが無効にするイミディエイトコンテキストのメソッドを示しています。
__uuidof(ID3D10Device1) または __uuidof(ID3D10Device) が有効なときの ID3D11DeviceContext のメソッド
|
__uuidof(ID3D11Device) が有効なときの ID3D10Device のメソッド
|
|---|---|
| IAGetVertexBuffers | |
| IASetIndexBuffer | |
| IASetInputLayout | |
| IASetPrimitiveTopology | |
| IASetVertexBuffers | |
次の表は、指定したコンテキストステートオブジェクトが有効なときでもランタイムが無効にしないイミディエイトコンテキストのメソッドを示しています。
__uuidof(ID3D10Device1) または __uuidof(ID3D10Device) が有効なときの ID3D11DeviceContext のメソッド
|
__uuidof(ID3D11Device) が有効なときの ID3D10Device のメソッド
|
|---|---|
次の表は、イミディエイトコンテキストのメソッドではないためランタイムが無効にしない ID3D10Device インターフェイスのメソッドを示しています。
| ID3D10Device のメソッド |
|---|
| CreateQuery などの Create* メソッド |
Windows Phone 8: この API はサポートされています。
別のデバイスで作成され、ハンドルによって参照される共有リソースへのアクセス権をデバイスに与えます。
| hResource | HANDLE | in | 開くリソースへのハンドル。このパラメーターの詳細については、「解説」を参照してください。 |
| returnedInterface | GUID* | in | リソースインターフェイスのグローバル一意識別子 (GUID)。このパラメーターの詳細については、「解説」を参照してください。 |
| ppResource | void** | out | アクセスする共有リソースオブジェクトのインターフェイスへのポインターを受け取る変数へのポインター。 |
戻り値
このメソッドは、Direct3D 11 の戻り値コード のいずれかを返します。また、リソースへのアクセス許可が有効でない場合は E_ACCESSDENIED を返します。
Platform Update for Windows 7: Platform Update for Windows 7 をインストールした Windows 7 または Windows Server 2008 R2 では、NTHANDLE が使用されるため、OpenSharedResource1 は E_NOTIMPL で失敗します。Platform Update for Windows 7 の詳細については、Platform Update for Windows 7 を参照してください。
解説(Remarks)
OpenSharedResource1 の動作は ID3D11Device::OpenSharedResource メソッドの動作に似ています。リソースにアクセスするために OpenSharedResource1 を呼び出すたびに、新しいリソースオブジェクトが作成されます。 つまり、OpenSharedResource1 を 2 回呼び出して同じリソースハンドルを hResource に渡すと、異なる IUnknown ポインターを持つ 2 つのリソースオブジェクトが得られます。
2 つのデバイス間でリソースを共有するには
- D3D11_RESOURCE_MISC_SHARED_NTHANDLE フラグを設定して、リソースを共有として作成し、NT ハンドルを使用することを指定します。
- __uuidof() マクロを使用して、リソースのインターフェイスの REFIID (GUID) を取得します。たとえば __uuidof(ID3D11Texture2D) は、2D テクスチャのインターフェイスの GUID を取得します。
- リソースに対して IDXGIResource1 インターフェイスをクエリします。
- IDXGIResource1::CreateSharedHandle メソッドを呼び出して、リソースの一意なハンドルを取得します。
例
HANDLE handle = GetSharedHandleFromOtherProcess();
ID3D11Device1* pDevice;
ID3D11Texture2D* pTexture2D;
pDevice->OpenSharedResource1(
handle,
__uuidof(ID3D11Texture2D),
(void**)&pTexture2D);
別のデバイスで作成され、名前によって参照される共有リソースへのアクセス権をデバイスに与えます。
| lpName | LPWSTR | in | 開くリソースの名前。このパラメーターに NULL を指定することはできません。 |
| dwDesiredAccess | DWORD | in | リソースに対して要求するアクセス権。汎用アクセス権 に加えて、DXGI では次の値が定義されています。
|
| returnedInterface | GUID* | in | リソースインターフェイスのグローバル一意識別子 (GUID)。詳細については、「解説」を参照してください。 |
| ppResource | void** | out | アクセスする共有リソースオブジェクトのインターフェイスへのポインターを受け取る変数へのポインター。 |
戻り値
このメソッドは、Direct3D 11 の戻り値コード のいずれかを返します。また、リソースへのアクセス許可が有効でない場合は E_ACCESSDENIED を返します。
Platform Update for Windows 7: Platform Update for Windows 7 をインストールした Windows 7 または Windows Server 2008 R2 では、NTHANDLE が使用されるため、OpenSharedResourceByName は E_NOTIMPL で失敗します。Platform Update for Windows 7 の詳細については、Platform Update for Windows 7 を参照してください。
解説(Remarks)
OpenSharedResourceByName の動作は ID3D11Device1::OpenSharedResource1 メソッドの動作に似ています。リソースにアクセスするために OpenSharedResourceByName を呼び出すたびに、新しいリソースオブジェクトが作成されます。 つまり、OpenSharedResourceByName を 2 回呼び出して同じリソース名を lpName に渡すと、異なる IUnknown ポインターを持つ 2 つのリソースオブジェクトが得られます。
2 つのデバイス間でリソースを共有するには
- D3D11_RESOURCE_MISC_SHARED_NTHANDLE フラグを設定して、リソースを共有として作成し、NT ハンドルを使用することを指定します。
- __uuidof() マクロを使用して、リソースのインターフェイスの REFIID (GUID) を取得します。たとえば __uuidof(ID3D11Texture2D) は、2D テクスチャのインターフェイスの GUID を取得します。
- リソースに対して IDXGIResource1 インターフェイスをクエリします。
- IDXGIResource1::CreateSharedHandle メソッドを呼び出して、リソースの一意なハンドルを取得します。その後 OpenSharedResourceByName を呼び出して名前でリソースにアクセスする場合は、この IDXGIResource1::CreateSharedHandle の呼び出しでリソースの名前を渡す必要があります。
例
ID3D11Device1* pDevice;
ID3D11Texture2D* pTexture2D;
pDevice->OpenSharedResourceByName(
"MySurface",
DXGI_SHARED_RESOURCE_READ,
__uuidof(ID3D11Texture2D),
(void**)&pTexture2D);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D11Device1 "{A04BFB29-08EF-43D6-A49C-A9BDBDCBE686}" #usecom global ID3D11Device1 IID_ID3D11Device1 "{}" #comfunc global ID3D11Device1_GetImmediateContext1 43 sptr #comfunc global ID3D11Device1_CreateDeferredContext1 44 int,sptr #comfunc global ID3D11Device1_CreateBlendState1 45 var,sptr #comfunc global ID3D11Device1_CreateRasterizerState1 46 var,sptr #comfunc global ID3D11Device1_CreateDeviceContextState 47 int,var,int,int,var,var,sptr #comfunc global ID3D11Device1_OpenSharedResource1 48 sptr,var,sptr #comfunc global ID3D11Device1_OpenSharedResourceByName 49 wstr,int,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D11Device1 "{A04BFB29-08EF-43D6-A49C-A9BDBDCBE686}" #usecom global ID3D11Device1 IID_ID3D11Device1 "{}" #comfunc global ID3D11Device1_GetImmediateContext1 43 sptr #comfunc global ID3D11Device1_CreateDeferredContext1 44 int,sptr #comfunc global ID3D11Device1_CreateBlendState1 45 sptr,sptr #comfunc global ID3D11Device1_CreateRasterizerState1 46 sptr,sptr #comfunc global ID3D11Device1_CreateDeviceContextState 47 int,sptr,int,int,sptr,sptr,sptr #comfunc global ID3D11Device1_OpenSharedResource1 48 sptr,sptr,sptr #comfunc global ID3D11Device1_OpenSharedResourceByName 49 wstr,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。