LPD3DHAL_DRAWPRIMITIVES2CB fonction de rappel (d3dhal.h)
La fonction D3dDrawPrimitives2 restitue les primitives et retourne l’état de rendu mis à jour.
Syntaxe
LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;
DWORD Lpd3dhalDrawprimitives2cb(
LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}
Paramètres
unnamedParam1
pdp [in]
Pointe vers une structure D3DHAL_DRAWPRIMITIVES2DATA qui contient les informations requises pour que le pilote affiche une ou plusieurs primitives.
Valeur retournée
D3dDrawPrimitives2 retourne l’un des codes de rappel suivants :
Remarques
D3dDrawPrimitives2 doit être implémenté dans les pilotes Microsoft Direct3D.
Le pilote doit effectuer les opérations suivantes :
- Vérifiez que le handle de contexte spécifié par le membre dwhContext de la structure D3DHAL_DRAWPRIMITIVES2DATA au niveau de pdp est valide.
- Vérifiez qu’un retournement vers la surface de dessin associée au contexte n’est pas en cours. Si la surface de dessin est impliquée dans un retournement, le pilote doit définir le membre ddrval de D3DHAL_DRAWPRIMITIVES2DATA sur DDERR_WASSTILLDRAWING et retourner DDHAL_DRIVER_HANDLED.
- Déterminez l’emplacement de la première structure D3DHAL_DP2COMMAND en ajoutant le nombre d’octets dans le membre dwCommandOffset de D3DHAL_DRAWPRIMITIVES2DATA à la mémoire tampon de commandes vers laquelle le membre lpDDCommands de D3DHAL_DRAWPRIMITIVES2DATA pointe.
- Déterminez l’emplacement du premier sommet dans la mémoire tampon de vertex. Cela ne doit être effectué que s’il existe des données dans la mémoire tampon de vertex ; autrement dit, lorsqu’un jeton de commande D3DDP2OP_Xxx est reçu (sauf lorsque le jeton est D3DDP2OP_LINELIST_IMM ou D3DDP2OP_TRIANGLEFAN_IMM). Ces deux opcodes indiquent que les données de vertex sont passées immédiatement dans le flux de commandes, plutôt que dans une mémoire tampon de vertex. Par conséquent, en supposant qu’il existe des données dans la mémoire tampon de vertex, si la mémoire tampon de vertex est en mémoire utilisateur, le premier vertex est dwVertexOffset octets dans la mémoire tampon vers laquelle lpVertices pointe. Sinon, le pilote doit appliquer dwVertexOffset à la mémoire associée à la structure DD_SURFACE_LOCAL vers laquelle pointe lpDDVertex . dwVertexOffset, lpVertices et lpDDVertex sont membres de D3DHAL_DRAWPRIMITIVES2DATA.
- Vérifiez le membre dwVertexType de D3DHAL_DRAWPRIMITIVES2DATA pour vous assurer que le pilote prend en charge le FVF demandé. Le pilote doit échouer l’appel si l’une des conditions suivantes existe :
- Les coordonnées de vertex ne sont pas spécifiées ; autrement dit, si D3DFVF_XYZRHW n’est pas défini.
- Les normales sont spécifiées ; autrement dit, si D3DFVF_NORMAL est défini.
- L’un des D3DFVF_RESERVED x bits réservés est défini.
- Traitez toutes les commandes de la mémoire tampon de commandes de manière séquentielle. Pour chaque structure D3DHAL_DP2COMMAND, le pilote doit effectuer les opérations suivantes :
- Si la commande est D3DDP2OP_RENDERSTATE, traitez les structures wStateCount D3DHAL_DP2RENDERSTATE qui suivent dans la mémoire tampon de commandes, en mettant à jour l’état du pilote pour chaque structure d’état de rendu. Lorsque l’indicateur D3DHALDP2_EXECUTEBUFFER est défini, le pilote doit également refléter le changement d’état dans le tableau vers lequel lpdwRStates pointe. wStateCount et lpdwRStates sont membres de D3DHAL_DRAWPRIMITIVES2DATA.
- Si la commande est D3DDP2OP_TEXTURESTAGESTATE, traitez les structures wStateCount D3DHAL_DP2TEXTURESTAGESTATE qui suivent dans la mémoire tampon de commandes, en mettant à jour l’état de texture du pilote associé à la phase de texture spécifiée pour chaque structure d’état de texture.
- Si la commande est D3DDP2OP_VIEWPORTINFO, traitez la structure D3DHAL_DP2VIEWPORTINFO qui suit dans la mémoire tampon de commande, en mettant à jour les informations de fenêtre d’affichage stockées dans le contexte de rendu interne du pilote.
- Si la commande est D3DDP2OP_WINFO, traitez la structure D3DHAL_DP2WINFO qui suit dans la mémoire tampon de commande, en mettant à jour les informations de mise en mémoire tampon w stockées dans le contexte de rendu interne du pilote.
- Sinon, traitez les structures primitives D3DHAL_DP2Xxx qui suivent la commande D3DDP2OP_Xxx primitive rendering dans la mémoire tampon de commandes.
- Si la commande est inconnue, appelez le rappel D3dParseUnknownCommand du runtime. Le runtime fournit ce rappel au rappel DdGetDriverInfo du pilote avec le GUID GUID_D3DParseUnknownCommandCallback.
Si le pilote doit échouer dans D3dDrawPrimitives2, il doit renseigner le membre dwErrorOffset de D3DHAL_DRAWPRIMITIVES2DATA avec le décalage dans la mémoire tampon de commandes où se trouve la première D3DHAL_DP2COMMAND non gérée.
Les commentaires suivants ne sont pas valides pour les applications écrites à l’aide d’interfaces DirectX 8.0 et ultérieures, car ces applications n’utilisent plus le concept de mémoire tampon de vertex actuelle (autrement dit, les données de vertex ne sont plus transmises via le membre lpDDVertex de D3DHAL_DRAWPRIMITIVES2DATA). Par conséquent, avec ces applications, la fonction D3dDrawPrimitives2 du pilote ne doit jamais entraîner le blocage du rendu à partir d’une mémoire tampon de vertex, même si la mémoire tampon est implicite ou explicite et qu’il existe un verrou en suspens.
Si le pilote est utilisé avec un runtime DirectX 8.0, il doit parfois se bloquer lors du rendu à partir d’une mémoire tampon de vertex actuelle implicite pour éviter les problèmes de synchronisation et l’altération qui en résulte. En outre, le runtime DirectX 8.0 appelle la fonction D3dDrawPrimitives2 du pilote pour effectuer le rendu à partir d’une mémoire tampon de vertex active explicite verrouillée plus souvent que nécessaire pour que les performances soient dégradées. Les solutions de contournement suivantes bloquent un pilote utilisé avec un runtime DirectX 8.0 :
-
Le pilote doit se bloquer lorsqu’il effectue une transition entre le rendu des primitives de mémoire utilisateur (identifiées par D3DHALDP2_USERMEMVERTICES) et le rendu à partir d’une mémoire tampon de vertex actuelle implicite uniquement s’il ne renomme pas la mémoire tampon (ne définit pas D3DHALDP2_SWAPVERTEXBUFFER).
L’exemple suivant montre quand D3dDrawPrimitives2 doit se bloquer sur une mémoire tampon de vertex actuelle implicite :
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, 0); // Stall
L’exemple suivant montre quand D3dDrawPrimitives2 ne doit pas se bloquer sur une mémoire tampon de vertex actuelle implicite :
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is set
Si le runtime définit l’indicateur D3DHALDP2_REQCOMMANDBUFSIZE, le pilote n’est pas tenu de se bloquer. Par coïncidence, le runtime DirectX 8.0 définit également D3DHALDP2_REQCOMMANDBUFSIZE lorsqu’il s’affiche le plus souvent à partir d’une mémoire tampon de vertex actuelle explicite verrouillée. Le pilote peut donc améliorer les performances en ne se décroissant pas lorsqu’il détecte D3DHALDP2_REQCOMMANDBUFSIZE lors du rendu à partir d’une mémoire tampon de vertex actuelle explicite verrouillée.
L’exemple suivant montre quand D3dDrawPrimitives2 doit se bloquer sur une mémoire tampon de vertex active explicite :
DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
L’exemple suivant montre quand D3dDrawPrimitives2 ne doit pas se bloquer sur une mémoire tampon de vertex active explicite :
DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall
Configuration requise
Condition requise Valeur Plateforme cible Desktop (Expérience utilisateur) En-tête d3dhal.h (inclure D3dhal.h) Voir aussi