次の方法で共有


ID3D11DeviceContext1::P SSetConstantBuffers1 メソッド (d3d11_1.h)

ピクセル シェーダー パイプライン ステージで使用される定数バッファーを設定し、シェーダーがバッファーの他の部分にアクセスできるようにします。

構文

void PSSetConstantBuffers1(
  [in]           UINT         StartSlot,
  [in]           UINT         NumBuffers,
  [in, optional] ID3D11Buffer * const *ppConstantBuffers,
  [in, optional] const UINT   *pFirstConstant,
  [in, optional] const UINT   *pNumConstants
);

パラメーター

[in] StartSlot

型: UINT

定数バッファーの設定を開始するには、デバイスの 0 から始まる配列にインデックスを付けます (0 から D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 の範囲)。

[in] NumBuffers

型: UINT

設定するバッファーの数 (0 から D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot の範囲)。

[in, optional] ppConstantBuffers

種類: ID3D11Buffer*

デバイスに指定されている定数バッファーの配列。

[in, optional] pFirstConstant

型: const UINT*

ppConstantBuffers が指定するバッファーへのオフセットを保持する配列。 各オフセットは、シェーダーの観点から各定数バッファーが開始される場所を指定します。 各オフセットはシェーダー定数で測定されます。これは 16 バイト (4*32 ビット コンポーネント) です。 したがって、16 のオフセットは、関連付けられている定数バッファーの開始が定数バッファーに 256 バイトであることを示します。 各オフセットは、16 個の定数の倍数である必要があります。

[in, optional] pNumConstants

型: const UINT*

ppConstantBuffers が指定するバッファー内の定数の数を保持する配列。 各数値は、シェーダーが使用する定数バッファーに含まれる定数の数を指定します。 定数の各数は、 pFirstConstant 配列で指定されたそれぞれのオフセットから始まります。 各定数の数は、範囲 [0...4096] の 16 個の定数の倍数である必要があります。

戻り値

なし

解説

シェーダーがバッファーの他の部分にアクセスできるようにするには、 PSSetConstantBuffers ではなく PSSetConstantBuffers1 を呼び出 しますPSSetConstantBuffers1 には、追加のパラメーター pFirstConstantpNumConstants があります

pNumConstants が指す定数の数がシェーダーでサポートされている最大定数バッファー サイズより大きい場合、ランタイムは PSSetConstantBuffers1 の呼び出しを破棄します。 シェーダーでサポートされる最大定数バッファー サイズは 4096 個の定数を保持します。各定数には 4 つの 32 ビット コンポーネントがあります。

pFirstConstConstant 配列と pFirstConstant + pNumConstants 配列の要素内の値は、各バッファーの長さを超える可能性があります。シェーダーの観点からは、定数バッファーは、バッファーと次のウィンドウ (範囲) の実際のメモリ割り当ての積集合です。

[ 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 を返します。

pFirstConstConstant 配列と 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.
          }
     }

ランタイムがコマンド リストをエミュレートする場合は、次のいずれかのコード スニペットを使用する必要があります。

1 つの定数バッファーでのみオフセットとサイズを変更する場合は、最初に定数バッファーを 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);

要件

   
サポートされている最小のクライアント Windows 8 および Windows 7 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2012 および Windows Server 2008 R2 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー d3d11_1.h
Library D3D11.lib

関連項目

ID3D11DeviceContext1