ID3D11Device3
COM公式ドキュメント
デバイスインターフェイスは仮想アダプターを表し、リソースの作成に使用します。ID3D11Device3 は ID3D11Device2 のメソッドに新しいメソッドを追加します。
メソッド 11
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
2D テクスチャを作成します。
| pDesc1 | D3D11_TEXTURE2D_DESC1* | in | 2D テクスチャリソースを記述する D3D11_TEXTURE2D_DESC1 構造体へのポインターです。実行時に互換性のある別の形式として解釈できる typeless リソースを作成するには、テクスチャの記述で typeless 形式を指定します。ミップマップレベルを自動生成するには、ミップマップレベル数を 0 に設定します。 |
| pInitialData | D3D11_SUBRESOURCE_DATA* | inoptional | 2D テクスチャリソースのサブリソースを記述する D3D11_SUBRESOURCE_DATA 構造体の配列へのポインターです。IMMUTABLE リソースを作成する場合、アプリケーションは pInitialData に NULL を指定できません (D3D11_USAGE を参照)。リソースがマルチサンプリングされている場合、マルチサンプリングされたリソースは作成時にデータで初期化できないため、pInitialData は NULL でなければなりません。 pInitialData に何も渡さない場合、リソース用メモリの初期内容は未定義です。この場合、リソースが読み取られる前に何らかの別の方法でリソースの内容を書き込む必要があります。 この配列のサイズは、pDesc1 が指す D3D11_TEXTURE2D_DESC1 構造体の MipLevels メンバーと ArraySize メンバーの値から、次の計算で求められます。 MipLevels * ArraySize この配列サイズの詳細については、「解説」を参照してください。 |
| ppTexture2D | ID3D11Texture2D1** | outoptional | 作成されたテクスチャの ID3D11Texture2D1 インターフェイスへのポインターを受け取るメモリブロックへのポインターです。他の入力パラメーターを検証するだけの場合は、このパラメーターに NULL を設定します (他の入力パラメーターが検証に合格すると、このメソッドは S_FALSE を返します)。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は S_OK です。失敗時のエラーコードについては、「Direct3D 11 Return Codes」を参照してください。
解説(Remarks)
CreateTexture2D1 は、複数の 2D サブリソースを含めることができる 2D テクスチャリソースを作成します。サブリソースの数はテクスチャの記述で指定します。1 つのリソース内のすべてのテクスチャは、同じ形式、サイズ、ミップマップレベル数でなければなりません。
すべてのリソースは 1 つ以上のサブリソースで構成されます。テクスチャにデータを読み込むには、アプリケーションは pInitialData が指す D3D11_SUBRESOURCE_DATA 構造体の配列として初期データを与えるか、D3DX11CreateTextureFromFile などの D3DX テクスチャ関数を使用します。
完全なミップマップチェーンを持つ 32 x 32 のテクスチャの場合、pInitialData 配列は次の 6 個の要素を持ちます。
- pInitialData[0] = 32x32
- pInitialData[1] = 16x16
- pInitialData[2] = 8x8
- pInitialData[3] = 4x4
- pInitialData[4] = 2x2
- pInitialData[5] = 1x1
3D テクスチャを作成します。
| pDesc1 | D3D11_TEXTURE3D_DESC1* | in | 3D テクスチャリソースを記述する D3D11_TEXTURE3D_DESC1 構造体へのポインターです。実行時に互換性のある別の形式として解釈できる typeless リソースを作成するには、テクスチャの記述で typeless 形式を指定します。ミップマップレベルを自動生成するには、ミップマップレベル数を 0 に設定します。 |
| pInitialData | D3D11_SUBRESOURCE_DATA* | inoptional | 3D テクスチャリソースのサブリソースを記述する D3D11_SUBRESOURCE_DATA 構造体の配列へのポインターです。IMMUTABLE リソースを作成する場合、アプリケーションは pInitialData に NULL を指定できません (D3D11_USAGE を参照)。リソースがマルチサンプリングされている場合、マルチサンプリングされたリソースは作成時にデータで初期化できないため、pInitialData は NULL でなければなりません。 pInitialData に何も渡さない場合、リソース用メモリの初期内容は未定義です。この場合、リソースが読み取られる前に何らかの別の方法でリソースの内容を書き込む必要があります。 この配列のサイズは、pDesc1 が指す D3D11_TEXTURE3D_DESC1 構造体の MipLevels メンバーの値から求められます。3D ボリュームテクスチャの配列はサポートされていません。 この配列サイズの詳細については、「解説」を参照してください。 |
| ppTexture3D | ID3D11Texture3D1** | outoptional | 作成されたテクスチャの ID3D11Texture3D1 インターフェイスへのポインターを受け取るメモリブロックへのポインターです。他の入力パラメーターを検証するだけの場合は、このパラメーターに NULL を設定します (他の入力パラメーターが検証に合格すると、このメソッドは S_FALSE を返します)。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は S_OK です。失敗時のエラーコードについては、「Direct3D 11 Return Codes」を参照してください。
解説(Remarks)
CreateTexture3D1 は、複数の 3D サブリソースを含めることができる 3D テクスチャリソースを作成します。テクスチャの数はテクスチャの記述で指定します。1 つのリソース内のすべてのテクスチャは、同じ形式、サイズ、ミップマップレベル数でなければなりません。
すべてのリソースは 1 つ以上のサブリソースで構成されます。テクスチャにデータを読み込むには、アプリケーションは pInitialData が指す D3D11_SUBRESOURCE_DATA 構造体の配列として初期データを与えるか、D3DX11CreateTextureFromFile などの D3DX テクスチャ関数を使用します。
pInitialData の各要素は、指定されたミップレベルに対して定義されるすべてのスライスを提供します。たとえば、完全なミップマップチェーンを持つ 32 x 32 x 4 のボリュームテクスチャの場合、配列は次の 6 個の要素を持ちます。
- pInitialData[0] = 32x32、4 スライス
- pInitialData[1] = 16x16、2 スライス
- pInitialData[2] = 8x8、1 スライス
- pInitialData[3] = 4x4、 1 スライス
- pInitialData[4] = 2x2、 1 スライス
- pInitialData[5] = 1x1、 1 スライス
ラスタライザーステージの動作を指定し、UAV レンダリング時やラスタライズ時にサンプル数を強制するラスタライザーステートオブジェクトを作成します。(ID3D11Device3.CreateRasterizerState2)
| pRasterizerDesc | D3D11_RASTERIZER_DESC2* | in | ラスタライザーステートを記述する D3D11_RASTERIZER_DESC2 構造体へのポインターです。 |
| ppRasterizerState | ID3D11RasterizerState2** | outoptional | 作成されたラスタライザーステートオブジェクトの ID3D11RasterizerState2 インターフェイスへのポインターを受け取るメモリブロックへのポインターです。他の入力パラメーターを検証するだけの場合は、このパラメーターに NULL を設定します (他の入力パラメーターが検証に合格すると、このメソッドは S_FALSE を返します)。 |
戻り値
型: HRESULT
ラスタライザーステートオブジェクトを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。その他の戻り値については、「Direct3D 11 Return Codes」を参照してください。
リソース内のデータにアクセスするためのシェーダーリソースビューを作成します。(ID3D11Device3.CreateShaderResourceView1)
| pResource | ID3D11Resource* | in | シェーダーへの入力となるリソースへのポインターです。このリソースは D3D11_BIND_SHADER_RESOURCE フラグを指定して作成されている必要があります。 |
| pDesc1 | D3D11_SHADER_RESOURCE_VIEW_DESC1* | inoptional | シェーダーリソースビューを記述する D3D11_SHADER_RESOURCE_VIEW_DESC1 構造体へのポインターです。リソース全体にアクセスするビュー (リソースの作成時に使用された形式を使用) を作成するには、 このパラメーターに NULL を設定します。 |
| ppSRView1 | ID3D11ShaderResourceView1** | outoptional | 作成されたシェーダーリソースビューの ID3D11ShaderResourceView1 インターフェイスへのポインターを受け取るメモリブロックへのポインターです。他の入力パラメーターを検証するだけの場合は、このパラメーターに NULL を設定します (他の入力パラメーターが検証に合格すると、このメソッドは S_FALSE を返します)。 |
戻り値
型: HRESULT
シェーダーリソースビューを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。その他の戻り値については、「Direct3D 11 Return Codes」を参照してください。
アンオーダードアクセスリソースにアクセスするためのビューを作成します。(ID3D11Device3.CreateUnorderedAccessView1)
| pResource | ID3D11Resource* | in | シェーダーへの入力となるリソースを表す ID3D11Resource へのポインターです。 |
| pDesc1 | D3D11_UNORDERED_ACCESS_VIEW_DESC1* | inoptional | アンオーダードアクセスビューの記述を表す D3D11_UNORDERED_ACCESS_VIEW_DESC1 構造体へのポインターです。リソース全体にアクセスするビュー (リソースの作成時に使用された形式を使用) を作成するには、このパラメーターに NULL を設定します。 |
| ppUAView1 | ID3D11UnorderedAccessView1** | outoptional | 作成されたアンオーダードアクセスビューの ID3D11UnorderedAccessView1 インターフェイスへのポインターを受け取るメモリブロックへのポインターです。他の入力パラメーターを検証するだけの場合は、このパラメーターに NULL を設定します (他の入力パラメーターが検証に合格すると、このメソッドは S_FALSE を返します)。 |
戻り値
型: HRESULT
アンオーダードアクセスビューを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。その他の戻り値については、「Direct3D 11 Return Codes」を参照してください。
リソースデータにアクセスするためのレンダーターゲットビューを作成します。(ID3D11Device3.CreateRenderTargetView1)
| pResource | ID3D11Resource* | in | レンダーターゲットを表す ID3D11Resource へのポインターです。このリソースは D3D11_BIND_RENDER_TARGET フラグを指定して作成されている必要があります。 |
| pDesc1 | D3D11_RENDER_TARGET_VIEW_DESC1* | inoptional | レンダーターゲットビューの記述を表す D3D11_RENDER_TARGET_VIEW_DESC1 へのポインターです。ミップマップレベル 0 のすべてのサブリソースにアクセスするビューを作成するには、このパラメーターに NULL を設定します。 |
| ppRTView1 | ID3D11RenderTargetView1** | outoptional | 作成されたレンダーターゲットビューの ID3D11RenderTargetView1 インターフェイスへのポインターを受け取るメモリブロックへのポインターです。他の入力パラメーターを検証するだけの場合は、このパラメーターに NULL を設定します (他の入力パラメーターが検証に合格すると、このメソッドは S_FALSE を返します)。 |
戻り値
型: HRESULT
このメソッドは Direct3D 11 Return Codes のいずれかを返します。
解説(Remarks)
レンダーターゲットビューは、ID3D11DeviceContext::OMSetRenderTargets を呼び出すことで出力マージャーステージにバインドできます。
グラフィックスプロセッシングユニット (GPU) から情報を照会するためのクエリオブジェクトを作成します。
| pQueryDesc1 | D3D11_QUERY_DESC1* | in | クエリの記述を表す D3D11_QUERY_DESC1 構造体へのポインターです。 |
| ppQuery1 | ID3D11Query1** | outoptional | 作成されたクエリオブジェクトの ID3D11Query1 インターフェイスへのポインターを受け取るメモリブロックへのポインターです。他の入力パラメーターを検証するだけの場合は、このパラメーターに NULL を設定します (他の入力パラメーターが検証に合格すると、このメソッドは S_FALSE を返します)。 |
戻り値
型: HRESULT
クエリオブジェクトを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。 その他の戻り値については、「Direct3D 11 Return Codes」を参照してください。
コマンドリストを再生できるイミディエイトコンテキストを取得します。(ID3D11Device3.GetImmediateContext3)
| ppImmediateContext | ID3D11DeviceContext3** | out | メソッドの完了時に、渡された ID3D11DeviceContext3 インターフェイスポインターへのポインターが初期化されます。 |
解説(Remarks)
<b>GetImmediateContext3</b> メソッドは、イミディエイトコンテキストを表す
<a href="/windows/desktop/api/d3d11_3/nn-d3d11_3-id3d11devicecontext3">ID3D11DeviceContext3</a> オブジェクトを出力します。イミディエイトコンテキストは、デバイスに即座に送信したいレンダリングを実行するために使用します。
ほとんどのアプリにとって、イミディエイトコンテキストはシーンを描画するために使用する主要なオブジェクトです。
GetImmediateContext3 メソッドは、イミディエイトコンテキストの参照カウントを 1 つ増加させます。 したがって、メモリリークを避けるため、使用が終わったら返されたインターフェイスポインターに対して Release を呼び出す必要があります。
コマンドリストを記録できるディファードコンテキストを作成します。(ID3D11Device3.CreateDeferredContext3)
| ContextFlags | DWORD | in | 将来の使用のために予約されています。0 を渡してください。 |
| ppDeferredContext | ID3D11DeviceContext3** | outoptional | メソッドの完了時に、渡された ID3D11DeviceContext3 インターフェイスポインターへのポインターが初期化されます。 |
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合は、次のいずれかを返します。
- ビデオカードがシステムから物理的に取り外された場合、またはビデオカードのドライバーがアップグレードされた場合は DXGI_ERROR_DEVICE_REMOVED を返します。 このエラーが発生した場合は、デバイスを破棄して再作成する必要があります。
- 現在のコンテキストから CreateDeferredContext3 メソッドを呼び出せない場合は DXGI_ERROR_INVALID_CALL を返します。 たとえば、デバイスが D3D11_CREATE_DEVICE_SINGLETHREADED 値を指定して作成された場合、CreateDeferredContext3 は DXGI_ERROR_INVALID_CALL を返します。
- ContextFlags パラメーターが無効な場合は E_INVALIDARG を返します。
- アプリが使用可能なメモリを使い果たした場合は E_OUTOFMEMORY を返します。
D3D11_MAPPED_SUBRESOURCE パラメーターに NULL を指定して ID3D11DeviceContext3::Map でマップされた D3D11_USAGE_DEFAULT テクスチャにデータをコピーします。
| pDstResource | ID3D11Resource* | in | コピー先リソース ( ID3D11Resource) へのポインターです。 |
| DstSubresource | DWORD | in | コピー先サブリソースを識別する 0 から始まるインデックスです。 詳細については、 D3D11CalcSubresource を参照してください。 |
| pDstBox | D3D11_BOX* | inoptional | リソースデータのコピー先となるコピー先サブリソースの領域を定義するボックスへのポインターです。 NULL の場合、データはオフセットなしでコピー先サブリソースに書き込まれます。 コピー元の寸法はコピー先に収まる必要があります ( D3D11_BOX を参照)。 空のボックスを指定すると何も行われません。 top の値が bottom 以上の場合、left の値が right 以上の場合、または front の値が back 以上の場合、そのボックスは空です。 ボックスが空の場合、このメソッドは何の操作も行いません。 |
| pSrcData | void* | in | メモリ内のコピー元データへのポインターです。 |
| SrcRowPitch | DWORD | in | コピー元データの 1 行分のサイズです。 |
| SrcDepthPitch | DWORD | in | コピー元データの深度スライス 1 枚分のサイズです。 |
解説(Remarks)
指定するリソースは、 D3D11_MAPPED_SUBRESOURCE パラメーターに NULL を指定して ID3D11DeviceContext3::Map を事前に呼び出し、書き込み用にマップされた D3D11_USAGE_DEFAULT テクスチャでなければなりません。
この API は高頻度で呼び出すことを想定しています。 呼び出し側は、テクスチャの領域を段階的に更新する反復呼び出しを行い、各呼び出しで小さなバッファーを与えることでメモリを削減できます。 ただし、十分に大きな領域を指定するほうが効率的です。これにより、D3D は復帰する前にテクスチャのキャッシュラインを丸ごと埋められるからです。
効率のため、ボックス内の範囲の境界と配置は、水平方向に ( 64 / [1 ピクセルあたりのバイト数] ) ピクセルとなるようにしてください。 垂直方向の境界と配置は 2 行にするべきですが、1 バイト/ピクセル形式を使用する場合は 4 行が推奨されます。 1 回の呼び出しにつき単一の深度スライスとする場合は効率的に処理されます。 ポインターとストライドを 128 バイト境界に配置することを推奨しますが、必須ではありません。
下位のミップマップレベルに書き込む場合は、上記より大きい幅と高さを使用することを推奨します。 これは、小さいミップマップレベルが実際にはより大きなメモリブロック内に不透明なオフセットを伴って格納されることがあり、それがキャッシュラインへの配置を妨げる可能性があるためです。
D3D11_MAPPED_SUBRESOURCE パラメーターに NULL を指定して ID3D11DeviceContext3::Map でマップされた D3D11_USAGE_DEFAULT テクスチャからデータをコピーします。
| pDstData | void* | out | メモリ内のコピー先データへのポインターです。 |
| DstRowPitch | DWORD | in | コピー先データの 1 行分のサイズです。 |
| DstDepthPitch | DWORD | in | コピー先データの深度スライス 1 枚分のサイズです。 |
| pSrcResource | ID3D11Resource* | in | コピー元リソースへのポインターです ( ID3D11Resource を参照)。 |
| SrcSubresource | DWORD | in | コピー先サブリソースを識別する 0 から始まるインデックスです。 詳細については、 D3D11CalcSubresource を参照してください。 |
| pSrcBox | D3D11_BOX* | inoptional | リソースデータのコピー元となるコピー先サブリソースの領域を定義するボックスへのポインターです。 NULL の場合、データはオフセットなしでコピー先サブリソースから読み取られます。 コピー先の寸法はコピー先に収まる必要があります ( D3D11_BOX を参照)。 空のボックスを指定すると何も行われません。 top の値が bottom 以上の場合、left の値が right 以上の場合、または front の値が back 以上の場合、そのボックスは空です。 ボックスが空の場合、このメソッドは何の操作も行いません。 |
解説(Remarks)
指定するリソースは、 D3D11_MAPPED_SUBRESOURCE パラメーターに NULL を指定して ID3D11DeviceContext3::Map を事前に呼び出し、書き込み用にマップされた D3D11_USAGE_DEFAULT テクスチャでなければなりません。
この API は高頻度で呼び出すことを想定しています。 呼び出し側は、テクスチャの領域を段階的に更新する反復呼び出しを行い、各呼び出しで小さなバッファーを与えることでメモリを削減できます。 ただし、十分に大きな領域を指定するほうが効率的です。これにより、D3D は復帰する前にテクスチャのキャッシュラインを丸ごと埋められるからです。
効率のため、ボックス内の範囲の境界と配置は、水平方向に ( 64 / [1 ピクセルあたりのバイト数] ) ピクセルとなるようにしてください。 垂直方向の境界と配置は 2 行にするべきですが、1 バイト/ピクセル形式を使用する場合は 4 行が推奨されます。 1 回の呼び出しにつき単一の深度スライスとする場合は効率的に処理されます。 ポインターとストライドを 128 バイト境界に配置することを推奨しますが、必須ではありません。
下位のミップマップレベルから読み取る場合は、上記より大きい幅と高さを使用することを推奨します。 これは、小さいミップマップレベルが実際にはより大きなメモリブロック内に不透明なオフセットを伴って格納されることがあり、それがキャッシュラインへの配置を妨げる可能性があるためです。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D11Device3 "{A05C8C37-D2C6-4732-B3A0-9CE0B0DC9AE6}" #usecom global ID3D11Device3 IID_ID3D11Device3 "{}" #comfunc global ID3D11Device3_CreateTexture2D1 54 var,var,sptr #comfunc global ID3D11Device3_CreateTexture3D1 55 var,var,sptr #comfunc global ID3D11Device3_CreateRasterizerState2 56 var,sptr #comfunc global ID3D11Device3_CreateShaderResourceView1 57 sptr,var,sptr #comfunc global ID3D11Device3_CreateUnorderedAccessView1 58 sptr,var,sptr #comfunc global ID3D11Device3_CreateRenderTargetView1 59 sptr,var,sptr #comfunc global ID3D11Device3_CreateQuery1 60 var,sptr #comfunc global ID3D11Device3_GetImmediateContext3 61 sptr #comfunc global ID3D11Device3_CreateDeferredContext3 62 int,sptr #comfunc global ID3D11Device3_WriteToSubresource 63 sptr,int,var,sptr,int,int #comfunc global ID3D11Device3_ReadFromSubresource 64 sptr,int,int,sptr,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D11Device3 "{A05C8C37-D2C6-4732-B3A0-9CE0B0DC9AE6}" #usecom global ID3D11Device3 IID_ID3D11Device3 "{}" #comfunc global ID3D11Device3_CreateTexture2D1 54 sptr,sptr,sptr #comfunc global ID3D11Device3_CreateTexture3D1 55 sptr,sptr,sptr #comfunc global ID3D11Device3_CreateRasterizerState2 56 sptr,sptr #comfunc global ID3D11Device3_CreateShaderResourceView1 57 sptr,sptr,sptr #comfunc global ID3D11Device3_CreateUnorderedAccessView1 58 sptr,sptr,sptr #comfunc global ID3D11Device3_CreateRenderTargetView1 59 sptr,sptr,sptr #comfunc global ID3D11Device3_CreateQuery1 60 sptr,sptr #comfunc global ID3D11Device3_GetImmediateContext3 61 sptr #comfunc global ID3D11Device3_CreateDeferredContext3 62 int,sptr #comfunc global ID3D11Device3_WriteToSubresource 63 sptr,int,sptr,sptr,int,int #comfunc global ID3D11Device3_ReadFromSubresource 64 sptr,int,int,sptr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。