Partager via


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

Définit les tampons constants que la phase hull-shader du pipeline utilise.

Syntaxe

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

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

[in] NumBuffers

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

[in, optional] ppConstantBuffers

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

[in, optional] pFirstConstant

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

Tableau qui contient le nombre 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 qui est 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

None

Remarques

Le runtime supprime l’appel à HSSetConstantBuffers1 si le nombre de constantes auxquelles points pNumConstants 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 + value dans un élément de pNumConstants]. Le runtime supprime également l’appel à HSSetConstantBuffers1 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 au niveau 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 liez l’intégralité de la mémoire tampon dans l’affichage. Vous obtenez ce même résultat si vous appelez la méthode HSSetConstantBuffers . Si la mémoire tampon est supérieure à la taille de mémoire tampon constante maximale 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 avoir la valeur NULL.

Appel de HSSetConstantBuffers1 avec émulation de liste de commandes

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

HSSetConstantBuffers1 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 des extraits de code suivants :

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

Configuration requise

Condition requise Valeur
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 mise à jour de plateforme 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