METODE ID3D12GraphicsCommandList::ResolveQueryData (d3d12.h)

Mengekstrak data dari kueri. ResolveQueryData berfungsi dengan semua jenis heap (default, upload, dan readback).

Sintaks

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

Parameter

[in] pQueryHeap

Jenis: ID3D12QueryHeap*

Menentukan ID3D12QueryHeap yang berisi kueri untuk diselesaikan.

[in] Type

Jenis: D3D12_QUERY_TYPE

Menentukan jenis kueri, satu anggota D3D12_QUERY_TYPE.

[in] StartIndex

Jenis: UINT

Menentukan indeks kueri pertama yang akan diatasi.

[in] NumQueries

Jenis: UINT

Menentukan jumlah kueri yang akan diatasi.

[in] pDestinationBuffer

Jenis: ID3D12Resource*

Menentukan buffer tujuan ID3D12Resource , yang harus dalam status D3D12_RESOURCE_STATE_COPY_DEST.

[in] AlignedDestinationBufferOffset

Jenis: UINT64

Menentukan offset perataan ke dalam buffer tujuan. Harus kelipatan 8 byte.

Mengembalikan nilai

Tidak ada

Keterangan

ResolveQueryData melakukan operasi batch yang menulis data kueri ke dalam buffer tujuan. Data kueri ditulis secara berdampingan dengan buffer tujuan, dan parameter .

ResolveQueryData mengubah data kueri application-opaque dalam tumpukan kueri application-opaque menjadi nilai adapter-agnostic yang dapat digunakan oleh aplikasi Anda. Mengatasi kueri dalam timbunan yang belum selesai (jadi telah memiliki ID3D12GraphicsCommandList::BeginQuery memanggilnya, tetapi tidak ID3D12GraphicsCommandList::EndQuery), atau yang telah tidak diinisialisasi, mengakibatkan perilaku yang tidak terdefinisi dan dapat menyebabkan perangkat macet atau dihapus. Lapisan debug akan memancarkan kesalahan jika mendeteksi aplikasi telah menyelesaikan kueri yang tidak lengkap atau tidak diinisialisasi.

Catatan

Mengatasi kueri yang tidak lengkap atau tidak terinisialisasi adalah perilaku yang tidak terdefinisi karena driver mungkin secara internal menyimpan GPUVA atau data lain dalam kueri yang belum terselesaikan. Sehingga mencoba mengatasi kueri ini pada data yang tidak diinisialisasi dapat menyebabkan kesalahan halaman atau perangkat macet. Versi lama lapisan debug tidak memvalidasi perilaku ini.

Kueri oklusi biner menulis 64-bit per kueri. Bit yang paling tidak signifikan adalah 0 (objek sepenuhnya terakludasi) atau 1 (setidaknya 1 sampel objek akan digambar). Sisa bit adalah 0. Kueri oklusi menulis 64-bit per kueri. Nilainya adalah jumlah sampel yang lulus pengujian. Kueri tanda waktu menulis 64-bit per kueri, yang merupakan nilai centang yang harus dibandingkan dengan frekuensi antrean perintah masing-masing (lihat Pengaturan Waktu).

Kueri statistik alur menulis struktur D3D12_QUERY_DATA_PIPELINE_STATISTICS per kueri. Semua kueri statistik stream-out menulis struktur D3D12_QUERY_DATA_SO_STATISTICS per kueri.

Runtime inti akan memvalidasi hal berikut.

  • StartIndex dan NumQueries berada dalam rentang.
  • AlignedDestinationBufferOffset adalah kelipatan 8 byte.
  • DestinationBuffer adalah buffer.
  • Data tertulis tidak akan meluapkan buffer output.
  • Jenis kueri harus didukung oleh tipe daftar perintah.
  • Jenis kueri harus didukung oleh timbunan kueri.

Lapisan debug akan mengeluarkan peringatan jika buffer tujuan tidak dalam status D3D12_RESOURCE_STATE_COPY_DEST, atau jika ada kueri yang diselesaikan belum memiliki ID3D12GraphicsCommandList::EndQuery yang dipanggil.

Contoh

Sampel D3D12PredicationQueries menggunakan ID3D12GraphicsCommandList::ResolveQueryData sebagai berikut:

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

Lihat Contoh Kode di Referensi D3D12.

Persyaratan

Persyaratan Nilai
Target Platform Windows
Header d3d12.h
Pustaka D3d12.lib
DLL D3d12.dll

Lihat juga

ID3D12GraphicsCommandList