Requêtes
Dans Direct3D 12, les requêtes sont regroupées en tableaux de requêtes appelés tas de requêtes. Un tas de requêtes a un type qui définit les types valides de requêtes qui peuvent être utilisés avec ce tas.
- différences dans les requêtes de Direct3D 11 à Direct3D 12
- segments de requête
- création de tas de requêtes
- Extraire des données d’une requête
- rubriques connexes
Différences dans les requêtes de Direct3D 11 à Direct3D 12
Les types de requêtes suivants ne sont plus présents dans Direct3D 12, leur fonctionnalité étant incorporée dans d’autres processus :
- requêtes d’événements : l’événement est désormais géré par des clôtures.
- requêtes d’horodatage disjoint - Les horloges GPU peuvent être définies sur un état stable dans Direct3D 12 (voir la section Minutage). Les comparaisons d’horloge GPU ne sont pas significatives si le GPU est inactif du tout entre les horodatages (appelé requête disjoint). Avec une puissance stable, deux requêtes d’horodatage émises à partir de listes de commandes différentes sont comparables de manière fiable. Deux horodatages dans la même liste de commandes sont toujours comparables de manière fiable.
- requêtes de statistiques de sortie de flux : dans Direct3D 12, il n’existe aucune requête de dépassement de débit de flux unique pour tous les flux de sortie. Les applications doivent émettre plusieurs requêtes à flux unique, puis mettre en corrélation les résultats.
- prédicat de statistiques de sortie de flux et les requêtes de prédicat d’occlusion - requêtes (qui écrivent en mémoire) et de prédication (qui lit à partir de la mémoire) ne sont plus couplées, et ces types de requêtes ne sont donc pas nécessaires.
Un nouveau type de requête d’occlusion binaire a été ajouté à Direct3D 12. Cela permet des stratégies de prédication qui s’occupent uniquement si un objet a été entièrement oblude ou non (plutôt que le nombre de pixels qui ont été obstrués) pour indiquer cela à l’appareil, ce qui peut être en mesure d’effectuer plus efficacement les requêtes.
Segments de requête
Les requêtes peuvent être un des types (D3D12_QUERY_HEAP_TYPE) et sont regroupées dans des tas de requêtes avant d’être envoyées au GPU.
Un nouveau type de requête D3D12_QUERY_TYPE_BINARY_OCCLUSION est disponible et agit comme D3D12_QUERY_TYPE_OCCLUSION, sauf qu’il retourne un résultat binaire 0/1 : 0 indique qu’aucun échantillon n’a passé de profondeur et de gabarit, 1 indique qu’au moins un échantillon a passé la profondeur et le test de gabarit. Cela permet aux requêtes d’occlusion de ne pas interférer avec une optimisation des performances GPU associée aux tests de profondeur/gabarit.
Création de tas de requêtes
Les API pertinentes pour créer des tas de requêtes sont l’énumération D3D12_QUERY_HEAP_TYPE, le struct D3D12_QUERY_HEAP_DESCet la méthode CreateQueryHeap.
Le runtime principal vérifie que le type de tas de requête est un membre valide de l’énumération D3D12_HEAP_TYPE et que le nombre est supérieur à 0.
Chaque élément de requête individuel au sein d’un tas de requêtes peut être démarré et arrêté séparément.
Les API permettant d’utiliser les tas de requêtes sont l’énumération D3D12_QUERY_TYPE, et les méthodes BeginQuery et endQuery.
D3D12_QUERY_TYPE_TIMESTAMP est la seule requête qui prend en charge EndQuery uniquement. Tous les autres types de requêtes nécessitent BeginQuery et EndQuery .
La couche de débogage valide les éléments suivants :
- Il est illégal de commencer une requête d’horodatage : vous ne pouvez la mettre fin qu’à
- Il est illégal de commencer une requête deux fois sans la terminer (pour un élément donné). Pour les requêtes qui nécessitent à la fois le début et la fin, il est illégal de mettre fin à une requête avant le début correspondant (pour un élément donné).
- Le type de requête passé à BeginQuery doit correspondre au type de requête passé à endQuery.
Le runtime principal valide les éléments suivants :
BeginQuery ne peut pas être appelé sur une requête d’horodatage.
Pour les types de requêtes qui prennent en charge BeginQuery et EndQuery (tous à l’exception de timestamp), une requête pour un élément donné ne doit pas couvrir les limites de liste de commandes.
ElementIndex doit se trouver dans la plage.
Le type de requête est un membre valide de l’énumération D3D12_QUERY_TYPE.
Le type de requête doit être compatible avec le tas de requêtes. Le tableau suivant montre le type de tas de requête requis pour chaque type de requête :
Type de requête Type de tas de requête D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS Le type de requête est pris en charge par le type de liste de commandes. Le tableau suivant indique les requêtes prises en charge sur les types de liste de commandes.
Type de requête Types de liste de commandes pris en charge D3D12_QUERY_TYPE_OCCLUSION Direct D3D12_QUERY_TYPE_BINARY_OCCLUSION Direct D3D12_QUERY_TYPE_TIMESTAMP Direct, Compute et éventuellement Copier D3D12_QUERY_TYPE_PIPELINE_STATISTICS Direct D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Direct D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Direct D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Direct D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Direct
Extraction de données à partir d’une requête
La façon d’extraire des données d’une requête consiste à utiliser la méthode ResolveQueryData. ResolveQueryData fonctionne avec tous les types de mémoire (qu’il s’agisse de mémoire système ou de mémoire locale de l’appareil), mais nécessite que la ressource de destination se trouve dans D3D12_RESOURCE_STATE_COPY_DEST.