ID3D10Device::UpdateSubresource, méthode (d3d10.h)

Le processeur copie les données de la mémoire vers une sous-ressource créée dans la mémoire non mappable. Consultez la section Remarques.

Syntaxe

void UpdateSubresource(
  [in] ID3D10Resource  *pDstResource,
  [in] UINT            DstSubresource,
  [in] const D3D10_BOX *pDstBox,
  [in] const void      *pSrcData,
  [in] UINT            SrcRowPitch,
  [in] UINT            SrcDepthPitch
);

Paramètres

[in] pDstResource

Type : ID3D10Resource*

Pointeur vers la ressource de destination (voir ID3D10Resource Interface).

[in] DstSubresource

Type : UINT

Index de base zéro qui identifie la sous-ressource de destination. Pour plus d’informations, consultez D3D10CalcSubresource .

[in] pDstBox

Type : const D3D10_BOX*

Zone qui définit la partie de la sous-ressource de destination dans laquelle copier les données de ressource. Les coordonnées sont exprimées en octets pour les mémoires tampons et en texels pour les textures. Si la valeur est NULL, les données sont écrites dans la sous-ressource de destination sans décalage. Les dimensions de la source doivent correspondre à la destination (voir D3D10_BOX).

Une zone vide entraîne une absence d’opération. Une zone est vide si la valeur supérieure est supérieure ou égale à la valeur inférieure, ou si la valeur de gauche est supérieure ou égale à la valeur de droite, ou si la valeur de début est supérieure ou égale à la valeur d’arrière-plan. Lorsque la zone est vide, UpdateSubresource n’effectue pas d’opération de mise à jour.

[in] pSrcData

Type : const void*

Pointeur vers les données sources en mémoire.

[in] SrcRowPitch

Type : UINT

Taille d’une ligne des données sources.

[in] SrcDepthPitch

Type : UINT

Taille d’une tranche de profondeur des données sources.

Valeur de retour

Aucune

Remarques

Pour une mémoire tampon de constante de nuanceur ; définissez pDstBox sur NULL. Il n’est pas possible d’utiliser cette méthode pour mettre à jour partiellement une mémoire tampon de constante de nuanceur.

Une ressource ne peut pas être utilisée comme destination si :

Lorsque UpdateSubresource retourne une valeur, l’application est libre de modifier ou même de libérer les données pointées par pSrcData, car la méthode a déjà copié/supprimé le contenu d’origine.

Les performances de UpdateSubresource varient selon qu’il existe ou non une contention pour la ressource de destination. Par exemple, une contention pour une ressource de mémoire tampon de vertex se produit lorsque l’application exécute un appel Draw et appelle ultérieurement UpdateSubresource sur la même mémoire tampon de vertex avant que l’appel Draw ne soit réellement exécuté par le GPU.

  • En cas de conflit pour la ressource, UpdateSubresource effectue 2 copies des données sources. Tout d’abord, les données sont copiées par le processeur dans un espace de stockage temporaire accessible par la mémoire tampon de commandes. Cette copie se produit avant le retour de la méthode. Une deuxième copie est ensuite effectuée par le GPU pour copier les données sources dans la mémoire non mappable. Cette deuxième copie se produit de manière asynchrone, car elle est exécutée par GPU lorsque la mémoire tampon de commande est vidée.
  • En l’absence de conflit de ressources, le comportement de UpdateSubresource dépend de ce qui est le plus rapide (du point de vue de l’UC) : copie des données dans la mémoire tampon de commande, puis exécution d’une deuxième copie lorsque la mémoire tampon de commande est vidée, ou faire en sorte que le processeur copie les données vers l’emplacement de ressource final. Cela dépend de l’architecture du système sous-jacent.
Pour mieux comprendre les paramètres de tangage de ligne source et de profondeur de la source, envisagez l’illustration suivante d’une texture de volume 3D. Illustration d’une texture de volume 3D

Chaque bloc de ce visuel représente un élément de données, et la taille de chaque élément dépend du format de la ressource. Par exemple, si le format de ressource est DXGI_FORMAT_R32G32B32A32_FLOAT, la taille de chaque élément est de 128 bits ou 16 octets. Cette texture de volume 3D a une largeur de deux, une hauteur de trois et une profondeur de quatre.

Pour calculer le tangage de ligne source et le pas de profondeur de la source pour une ressource donnée, utilisez les formules suivantes :

  • Pitch de ligne source = [taille d’un élément en octets] * [nombre d’éléments dans une ligne]
  • Profondeur de la source Pitch = [Emplacement de la ligne source] * [nombre de lignes (hauteur)]
Dans le cas de cet exemple de texture de volume 3D où la taille de chaque élément est de 16 octets, les formules sont les suivantes :
  • Pitch de ligne source = 16 * 2 = 32
  • Profondeur de la source pitch = 16 * 2 * 3 = 96
L’illustration suivante montre la ressource telle qu’elle est disposée en mémoire. Illustration d’une texture de volume 3D en mémoire

Par exemple, l’extrait de code suivant montre comment spécifier une région de destination dans une texture 2D. Supposons que la texture de destination est 512 x 512 et que l’opération copie les données pointées par pData vers [(120,100).. (200 220)] dans la texture de destination. Supposons également que rowPitch a été initialisé avec la valeur appropriée (comme expliqué ci-dessus). L’avant et l’arrière sont définis sur 0 et 1 respectivement, car en ayant l’avant égal à l’arrière, la boîte est techniquement vide.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 100;
destRegion.bottom = 220;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Le cas 1D est similaire. L’extrait de code suivant montre comment spécifier une région de destination dans une texture 1D. Utilisez les mêmes hypothèses que ci-dessus, sauf que la texture est de 512.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Différences entre Direct3D 10 et Direct3D 10.1 :

Direct3D 10.1 permet d’utiliser des ressources de gabarit de profondeur en tant que source ou destination.

Configuration requise

   
Plateforme cible Windows
En-tête d3d10.h
Bibliothèque D3D10.lib

Voir aussi

ID3D10Device

ID3D10Resource, interface