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

Legt die Konstantenpuffer fest, die von der Domain-Shader-Phase verwendet werden.

Syntax

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

Parameter

[in] StartSlot

Indexieren Sie das nullbasierte Array, um mit dem Festlegen von Konstantenpuffern zu beginnen (Bereiche von 0 bis D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

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

[in, optional] ppConstantBuffers

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

[in, optional] pFirstConstant

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

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

Die Laufzeit löscht den Aufruf von DSSetConstantBuffers1 , wenn die Anzahl der Konstanten, auf die pNumConstants verweist, größer ist als die maximale Größe des Konstantenpuffers, die von Shadern unterstützt wird (4096 Konstanten). 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 Fenster [Wert in einem Element von pFirstConstant, Wert in einem Element von pFirstConstant + wert in einem Element von pNumConstants]. Die Runtime verwirft auch den Aufruf von DSSetConstantBuffers1 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 DSSetConstantBuffers-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 DSSetConstantBuffers1 mit Befehlslistenemulation

Die Befehlslistenemulation der Laufzeit dsSetConstantBuffers1 ändert manchmal die Offsets oder Größen für die Arrays von Konstantenpuffern nicht. Dieses Verhalten tritt auf, wenn

DSSetConstantBuffers1 ändert die Konstantenpuffer am Anfang und Ende des Bereichs von Slots, den Sie aktualisieren möchten, nicht effektiv. In diesem Abschnitt wird gezeigt, wie Sie dies umgehen.

frühestmöglich aufzudecken.

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

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


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

Anforderungen

Anforderung Wert
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