ID3D11DeviceContext1::CSSetConstantBuffers1-Methode (d3d11_1.h)
Legt die Konstantenpuffer fest, die von der Compute-Shader-Phase verwendet werden.
Syntax
void CSSetConstantBuffers1(
[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, um mit dem Festlegen von Konstantenpuffern zu beginnen (Bereich von 0 bis D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).
[in] NumBuffers
Anzahl der festzulegenden Puffer (Bereich von 0 bis D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT – StartSlot).
[in, optional] ppConstantBuffers
Array von Konstantenpuffern (siehe ID3D11Buffer), das dem Gerät zugewiesen wird.
[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 Start des zugeordneten Konstantenpuffers 256 Bytes 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 ihrem jeweiligen Offset, der im pFirstConstant-Array angegeben wird. Jede Anzahl von Konstanten muss ein Vielfaches von 16 Konstanten im Bereich [0..4096] sein.
Rückgabewert
Keine
Bemerkungen
Die Runtime hebt den Aufruf von CSSetConstantBuffers1 ab, wenn die Anzahl der Konstanten, für die pNumConstants-Punkte größer sind als die maximale Konstantepuffergröße, die von Shadern (4096 Konstanten) unterstützt wird. 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 Speicherzuordnung 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 löst auch den Aufruf von CSSetConstantBuffers1 für vorhandene Treiber ab, die diesen Ausgleich nicht unterstützen.
Die Runtime emuliert dieses Feature für die Featureebene 9.1, 9.2 und 9.3. Daher wird dieses Feature für die Featureebene 9.1, 9.2 und 9.3 unterstützt. Dieses Feature ist immer für neue Treiber für Featureebene 10 und höher verfügbar.
Aus Sicht des Shaders ist das 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 würden Sie den gesamten Puffer in die Ansicht binden. Das gleiche Ergebnis erhalten Sie, wenn Sie die CSSetConstantBuffers-Methode aufrufen. Wenn der Puffer größer als die maximale konstante Puffergröße 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 auch der andere Parameter NULL sein.
Aufrufen von CSSetConstantBuffers1 mit Befehlslistenemulation
Die Befehlslistenemulation der Runtime von CSSetConstantBuffers1 ändert manchmal nicht wirklich die Offsets oder Größen für die Arrays von Konstantenpuffern. Dieses Verhalten tritt auf, wennCSSetConstantBuffers1 ändert die Konstantenpuffer am Anfang und Ende des Bereichs von Slots, den Sie für die Aktualisierung festgelegt haben, nicht effektiv. In diesem Abschnitt wird gezeigt, wie Sie diese umgehen können.
frühestmöglich aufzudecken.
Hier ist der Code, um zu überprüfen, 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->CSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->CSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->CSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
Wenn Sie mehrere Konstantenpuffer ändern, legen Sie die ersten und letzten Konstantenpuffer des Bereichs zuerst auf NULL fest:
pDeviceContext->CSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->CSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->CSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->CSSetConstantBuffers1(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 |