Consultas

En Direct3D 12, las consultas se agrupan en matrices de consultas denominadas montón de consultas. Un montón de consultas tiene un tipo que define los tipos válidos de consultas que se pueden usar con ese montón.

Diferencias en las consultas de Direct3D 11 a Direct3D 12

Los siguientes tipos de consulta ya no están presentes en Direct3D 12, su funcionalidad se incorpora a otros procesos:

  • Consultas de eventos: los eventos funcionalmente ahora se controlan mediante barreras.
  • Consultas de marca de tiempo separados: los relojes de GPU se pueden establecer en un estado estable en Direct3D 12 (consulta la sección Tiempo ). Las comparaciones de reloj de GPU no son significativas si la GPU está inactiva en absoluto entre las marcas de tiempo (conocidas como una consulta desenlazada). Con la potencia estable dos consultas de marca de tiempo emitidas desde listas de comandos diferentes son comparables de forma confiable. Dos marcas de tiempo dentro de la misma lista de comandos siempre son comparables de forma confiable.
  • Consultas de estadísticas de salida de flujo: en Direct3D 12 no hay ninguna consulta de desbordamiento de salida de flujo (SO) única para todos los flujos de salida. Las aplicaciones deben emitir varias consultas de flujo único y, a continuación, correlacionar los resultados.
  • Predicado de estadísticas de salida de flujo y consultas de predicado de oclusión : consultas (que escriben en memoria) y Predicación (que lee de la memoria) ya no están acopladas, por lo que estos tipos de consulta no son necesarios.

Se ha agregado un nuevo tipo de consulta de oclusión binaria a Direct3D 12. Esto permite estrategias de predicado que solo importan si un objeto estaba totalmente ocluido o no (en lugar de cuántos píxeles se ocluyeron) para indicar esto al dispositivo, lo que podría ser capaz de realizar las consultas de forma más eficaz.

Montones de consultas

Las consultas pueden ser de uno de varios tipos (D3D12_QUERY_HEAP_TYPE) y se agrupan en montones de consultas antes de enviarse a la GPU.

Hay disponible un nuevo tipo de consulta D3D12_QUERY_TYPE_BINARY_OCCLUSION y actúa como D3D12_QUERY_TYPE_OCCLUSION, salvo que devuelve un resultado binario 0/1: 0 indica que no se han superado muestras pruebas de profundidad y galería de símbolos, 1 indica que al menos una muestra pasó pruebas de profundidad y galería de símbolos. Esto permite que las consultas de oclusión no interfieran con ninguna optimización del rendimiento de GPU asociada a pruebas de profundidad o galería de símbolos.

Creación de montones de consultas

Las API pertinentes para crear montones de consulta son la enumeración D3D12_QUERY_HEAP_TYPE, la estructura D3D12_QUERY_HEAP_DESC y el método CreateQueryHeap.

El entorno de ejecución principal validará que el tipo de montón de consultas es un miembro válido de la enumeración D3D12_HEAP_TYPE y que el recuento es mayor que 0.

Cada elemento de consulta individual dentro de un montón de consultas se puede iniciar y detener por separado.

Las API para usar los montones de consulta son la enumeración D3D12_QUERY_TYPE y los métodos BeginQuery y EndQuery.

D3D12_QUERY_TYPE_TIMESTAMP es la única consulta que solo admite EndQuery . Todos los demás tipos de consulta requieren BeginQuery y EndQuery.

La capa de depuración validará lo siguiente:

  • No es válido iniciar una consulta de marca de tiempo; solo se puede finalizar.
  • No es válido iniciar una consulta dos veces sin terminarla (para un elemento determinado). En el caso de las consultas que requieren inicio y finalización, no es válido finalizar una consulta antes del inicio correspondiente (para un elemento determinado).
  • El tipo de consulta pasado a BeginQuery debe coincidir con el tipo de consulta pasado a EndQuery.

El entorno de ejecución principal validará lo siguiente:

  • No se puede llamar a BeginQuery en una consulta de marca de tiempo.

  • Para los tipos de consulta que admiten BeginQuery y EndQuery (todos excepto la marca de tiempo), una consulta de un elemento determinado no debe abarcar los límites de la lista de comandos.

  • ElementIndex debe estar dentro del intervalo.

  • El tipo de consulta es un miembro válido de la enumeración D3D12_QUERY_TYPE .

  • El tipo de consulta debe ser compatible con el montón de consultas. En la tabla siguiente se muestra el tipo de montón de consultas necesario para cada tipo de consulta:

    Tipo de consulta Tipo de montón de consultas
    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

     

  • El tipo de consulta es compatible con el tipo de lista de comandos. En la tabla siguiente se muestran las consultas que se admiten en qué tipos de lista de comandos.

    Tipo de consulta Tipos de lista de comandos admitidos
    D3D12_QUERY_TYPE_OCCLUSION Directo
    D3D12_QUERY_TYPE_BINARY_OCCLUSION Directo
    D3D12_QUERY_TYPE_TIMESTAMP Direct, Compute y, opcionalmente, Copy
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Directo

     

Extracción de datos de una consulta

La manera de extraer datos de una consulta es usar el método ResolveQueryData . ResolveQueryData funciona con todos los tipos de memoria (si son memoria del sistema o memoria local del dispositivo), pero requiere que el recurso de destino esté en D3D12_RESOURCE_STATE_COPY_DEST.