Partager via


ID3D11DeviceContext1::VSSetConstantBuffers1, méthode (d3d11_1.h)

Définit les mémoires tampons constantes que l’étape de pipeline du nuanceur de vertex utilise.

Syntaxe

void VSSetConstantBuffers1(
  [in]           UINT         StartSlot,
  [in]           UINT         NumBuffers,
  [in, optional] ID3D11Buffer * const *ppConstantBuffers,
  [in, optional] const UINT   *pFirstConstant,
  [in, optional] const UINT   *pNumConstants
);

Paramètres

[in] StartSlot

Type : UINT

Indexez dans le tableau de base zéro de l’appareil pour commencer à définir les mémoires tampons constantes sur (varie de 0 à D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

Type : UINT

Nombre de mémoires tampons à définir (compris entre 0 et D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).

[in, optional] ppConstantBuffers

Type : ID3D11Buffer*

Tableau de mémoires tampons constantes fournies à l’appareil.

[in, optional] pFirstConstant

Type : const UINT*

Tableau qui contient les décalages dans les mémoires tampons spécifiées par ppConstantBuffers . Chaque décalage spécifie où, du point de vue du nuanceur, chaque mémoire tampon constante démarre. Chaque décalage est mesuré en constantes de nuanceur, qui sont de 16 octets (composants 4*32 bits). Par conséquent, un décalage de 16 indique que le début de la mémoire tampon constante associée est de 256 octets dans la mémoire tampon constante. Chaque décalage doit être un multiple de 16 constantes.

[in, optional] pNumConstants

Type : const UINT*

Tableau qui contient les nombres de constantes dans les mémoires tampons spécifiées par ppConstantBuffers . Chaque nombre spécifie le nombre de constantes contenues dans la mémoire tampon constante utilisée par le nuanceur. Chaque nombre de constantes commence à partir de son décalage respectif spécifié dans le tableau pFirstConstant . Chaque nombre de constantes doit être un multiple de 16 constantes, dans la plage [0..4096].

Valeur de retour

Aucune

Remarques

Le runtime supprime l’appel à VSSetConstantBuffers1 si le nombre de constantes auxquelles pNumConstants pointe est supérieur à la taille maximale de mémoire tampon constante prise en charge par les nuanceurs (4 096 constantes). Les valeurs des éléments des tableaux pFirstConstant et pFirstConstant + pNumConstants peuvent dépasser la longueur de chaque mémoire tampon ; du point de vue du nuanceur, la mémoire tampon constante est l’intersection de l’allocation de mémoire réelle pour la mémoire tampon et de la fenêtre [valeur dans un élément de pFirstConstant, valeur dans un élément de pFirstConstant + valeur dans un élément de pNumConstants]. Le runtime supprime également l’appel à VSSetConstantBuffers1 sur les pilotes existants qui ne prennent pas en charge cette compensation.

Le runtime émule cette fonctionnalité pour les niveaux de fonctionnalité 9.1, 9.2 et 9.3 ; Par conséquent, cette fonctionnalité est prise en charge pour les niveaux de fonctionnalité 9.1, 9.2 et 9.3. Cette fonctionnalité est toujours disponible sur les nouveaux pilotes pour le niveau de fonctionnalité 10 et supérieur.

Du point de vue du nuanceur, l’élément [0] dans le tableau de mémoires tampons constantes est la constante de pFirstConstant.

L’accès hors limites aux mémoires tampons constantes du nuanceur à la plage définie par pFirstConstant et pNumConstants retourne 0.

Si les tableaux pFirstConstant et pNumConstants ont la valeur NULL, vous obtenez le même résultat que si vous aviez l’intégralité de la mémoire tampon dans l’affichage. Vous obtenez ce même résultat si vous appelez la méthode VSSetConstantBuffers . Si la mémoire tampon est supérieure à la taille maximale de mémoire tampon constante prise en charge par les nuanceurs (4 096 éléments), le nuanceur peut accéder uniquement aux 4 096 premières constantes.

Si pFirstConstant ou pNumConstants a la valeur NULL, l’autre paramètre doit également être NULL.

Appel de VSSetConstantBuffers1 avec émulation de liste de commandes

L’émulation de la liste de commandes du runtime de VSSetConstantBuffers1 ne modifie parfois pas réellement les décalages ou les tailles des tableaux de mémoires tampons constantes. Ce comportement se produit lorsque

VSSetConstantBuffers1 ne modifie pas efficacement les mémoires tampons constantes au début et à la fin de la plage d’emplacements que vous définissez pour la mise à jour. Cette section montre comment contourner ce problème

suspects.

Voici le code à case activée si le runtime émule les listes de commandes ou si le pilote prend en charge les listes de commandes :


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

Si le runtime émule des listes de commandes, vous devez utiliser l’un de ces extraits de code :

Si vous modifiez le décalage et la taille sur une seule mémoire tampon constante, définissez d’abord la mémoire tampon constante sur 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);

Si vous modifiez plusieurs mémoires tampons constantes, définissez d’abord la première et la dernière mémoire tampon constante de la plage sur 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);

Configuration requise

   
Client minimal pris en charge Windows 8 et mise à jour de plateforme pour Windows 7 [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2012 et Platform Update pour Windows Server 2008 R2 [applications de bureau | Applications UWP]
Plateforme cible Windows
En-tête d3d11_1.h
Bibliothèque D3D11.lib

Voir aussi

ID3D11DeviceContext1