Partager via


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.
Le pilote n’a pas besoin de sonder la lisibilité de la mémoire dans laquelle les mémoires tampons de commande et de vertex sont stockées. Toutefois, le pilote doit rester dans les limites spécifiées par les membres dwCommandLength et dwVertexLength de D3DHAL_DRAWPRIMITIVES2DATA.

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.

Note Les commentaires suivants sont valides uniquement pour les applications écrites à l’aide d’interfaces Microsoft DirectX 7.0 et qui communiquent avec les pilotes via les runtimes DirectX 8.0 et DirectX 8.1.

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.1 ou ultérieur, la fonction D3dDrawPrimitives2 du pilote ne doit jamais entraîner le blocage du rendu à partir de la mémoire tampon de vertex actuelle (passée via lpDDVertex) si la mémoire tampon est implicite. Si la mémoire tampon est explicite et qu’un verrou est en attente, le pilote doit se bloquer à la fin de sa fonction D3dDrawPrimitives2 s’il ne renomme pas la mémoire tampon (ne définit pas D3DHALDP2_SWAPVERTEXBUFFER). Si le pilote renomme la mémoire tampon, le pilote ne se bloque pas. Les runtimes DirectX 8.1 et ultérieur appellent la fonction D3dDrawPrimitives2 du pilote pour effectuer le rendu à partir d’une mémoire tampon de vertex explicite verrouillée uniquement lorsque cela est nécessaire afin que les performances soient rarement affectées. Une mémoire tampon de vertex implicite est créée par le rappel CreateD3DBuffer du pilote avec uniquement l’indicateur de DDSCAPS_EXECUTEBUFFER défini. Une mémoire tampon de vertex explicite est créée par le rappel CreateD3DBuffer du pilote avec les indicateurs DDSCAPS_EXECUTEBUFFER et DDSCAPS2_VERTEXBUFFER définis. La mémoire tampon de vertex explicite est verrouillée par le rappel LockD3DBuffer du pilote.

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

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF