Metodo ID3D11DeviceContext1::CSSetConstantBuffers1 (d3d11_1.h)
Imposta i buffer costanti usati dalla fase di calcolo-shader.
Sintassi
void CSSetConstantBuffers1(
[in] UINT StartSlot,
[in] UINT NumBuffers,
[in, optional] ID3D11Buffer * const *ppConstantBuffers,
[in, optional] const UINT *pFirstConstant,
[in, optional] const UINT *pNumConstants
);
Parametri
[in] StartSlot
Indice nella matrice in base zero per iniziare a impostare buffer costanti su (da 0 a D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).
[in] NumBuffers
Numero di buffer da impostare (da 0 a D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).
[in, optional] ppConstantBuffers
Matrice di buffer costanti (vedere ID3D11Buffer) assegnata al dispositivo.
[in, optional] pFirstConstant
Matrice che contiene gli offset nei buffer specificati da ppConstantBuffers . Ogni offset specifica dove, dal punto di vista dello shader, ogni buffer costante inizia. Ogni offset viene misurato in costanti shader, che sono 16 byte (componenti a 4*32 bit). Pertanto, un offset di 16 indica che l'inizio del buffer costante associato è 256 byte nel buffer costante. Ogni offset deve essere un multiplo di 16 costanti.
[in, optional] pNumConstants
Matrice che contiene i numeri di costanti nei buffer specificati da ppConstantBuffers . Ogni numero specifica il numero di costanti contenute nel buffer costante usato dal shader. Ogni numero di costanti inizia dal rispettivo offset specificato nella matrice pFirstConstant . Ogni numero di costanti deve essere un multiplo di 16 costanti, nell'intervallo [0,.4096].
Valore restituito
nessuno
Osservazioni
Il runtime elimina la chiamata a CSSetConstantBuffers1 se il numero di costanti a cui pNumConstants punta è maggiore della dimensione massima del buffer costante supportata dai shader (costanti 4096). I valori delle matrici pFirstConstant e pFirstConstant + pNumConstants possono superare la lunghezza di ogni buffer; dal punto di vista dello shader, il buffer costante è l'intersezione dell'allocazione di memoria effettiva per il buffer e la finestra [valore in un elemento pFirstConstant, valore in un elemento pFirstConstant + valore in un elemento di pNumConstants]. Il runtime elimina anche la chiamata a CSSetConstantBuffers1 nei driver esistenti che non supportano questa offsetzione.
Il runtime emulerà questa funzionalità per il livello di funzionalità 9.1, 9.2 e 9.3; pertanto, questa funzionalità è supportata per il livello di funzionalità 9.1, 9.2 e 9.3. Questa funzionalità è sempre disponibile sui nuovi driver per il livello di funzionalità 10 e superiore.
Dal punto di vista dello shader, l'elemento [0] nella matrice dei buffer costanti è la costante in pFirstConstant.
Accesso non consentito ai buffer costanti dal shader all'intervallo definito da pFirstConstant e pNumConstants restituisce 0.
Se le matrici pFirstConstant e pNumConstants sono NULL, si ottiene lo stesso risultato di se si associasse l'intero buffer nella visualizzazione. Si ottiene questo stesso risultato se si chiama il metodo CSSetConstantBuffers . Se il buffer è maggiore della dimensione massima del buffer supportata dagli shader (4096 elementi), lo shader può accedere solo alle prime costanti 4096.
Se pFirstConstant o pNumConstants è NULL, l'altro parametro deve essere NULL.
Chiamata a CSSetConstantBuffers1 con l'emulazione dell'elenco di comandi
L'emulazione dell'elenco di comandi del runtime di CSSetConstantBuffers1 talvolta non modifica in realtà gli offset o le dimensioni per le matrici di buffer costanti. Questo comportamento si verifica quandoCSSetConstantBuffers1 non modifica in modo efficace i buffer costanti all'inizio e alla fine dell'intervallo di slot impostati per l'aggiornamento. Questa sezione illustra come risolvere questo problema
comportamento.
Ecco il codice per verificare se il runtime emula gli elenchi di comandi o il driver supporta elenchi di comandi:
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.
}
}
Se il runtime emula gli elenchi di comandi, è necessario usare uno di questi frammenti di codice:
Se si modifica l'offset e la dimensione solo su un singolo buffer costante, impostare prima il buffer costante su NULL :
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);
Se si modificano più buffer costanti, impostare prima e l'ultimo buffer costante dell'intervallo su NULL :
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);
Requisiti
Client minimo supportato | Windows 8 e Platform Update per Windows 7 [app desktop | App UWP] |
Server minimo supportato | Windows Server 2012 e Aggiornamento della piattaforma per Windows Server 2008 R2 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | d3d11_1.h |
Libreria | D3D11.lib |