Metodo ID3D11DeviceContext1::P SSetConstantBuffers1 (d3d11_1.h)

Imposta i buffer costanti usati dalla pipeline pixel shader e consente al shader di accedere ad altre parti del buffer.

Sintassi

void PSSetConstantBuffers1(
  [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

Indice 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 (da 0 a 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, 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

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 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

Per abilitare lo shader per accedere ad altre parti del buffer, chiamare PSSetConstantBuffers1 anziché PSSetConstantBuffers. PSSetConstantBuffers1 include parametri aggiuntivi pFirstConstant e pNumConstants.

Il runtime elimina la chiamata a PSSetConstantBuffers1 se i numeri di costanti a cui pNumConstants puntano è maggiore della dimensione massima del buffer costante supportata dai shader. La dimensione massima del buffer costante supportata dagli shader contiene 4096 costanti, in cui ogni costante ha quattro componenti a 32 bit.

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 effettiva della memoria per il buffer e la finestra seguente (intervallo):

[valore in un elemento di pFirstConstant, valore in un elemento di pFirstConstant + valore in un elemento di pNumConstants]

Ovvero, la finestra è l'intervallo compreso tra (valore in un elemento pFirstConstant) e (valore in un elemento pFirstConstant + valore in un elemento di pNumConstants).

Il runtime elimina anche la chiamata a PSSetConstantBuffers1 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 PSSetConstantBuffers . 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 PSSetConstantBuffers1 con l'emulazione dell'elenco di comandi

L'emulazione dell'elenco di comandi del runtime di PSSetConstantBuffers1 talvolta non modifica gli offset o le dimensioni per le matrici di buffer costanti. Questo comportamento si verifica quando PSSetConstantBuffers1 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 aggirare questo 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->PSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
     }
     pDeviceContext->PSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);

Se si modificano più buffer costanti, impostare prima e l'ultimo buffer costante dell'intervallo su NULL :


     pDeviceContext->PSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
          pDeviceContext->PSSetConstantBuffers(3, 1, &NullCBuf);
     }
     pDeviceContext->PSSetConstantBuffers1(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