ID3D11DeviceContext1::GSSetConstantBuffers1-Methode (d3d11_1.h)
Legt die Konstantenpuffer fest, die von der Pipelinephase des Geometry-Shaders verwendet werden.
Syntax
void GSSetConstantBuffers1(
[in] UINT StartSlot,
[in] UINT NumBuffers,
[in, optional] ID3D11Buffer * const *ppConstantBuffers,
[in, optional] const UINT *pFirstConstant,
[in, optional] const UINT *pNumConstants
);
Parameter
[in] StartSlot
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
Anzahl der festzulegenden Puffer (Bereiche von 0 bis D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT – StartSlot).
[in, optional] ppConstantBuffers
Array von Konstantenpuffern (siehe ID3D11Buffer), 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 GSSetConstantBuffers1 , wenn die Anzahl der Konstanten, auf die pNumConstants verweist, größer ist als die maximale Konstantepuffergröße, 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 GSSetConstantBuffers1 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 GSSetConstantBuffers-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 GSSetConstantBuffers1 mit Befehlslistenemulation
Die Befehlslistenemulation der Laufzeit von GSSetConstantBuffers1 ändert manchmal die Offsets oder Größen für die Arrays von Konstantenpuffern nicht. Dieses Verhalten tritt auf, wennGSSetConstantBuffers1 ä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->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);
Wenn Sie mehrere Konstantenpuffer ändern, legen Sie zuerst den ersten und letzten Konstantenpuffer des Bereichs auf NULL fest:
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);
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 |