Partager via


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

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

Syntaxe

void CSSetConstantBuffers1(
  [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 pour commencer à définir les mémoires tampons constantes sur (va de 0 à D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

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

[in, optional] ppConstantBuffers

Tableau de mémoires tampons constantes (voir ID3D11Buffer) donné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 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 à CSSetConstantBuffers1 si le nombre de constantes vers lesquelles 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 à CSSetConstantBuffers1 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 CSSetConstantBuffers . 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 CSSetConstantBuffers1 avec émulation de liste de commandes

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

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