Allocation de mémoire tampon de vertex et de commandes

Il existe trois types de mémoires tampons utilisées dans Direct3D :

  • Tampons de vertex implicites, qui sont créés pour une utilisation interne uniquement ; c’est-à-dire que les applications ne les connaissent pas. Une mémoire tampon de vertex implicite est toujours créée après la création du contexte et Direct3D y stocke les données de vertex.

  • Tampons de vertex explicites, qui sont créés uniquement en réponse à une demande d’application. Direct3D stocke ensuite les données de vertex dans des tampons de vertex explicites.

  • Mémoires tampons de commande, qui sont créées pour une utilisation interne uniquement ; autrement dit, les applications ne connaissent pas les mémoires tampons de commande. Direct3D stocke les données de commande dans des mémoires tampons de commande.

Les tampons de vertex implicites sont des tampons de vertex spéciaux utilisés en interne par Direct3D pour le traitement par lots. Ils sont créés lors de l’initialisation de l’appareil et peuvent être multibuffers. Ils sont toujours en lecture/écriture et ne doivent donc pas être placés dans la mémoire vidéo (pour Microsoft DirectX 6.0 et les versions ultérieures). Ce type de mémoire tampon est marqué par l’absence des indicateurs DDSCAPS2_VERTEXBUFFER et DDSCAPS2_COMMANDBUFFER.

Les tampons de vertex explicites sont créés et contrôlés par l’application. Ceux-ci ne peuvent pas être multibuffers et ne peuvent pas être placés dans la mémoire vidéo locale ou non locale, sauf si l’indicateur DDSCAPS_WRITEONLY est défini. Les tampons de vertex explicites sont marqués avec DDSCAPS_VERTEXBUFFER.

Les mémoires tampons de commande sont utilisées par Direct3D pour les commandes par lots. Elles peuvent être multibuffer et sont utilisées pour toutes les API, à l’exception des appels d’API TLVERTEX ou de l’API de mémoire tampon d’exécution sans saut. Ce type de mémoire tampon est marqué par l’indicateur DDSCAPS2_COMMANDBUFFER. Ils sont toujours en écriture seule, bien qu’aucun indicateur explicite ne soit défini et qu’ils ne contiennent jamais d’instructions non valides.

Par défaut, le runtime Direct3D alloue toutes ces mémoires tampons. Les tampons de vertex implicites et les tampons de commande sont accessibles via les surfaces auxquelles ils sont associés. Toutes les mémoires tampons sont passées au rappel D3dDrawPrimitives2 du pilote.

Vertex alloués par le pilote et mémoires tampons de commande

Un pilote Direct3D effectue éventuellement l’allocation de vertex et de mémoires tampons de commande en fournissant des fonctions de rappel. Pour fournir ces fonctions de rappel, le pilote Direct3D remplit une structure DD_D3DBUFCALLBACKS et pointe vers lui le membre lpD3DBufCallbacks de la structure DD_HALINFO . DD_HALINFO est retourné par DrvGetDirectDrawInfo en réponse à l’initialisation du composant DirectDraw du pilote. Les rappels signalés dans la structure DD_D3DBUFCALLBACKS sont les suivants :

Ces fonctions sont appelées de la même manière que les rappels DdXxxSurface (tels que DdCanCreateSurface) et uniquement lorsque l’indicateur DDSCAPS_EXECUTEBUFFER est défini. Les indicateurs de création de mémoire tampon sont DDSCAPS_WRITEONLY, DDSCAPS2_VERTEXBUFFER et DDSCAPS2_COMMANDBUFFER.

Les pilotes déterminent le type de mémoire tampon demandée en vérifiant le membre ddsCaps de la structure DD_SURFACE_LOCAL passée au rappel CanCreateExecuteBuffer et CreateExecuteBuffer pour les indicateurs suivants :

  • DDSCAPS_VERTEXBUFFER indique que le pilote doit allouer une mémoire tampon de vertex explicite.

  • DDSCAPS_COMMANDBUFFER indique que le pilote doit allouer une mémoire tampon de commande.

  • Si aucun indicateur n’est défini, le pilote doit allouer une mémoire tampon de vertex implicite.

Le pilote alloue en interne les tampons de vertex et de commande et effectue des cycles dans ces mémoires tampons. Direct3D remplit une paire donnée tandis que le matériel s’affiche de manière asynchrone à partir des autres mémoires tampons mises en file d’attente. Cela est très utile avec l’accès direct à la mémoire (DMA).

Les mémoires tampons d’un jeu multibuffering peuvent être dans différents types de mémoire, c’est-à-dire dans la mémoire système ou vidéo. Lorsque le pilote est appelé pour créer la première mémoire tampon, il crée immédiatement l’ensemble et retourne la première mémoire tampon du jeu sur Direct3D. Le pilote utilise des indicateurs pour spécifier le type de mémoire qu’il a utilisé pour allouer chaque mémoire tampon dans l’ensemble. Le pilote doit retourner une nouvelle mémoire tampon dans la mémoire système pour chaque appel à D3dDrawPrimitives2 si l’indicateur D3DHALDP2_SWAPVERTEXBUFFER ou D3DHALDP2_SWAPCOMMANDBUFFER est défini. Si la mémoire tampon retournée est en mémoire vidéo, l’indicateur D3DHALDP2_VIDMEMVERTEXBUF ou D3DHALDP2_VIDMEMCOMMANDBUF correspondant doit être défini.

Parfois, Direct3D demande la taille minimale pour la mémoire tampon suivante. Si la taille est trop grande, le pilote doit allouer la mémoire tampon dans la mémoire système (une surface de stockage). Si la taille est trop petite, le pilote est autorisé à fournir une mémoire tampon plus grande. Le pilote doit suivre le nombre de mémoires tampons et les types de mémoire qu’ils sont et propre tout à la sortie.