ID3D11DeviceContext1::P SSetConstantBuffers1-Methode (d3d11_1.h)

Legt die konstanten Puffer fest, die von der Pixelshaderpipelinephase verwendet werden, und ermöglicht dem Shader den Zugriff auf andere Teile des Puffers.

Syntax

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

Parameter

[in] StartSlot

Typ: UINT

Indizieren Sie das nullbasierte Array des Geräts, um mit dem Festlegen von Konstantenpuffern zu beginnen (Bereiche von 0 bis D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

Typ: UINT

Anzahl der festzulegenden Puffer (Bereiche von 0 bis D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT – StartSlot).

[in, optional] ppConstantBuffers

Typ: ID3D11Buffer*

Array von Konstantenpuffern, die dem Gerät zugewiesen werden.

[in, optional] pFirstConstant

Typ: const UINT*

Ein Array, das die Offsets in den Puffern enthält, die ppConstantBuffers angibt. Jeder Offset gibt an, wo aus Sicht des Shaders jeder Konstantenpuffer beginnt. Jeder Offset wird in Shaderkonstanten gemessen, die 16 Bytes (4*32-Bit-Komponenten) sind. Daher gibt ein Offset von 16 an, dass der Anfang des zugeordneten Konstantenpuffers 256 Byte in den Konstantenpuffer beträgt. Jeder Offset muss ein Vielfaches von 16 Konstanten sein.

[in, optional] pNumConstants

Typ: const UINT*

Ein Array, das die Anzahl von Konstanten in den Puffern enthält, die ppConstantBuffers angibt. Jede Zahl gibt die Anzahl der Konstanten an, die im konstanten Puffer enthalten sind, den der Shader verwendet. Jede Anzahl von Konstanten beginnt mit dem entsprechenden Offset, der im pFirstConstant-Array angegeben ist. Jede Anzahl von Konstanten muss ein Vielfaches von 16 Konstanten im Bereich [0,.4096] sein.

Rückgabewert

Keine

Bemerkungen

Um dem Shader den Zugriff auf andere Teile des Puffers zu ermöglichen, rufen Sie PSSetConstantBuffers1 anstelle von PSSetConstantBuffers auf. PSSetConstantBuffers1 verfügt über zusätzliche Parameter pFirstConstant und pNumConstants.

Die Laufzeit löscht den Aufruf von PSSetConstantBuffers1 , wenn die Anzahl der Konstanten, auf die pNumConstants verweist, größer ist als die maximale Konstantepuffergröße, die von Shadern unterstützt wird. Die maximale Größe des Konstantenpuffers, die von Shadern unterstützt wird, enthält 4.096 Konstanten, wobei jede Konstante über vier 32-Bit-Komponenten verfügt.

Die Werte in den Elementen der pFirstConstant- und pFirstConstant-pNumConstants-Arrays + können die Länge jedes Puffers überschreiten. Aus Sicht des Shaders ist der Konstantenpuffer die Schnittmenge der tatsächlichen Speicherbelegung für den Puffer und das folgende Fenster (Bereich):

[Wert in einem Element von pFirstConstant, Wert in einem Element von pFirstConstant + Wert in einem Element von pNumConstants]

Das heißt, das Fenster ist der Bereich von (Wert in einem Element von pFirstConstant) bis (Wert in einem Element von pFirstConstant + Wert in einem Element von pNumConstants).

Die Runtime verwirft auch den Aufruf von PSSetConstantBuffers1 für vorhandene Treiber, die diesen Ausgleich nicht unterstützen.

Die Runtime emuliert dieses Feature für Featureebene 9.1, 9.2 und 9.3. Daher wird dieses Feature für Featureebene 9.1, 9.2 und 9.3 unterstützt. Dieses Feature ist für neue Treiber für Featureebene 10 und höher immer verfügbar.

Aus Sicht des Shaders ist element [0] im Konstantenpufferarray die Konstante bei pFirstConstant.

Out of bounds access to the constant buffers from the shader to the range that is defined by pFirstConstant and pNumConstants returns 0.

Wenn pFirstConstant - und pNumConstants-ArraysNULL sind, erhalten Sie das gleiche Ergebnis, als ob Sie den gesamten Puffer in View binden würden. Sie erhalten das gleiche Ergebnis, wenn Sie die PSSetConstantBuffers-Methode aufrufen. Wenn der Puffer größer als die maximale Größe des konstanten Puffers ist, die von Shadern (4096 Elemente) unterstützt wird, kann der Shader nur auf die ersten 4096-Konstanten zugreifen.

Wenn pFirstConstant oder pNumConstantsNULL ist, muss der andere Parameter ebenfalls NULL sein.

Aufrufen von PSSetConstantBuffers1 mit Befehlslistenemulation

Die Befehlslistenemulation der Laufzeit von PSSetConstantBuffers1 ändert manchmal die Offsets oder Größen für die Arrays von Konstantenpuffern nicht. Dieses Verhalten tritt auf, wenn PSSetConstantBuffers1 die Konstantenpuffer am Anfang und Ende des Zu aktualisierenden Slotsbereichs nicht effektiv ändert. In diesem Abschnitt wird gezeigt, wie Sie dieses Verhalten umgehen.

Im folgenden Code wird überprüft, ob die Runtime Befehlslisten emuliert oder der Treiber Befehlslisten unterstützt:


     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.
          }
     }

Wenn die Runtime Befehlslisten emuliert, müssen Sie einen der folgenden Codeausschnitte verwenden:

Wenn Sie den Offset und die Größe nur für einen einzelnen Konstantenpuffer ändern, legen Sie zuerst den Konstantenpuffer auf NULL fest:


     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);

Wenn Sie mehrere Konstantenpuffer ändern, legen Sie zuerst den ersten und letzten Konstantenpuffer des Bereichs auf NULL fest:


     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);

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 8 und Plattformupdate für Windows 7 [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2012 und Plattformupdate für Windows Server 2008 R2 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile d3d11_1.h
Bibliothek D3D11.lib

Weitere Informationen

ID3D11DeviceContext1