Método ID3D12GraphicsCommandList::ResolveQueryData (d3d12.h)
Extrae datos de una consulta. ResolveQueryData funciona con todos los tipos de montón (valor predeterminado, carga y lectura diferida).
Sintaxis
void ResolveQueryData(
[in] ID3D12QueryHeap *pQueryHeap,
[in] D3D12_QUERY_TYPE Type,
[in] UINT StartIndex,
[in] UINT NumQueries,
[in] ID3D12Resource *pDestinationBuffer,
[in] UINT64 AlignedDestinationBufferOffset
);
Parámetros
[in] pQueryHeap
Tipo: ID3D12QueryHeap*
Especifica el id3D12QueryHeap que contiene las consultas que se van a resolver.
[in] Type
Tipo: D3D12_QUERY_TYPE
Especifica el tipo de consulta, un miembro de D3D12_QUERY_TYPE.
[in] StartIndex
Tipo: UINT
Especifica un índice de la primera consulta que se va a resolver.
[in] NumQueries
Tipo: UINT
Especifica el número de consultas que se van a resolver.
[in] pDestinationBuffer
Tipo: ID3D12Resource*
Especifica un búfer de destino ID3D12Resource , que debe estar en el estado D3D12_RESOURCE_STATE_COPY_DEST.
[in] AlignedDestinationBufferOffset
Tipo: UINT64
Especifica un desplazamiento de alineación en el búfer de destino. Debe ser un múltiplo de 8 bytes.
Valor devuelto
None
Observaciones
ResolveQueryData realiza una operación por lotes que escribe datos de consulta en un búfer de destino. Los datos de consulta se escriben de forma contigua en el búfer de destino y el parámetro .
ResolveQueryData convierte los datos de consulta opacos de la aplicación en un montón de consultas opacas de aplicación en valores independientes del adaptador que puede usar la aplicación. La resolución de consultas dentro de un montón que no se ha completado (por lo tanto, ha tenido ID3D12GraphicsCommandList::BeginQuery llamado para ellos, pero no ID3D12GraphicsCommandList::EndQuery), o que no se han inicializado, da como resultado un comportamiento indefinido y puede provocar bloqueos o eliminación del dispositivo. La capa de depuración emitirá un error si detecta que una aplicación ha resuelto consultas incompletas o no inicializadas.
Nota
La resolución de consultas incompletas o no inicializadas no está definida porque el controlador puede almacenar internamente GPUVA u otros datos dentro de consultas sin resolver. Por lo tanto, intentar resolver estas consultas en datos no inicializados podría provocar un error de página o un bloqueo del dispositivo. Las versiones anteriores de la capa de depuración no validaron este comportamiento.
Las consultas de oclusión binaria escriben 64 bits por consulta. El bit menos significativo es 0 (el objeto estaba completamente ocluido) o 1 (al menos 1 muestra del objeto se habría dibujado). El resto de los bits son 0. Las consultas de oclusión escriben 64 bits por consulta. El valor es el número de muestras que han superado las pruebas. Las consultas de marca de tiempo escriben 64 bits por consulta, que es un valor de tic que se debe comparar con la frecuencia de la cola de comandos correspondiente (consulte Tiempo).
Las consultas de estadísticas de canalización escriben una estructura de D3D12_QUERY_DATA_PIPELINE_STATISTICS por consulta. Todas las consultas de estadísticas de salida escriben una estructura de D3D12_QUERY_DATA_SO_STATISTICS por consulta.
El entorno de ejecución principal validará lo siguiente.
- StartIndex y NumQueries están dentro del intervalo.
- AlignedDestinationBufferOffset es un múltiplo de 8 bytes.
- DestinationBuffer es un búfer.
- Los datos escritos no desbordarán el búfer de salida.
- El tipo de consulta debe ser compatible con el tipo de lista de comandos.
- El montón de consultas debe admitir el tipo de consulta.
La capa de depuración emitirá una advertencia si el búfer de destino no está en el estado D3D12_RESOURCE_STATE_COPY_DEST o si alguna consulta que se resuelve no ha tenido id3D12GraphicsCommandList::EndQuery llamado en ellos.
Ejemplos
El ejemplo D3D12PredicationQueries usa ID3D12GraphicsCommandList::ResolveQueryData de la siguiente manera:
// Fill the command list with all the render commands and dependent state.
void D3D12PredicationQueries::PopulateCommandList()
{
// Command list allocators can only be reset when the associated
// command lists have finished execution on the GPU; apps should use
// fences to determine GPU execution progress.
ThrowIfFailed(m_commandAllocators[m_frameIndex]->Reset());
// However, when ExecuteCommandList() is called on a particular command
// list, that command list can then be reset at any time and must be before
// re-recording.
ThrowIfFailed(m_commandList->Reset(m_commandAllocators[m_frameIndex].Get(), m_pipelineState.Get()));
// Set necessary state.
m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());
ID3D12DescriptorHeap* ppHeaps[] = { m_cbvHeap.Get() };
m_commandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);
m_commandList->RSSetViewports(1, &m_viewport);
m_commandList->RSSetScissorRects(1, &m_scissorRect);
// Indicate that the back buffer will be used as a render target.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize);
CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, &dsvHandle);
// Record commands.
const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
m_commandList->ClearDepthStencilView(dsvHandle, D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);
// Draw the quads and perform the occlusion query.
{
CD3DX12_GPU_DESCRIPTOR_HANDLE cbvFarQuad(m_cbvHeap->GetGPUDescriptorHandleForHeapStart(), m_frameIndex * CbvCountPerFrame, m_cbvSrvDescriptorSize);
CD3DX12_GPU_DESCRIPTOR_HANDLE cbvNearQuad(cbvFarQuad, m_cbvSrvDescriptorSize);
m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
// Draw the far quad conditionally based on the result of the occlusion query
// from the previous frame.
m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
m_commandList->SetPredication(m_queryResult.Get(), 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
m_commandList->DrawInstanced(4, 1, 0, 0);
// Disable predication and always draw the near quad.
m_commandList->SetPredication(nullptr, 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
m_commandList->SetGraphicsRootDescriptorTable(0, cbvNearQuad);
m_commandList->DrawInstanced(4, 1, 4, 0);
// Run the occlusion query with the bounding box quad.
m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
m_commandList->SetPipelineState(m_queryState.Get());
m_commandList->BeginQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);
m_commandList->DrawInstanced(4, 1, 8, 0);
m_commandList->EndQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);
// Resolve the occlusion query and store the results in the query result buffer
// to be used on the subsequent frame.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_PREDICATION, D3D12_RESOURCE_STATE_COPY_DEST));
m_commandList->ResolveQueryData(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0, 1, m_queryResult.Get(), 0);
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PREDICATION));
}
// Indicate that the back buffer will now be used to present.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
ThrowIfFailed(m_commandList->Close());
}
Vea Código de ejemplo en la referencia de D3D12.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Windows |
Encabezado | d3d12.h |
Library | D3d12.lib |
Archivo DLL | D3d12.dll |