Énumération D3DSWAPEFFECT

Définit les effets d’échange.

Syntaxe

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

Constantes

D3DSWAPEFFECT_DISCARD

Lorsqu’une chaîne d’échange est créée avec un effet d’échange de D3DSWAPEFFECT_FLIP ou de D3DSWAPEFFECT_COPY, le runtime garantit qu’une opération IDirect3DDevice9::P resent n’affectera pas le contenu des mémoires tampons d’arrière-mémoire. Malheureusement, le respect de cette garantie peut impliquer des surcharges de traitement ou de mémoire vidéo importantes, en particulier lors de l’implémentation de la sémantique de retournement pour une chaîne d’échange fenêtré ou de la sémantique de copie pour une chaîne d’échange en plein écran. Une application peut utiliser l’effet d’échange D3DSWAPEFFECT_DISCARD pour éviter ces surcharges et pour permettre au pilote d’affichage de sélectionner la technique de présentation la plus efficace pour la chaîne d’échange. Il s’agit également du seul effet d’échange qui peut être utilisé lors de la spécification d’une valeur autre que D3DMULTISAMPLE_NONE pour le membre MultiSampleType de D3DPRESENT_PARAMETERS.

À l’instar d’une chaîne d’échange qui utilise D3DSWAPEFFECT_FLIP, une chaîne d’échange qui utilise D3DSWAPEFFECT_DISCARD peut inclure plusieurs mémoires tampons d’arrière-plan, accessibles à l’aide de IDirect3DDevice9::GetBackBuffer ou IDirect3DSwapChain9::GetBackBuffer. La chaîne d’échange est mieux envisagée comme une file d’attente dans laquelle 0 indexe toujours la mémoire tampon d’arrière-mémoire qui sera affichée par l’opération Present suivante et à partir de laquelle les mémoires tampons sont ignorées lorsqu’elles ont été affichées.

Une application qui utilise cet effet d’échange ne peut pas faire d’hypothèses sur le contenu d’une mémoire tampon d’arrière-mémoire ignorée et doit donc mettre à jour une mémoire tampon d’arrière-mémoire entière avant d’appeler une opération Present qui l’afficherait. Bien que cela ne soit pas appliqué, la version de débogage du runtime remplace le contenu des mémoires tampons arrière ignorées par des données aléatoires pour permettre aux développeurs de vérifier que leurs applications mettent à jour correctement l’ensemble des surfaces de mémoire tampon arrière.

D3DSWAPEFFECT_FLIP

La chaîne d’échange peut inclure plusieurs mémoires tampons d’arrière-plan et est mieux envisagée comme une file d’attente circulaire qui inclut la mémoire tampon avant. Dans cette file d’attente, les mémoires tampons d’arrière-mémoire sont toujours numérotées séquentiellement de 0 à (n - 1), où n est le nombre de mémoires tampons d’arrière-mémoire, de sorte que 0 indique la mémoire tampon la moins récemment présentée. Lorsque Present est appelé, la file d’attente est « pivotée » de sorte que la mémoire tampon avant devient la mémoire tampon d’arrière-plan (n - 1), tandis que la mémoire tampon d’arrière-plan 0 devient la nouvelle mémoire tampon avant.

D3DSWAPEFFECT_COPY

Cet effet d’échange peut être spécifié uniquement pour une chaîne d’échange comprenant une seule mémoire tampon d’arrière-mémoire. Que la chaîne d’échange soit fenêtré ou en plein écran, le runtime garantit la sémantique impliquée par une opération Present basée sur la copie, à savoir que l’opération laisse le contenu de la mémoire tampon d’arrière-plan inchangée, au lieu de le remplacer par le contenu de la mémoire tampon avant, comme le ferait une opération Present basée sur une rotation.

Pour une chaîne d’échange en plein écran, le runtime utilise une combinaison d’opérations de retournement et d’opérations de copie, prises en charge si nécessaire par les mémoires tampons d’arrière-plan masquées, pour effectuer l’opération Present. En conséquence, la présentation est synchronisée avec le retracement vertical de la carte d’affichage et sa vitesse est limitée par l’intervalle de présentation choisi. Une chaîne d’échange spécifiée avec l’indicateur D3DPRESENT_INTERVAL_IMMEDIATE est la seule exception. (Reportez-vous à la description du membre PresentationIntervals de la structure D3DPRESENT_PARAMETERS .) Dans ce cas, une opération Present copie le contenu de la mémoire tampon d’arrière-plan directement dans la mémoire tampon avant sans attendre le retracement vertical.

D3DSWAPEFFECT_OVERLAY

Utilisez une zone dédiée de mémoire vidéo qui peut être écrasée sur la surface primaire. Aucune copie n’est effectuée lorsque la superposition est affichée. L’opération de superposition est effectuée dans le matériel, sans modifier les données dans la surface primaire.

Différences entre Direct3D 9 et Direct3D 9Ex :

  • D3DSWAPEFFECT_OVERLAY est disponible uniquement dans Direct3D9Ex s’exécutant sur Windows 7 (ou un système d’exploitation plus actuel).

D3DSWAPEFFECT_FLIPEX

Désigne le moment où une application adopte le mode retournement, pendant lequel l’image d’une application est passée au lieu d’être copiée dans le Gestionnaire de fenêtres du bureau (DWM) pour la composition lorsque l’application se présente en mode fenêtré. Le mode Retournement permet à une application d’utiliser plus efficacement la bande passante mémoire et de tirer parti des statistiques en plein écran. Le mode Retournement n’affecte pas le comportement en plein écran.

Remarque

Si vous créez une chaîne d’échange avec D3DSWAPEFFECT_FLIPEX, vous ne pouvez pas remplacer le membre hDeviceWindow de la structure D3DPRESENT_PARAMETERS lorsque vous présentez un nouveau cadre à afficher. Autrement dit, vous devez passer NULL au paramètre hDestWindowOverride de IDirect3DDevice9Ex::P resentEx pour indiquer au runtime d’utiliser le membre hDeviceWindow de D3DPRESENT_PARAMETERS pour la présentation.

Différences entre Direct3D 9 et Direct3D 9Ex :

  • D3DSWAPEFFECT_FLIPEX est disponible uniquement dans Direct3D9Ex s’exécutant sur Windows 7 (ou un système d’exploitation plus actuel).

D3DSWAPEFFECT_FORCE_DWORD

Force cette énumération à compiler à une taille de 32 bits. Sans cette valeur, certains compilateurs autoriseraient cette énumération à compiler à une taille autre que 32 bits. Cette valeur n'est pas utilisée.

Notes

L’état de la mémoire tampon d’arrière-mémoire après un appel à Present est bien défini par chacun de ces effets d’échange, et si l’appareil Direct3D a été créé avec une chaîne d’échange plein écran ou une chaîne d’échange fenêtré n’a aucun effet sur cet état. En particulier, l’effet d’échange D3DSWAPEFFECT_FLIP fonctionne de la même façon, qu’il soit fenêtré ou en plein écran, et le runtime Direct3D le garantit en créant des mémoires tampons supplémentaires. Par conséquent, il est recommandé que les applications utilisent D3DSWAPEFFECT_DISCARD chaque fois que possible pour éviter de telles pénalités. En effet, cet effet d’échange sera toujours le plus efficace en termes de consommation de mémoire et de performances.

Les applications qui utilisent D3DSWAPEFFECT_FLIP ou D3DSWAPEFFECT_DISCARD ne doivent pas s’attendre à ce que l’alpha de destination plein écran fonctionne. Cela signifie que l’état de rendu D3DRS_DESTBLEND ne fonctionnera pas comme prévu, car les chaînes d’échange plein écran avec ces effets d’échange n’ont pas de format de pixel explicite du point de vue du pilote. Le pilote en déduit qu’il doit prendre le format d’affichage, qui n’a pas de canal alpha. Pour contourner ce problème, procédez comme suit :

  • Utilisez D3DSWAPEFFECT_COPY.
  • Vérifiez l’indicateur D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD dans le membre Caps3 de la structure D3DCAPS9 . Cet indicateur indique si le pilote peut effectuer un mélange alpha lorsque D3DSWAPEFFECT_FLIP ou D3DSWAPEFFECT_DISCARD est utilisé.
  • Les applications utilisant l’effet d’échange en mode bascule (D3DSWAPEFFECT_FLIPEX) doivent appeler PresentEx après un redimensionnement de fenêtre ou un changement de région pour s’assurer que le contenu d’affichage est mis à jour.

Une fenêtre invisible ne peut pas recevoir d’événements en mode utilisateur ; en outre, une fenêtre plein écran invisible interfère avec la présentation de la fenêtre en mode fenêtré d’une autre application. Par conséquent, chaque application doit s’assurer qu’une fenêtre d’appareil est visible lorsqu’une chaîne d’échange est présentée en mode plein écran.

Spécifications

Condition requise Valeur
En-tête
D3D9Types.h

Voir aussi

Énumérations Direct3D

IDirect3DDevice9::Reset