Partager via


LPD3DHAL_DRAWPRIMITIVES2CB fonction de rappel (d3dhal.h)

La fonction D3dDrawPrimitives 2 affiche 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 de retour

D3dDrawPrimitives2 retourne l’un des codes de rappel suivants :

Remarques

D3dDrawPrimitives2 doivent être implémentés dans les pilotes Microsoft Direct3D.

Le pilote doit effectuer les opérations suivantes :

  • Vérifiez que le handle de contexte spécifié par le dwhContext membre de la structure D3DHAL_DRAWPRIMITIVES2DATA à pdp est valide.
  • Vérifiez qu’un retournement à l’aire 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 de D3DHAL_DP2COMMAND en ajoutant le nombre d’octets dans le membre dwCommandOffset de D3DHAL_DRAWPRIMITIVES2DATA à la mémoire tampon de commande à laquelle le lpDDCommands membre de D3DHAL_DRAWPRIMITIVES2DATA points.
  • 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 commandexxx D3DDP2OP_ 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 vers. Sinon, le pilote doit appliquer dwVertexOffset à la mémoire associée à la structure DD_SURFACE_LOCAL à laquelle lpDVertex points. dwVertexOffset, lpVerticeset 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éfinie.
    • Les normales sont spécifiées ; autrement dit, si D3DFVF_NORMAL est définie.
    • L’un des D3DFVF_RESERVED x bits réservés est défini.
  • Traitez toutes les commandes de la mémoire tampon de commande 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 commande, 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 commande, mettant à jour l’état de texture du pilote associé à l’étape 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, mettant à jour les informations de la 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, 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 de rendu primitiveD3DDP2OP_ Xxx dans la mémoire tampon de commande.
    • Si la commande est inconnue, appelez le rappel D3dParseUnknownCommand runtime. Le runtime fournit ce rappel au rappel DdGetDriverInfo du pilote avec le GUID de GUID_D3DParseUnknownCommandCallback.
Le pilote n’a pas besoin de rechercher 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 le dwCommandLength et membres dwVertexLength de D3DHAL_DRAWPRIMITIVES2DATA.

Si le pilote doit échouer D3dDrawPrimitives2, il doit renseigner le membre dwErrorOffset membre de D3DHAL_DRAWPRIMITIVES2DATA avec le décalage dans la mémoire tampon de commande où le premier D3DHAL_DP2COMMAND non géré est trouvé.

Remarque 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 d’une mémoire tampon de vertex actuelle (autrement dit, les données de vertex ne sont plus transmises via le lpDDVertex membre de D3DHAL_DRAWPRIMITIVES2DATA). Par conséquent, avec ces applications, la fonction D3dDrawPrimitives2 du pilote ne doit jamais provoquer le rendu à partir d’une mémoire tampon de vertex pour bloquer même si la mémoire tampon est implicite ou explicite et qu’il y a un verrou en attente sur celui-ci.

 
Si le pilote est utilisé avec un runtime DirectX 8.1 ou ultérieur, la fonction D3dDrawPrimitives2 du pilote ne doit jamais provoquer le rendu à partir de la mémoire tampon de vertex actuelle (transmise via lpDVertex) pour se bloquer si la mémoire tampon est implicite. Si la mémoire tampon est explicite et qu’il y a un verrou en attente, le pilote doit se bloquer à la fin de son fonction D3dDrawPrimitives2 si elle ne renomme pas la mémoire tampon (ne définit pas D3DHALDP2_SWAPVERTEXBUFFER). Si le pilote renomme la mémoire tampon, le pilote ne bloque pas. Les runtimes DirectX 8.1 et ultérieurs appellent la fonction D3dDrawPrimitives2 du pilote pour effectuer le rendu à partir d’une mémoire tampon de vertex explicite verrouillée uniquement si nécessaire, de sorte que les performances sont 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 de DDSCAPS_EXECUTEBUFFER et de DDSCAPS2_VERTEXBUFFER définis. La mémoire tampon de vertex explicite devient verrouillée par le LockD3DBuffer du pilote rappel.

Si le pilote est utilisé avec un runtime DirectX 8.0, le pilote doit parfois se bloquer lors du rendu à partir d’une mémoire tampon de vertex actuelle implicite pour empêcher les problèmes de synchronisation et la corruption résultante. 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 verrouillée plus souvent, alors vraiment nécessaire afin que les performances soient dégradées. Les solutions suivantes bloquent les solutions de contournement pour un pilote utilisé avec un runtime DirectX 8.0 :

  • Le pilote doit se bloquer lorsqu’il passe entre les primitives de mémoire utilisateur de rendu (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 obligé de se bloquer. Par coïncidence, le runtime DirectX 8.0 définit également D3DHALDP2_REQCOMMANDBUFSIZE lorsqu’il est le plus souvent rendu à partir d’une mémoire tampon de vertex actuelle verrouillée. Le pilote peut donc améliorer les performances en ne décroissant pas lorsqu’il détecte D3DHALDP2_REQCOMMANDBUFSIZE lors du rendu à partir d’une mémoire tampon de vertex active verrouillée.

    L’exemple suivant montre quand D3dDrawPrimitives2 doit se bloquer sur une mémoire tampon de vertex actuelle 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 actuelle 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
    

    Exigences

    Exigence Valeur
    plateforme cible Bureau
    d’en-tête d3dhal.h (include 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