Interrogation d’informations à partir du GPU
Le runtime Direct3D peut nécessiter des informations provenant de l’unité de traitement graphique (GPU) autre qu’une cible de rendu de sortie ou une mémoire tampon de vertex de sortie. Étant donné que le GPU s’exécute en parallèle avec le processeur, le pilote d’affichage en mode utilisateur doit fournir des fonctions qui exposent efficacement la nature asynchrone de la communication avec le GPU.
L’objet de requête est la ressource que le runtime et le pilote utilisent pour la notification asynchrone. Pour créer un objet de requête, le runtime appelle d’abord la fonction CalcPrivateQuerySize du pilote afin que le pilote puisse fournir la taille de la région de mémoire dont le pilote a besoin pour l’objet de requête. Le runtime appelle ensuite la fonction CreateQuery(D3D10) du pilote pour créer l’objet de requête. Dans les appels CalcPrivateQuerySize et CreateQuery(D3D10), le runtime fournit une valeur de type de requête à partir de l’énumération D3D10DDI_QUERY dans le membre Query de la structure D3D10DDIARG_CREATEQUERY vers laquelle pointent les paramètres pCreateQuery .
Chaque objet de requête instance existe dans l’un des trois états suivants : génération, émission et signal. Le runtime appelle la fonction QueryBegin du pilote pour faire passer l’objet de requête à l’état de génération.
Note Tous les types de requête prennent en charge QueryBegin , à l’exception des D3D10DDI_QUERY_EVENT et des D3D10DDI_QUERY_TIMESTAMP. Le concept de bâtiment n’existe pas pour D3D10DDI_QUERY_EVENT et D3D10DDI_QUERY_TIMESTAMP.
Le runtime appelle la fonction QueryEnd du pilote pour faire passer l’objet de requête à l’état émis. Les transitions vers l’état signalé se produisent de manière asynchrone quelque temps plus tard. Le runtime appelle la fonction QueryGetData du pilote pour détecter si la requête est passée à l’état signalé. Si la requête est à l’état signalé, QueryGetData peut transmettre les données qui s’appliquent à la requête dans la région de mémoire vers laquelle pointe le paramètre pData .
Tous les objets de requête du même type sont FIFO (c’est-à-dire, premier entré, premier sorti). Par exemple, tous les objets de requête de type D3D10DDI_QUERY_EVENT terminés dans l’ordre FIFO en fonction de leur ordre émis. Toutefois, les objets de requête de différents types peuvent se terminer ou signaler dans un ordre de chevauchement. Par exemple, une requête de type D3D10DDI_QUERY_EVENT peut se terminer avant une requête de type D3D10DDI_QUERY_OCCLUSION, même si le runtime a émis la requête D3D10DDI_QUERY_EVENT après que le runtime a émis la requête D3D10DDI_QUERY_OCCLUSION.
Lorsque le runtime n’a plus besoin de l’objet de requête, le runtime libère la région de mémoire que le runtime a allouée précédemment pour l’objet et appelle la fonction DestroyQuery(D3D10) du pilote pour informer le pilote que le pilote ne peut plus accéder à cette région de mémoire.