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
- montón de consultas
- creación de montones de consultas
- extracción de datos de una consulta
- temas relacionados
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 que se incorpora a otros procesos:
- consultas de eventos: el evento funcionalmente ahora se controla mediante barreras.
- consultas de marca de tiempo separados: los relojes de GPU se pueden establecer en un estado estable en Direct3D 12 (consulte la sección de tiempo de). 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 consultas de potencia estable de dos marcas de tiempo emitidas desde diferentes listas de comandos 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 stream: 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 stream y consultas de predicado de oclusión: consultas (que escriben en memoria) y predicación (que lee 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 completamente ocluido (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.
Montónes de consultas
Las consultas pueden ser de uno de varios tipos (D3D12_QUERY_HEAP_TYPE) y se agrupan en montones de consulta 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 excepto que devuelve un resultado binario 0/1: 0 indica que no se han superado pruebas de profundidad y galería de símbolos de muestra, 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 y 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_DESCy el método CreateQueryHeap.
El entorno de ejecución principal validará que el tipo de montón de consulta 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_TYPEy 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 el principio y el final, 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:
BeginQuery no se puede llamar 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 consulta necesario para cada tipo de consulta:
Tipo de consulta Tipo de montón de consulta 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.
Temas relacionados
- contadores y consultas
- consultas de predicación de paso a paso