Metodo ID3D11DeviceContext1::VSSetConstantBuffers1 (d3d11_1.h)
Imposta i buffer costanti usati dalla fase della pipeline del vertex shader.
Sintassi
void VSSetConstantBuffers1(
[in] UINT StartSlot,
[in] UINT NumBuffers,
[in, optional] ID3D11Buffer * const *ppConstantBuffers,
[in, optional] const UINT *pFirstConstant,
[in, optional] const UINT *pNumConstants
);
Parametri
[in] StartSlot
Tipo: UINT
Indicizzare nella matrice in base zero del dispositivo per iniziare a impostare buffer costanti su (da 0 a D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).
[in] NumBuffers
Tipo: UINT
Numero di buffer da impostare (compreso tra 0 e D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).
[in, optional] ppConstantBuffers
Tipo: ID3D11Buffer*
Matrice di buffer costanti assegnati al dispositivo.
[in, optional] pFirstConstant
Tipo: const UINT*
Matrice che contiene gli offset nei buffer specificati da ppConstantBuffers . Ogni offset specifica dove, dal punto di vista dello shader, viene avviato ogni buffer costante. Ogni offset viene misurato in costanti shader, ovvero 16 byte (componenti a 4*32 bit). Pertanto, un offset pari a 16 indica che l'inizio del buffer costante associato è di 256 byte nel buffer costante. Ogni offset deve essere un multiplo di 16 costanti.
[in, optional] pNumConstants
Tipo: const UINT*
Matrice che contiene i numeri di costanti nei buffer specificati da ppConstantBuffers . Ogni numero specifica il numero di costanti contenute nel buffer costante utilizzato dallo 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 VSSetConstantBuffers1 se il numero di costanti a cui pNumConstants punta è maggiore della dimensione massima del buffer costante supportata dagli shader (costanti 4096). I valori negli elementi 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 [value in un elemento di pFirstConstant, valore in un elemento di pFirstConstant + value in un elemento di pNumConstants]. Il runtime elimina anche la chiamata a VSSetConstantBuffers1 sui driver esistenti che non supportano questa differenza.
Il runtime emula questa funzionalità per il livello di funzionalità 9.1, 9.2 e 9.3; questa funzionalità è pertanto 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.
L'accesso out of bounds 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 in visualizzazione. Si ottiene questo stesso risultato se si chiama il metodo VSSetConstantBuffers . Se il buffer è maggiore della dimensione massima del buffer costante supportata dagli shader (4096 elementi), lo shader può accedere solo alle prime 4096 costanti.
Se pFirstConstant o pNumConstants è NULL, l'altro parametro deve essere NULL.
Chiamata a VSSetConstantBuffers1 con emulazione dell'elenco di comandi
L'emulazione dell'elenco di comandi del runtime di VSSetConstantBuffers1 talvolta non modifica effettivamente gli offset o le dimensioni per le matrici di buffer costanti. Questo comportamento si verifica quandoVSSetConstantBuffers1 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 gli 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 dei frammenti di codice seguenti:
Se si modifica l'offset e le dimensioni in un solo buffer costante, impostare prima il buffer costante su NULL :
pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
Se si modificano più buffer costanti, impostare prima i buffer della prima e dell'ultima costante dell'intervallo su NULL :
pDeviceContext->VSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->VSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->VSSetConstantBuffers1(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 |