ID3D12GraphicsCommandList::ResolveQueryData 方法 (d3d12.h)

从查询中提取数据。 ResolveQueryData 可使用所有堆类型(默认、上传和回读)。

语法

void ResolveQueryData(
  [in] ID3D12QueryHeap  *pQueryHeap,
  [in] D3D12_QUERY_TYPE Type,
  [in] UINT             StartIndex,
  [in] UINT             NumQueries,
  [in] ID3D12Resource   *pDestinationBuffer,
  [in] UINT64           AlignedDestinationBufferOffset
);

参数

[in] pQueryHeap

类型: ID3D12QueryHeap*

指定要解析的查询的 ID3D12QueryHeap

[in] Type

类型: D3D12_QUERY_TYPE

指定查询的类型,即 D3D12_QUERY_TYPE的一个成员。

[in] StartIndex

类型: UINT

指定要解析的第一个查询的索引。

[in] NumQueries

类型: UINT

指定要解析的查询数。

[in] pDestinationBuffer

类型: ID3D12Resource*

指定 ID3D12Resource 目标缓冲区,该缓冲区必须处于 D3D12_RESOURCE_STATE_COPY_DEST状态。

[in] AlignedDestinationBufferOffset

类型: UINT64

指定目标缓冲区的对齐偏移量。 必须是 8 个字节的倍数。

返回值

备注

ResolveQueryData 执行批处理操作,将查询数据写入目标缓冲区。 查询数据连续写入目标缓冲区和 参数。

ResolveQueryData 将应用程序不透明查询堆中的应用程序不透明查询数据转换为应用程序可用与适配器无关的值。 解析堆中尚未完成 (因此已为其调用 ID3D12GraphicsCommandList::BeginQuery 的查询,但不调用 ID3D12GraphicsCommandList::EndQuery) ,或已未初始化的查询会导致未定义的行为,并可能导致设备挂起或删除。 如果调试层检测到应用程序已解析不完整或未初始化的查询,则会发出错误。

注意

解析不完整或未初始化的查询是未定义的行为,因为驱动程序可能会在未解析的查询中内部存储 GPUVA 或其他数据。 因此,尝试解析对未初始化数据的这些查询可能会导致页面错误或设备挂起。 早期版本的调试层未验证此行为。

二进制封闭查询为每个查询写入 64 位。 最小有效位为 0, (对象完全被遮挡) 或 1 (至少 1 个对象样本将被绘制) 。 余下的位均为 0。 封闭查询为每个查询写入 64 位。 该值是通过测试的样本数。 时间戳查询为每个查询写入 64 位,这是一个时钟周期值,必须与相应的命令队列频率进行比较, (请参阅 计时) 。

管道统计信息查询为每个查询编写 D3D12_QUERY_DATA_PIPELINE_STATISTICS 结构。 所有流式输出统计信息查询为每个查询编写 D3D12_QUERY_DATA_SO_STATISTICS 结构。

核心运行时将验证以下内容。

  • StartIndexNumQueries 都在范围内。
  • AlignedDestinationBufferOffset 是 8 个字节的倍数。
  • DestinationBuffer 是一个缓冲区。
  • 写入的数据不会溢出输出缓冲区。
  • 命令列表类型必须支持查询类型。
  • 查询堆必须支持查询类型。

如果目标缓冲区不处于D3D12_RESOURCE_STATE_COPY_DEST状态,或者正在解析的任何查询都没有 调用 ID3D12GraphicsCommandList::EndQuery ,则调试层将发出警告。

示例

D3D12PredicationQueries 示例使用 ID3D12GraphicsCommandList::ResolveQueryData,如下所示:

// 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());
}

请参阅 D3D12 参考中的示例代码

要求

要求
目标平台 Windows
标头 d3d12.h
Library D3d12.lib
DLL D3d12.dll

另请参阅

ID3D12GraphicsCommandList