Mémoires tampons d’index (Direct3D 9)

Les mémoires tampons d’index, représentées par l’interface IDirect3DIndexBuffer9, sont des mémoires tampons qui contiennent des données d’index. Les données d’index, ou indices, sont des décalages d’entiers dans des mémoires tampon de vertex et sont utilisées pour afficher des primitives à l’aide de la méthode IDirect3DDevice9::D rawIndexedPrimitive.

Une mémoire tampon de vertex comporte des vertex. Vous pouvez donc dessiner une mémoire tampon de vertex avec ou sans primitives indexées. Toutefois, puisqu’une mémoire tampon d’index comporte des index, vous ne pouvez pas utiliser une mémoire de ce type sans sa mémoire tampon de vertex correspondante. (Remarque : IDirect3DDevice9::DrawIndexedPrimitiveUP et IDirect3DDevice9::DrawPrimitiveUP sont les seules méthodes de dessin qui dessinent sans mémoire tampon d'index ou de vertex.)

Description d’une mémoire tampon d’index

Une mémoire tampon d’index est décrite en fonction de ses fonctionnalités. Où se trouve-t-elle dans la mémoire ? Prend-elle en charge la lecture et l’écriture ? Combien d’index peut-elle contenir ? De quel type ? Ces caractéristiques sont conservées dans une structure D3DINDEXBUFFER_DESC..

Les descriptions de mémoires tampons d’index indiquent à votre application comment une mémoire tampon existante a été créée. Vous fournissez une structure de description vide, que le système renseigne avec les fonctionnalités d’une mémoire tampon d’index préalablement créée.

  • Le membre Format décrit le format de surface des données de mémoire tampon d’index.
  • Le Type identifie le type de ressource de la mémoire tampon d’index.
  • Le membre de la structure d’Utilisation contient des indicateurs de capacité généraux. L’indicateur D3DUSAGE_SOFTWAREPROCESSING indique que la mémoire tampon d’index doit être utilisée avec le traitement de vertex logiciel. La présence de l’indicateur D3DUSAGE_WRITEONLY dans Utilisation indique que la mémoire tampon d’index est utilisée uniquement pour les opérations d’écriture. Cela permet au pilote de placer les données d’index dans le meilleur emplacement de mémoire pour permettre un traitement et un rendu rapides. Si l’indicateur D3DUSAGE_WRITEONLY n’est pas utilisé, le pilote est moins susceptible de placer les données dans un emplacement inefficace pour les opérations de lecture. Cela sacrifie une certaine vitesse de traitement et de rendu. Si cet indicateur n’est pas spécifié, on suppose alors que les applications effectuent des opérations de lecture et d’écriture sur les données de la mémoire tampon d’index.
  • Le pool spécifie la classe de mémoire allouée pour la mémoire tampon d’index. L’indicateur D3DPOOL_SYSTEMMEM indique que le système a créé la mémoire tampon d’index dans la mémoire système.
  • Le membre « Size » stocke la taille, en octets, des données de tampon de sommets.
  • Le dernier paramètre pSharedHandle n’est pas utilisé. Définissez-le sur NULL.

Conditions requises pour le traitement des index

Les performances des opérations de traitement des index dépendent grandement de l’emplacement d’hébergement de la mémoire tampon de l’index dans la mémoire et du type de périphérique de rendu utilisé. Les applications contrôlent l’allocation de mémoire des mémoires tampons d’index lors de leur création. Lorsque l’indicateur de mémoire D3DPOOL_SYSTEMMEM est défini, la mémoire tampon d’index est créée dans la mémoire système. Lorsque l’indicateur de mémoire D3DPOOL_DEFAULT est utilisé, le pilote du périphérique détermine où la mémoire de la mémoire tampon d’index est la mieux allouée, souvent appelée mémoire optimisée pour l'espace disque. La mémoire optimisée pour l'espace disque peut être la mémoire vidéo locale, la mémoire vidéo non locale ou la mémoire système.

La définition de l’indicateur de comportement D3DUSAGE_SOFTWAREPROCESSING lors de l’appel de la méthode IDirect3DDevice9::CreateIndexBuffer spécifie que la mémoire tampon d’index doit être utilisée avec le traitement de vertex logiciel. Cet indicateur est requis dans le traitement de vertex en mode mixte (D3DCREATE_MIXED_VERTEXPROCESSING) lorsque le traitement de vertex logiciel est utilisé.

L’application peut écrire directement des index dans une mémoire tampon d’index allouée dans la mémoire optimisée pour l'espace disque. Cette technique empêche toute opération ultérieure de copie redondante. Cette technique ne fonctionne pas bien si votre application lit les données d’une mémoire tampon d’index, dans la mesure où les opérations de lecture effectuées par l’hôte à partir d’une mémoire optimisée pour l’espace disque peuvent être très lentes. Par conséquent, si votre application doit lire des données durant le traitement ou écrit de manière irrégulière dans la mémoire tampon, une mémoire tampon système s’avère être un choix plus judicieux.

Remarque

Utilisez toujours D3DPOOL_DEFAULT, sauf si vous ne souhaitez pas utiliser de mémoire vidéo ou utiliser de grandes quantités de RAM verrouillée lorsque le pilote place des mémoires tampons de vertex ou d’index dans la mémoire AGP.

 

Créer une mémoire tampon d’index

Créez un objet de mémoire tampon d’index en appelant la méthode IDirect3DDevice9::CreateIndexBuffer, qui prend en charge six paramètres.

  • Le premier paramètre spécifie la longueur de la mémoire tampon d’index, en octets.

  • Le deuxième paramètre est un ensemble de contrôles d’utilisation. Sa valeur détermine entre autres si les vertices référencés par les index sont capables de contenir des informations de découpage. Pour améliorer les performances, spécifiez D3DUSAGE_DONOTCLIP lorsque le découpage n’est pas nécessaire.

    L’indicateur D3DUSAGE_SOFTWAREPROCESSING peut être défini lorsque le traitement de vertex en mode mixte ou logiciel (D3DCREATE_MIXED_VERTEXPROCESSING/D3DCREATE_SOFTWARE_VERTEXPROCESSING) est activé pour ce périphérique. D3DUSAGE_SOFTWAREPROCESSING doit être défini pour que les mémoires tampons soient utilisées avec le traitement de vertex logiciel en mode mixte, mais ne doit pas être défini pour obtenir les performances optimales lors de l’utilisation du traitement d’index matériel en mode mixte (D3DCREATE_HARDWARE_VERTEXPROCESSING). Toutefois, la définition de D3DUSAGE_SOFTWAREPROCESSING est la seule option lorsqu’une seule mémoire tampon est utilisée avec le traitement de vertex matériel et logiciel. D3DUSAGE_SOFTWAREPROCESSING est autorisé pour les appareils mixtes et logiciels.

    Il est possible de forcer les mémoires tampons de vertex et d’index dans la mémoire système en spécifiant D3DPOOL_SYSTEMMEM, même lorsque le traitement d’index est effectué dans le matériel. Il s’agit d’un moyen d'éviter de trop grandes quantités de mémoire verrouillée lorsqu’un pilote place ces mémoires tampons dans la mémoire AGP.

  • Le troisième paramètre est le membre D3DFMT_INDEX16 ou D3DFMT_INDEX32 du type énuméré D3DFORMAT qui spécifie la taille de chaque index.

  • Le quatrième paramètre est membre du type énuméré D3DPOOL qui indique au système l'emplacement de la nouvelle mémoire tampon d'index dans la mémoire.

  • Le dernier paramètre accepté par IDirect3DDevice9::CreateIndexBuffer est l’adresse d’une variable saisie avec un pointeur vers la nouvelle interface IDirect3DIndexBuffer9 de l’objet tampon de vertex, en cas de réussite de l’appel.

L’exemple de code C++ suivant montre le résultat d'une création d’une mémoire tampon d’index en code.

/*
 * For the purposes of this example, the d3dDevice variable is the 
 * address of an IDirect3DDevice9 interface exposed by a 
 * Direct3DDevice object, g_IB is a variable of type 
 * LPDIRECT3DINDEXBUFFER9.
 */

if( FAILED( d3dDevice->CreateIndexBuffer( 16384 *sizeof(WORD),
           D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, 
           &g_IB, NULL ) ) )
    return E_FAIL;

Accéder à une mémoire tampon d’index

Les objets de mémoire tampon d’index permettent aux applications d’accéder directement à la mémoire allouée pour les données d’index. Vous pouvez récupérer un pointeur vers la mémoire tampon d’index en appelant la méthode IDirect3DIndexBuffer9::Lock, puis en accédant à la mémoire pour saisir de nouvelles données d'index dans la mémoire tampon ou pour lire les données qu’elle contient. La méthode « Verrouillage » accepte quatre paramètres. La première, OffsetToLock, est le décalage dans les données d’index. Le deuxième paramètre est la taille des données d'index, mesurée en octets. Le troisième paramètre accepté par la méthode IDirect3DIndexBuffer9::Lock, ppbData, est l’adresse d’un pointeur OCTET rempli d’un pointeur vers les données d’index, en cas de réussite de l’appel.

Le dernier paramètre, « Indicateurs », indique au système comment la mémoire doit être verrouillée. Vous pouvez l’utiliser pour indiquer comment l’application accède aux données dans la mémoire tampon. Spécifiez des constantes pour le paramètre « Indicateurs » en fonction de comment votre application accède aux données d’index. Cela permet au pilote de verrouiller la mémoire et de fournir des performances optimisées en fonction du type d’accès demandé. Utilisez l'indicateur D3DLOCK_READONLY si votre application accède à la mémoire tampon d’index en lecture seule. Cet indicateur permet à Direct3D d’optimiser ses procédures internes pour améliorer l’efficacité, l'accès à la mémoire étant en lecture seule.

Après avoir saisi ou lu les données d’index, appelez la méthode IDirect3DIndexBuffer9::Unlock, comme illustré dans l’exemple de code suivant.

// This code example assumes the m_pIndexBuffer is a variable of type 
// LPDIRECT3DINDEXBUFFER9 and that g_Indices has been properly 
// initialized with indices.

// To fill the index buffer, you must lock the buffer to gain 
// access to the indices. This mechanism is required because index
// buffers may be in device memory.

VOID* pIndices;

if( FAILED( m_pIndexBuffer->Lock( 
      0,                 // Fill from start of the buffer
      sizeof(g_Indices), // Size of the data to load
      BYTE**)&pIndices,  // Returned index data
      0 ) ) )            // Send default flags to the lock
{
    SAFE_RELEASE(m_pIndexBuffer);
    return E_FAIL;
}

memcpy( pIndices, g_Indices, sizeof(g_Indices) );
m_pIndexBuffer->Unlock();

Remarque

Si vous créez une mémoire tampon d’index avec l’indicateur D3DUSAGE_WRITEONLY, n’utilisez pas l’indicateur de verrouillage D3DLOCK_READONLY. Utilisez l'indicateur D3DLOCK_READONLY si votre application accède à la mémoire tampon d’index en lecture seule. Cet indicateur permet à Direct3D d’optimiser ses procédures internes pour améliorer l’efficacité, l'accès à la mémoire étant en lecture seule.

Pour plus d'informations sur l'utilisation de D3DLOCK_DISCARD ou D3DLOCK_NOOVERWRITE pour le paramètre « Indicateurs » de la méthode IDirect3DIndexBuffer9::Lock, reportez-vous à la rubrique « Optimisation des performances (Direct3D 9) ».

 

En C++, comme vous accédez directement à la mémoire allouée pour la mémoire tampon d’index, assurez-vous que votre application accède correctement à la mémoire allouée. Sinon, cette mémoire risque d'être invalide. Utilisez la progression du format d’index utilisé par votre application pour passer d’un index dans la mémoire tampon allouée à un autre.

Récupérez des informations sur une mémoire tampon d’index en appelant la méthode IDirect3DIndexBuffer9::GetDesc.. Cette méthode saisit les informations sur la mémoire tampon d'index dans la structure D3DINDEXBUFFER_DESC.

Ressources Direct3D

Rendu à partir de mémoires tampons de vertex et d’index (Direct3D 9)

Mémoires tampons de vertex (Direct3D 9)