Metodo ID3D11DeviceContext1::GSSetConstantBuffers1 (d3d11_1.h)

Imposta i buffer costanti usati dalla fase della pipeline geometry shader.

Sintassi

void GSSetConstantBuffers1(
  [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 del dispositivo 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 GSSetConstantBuffers1 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 GSSetConstantBuffers1 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 GSSetConstantBuffers . 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 di GSSetConstantBuffers1 con l'emulazione dell'elenco di comandi

L'emulazione dell'elenco di comandi del runtime di GSSetConstantBuffers1 a volte non modifica gli offset o le dimensioni per le matrici di buffer costanti. Questo comportamento si verifica quando

GSSetConstantBuffers1 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->GSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->GSSetConstantBuffers(0, 1, &NullCBuf);
     }
     pDeviceContext->GSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);

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


     pDeviceContext->GSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->GSSetConstantBuffers(0, 1, &NullCBuf);
          pDeviceContext->GSSetConstantBuffers(3, 1, &NullCBuf);
     }
     pDeviceContext->GSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);

Requisiti

Requisito Valore
Client minimo supportato Windows 8 e Aggiornamento della piattaforma 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