ID3D11DeviceContext1::HSSetConstantBuffers1 メソッド (d3d11_1.h)
パイプラインの ハル シェーダー ステージ で使用される定数バッファーを設定します。
構文
void HSSetConstantBuffers1(
[in] UINT StartSlot,
[in] UINT NumBuffers,
[in, optional] ID3D11Buffer * const *ppConstantBuffers,
[in, optional] const UINT *pFirstConstant,
[in, optional] const UINT *pNumConstants
);
パラメーター
[in] StartSlot
定数バッファーの設定を開始するには、デバイスの 0 から始まる配列にインデックスを付けます (0 から D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。
[in] NumBuffers
設定するバッファーの数 (0 から D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。
[in, optional] ppConstantBuffers
デバイスに指定されている定数バッファーの配列。
[in, optional] pFirstConstant
ppConstantBuffers が指定するバッファーへのオフセットを保持する配列。 各オフセットは、シェーダーの観点から各定数バッファーが開始される場所を指定します。 各オフセットはシェーダー定数で測定されます。これは 16 バイト (4*32 ビット コンポーネント) です。 したがって、16 のオフセットは、関連付けられている定数バッファーの開始が定数バッファーに 256 バイトであることを示します。 各オフセットは、16 個の定数の倍数である必要があります。
[in, optional] pNumConstants
ppConstantBuffers が指定するバッファー内の定数の数を保持する配列。 各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。 定数の各数は、 pFirstConstant 配列で指定されたそれぞれのオフセットから始まります。 各定数の数は、範囲 [0...4096] の 16 個の定数の倍数である必要があります。
戻り値
なし
解説
pNumConstants が指す定数の数がシェーダーでサポートされている最大定数バッファー サイズ (4096 定数) を超える場合、ランタイムは HSSetConstantBuffers1 の呼び出しを削除します。 pFirstConstConstant 配列と pFirstConstConstant + 配列の要素内の値は、各バッファーの長さを超える可能性があります。シェーダーの観点からは、定数バッファーはバッファーの実際のメモリ割り当てとウィンドウ [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.
}
}
ランタイムがコマンド リストをエミュレートする場合は、次のいずれかのコード スニペットを使用する必要があります。
1 つの定数バッファーでのみオフセットとサイズを変更する場合は、最初に定数バッファーを 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);
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 7 のWindows 8とプラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 R2 のWindows Server 2012とプラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | d3d11_1.h |
Library | D3D11.lib |