ID3D11DeviceContext1
COM公式ドキュメント
デバイスコンテキストインターフェイスはデバイスコンテキストを表し、レンダリングコマンドの発行に使用します。ID3D11DeviceContext1 は、ID3D11DeviceContext のメソッドに新しいメソッドを追加します。
メソッド 19
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コピー元リソースからコピー先リソースへ領域をコピーします。
| pDstResource | ID3D11Resource* | in | コピー先リソースへのポインターです。 |
| DstSubresource | DWORD | in | コピー先のサブリソースインデックスです。 |
| DstX | DWORD | in | コピー先領域の左上隅の x 座標です。 |
| DstY | DWORD | in | コピー先領域の左上隅の y 座標です。1D サブリソースの場合は 0 である必要があります。 |
| DstZ | DWORD | in | コピー先領域の左上隅の z 座標です。1D または 2D サブリソースの場合は 0 である必要があります。 |
| pSrcResource | ID3D11Resource* | in | コピー元リソースへのポインターです。 |
| SrcSubresource | DWORD | in | コピー元のサブリソースインデックスです。 |
| pSrcBox | D3D11_BOX* | inoptional | CopySubresourceRegion1 がコピーできるコピー元サブリソースの領域を定義する 3D ボックスへのポインターです。NULL の場合、CopySubresourceRegion1 はコピー元サブリソース全体をコピーします。ボックスはコピー元リソース内に収まっている必要があります。 空のボックスを指定した場合は何も行われません。top の値が bottom の値以上、left の値が right の値以上、または front の値が back の値以上である場合、そのボックスは空です。ボックスが空の場合、CopySubresourceRegion1 はコピー操作を実行しません。 |
| CopyFlags | DWORD | in | コピー操作の実行方法を指定する D3D11_COPY_FLAGS 型の値です。コピーオプションを指定せず 0 を指定した場合、CopySubresourceRegion1 は ID3D11DeviceContext::CopySubresourceRegion と同じように動作します。これらのフラグを処理できない既存のディスプレイドライバーでは、ランタイムはこれらを使用しません。 |
解説(Remarks)
ディスプレイドライバーがオーバーラップをサポートしている場合、コピー元とコピー先のサブリソースが同一でもよく、コピー元とコピー先の領域が互いに重なっていても構いません。オーバーラップをサポートしない既存のディスプレイドライバーでは、領域が重なっているかどうかにかかわらず、コピー元とコピー先のサブリソースが同一である呼び出しをランタイムが破棄します。ディスプレイドライバーがオーバーラップをサポートしているかどうかを確認するには、D3D11_FEATURE_DATA_D3D11_OPTIONS の CopyWithOverlap メンバーを調べます。このオーバーラップのサポートにより、IDXGISwapChain::Present の呼び出しで追加のスクロール機能が利用できます。
CPU が、メモリーからマップ不可能なメモリーに作成されたサブリソースへデータをコピーします。(ID3D11DeviceContext1.UpdateSubresource1)
| pDstResource | ID3D11Resource* | in | コピー先リソースへのポインターです。 |
| DstSubresource | DWORD | in | コピー先のサブリソースを識別する、ゼロ基点のインデックスです。詳しくは D3D11CalcSubresource を参照してください。 |
| pDstBox | D3D11_BOX* | inoptional | リソースデータのコピー先となる、コピー先サブリソースの部分を定義するボックスへのポインターです。座標は、バッファーの場合はバイト単位、テクスチャの場合はテクセル単位です。NULL の場合、UpdateSubresource1 はオフセットなしでコピー先サブリソースにデータを書き込みます。コピー元の寸法はコピー先に収まる必要があります。 空のボックスを指定した場合は何も行われません。top の値が bottom の値以上、left の値が right の値以上、または front の値が back の値以上である場合、そのボックスは空です。ボックスが空の場合、UpdateSubresource1 は更新操作を実行しません。 |
| pSrcData | void* | in | メモリー上のコピー元データへのポインターです。 |
| SrcRowPitch | DWORD | in | コピー元データの 1 行分のサイズです。 |
| SrcDepthPitch | DWORD | in | コピー元データの 1 深度スライス分のサイズです。 |
| CopyFlags | DWORD | in | 更新操作の実行方法を指定する D3D11_COPY_FLAGS 型の値です。更新オプションを指定せず 0 を指定した場合、UpdateSubresource1 は ID3D11DeviceContext::UpdateSubresource と同じように動作します。これらのフラグを処理できない既存のディスプレイドライバーでは、ランタイムはこれらを使用しません。 |
解説(Remarks)
定数バッファーを更新するために UpdateSubresource1 を呼び出して任意の領域を渡した場合、ドライバーが Windows 8 向けに実装されていなければ、ランタイムはその呼び出しを破棄します (ただし、機能レベル 9.1、9.2、9.3 ではランタイムがサポートをエミュレートします)。また、16 バイト単位 (16 バイトが 1 定数) にアラインしていない範囲の部分領域で定数バッファーを更新した場合も、ランタイムは呼び出しを破棄します。ランタイムが呼び出しを破棄した場合、対応するデバイスドライバーインターフェイス (DDI) は呼び出されません。
ソフトウェアコマンドリストにおいて、オフセットを持つ pDstBox を指定して UpdateSubresource の呼び出しを記録すると、コマンドリストを再生するときに pDstBox のオフセットが誤って pSrcData に適用されます。Windows 8 で新たに導入された UpdateSubresource1 はこの問題を修正しています。UpdateSubresource1 の呼び出しでは、pDstBox は pSrcData に影響しません。
さまざまなリソースの種類と、UpdateSubresource1 が各リソースの種類でどのように動作するかについては、Direct3D 11 のリソースの概要 を参照してください。
デバイスコンテキストからリソースを破棄します。
| pResource | ID3D11Resource* | in | 破棄するリソースの ID3D11Resource インターフェイスへのポインターです。そのリソースは、使用方法 D3D11_USAGE_DEFAULT または D3D11_USAGE_DYNAMIC で作成されている必要があります。そうでない場合、ランタイムは DiscardResource の呼び出しを破棄します。デバッグレイヤーが有効な場合、ランタイムはエラーメッセージを返します。 |
解説(Remarks)
DiscardResource は、pResource が指すリソース内の既存の内容が不要になったことをグラフィックスプロセッシングユニット (GPU) に通知します。
デバイスコンテキストからリソースビューを破棄します。
| pResourceView | ID3D11View* | in | 破棄するリソースビューの ID3D11View インターフェイスへのポインターです。ビューの基となるリソースは、使用方法 D3D11_USAGE_DEFAULT または D3D11_USAGE_DYNAMIC で作成されている必要があります。そうでない場合、ランタイムは DiscardView の呼び出しを破棄します。デバッグレイヤーが有効な場合、ランタイムはエラーメッセージを返します。 |
解説(Remarks)
DiscardView は、pResourceView が指すリソースビュー内の既存の内容が不要になったことをグラフィックスプロセッシングユニット (GPU) に通知します。ビューは SRV、RTV、UAV、DSV のいずれかです。DiscardView は DiscardResource メソッドのバリエーションです。DiscardView を使用すると、ビューに含まれるリソースの一部 (単一のミップレベルなど) を破棄できます。さらに重要な点として、パイプラインでバインド・アンバインドされる対象はビューであることが多いため、DiscardView は便利です。ストリーム出力のように、ビューを持たないパイプラインバインディングもあります。その場合は、任意のリソースに対して DiscardResource を使用できます。
頂点シェーダーパイプラインステージが使用する定数バッファーを設定します。
| StartSlot | DWORD | in | 定数バッファーの設定を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 設定するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | inoptional | デバイスに渡す定数バッファーの配列です。 |
| pFirstConstant | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内のオフセットを保持する配列です。各オフセットは、シェーダーから見た各定数バッファーの開始位置を指定します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 16 は、対応する定数バッファーの開始位置が定数バッファー内の 256 バイト目であることを示します。各オフセットは 16 定数の倍数である必要があります。 |
| pNumConstants | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内の定数の数を保持する配列です。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各定数数は 16 定数の倍数で、[0..4096] の範囲である必要があります。 |
解説(Remarks)
pNumConstants が指す定数の数が、シェーダーがサポートする定数バッファーの最大サイズ (4096 定数。各定数は 4 つの 32 ビット成分を持ちます) を超える場合、ランタイムは VSSetConstantBuffers1 の呼び出しを破棄します。pFirstConstant および pFirstConstant + pNumConstants の各要素の値は、各バッファーの長さを超えても構いません。シェーダーから見た定数バッファーは、バッファーに実際に割り当てられたメモリーと、ウィンドウ [pFirstConstant の要素の値、pFirstConstant の要素の値 + pNumConstants の要素の値] との共通部分になります。また、このオフセット指定をサポートしない既存のドライバーでも、ランタイムは VSSetConstantBuffers1 の呼び出しを破棄します。
ランタイムはこの機能を 機能レベル 9.1、9.2、9.3 向けにエミュレートします。そのため、この機能は機能レベル 9.1、9.2、9.3 でサポートされます。機能レベル 10 以上の新しいドライバーでは、この機能は常に利用できます。
シェーダーから見ると、定数バッファー配列の要素 [0] は pFirstConstant が示す位置の定数です。
pFirstConstant と pNumConstants で定義される範囲を超えてシェーダーから定数バッファーにアクセスした場合は、0 が返されます。
pFirstConstant 配列と pNumConstants 配列が NULL の場合、バッファー全体をビューにバインドした場合と同じ結果になります。VSSetConstantBuffers メソッドを呼び出した場合も同じ結果になります。バッファーが、シェーダーがサポートする定数バッファーの最大サイズ (4096 要素) より大きい場合、シェーダーは先頭の 4096 定数にのみアクセスできます。
pFirstConstant または pNumConstants のいずれかが NULL の場合、もう一方のパラメーターも NULL である必要があります。
コマンドリストのエミュレーション下での VSSetConstantBuffers1 の呼び出し
ランタイムのコマンドリストエミュレーションでは、VSSetConstantBuffers1 が定数バッファー配列のオフセットやサイズを実際には変更しないことがあります。この動作は、VSSetConstantBuffers1 が、更新対象として設定したスロット範囲の先頭と末尾の定数バッファーを実質的に変更しない場合に発生します。このセクションでは、この動作を回避する方法を示します。ランタイムがコマンドリストをエミュレートしているか、ドライバーがコマンドリストをサポートしているかを確認するコードを次に示します。
HRESULT hr = S_OK;
bool needWorkaround = false;
D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();
if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
{
D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };
hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
{
needWorkaround = true; // the runtime emulates command lists.
}
}
ランタイムがコマンドリストをエミュレートしている場合は、次のいずれかのコードスニペットを使用する必要があります。
単一の定数バッファーのオフセットとサイズのみを変更する場合は、まずその定数バッファーを NULL に設定します。
pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
複数の定数バッファーを変更する場合は、まず範囲の最初と最後の定数バッファーを NULL に設定します。
pDeviceContext->VSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->VSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->VSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
パイプラインのハルシェーダーステージが使用する定数バッファーを設定します。
| StartSlot | DWORD | in | 定数バッファーの設定を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 設定するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | inoptional | デバイスに渡す定数バッファーの配列です。 |
| pFirstConstant | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内のオフセットを保持する配列です。各オフセットは、シェーダーから見た各定数バッファーの開始位置を指定します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 16 は、対応する定数バッファーの開始位置が定数バッファー内の 256 バイト目であることを示します。各オフセットは 16 定数の倍数である必要があります。 |
| pNumConstants | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内の定数の数を保持する配列です。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各定数数は 16 定数の倍数で、[0..4096] の範囲である必要があります。 |
解説(Remarks)
pNumConstants が指す定数の数が、シェーダーがサポートする定数バッファーの最大サイズ (4096 定数。各定数は 4 つの 32 ビット成分を持ちます) を超える場合、ランタイムは HSSetConstantBuffers1 の呼び出しを破棄します。pFirstConstant および pFirstConstant + pNumConstants の各要素の値は、各バッファーの長さを超えても構いません。シェーダーから見た定数バッファーは、バッファーに実際に割り当てられたメモリーと、ウィンドウ [pFirstConstant の要素の値、pFirstConstant の要素の値 + pNumConstants の要素の値] との共通部分になります。また、このオフセット指定をサポートしない既存のドライバーでも、ランタイムは HSSetConstantBuffers1 の呼び出しを破棄します。
ランタイムはこの機能を 機能レベル 9.1、9.2、9.3 向けにエミュレートします。そのため、この機能は機能レベル 9.1、9.2、9.3 でサポートされます。機能レベル 10 以上の新しいドライバーでは、この機能は常に利用できます。
シェーダーから見ると、定数バッファー配列の要素 [0] は pFirstConstant が示す位置の定数です。
pFirstConstant と pNumConstants で定義される範囲を超えてシェーダーから定数バッファーにアクセスした場合は、0 が返されます。
pFirstConstant 配列と pNumConstants 配列が NULL の場合、バッファー全体をビューにバインドした場合と同じ結果になります。HSSetConstantBuffers メソッドを呼び出した場合も同じ結果になります。バッファーが、シェーダーがサポートする定数バッファーの最大サイズ (4096 要素) より大きい場合、シェーダーは先頭の 4096 定数にのみアクセスできます。
pFirstConstant または pNumConstants のいずれかが NULL の場合、もう一方のパラメーターも NULL である必要があります。
コマンドリストのエミュレーション下での HSSetConstantBuffers1 の呼び出し
ランタイムのコマンドリストエミュレーションでは、HSSetConstantBuffers1 が定数バッファー配列のオフセットやサイズを実際には変更しないことがあります。この動作は、HSSetConstantBuffers1 が、更新対象として設定したスロット範囲の先頭と末尾の定数バッファーを実質的に変更しない場合に発生します。このセクションでは、この動作を回避する方法を示します。ランタイムがコマンドリストをエミュレートしているか、ドライバーがコマンドリストをサポートしているかを確認するコードを次に示します。
HRESULT hr = S_OK;
bool needWorkaround = false;
D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();
if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
{
D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };
hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
{
needWorkaround = true; // the runtime emulates command lists.
}
}
ランタイムがコマンドリストをエミュレートしている場合は、次のいずれかのコードスニペットを使用する必要があります。
単一の定数バッファーのオフセットとサイズのみを変更する場合は、まずその定数バッファーを NULL に設定します。
pDeviceContext->HSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->HSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->HSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
複数の定数バッファーを変更する場合は、まず範囲の最初と最後の定数バッファーを NULL に設定します。
pDeviceContext->HSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->HSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->HSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->HSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
ドメインシェーダーステージが使用する定数バッファーを設定します。
| StartSlot | DWORD | in | 定数バッファーの設定を開始する、ゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 設定するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | inoptional | デバイスに渡す定数バッファーの配列です。 |
| pFirstConstant | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内のオフセットを保持する配列です。各オフセットは、シェーダーから見た各定数バッファーの開始位置を指定します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 16 は、対応する定数バッファーの開始位置が定数バッファー内の 256 バイト目であることを示します。各オフセットは 16 定数の倍数である必要があります。 |
| pNumConstants | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内の定数の数を保持する配列です。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各定数数は 16 定数の倍数で、[0..4096] の範囲である必要があります。 |
解説(Remarks)
pNumConstants が指す定数の数が、シェーダーがサポートする定数バッファーの最大サイズ (4096 定数。各定数は 4 つの 32 ビット成分を持ちます) を超える場合、ランタイムは DSSetConstantBuffers1 の呼び出しを破棄します。pFirstConstant および pFirstConstant + pNumConstants の各要素の値は、各バッファーの長さを超えても構いません。シェーダーから見た定数バッファーは、バッファーに実際に割り当てられたメモリーと、ウィンドウ [pFirstConstant の要素の値、pFirstConstant の要素の値 + pNumConstants の要素の値] との共通部分になります。また、このオフセット指定をサポートしない既存のドライバーでも、ランタイムは DSSetConstantBuffers1 の呼び出しを破棄します。
ランタイムはこの機能を 機能レベル 9.1、9.2、9.3 向けにエミュレートします。そのため、この機能は機能レベル 9.1、9.2、9.3 でサポートされます。機能レベル 10 以上の新しいドライバーでは、この機能は常に利用できます。
シェーダーから見ると、定数バッファー配列の要素 [0] は pFirstConstant が示す位置の定数です。
pFirstConstant と pNumConstants で定義される範囲を超えてシェーダーから定数バッファーにアクセスした場合は、0 が返されます。
pFirstConstant 配列と pNumConstants 配列が NULL の場合、バッファー全体をビューにバインドした場合と同じ結果になります。DSSetConstantBuffers メソッドを呼び出した場合も同じ結果になります。バッファーが、シェーダーがサポートする定数バッファーの最大サイズ (4096 要素) より大きい場合、シェーダーは先頭の 4096 定数にのみアクセスできます。
pFirstConstant または pNumConstants のいずれかが NULL の場合、もう一方のパラメーターも NULL である必要があります。
コマンドリストのエミュレーション下での DSSetConstantBuffers1 の呼び出し
ランタイムのコマンドリストエミュレーションでは、DSSetConstantBuffers1 が定数バッファー配列のオフセットやサイズを実際には変更しないことがあります。この動作は、DSSetConstantBuffers1 が、更新対象として設定したスロット範囲の先頭と末尾の定数バッファーを実質的に変更しない場合に発生します。このセクションでは、この動作を回避する方法を示します。ランタイムがコマンドリストをエミュレートしているか、ドライバーがコマンドリストをサポートしているかを確認するコードを次に示します。
HRESULT hr = S_OK;
bool needWorkaround = false;
D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();
if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
{
D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };
hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
{
needWorkaround = true; // the runtime emulates command lists.
}
}
ランタイムがコマンドリストをエミュレートしている場合は、次のいずれかのコードスニペットを使用する必要があります。
単一の定数バッファーのオフセットとサイズのみを変更する場合は、まずその定数バッファーを NULL に設定します。
pDeviceContext->DSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->DSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->DSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
複数の定数バッファーを変更する場合は、まず範囲の最初と最後の定数バッファーを NULL に設定します。
pDeviceContext->DSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->DSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->DSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->DSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
ジオメトリシェーダーパイプラインステージが使用する定数バッファーを設定します。
| StartSlot | DWORD | in | 定数バッファーの設定を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 設定するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | inoptional | デバイスに渡す定数バッファーの配列です (ID3D11Buffer を参照)。 |
| pFirstConstant | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内のオフセットを保持する配列です。各オフセットは、シェーダーから見た各定数バッファーの開始位置を指定します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 16 は、対応する定数バッファーの開始位置が定数バッファー内の 256 バイト目であることを示します。各オフセットは 16 定数の倍数である必要があります。 |
| pNumConstants | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内の定数の数を保持する配列です。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各定数数は 16 定数の倍数で、[0..4096] の範囲である必要があります。 |
解説(Remarks)
pNumConstants が指す定数の数が、シェーダーがサポートする定数バッファーの最大サイズ (4096 定数。各定数は 4 つの 32 ビット成分を持ちます) を超える場合、ランタイムは GSSetConstantBuffers1 の呼び出しを破棄します。pFirstConstant および pFirstConstant + pNumConstants の各要素の値は、各バッファーの長さを超えても構いません。シェーダーから見た定数バッファーは、バッファーに実際に割り当てられたメモリーと、ウィンドウ [pFirstConstant の要素の値、pFirstConstant の要素の値 + pNumConstants の要素の値] との共通部分になります。また、このオフセット指定をサポートしない既存のドライバーでも、ランタイムは GSSetConstantBuffers1 の呼び出しを破棄します。
ランタイムはこの機能を 機能レベル 9.1、9.2、9.3 向けにエミュレートします。そのため、この機能は機能レベル 9.1、9.2、9.3 でサポートされます。機能レベル 10 以上の新しいドライバーでは、この機能は常に利用できます。
シェーダーから見ると、定数バッファー配列の要素 [0] は pFirstConstant が示す位置の定数です。
pFirstConstant と pNumConstants で定義される範囲を超えてシェーダーから定数バッファーにアクセスした場合は、0 が返されます。
pFirstConstant 配列と pNumConstants 配列が NULL の場合、バッファー全体をビューにバインドした場合と同じ結果になります。GSSetConstantBuffers メソッドを呼び出した場合も同じ結果になります。バッファーが、シェーダーがサポートする定数バッファーの最大サイズ (4096 要素) より大きい場合、シェーダーは先頭の 4096 定数にのみアクセスできます。
pFirstConstant または pNumConstants のいずれかが NULL の場合、もう一方のパラメーターも NULL である必要があります。
コマンドリストのエミュレーション下での GSSetConstantBuffers1 の呼び出し
ランタイムのコマンドリストエミュレーションでは、GSSetConstantBuffers1 が定数バッファー配列のオフセットやサイズを実際には変更しないことがあります。この動作は、GSSetConstantBuffers1 が、更新対象として設定したスロット範囲の先頭と末尾の定数バッファーを実質的に変更しない場合に発生します。このセクションでは、この動作を回避する方法を示します。ランタイムがコマンドリストをエミュレートしているか、ドライバーがコマンドリストをサポートしているかを確認するコードを次に示します。
HRESULT hr = S_OK;
bool needWorkaround = false;
D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();
if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
{
D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };
hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
{
needWorkaround = true; // the runtime emulates command lists.
}
}
ランタイムがコマンドリストをエミュレートしている場合は、次のいずれかのコードスニペットを使用する必要があります。
単一の定数バッファーのオフセットとサイズのみを変更する場合は、まずその定数バッファーを NULL に設定します。
pDeviceContext->GSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->GSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->GSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
複数の定数バッファーを変更する場合は、まず範囲の最初と最後の定数バッファーを NULL に設定します。
pDeviceContext->GSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->GSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->GSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->GSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
ピクセルシェーダーパイプラインステージが使用する定数バッファーを設定し、シェーダーがバッファーの他の部分にアクセスできるようにします。
| StartSlot | DWORD | in | 定数バッファーの設定を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 設定するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | inoptional | デバイスに渡す定数バッファーの配列です。 |
| pFirstConstant | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内のオフセットを保持する配列です。各オフセットは、シェーダーから見た各定数バッファーの開始位置を指定します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 16 は、対応する定数バッファーの開始位置が定数バッファー内の 256 バイト目であることを示します。各オフセットは 16 定数の倍数である必要があります。 |
| pNumConstants | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内の定数の数を保持する配列です。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各定数数は 16 定数の倍数で、[0..4096] の範囲である必要があります。 |
解説(Remarks)
シェーダーがバッファーの他の部分にアクセスできるようにするには、PSSetConstantBuffers ではなく PSSetConstantBuffers1 を呼び出します。PSSetConstantBuffers1 には、追加のパラメーター pFirstConstant と pNumConstants があります。
pNumConstants が指す定数の数が、シェーダーがサポートする定数バッファーの最大サイズ (4096 定数。各定数は 4 つの 32 ビット成分を持ちます) を超える場合、ランタイムは PSSetConstantBuffers1 の呼び出しを破棄します。pFirstConstant および pFirstConstant + pNumConstants の各要素の値は、各バッファーの長さを超えても構いません。シェーダーから見た定数バッファーは、バッファーに実際に割り当てられたメモリーと、ウィンドウ [pFirstConstant の要素の値、pFirstConstant の要素の値 + pNumConstants の要素の値] との共通部分になります。また、このオフセット指定をサポートしない既存のドライバーでも、ランタイムは PSSetConstantBuffers1 の呼び出しを破棄します。
ランタイムはこの機能を 機能レベル 9.1、9.2、9.3 向けにエミュレートします。そのため、この機能は機能レベル 9.1、9.2、9.3 でサポートされます。機能レベル 10 以上の新しいドライバーでは、この機能は常に利用できます。
シェーダーから見ると、定数バッファー配列の要素 [0] は pFirstConstant が示す位置の定数です。
pFirstConstant と pNumConstants で定義される範囲を超えてシェーダーから定数バッファーにアクセスした場合は、0 が返されます。
pFirstConstant 配列と pNumConstants 配列が NULL の場合、バッファー全体をビューにバインドした場合と同じ結果になります。PSSetConstantBuffers メソッドを呼び出した場合も同じ結果になります。バッファーが、シェーダーがサポートする定数バッファーの最大サイズ (4096 要素) より大きい場合、シェーダーは先頭の 4096 定数にのみアクセスできます。
pFirstConstant または pNumConstants のいずれかが NULL の場合、もう一方のパラメーターも NULL である必要があります。
コマンドリストのエミュレーション下での PSSetConstantBuffers1 の呼び出し
ランタイムのコマンドリストエミュレーションでは、PSSetConstantBuffers1 が定数バッファー配列のオフセットやサイズを実際には変更しないことがあります。この動作は、PSSetConstantBuffers1 が、更新対象として設定したスロット範囲の先頭と末尾の定数バッファーを実質的に変更しない場合に発生します。このセクションでは、この動作を回避する方法を示します。ランタイムがコマンドリストをエミュレートしているか、ドライバーがコマンドリストをサポートしているかを確認するコードを次に示します。
HRESULT hr = S_OK;
bool needWorkaround = false;
D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();
if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
{
D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };
hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
{
needWorkaround = true; // the runtime emulates command lists.
}
}
ランタイムがコマンドリストをエミュレートしている場合は、次のいずれかのコードスニペットを使用する必要があります。
単一の定数バッファーのオフセットとサイズのみを変更する場合は、まずその定数バッファーを NULL に設定します。
pDeviceContext->PSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->PSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
複数の定数バッファーを変更する場合は、まず範囲の最初と最後の定数バッファーを NULL に設定します。
pDeviceContext->PSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->PSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->PSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
コンピュートシェーダーステージが使用する定数バッファーを設定します。
| StartSlot | DWORD | in | 定数バッファーの設定を開始する、ゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 設定するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | inoptional | デバイスに渡す定数バッファーの配列です (ID3D11Buffer を参照)。 |
| pFirstConstant | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内のオフセットを保持する配列です。各オフセットは、シェーダーから見た各定数バッファーの開始位置を指定します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 16 は、対応する定数バッファーの開始位置が定数バッファー内の 256 バイト目であることを示します。各オフセットは 16 定数の倍数である必要があります。 |
| pNumConstants | DWORD* | inoptional | ppConstantBuffers で指定するバッファー内の定数の数を保持する配列です。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各定数数は 16 定数の倍数で、[0..4096] の範囲である必要があります。 |
解説(Remarks)
pNumConstants が指す定数の数が、シェーダーがサポートする定数バッファーの最大サイズ (4096 定数。各定数は 4 つの 32 ビット成分を持ちます) を超える場合、ランタイムは CSSetConstantBuffers1 の呼び出しを破棄します。pFirstConstant および pFirstConstant + pNumConstants の各要素の値は、各バッファーの長さを超えても構いません。シェーダーから見た定数バッファーは、バッファーに実際に割り当てられたメモリーと、ウィンドウ [pFirstConstant の要素の値、pFirstConstant の要素の値 + pNumConstants の要素の値] との共通部分になります。また、このオフセット指定をサポートしない既存のドライバーでも、ランタイムは CSSetConstantBuffers1 の呼び出しを破棄します。
ランタイムはこの機能を 機能レベル 9.1、9.2、9.3 向けにエミュレートします。そのため、この機能は機能レベル 9.1、9.2、9.3 でサポートされます。機能レベル 10 以上の新しいドライバーでは、この機能は常に利用できます。
シェーダーから見ると、定数バッファー配列の要素 [0] は pFirstConstant が示す位置の定数です。
pFirstConstant と pNumConstants で定義される範囲を超えてシェーダーから定数バッファーにアクセスした場合は、0 が返されます。
pFirstConstant 配列と pNumConstants 配列が NULL の場合、バッファー全体をビューにバインドした場合と同じ結果になります。CSSetConstantBuffers メソッドを呼び出した場合も同じ結果になります。バッファーが、シェーダーがサポートする定数バッファーの最大サイズ (4096 要素) より大きい場合、シェーダーは先頭の 4096 定数にのみアクセスできます。
pFirstConstant または pNumConstants のいずれかが NULL の場合、もう一方のパラメーターも NULL である必要があります。
コマンドリストのエミュレーション下での CSSetConstantBuffers1 の呼び出し
ランタイムのコマンドリストエミュレーションでは、CSSetConstantBuffers1 が定数バッファー配列のオフセットやサイズを実際には変更しないことがあります。この動作は、CSSetConstantBuffers1 が、更新対象として設定したスロット範囲の先頭と末尾の定数バッファーを実質的に変更しない場合に発生します。このセクションでは、この動作を回避する方法を示します。ランタイムがコマンドリストをエミュレートしているか、ドライバーがコマンドリストをサポートしているかを確認するコードを次に示します。
HRESULT hr = S_OK;
bool needWorkaround = false;
D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();
if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
{
D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };
hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
{
needWorkaround = true; // the runtime emulates command lists.
}
}
ランタイムがコマンドリストをエミュレートしている場合は、次のいずれかのコードスニペットを使用する必要があります。
単一の定数バッファーのオフセットとサイズのみを変更する場合は、まずその定数バッファーを NULL に設定します。
pDeviceContext->CSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->CSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->CSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
複数の定数バッファーを変更する場合は、まず範囲の最初と最後の定数バッファーを NULL に設定します。
pDeviceContext->CSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->CSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->CSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->CSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
頂点シェーダーパイプラインステージが使用する定数バッファーを取得します。
| StartSlot | DWORD | in | 定数バッファーの取得を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 取得するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | outoptional | このメソッドが返す定数バッファーインターフェイスポインターの配列です。 |
| pFirstConstant | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内のオフセットを受け取る配列へのポインターです。各オフセットは、シェーダーから見た各定数バッファーの開始位置を示します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 2 は、対応する定数バッファーの開始位置が定数バッファー内の 32 バイト目であることを示します。バッファーにオフセットがない場合、ランタイムは pFirstConstant を NULL に設定します。 |
| pNumConstants | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内の定数の数を受け取る配列へのポインターです。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を示します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各バッファー内の定数の数を指定しない場合、ランタイムは pNumConstants を NULL に設定します。 |
解説(Remarks)
スロットにバッファーがバインドされていない場合、そのスロットの pFirstConstant と pNumConstants は NULL になります。
ハルシェーダーステージが使用する定数バッファーを取得します。
| StartSlot | DWORD | in | 定数バッファーの取得を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 取得するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | outoptional | このメソッドが返す定数バッファーインターフェイスポインターの配列です。 |
| pFirstConstant | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内のオフセットを受け取る配列へのポインターです。各オフセットは、シェーダーから見た各定数バッファーの開始位置を示します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 2 は、対応する定数バッファーの開始位置が定数バッファー内の 32 バイト目であることを示します。バッファーにオフセットがない場合、ランタイムは pFirstConstant を NULL に設定します。 |
| pNumConstants | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内の定数の数を受け取る配列へのポインターです。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を示します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各バッファー内の定数の数を指定しない場合、ランタイムは pNumConstants を NULL に設定します。 |
解説(Remarks)
スロットにバッファーがバインドされていない場合、そのスロットの pFirstConstant と pNumConstants は NULL になります。
ドメインシェーダーステージが使用する定数バッファーを取得します。
| StartSlot | DWORD | in | 定数バッファーの取得を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 取得するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | outoptional | このメソッドが返す定数バッファーインターフェイスポインターの配列です。 |
| pFirstConstant | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内のオフセットを受け取る配列へのポインターです。各オフセットは、シェーダーから見た各定数バッファーの開始位置を示します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 2 は、対応する定数バッファーの開始位置が定数バッファー内の 32 バイト目であることを示します。バッファーにオフセットがない場合、ランタイムは pFirstConstant を NULL に設定します。 |
| pNumConstants | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内の定数の数を受け取る配列へのポインターです。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を示します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各バッファー内の定数の数を指定しない場合、ランタイムは pNumConstants を NULL に設定します。 |
解説(Remarks)
スロットにバッファーがバインドされていない場合、そのスロットの pFirstConstant と pNumConstants は NULL になります。
ジオメトリシェーダーパイプラインステージが使用する定数バッファーを取得します。
| StartSlot | DWORD | in | 定数バッファーの取得を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 取得するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | outoptional | このメソッドが返す定数バッファーインターフェイスポインターの配列です。 |
| pFirstConstant | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内のオフセットを受け取る配列へのポインターです。各オフセットは、シェーダーから見た各定数バッファーの開始位置を示します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 2 は、対応する定数バッファーの開始位置が定数バッファー内の 32 バイト目であることを示します。バッファーにオフセットがない場合、ランタイムは pFirstConstant を NULL に設定します。 |
| pNumConstants | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内の定数の数を受け取る配列へのポインターです。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を示します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各バッファー内の定数の数を指定しない場合、ランタイムは pNumConstants を NULL に設定します。 |
解説(Remarks)
スロットにバッファーがバインドされていない場合、そのスロットの pFirstConstant と pNumConstants は NULL になります。
ピクセルシェーダーパイプラインステージが使用する定数バッファーを取得します。
| StartSlot | DWORD | in | 定数バッファーの取得を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 取得するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | outoptional | このメソッドが返す定数バッファーインターフェイスポインターの配列です。 |
| pFirstConstant | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内のオフセットを受け取る配列へのポインターです。各オフセットは、シェーダーから見た各定数バッファーの開始位置を示します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 2 は、対応する定数バッファーの開始位置が定数バッファー内の 32 バイト目であることを示します。バッファーにオフセットがない場合、ランタイムは pFirstConstant を NULL に設定します。 |
| pNumConstants | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内の定数の数を受け取る配列へのポインターです。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を示します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各バッファー内の定数の数を指定しない場合、ランタイムは pNumConstants を NULL に設定します。 |
解説(Remarks)
スロットにバッファーがバインドされていない場合、そのスロットの pFirstConstant と pNumConstants は NULL になります。
コンピュートシェーダーステージが使用する定数バッファーを取得します。
| StartSlot | DWORD | in | 定数バッファーの取得を開始する、デバイスのゼロ基点の配列内のインデックスです (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。 |
| NumBuffers | DWORD | in | 取得するバッファーの数です (0 ~ D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。 |
| ppConstantBuffers | ID3D11Buffer** | outoptional | このメソッドが返す定数バッファーインターフェイスポインターの配列です。 |
| pFirstConstant | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内のオフセットを受け取る配列へのポインターです。各オフセットは、シェーダーから見た各定数バッファーの開始位置を示します。各オフセットはシェーダー定数単位 (16 バイト、4 × 32 ビット成分) で測られます。したがって、オフセット 2 は、対応する定数バッファーの開始位置が定数バッファー内の 32 バイト目であることを示します。バッファーにオフセットがない場合、ランタイムは pFirstConstant を NULL に設定します。 |
| pNumConstants | DWORD* | outoptional | ppConstantBuffers で指定するバッファー内の定数の数を受け取る配列へのポインターです。各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を示します。各定数数は、pFirstConstant 配列で指定された対応するオフセットから始まります。各バッファー内の定数の数を指定しない場合、ランタイムは pNumConstants を NULL に設定します。 |
解説(Remarks)
スロットにバッファーがバインドされていない場合、そのスロットの pFirstConstant と pNumConstants は NULL になります。
指定されたコンテキストステートオブジェクトをアクティブ化し、現在のデバイスの動作を Direct3D 11、Direct3D 10.1、または Direct3D 10 に変更します。
| pState | ID3DDeviceContextState* | in | 以前に ID3D11Device1::CreateDeviceContextState メソッドで作成されたコンテキストステートオブジェクトの ID3DDeviceContextState インターフェイスへのポインターです。pState に NULL を指定して SwapDeviceContextState を呼び出した場合、その呼び出しは何の効果もありません。 |
| ppPreviousState | ID3DDeviceContextState** | outoptional | 直前にアクティブだったコンテキストステートオブジェクトの ID3DDeviceContextState インターフェイスへのポインターを受け取る変数へのポインターです。 |
解説(Remarks)
SwapDeviceContextState はデバイスの動作を変更します。このデバイスの動作は、コンテキストステートオブジェクトを作成したときに ID3D11Device1::CreateDeviceContextState メソッドの EmulatedInterface パラメーターに渡したエミュレート対象インターフェイスによって決まります。
SwapDeviceContextState は遅延コンテキストではサポートされません。
SwapDeviceContextState は、互換性のないデバイスインターフェイスである ID3D10Device、ID3D10Device1、ID3D11Device、ID3D11Device1 を無効にします。コンテキストステートオブジェクトがアクティブな間、ランタイムはデバイスインターフェイスおよびコンテキストインターフェイスの一部のメソッドを無効にします。__uuidof(ID3D11Device1) または __uuidof(ID3D11Device) で作成されたコンテキストステートオブジェクトは、ほとんどの Direct3D 10 デバイスインターフェイスを無効にします。__uuidof(ID3D10Device1) または __uuidof(ID3D10Device) で作成されたコンテキストステートオブジェクトは、ほとんどの ID3D11DeviceContext メソッドを無効にします。
この動作の詳細については、ID3D11Device1::CreateDeviceContextState を参照してください。
SwapDeviceContextState は、pState で指定されたコンテキストステートオブジェクトをアクティブ化します。つまり、そのコンテキストステートオブジェクトの機能レベルと互換インターフェイスに関連付けられたデバイスの動作が、次に SwapDeviceContextState を呼び出すまで Direct3D デバイス上で有効になります。さらに、このコンテキストステートオブジェクトが最後にアクティブだったときに保存された状態が再び有効になり、直前の状態は置き換えられます。
SwapDeviceContextState は、直近にアクティブ化されたコンテキストステートオブジェクトを ppPreviousState に設定します。このオブジェクトにより、呼び出し元は以前のデバイスの状態を保存し、後で復元できます。この動作は、Direct2D のようにプラグインと Direct3D デバイスを共有するプラグインアーキテクチャーで役立ちます。Direct2D インターフェイスは、コンテキストステートオブジェクトを使用してアプリケーションの状態を保存および復元できます。
呼び出し元が以前に ID3D11Device1::CreateDeviceContextState メソッドを呼び出してコンテキストステートオブジェクトを作成していない場合、SwapDeviceContextState は ppPreviousState に既定のコンテキストステートオブジェクトを設定します。いずれの場合も、SwapDeviceContextState の使い方は同じです。
アプリケーションが指定し、アプリケーションが ID3D11Device1::CreateDeviceContextState に渡した許容リストの中からコンテキストステートオブジェクトが選択した機能レベルは、そのコンテキストステートオブジェクトがアクティブな間、イミディエイトコンテキストの機能レベルを制御します。Direct3D 11 デバイスはフリースレッドであるため、デバイスのメソッドから現在のイミディエイトコンテキストの機能レベルを照会することはできません。代わりにデバイスは、それまでに作成されたすべてのコンテキストステートオブジェクトの機能レベルの最大値で動作します。つまり、デバイスの機能レベルは動的に上昇する可能性があります。
コンテキストステートオブジェクトの機能レベルは、イミディエイトコンテキストから利用できる機能を制御します。ただし、Direct3D 11 デバイスのメソッド (特にリソース作成メソッド) のフリースレッドの契約を維持するため、デバイスが作成するリソースの範囲は、作成済みのすべてのコンテキストステートオブジェクトの機能レベルの上限によって制御されます。
コンテキストステートオブジェクトのインターフェイスはイミディエイトコンテキストによって公開されるため、このインターフェイスはイミディエイトコンテキストと同じスレッドモデルを必要とします。具体的には、SwapDeviceContextState は、他のイミディエイトコンテキストのメソッド、および ID3D10Device の同等のメソッドに対してシングルスレッドです。
きわめて重要な点として、Direct3D 10 と Direct3D 11 の参照カウント動作は同時に一方しか利用できないため、Direct3D 10 と Direct3D 11 のいずれかのインターフェイスが参照カウントの契約を破ることになります。この事態を避けるため、コンテキストステートオブジェクトをアクティブ化すると、互換性のないバージョンのインターフェイスが無効になります。また、互換性のないバージョンのインターフェイスのメソッドを呼び出した場合、そのメソッドの戻り値の型が void であれば呼び出しは黙って失敗し、HRESULT 値として E_INVALIDARG を返すか、出力パラメーターを NULL に設定します。
Direct3D 11 モードから Direct3D 10 モードまたは Direct3D 10.1 モードに切り替えると、デバイスのバインディング動作が変わります。具体的には、Direct3D 10 モードまたは Direct3D 10.1 モードでは、リソースの最終解放によってアンバインドが発生します。最終解放の際、アプリケーションは、ビューからリソースへのリンクや、コンテキストステートオブジェクトからバインド済みリソースへのリンクといった間接的な参照も含めて、そのリソースのすべての参照を解放します。アプリケーションが参照を持たないバインド済みリソースは、Direct3D 10 の動作を維持するためにアンバインドされ、破棄されます。
SwapDeviceContextState は、ID3D11VideoContext が設定した状態には影響しません。
遅延コンテキストが生成したコマンドリストは、コンテキストステートオブジェクトへの参照を保持せず、以降のコンテキストステートオブジェクトの更新の影響を受けません。
SwapDeviceContextState は非同期オブジェクトに影響しません。たとえば、SwapDeviceContextState の呼び出し前にクエリがアクティブだった場合、呼び出し後もアクティブのままです。
リソースビュー内のすべての要素を 1 つの値に設定します。
| pView | ID3D11View* | in | クリアするリソースビューを表す ID3D11View インターフェイスへのポインターです。 |
| Color | FLOAT* | in | リソースビューのクリアに使用する色を表す 4 成分の配列です。 |
| pRect | RECT* | inoptional | クリアするリソースビュー内の矩形を表す D3D11_RECT 構造体の配列です。NULL の場合、ClearView はサーフェス全体をクリアします。 |
| NumRects | DWORD | in | pRect パラメーターで指定する配列内の矩形の数です。 |
解説(Remarks)
ClearView が動作するのは、レンダーターゲットビュー (RTV)、深度のみのリソース (ステンシル成分を持たないリソース) 上の深度ステンシルビュー (DSV)、アンオーダードアクセスビュー (UAV)、または Texture2D サーフェスの任意のビデオビューに対してのみです。無効な呼び出しはランタイムが破棄します。pRect 配列内の空の矩形は何も行いません。top の値が bottom の値と等しい場合、または left の値が right の値と等しい場合、その矩形は空です。
ClearView は 3D テクスチャをサポートしません。
ClearView は、ビュー内のすべての配列スライスに同じ色の値を適用します。pRect 配列内のすべての矩形は、各配列スライスに対応します。pRect の矩形の配列は、単一のサーフェス上でクリアする領域の集合です。ビューが配列の場合、ClearView は各配列スライスに対してすべての矩形を個別にクリアします。
バッファーに矩形を適用する場合は、top の値を 0、bottom の値を 1 に設定し、left と right の値でバッファー内の範囲を指定します。top の値が bottom の値と等しい場合、または left の値が right の値と等しい場合、その矩形は空となり、何も行われません。
ドライバーは、Direct3D の変換規則に従って、色の値をコピー先の形式に合わせて適切に変換およびクランプします。たとえば、ビューの形式が DXGI_FORMAT_R8G8B8A8_UNORM の場合、ドライバーは入力を 0.0f ~ 1.0f にクランプします (+INF -> 1.0f (0XFF)/NaN -> 0.0f)。
形式が DXGI_FORMAT_R8G8B8A8_UINT のような整数形式の場合、ランタイムは入力を整数値の float として解釈します。したがって、235.0f は 235 にマップされます (ゼロ方向に丸められ、範囲外の値や INF は対象の範囲にクランプされ、NaN は 0 になります)。
色のマッピングは次のとおりです。
- Color[0]: R (ビデオの場合は Y)
- Color[1]: G (ビデオの場合は U/Cb)
- Color[2]: B (ビデオの場合は V/Cr)
- Color[3]: A
デバイスコンテキストから、リソースビュー内の指定した要素を破棄します。
| pResourceView | ID3D11View* | in | 破棄するリソースビューの ID3D11View インターフェイスへのポインターです。ビューの基となるリソースは、使用方法 D3D11_USAGE_DEFAULT または D3D11_USAGE_DYNAMIC で作成されている必要があります。そうでない場合、ランタイムは DiscardView1 の呼び出しを破棄します。デバッグレイヤーが有効な場合、ランタイムはエラーメッセージを返します。 |
| pRects | RECT* | inoptional | 破棄するリソースビュー内の矩形を表す D3D11_RECT 構造体の配列です。NULL の場合、DiscardView1 はビュー全体を破棄し、DiscardView と同じように動作します。 |
| NumRects | DWORD | in | pRects パラメーターで指定する配列内の矩形の数です。 |
解説(Remarks)
DiscardView1 は、pResourceView が指すリソースビュー内の指定された要素の既存の内容が不要になったことをグラフィックスプロセッシングユニット (GPU) に通知します。ビューは SRV、RTV、UAV、DSV のいずれかです。DiscardView1 は DiscardResource メソッドのバリエーションです。DiscardView1 を使用すると、ビューに含まれるリソースの一部の要素 (単一のミップレベルの要素など) を破棄できます。さらに重要な点として、パイプラインでバインド・アンバインドされる対象はビューであることが多いため、DiscardView1 は便利です。ストリーム出力のように、ビューを持たないパイプラインバインディングもあります。その場合は、任意のリソースに対して DiscardResource を使用できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D11DeviceContext1 "{BB2C6FAA-B5FB-4082-8E6B-388B8CFA90E1}" #usecom global ID3D11DeviceContext1 IID_ID3D11DeviceContext1 "{}" #comfunc global ID3D11DeviceContext1_CopySubresourceRegion1 115 sptr,int,int,int,int,sptr,int,var,int #comfunc global ID3D11DeviceContext1_UpdateSubresource1 116 sptr,int,var,sptr,int,int,int #comfunc global ID3D11DeviceContext1_DiscardResource 117 sptr #comfunc global ID3D11DeviceContext1_DiscardView 118 sptr #comfunc global ID3D11DeviceContext1_VSSetConstantBuffers1 119 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_HSSetConstantBuffers1 120 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_DSSetConstantBuffers1 121 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_GSSetConstantBuffers1 122 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_PSSetConstantBuffers1 123 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_CSSetConstantBuffers1 124 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_VSGetConstantBuffers1 125 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_HSGetConstantBuffers1 126 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_DSGetConstantBuffers1 127 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_GSGetConstantBuffers1 128 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_PSGetConstantBuffers1 129 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_CSGetConstantBuffers1 130 int,int,sptr,var,var #comfunc global ID3D11DeviceContext1_SwapDeviceContextState 131 sptr,sptr #comfunc global ID3D11DeviceContext1_ClearView 132 sptr,var,var,int #comfunc global ID3D11DeviceContext1_DiscardView1 133 sptr,var,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D11DeviceContext1 "{BB2C6FAA-B5FB-4082-8E6B-388B8CFA90E1}" #usecom global ID3D11DeviceContext1 IID_ID3D11DeviceContext1 "{}" #comfunc global ID3D11DeviceContext1_CopySubresourceRegion1 115 sptr,int,int,int,int,sptr,int,sptr,int #comfunc global ID3D11DeviceContext1_UpdateSubresource1 116 sptr,int,sptr,sptr,int,int,int #comfunc global ID3D11DeviceContext1_DiscardResource 117 sptr #comfunc global ID3D11DeviceContext1_DiscardView 118 sptr #comfunc global ID3D11DeviceContext1_VSSetConstantBuffers1 119 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_HSSetConstantBuffers1 120 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_DSSetConstantBuffers1 121 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_GSSetConstantBuffers1 122 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_PSSetConstantBuffers1 123 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_CSSetConstantBuffers1 124 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_VSGetConstantBuffers1 125 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_HSGetConstantBuffers1 126 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_DSGetConstantBuffers1 127 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_GSGetConstantBuffers1 128 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_PSGetConstantBuffers1 129 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_CSGetConstantBuffers1 130 int,int,sptr,sptr,sptr #comfunc global ID3D11DeviceContext1_SwapDeviceContextState 131 sptr,sptr #comfunc global ID3D11DeviceContext1_ClearView 132 sptr,sptr,sptr,int #comfunc global ID3D11DeviceContext1_DiscardView1 133 sptr,sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。