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