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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk