Notification asynchrone (Direct3D 9)

Il existe un nombre de requêtes intéressantes sur un pilote qu’une application peut effectuer s’il n’y a pas de coût de performances. Dans Direct3D 7 et Direct3D 8, un mécanisme de requête synchrone, GetInfo, fonctionnait bien pour les statistiques, mais aucune requête critique n’a été ajoutée. Il existe d’autres éléments (comme les clôtures) qui sont intrinsèquement asynchrones. Il s’agit d’une API simple pour effectuer des requêtes synchrones et asynchrones. GetInfo sera mis hors service dans Direct3D 9.

Créez une requête à l’aide de IDirect3DDevice9::CreateQuery. Cette méthode prend un D3DQUERYTYPE, qui définit le type de requête à effectuer et retourne un pointeur vers un objet IDirect3DQuery9 . Si le type de requête n’est pas pris en charge, l’appel retourne une erreur D3DERR_NOTAVAILABLE. À l’aide de l’objet de requête, l’application envoie la requête au runtime à l’aide de IDirect3DQuery9::Issue et interroge la requête status à l’aide de IDirect3DQuery9::GetData. Si le résultat de la requête est disponible, S_OK est retourné ; sinon, S_FALSE est retourné. L’application doit passer une mémoire tampon de taille appropriée pour les résultats de la requête.

L’application dispose d’une option permettant de forcer le runtime à vider la requête sur le pilote à l’aide de D3DGETDATA_FLUSH avec IDirect3DQuery9::GetData. Cela provoque une vidage, ce qui force le pilote à voir la requête. Dans ce cas, D3DERR_DEVICELOST est retourné si l’appareil est perdu.

Toutes les requêtes sont perdues lorsque l’appareil est perdu, l’application doit les recréer. Si l’appareil ne prend pas en charge la requête et que le pQueryID a la valeur NULL, la création de la requête échoue avec D3DERR_INVALIDCALL.

Le tableau suivant résume les informations importantes sur chaque type de requête.

QuertyType Indicateur de problème valide Mémoire tampon GetData Runtime Début implicite de la requête
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Vente au détail/Débogage CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Déboguer uniquement Présent
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Déboguer uniquement Présent
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Vente au détail/Débogage CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Vente au détail/Débogage N/A

 

Champ Indicateurs pour IDirect3DQuery9::Problème :

#define D3DISSUE_END (1 << 0) 
// Tells the runtime to issue the end of a query, changing its state to 
//   "non-signaled" 
 
#define D3DISSUE_BEGIN (1 << 1) // Tells the runtime to issue the 
// beginning of a query. 

Champ Indicateurs pour IDirect3DQuery9::GetData :

 
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush 
// if the query is outstanding.

Conseils de programmation