Consultando informações da GPU
O runtime do Direct3D pode exigir informações da GPU (unidade de processamento gráfico) que não seja um destino de renderização de saída ou um buffer de vértice de saída. Como a GPU é executada em paralelo com a CPU, o driver de exibição do modo de usuário deve fornecer funções que expõem a natureza assíncrona da comunicação com a GPU com eficiência.
O objeto de consulta é o recurso que o runtime e o driver usam para notificação assíncrona. Para criar um objeto de consulta, o runtime primeiro chama a função CalcPrivateQuerySize do driver para que o driver possa fornecer o tamanho da região de memória necessária pelo driver para o objeto de consulta. Em seguida, o runtime chama a função CreateQuery(D3D10) do driver para criar o objeto de consulta. Nas chamadas CalcPrivateQuerySize e CreateQuery(D3D10), o runtime fornece um valor de tipo de consulta da enumeração D3D10DDI_QUERY no membro Query da estrutura D3D10DDIARG_CREATEQUERY para a qual os parâmetros pCreateQuery apontam.
Cada instância de objeto de consulta existe em um dos três estados: compilação, emissão e sinalização. O runtime chama a função QueryBegin do driver para fazer a transição do objeto de consulta para o estado de construção.
Nota Todos os tipos de consulta dão suporte a QueryBegin , exceto para D3D10DDI_QUERY_EVENT e D3D10DDI_QUERY_TIMESTAMP. O conceito de construção não existe para D3D10DDI_QUERY_EVENT e D3D10DDI_QUERY_TIMESTAMP.
O runtime chama a função QueryEnd do driver para fazer a transição do objeto de consulta para o estado emitido. As transições para o estado sinalizado ocorrem de forma assíncrona algum tempo depois. O runtime chama a função QueryGetData do driver para detectar se a consulta fez a transição para o estado sinalizado. Se a consulta estiver no estado sinalizado, QueryGetData poderá transmitir dados que se aplicam à consulta na região de memória para a qual o parâmetro pData aponta.
Todos os objetos de consulta do mesmo tipo são FIFO (ou seja, primeiro a entrar, primeiro a sair). Por exemplo, todos os objetos de consulta do tipo D3D10DDI_QUERY_EVENT concluídos na ordem FIFO com base na ordem emitida. No entanto, objetos de consulta de diferentes tipos podem ser concluídos ou sinalizar em uma ordem sobreposta. Por exemplo, uma consulta do tipo D3D10DDI_QUERY_EVENT pode ser concluída antes de uma consulta do tipo D3D10DDI_QUERY_OCCLUSION, mesmo que o runtime tenha emitido a consulta D3D10DDI_QUERY_EVENT depois que o runtime emitiu a consulta D3D10DDI_QUERY_OCCLUSION.
Quando o runtime não exige mais o objeto de consulta, o runtime libera a região de memória que o runtime alocava anteriormente para o objeto e chama a função DestroyQuery(D3D10) do driver para notificar o driver de que o driver não pode mais acessar essa região de memória.