Condividi tramite


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 quando

VSSetConstantBuffers1 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

Vedi anche

ID3D11DeviceContext1