ID3D11DeviceContext1::P SSetConstantBuffers1, méthode (d3d11_1.h)
Définit les mémoires tampons constantes que la phase de pipeline du nuanceur de pixels utilise et permet au nuanceur d’accéder à d’autres parties de la mémoire tampon.
Syntaxe
void PSSetConstantBuffers1(
[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 (plages de 0 à D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).
[in] NumBuffers
Type : UINT
Nombre de mémoires tampons à définir (plages de 0 à D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).
[in, optional] ppConstantBuffers
Type : ID3D11Buffer*
Tableau de mémoires tampons constantes attribuées à 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 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
Aucune
Remarques
Pour permettre au nuanceur d’accéder à d’autres parties de la mémoire tampon, appelez PSSetConstantBuffers1 au lieu de PSSetConstantBuffers. PSSetConstantBuffers1 a des paramètres supplémentaires pFirstConstant et pNumConstants.
Le runtime supprime l’appel à PSSetConstantBuffers1 si le nombre de constantes auxquelles pNumConstants points est supérieur à la taille maximale de mémoire tampon constante prise en charge par les nuanceurs. La taille maximale de mémoire tampon constante prise en charge par les nuanceurs contient 4 096 constantes, chaque constante ayant quatre composants 32 bits.
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 suivante (plage) :
[valeur dans un élément de pFirstConstant, valeur dans un élément de pFirstConstant + valeur dans un élément de pNumConstants]
Autrement dit, la fenêtre est la plage comprise entre (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 à PSSetConstantBuffers1 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’ensemble de la mémoire tampon dans l’affichage. Vous obtenez ce même résultat si vous appelez la méthode PSSetConstantBuffers . 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 PSSetConstantBuffers1 avec émulation de liste de commandes
L’émulation de la liste de commandes du runtime de PSSetConstantBuffers1 ne modifie pas les décalages ou les tailles des tableaux de mémoires tampons constantes. Ce comportement se produit lorsque PSSetConstantBuffers1 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 mettre à jour. Cette section montre comment contourner ce comportement.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->PSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->PSSetConstantBuffers1(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->PSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->PSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->PSSetConstantBuffers1(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 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 |