Bagikan melalui


Kueri

Di Direct3D 12, kueri dikelompokkan ke dalam array kueri yang disebut tumpukan kueri. Timbunan kueri memiliki jenis yang menentukan jenis kueri yang valid yang dapat digunakan dengan tumpuk tersebut.

Perbedaan kueri dari Direct3D 11 ke Direct3D 12

Jenis kueri berikut ini tidak lagi ada di Direct3D 12, fungsionalitasnya dimasukkan ke dalam proses lain:

  • Kueri peristiwa - peristiwa secara fungsional sekarang ditangani oleh pagar.
  • Kueri tanda waktu terputus-putus - Jam GPU dapat diatur ke status stabil di Direct3D 12 (lihat bagian Pengaturan Waktu ). Perbandingan jam GPU tidak bermakna jika GPU diam sama sekali di antara tanda waktu (dikenal sebagai kueri terputus-putus). Dengan daya stabil dua kueri tanda waktu yang dikeluarkan dari daftar perintah yang berbeda dapat dibandingkan. Dua tanda waktu dalam daftar perintah yang sama selalu sebanding.
  • Kueri statistik output aliran - di Direct3D 12 tidak ada kueri luapan output aliran tunggal (SO) untuk semua aliran output. Aplikasi perlu mengeluarkan beberapa kueri aliran tunggal, lalu menghubungkan hasilnya.
  • Statistik output aliran predikat dan kueri predikat oklusi - kueri (yang menulis ke memori) dan Predikasi (yang berbunyi dari memori) tidak lagi digabungkan, sehingga jenis kueri ini tidak diperlukan.

Jenis kueri oklusi biner baru telah ditambahkan ke Direct3D 12. Ini memungkinkan strategi predikasi yang hanya peduli apakah objek sepenuhnya terpaku atau tidak (daripada berapa banyak piksel yang dihilangkan) untuk menunjukkan hal ini ke perangkat, yang mungkin dapat melakukan kueri dengan lebih efisien.

Timbunan Kueri

Kueri dapat berupa satu dari sejumlah jenis (D3D12_QUERY_HEAP_TYPE), dan dikelompokkan ke dalam tumpukan kueri sebelum dikirimkan ke GPU.

Jenis kueri baru D3D12_QUERY_TYPE_BINARY_OCCLUSION tersedia dan bertindak seperti D3D12_QUERY_TYPE_OCCLUSION kecuali bahwa ia mengembalikan hasil biner 0/1: 0 menunjukkan bahwa tidak ada sampel yang lulus pengujian kedalaman dan stensil, 1 menunjukkan bahwa setidaknya satu sampel melewati pengujian kedalaman dan stensil. Ini memungkinkan kueri oklusi tidak mengganggu pengoptimalan performa GPU apa pun yang terkait dengan pengujian kedalaman/stensil.

Membuat timbunan Kueri

API yang relevan dengan pembuatan tumpukan kueri adalah enum D3D12_QUERY_HEAP_TYPE, struct D3D12_QUERY_HEAP_DESC, dan metode CreateQueryHeap.

Runtime inti akan memvalidasi bahwa jenis tumpukan kueri adalah anggota enumerasi D3D12_HEAP_TYPE yang valid, dan jumlahnya lebih besar dari 0.

Setiap elemen kueri individual dalam timbunan kueri dapat dimulai dan dihentikan secara terpisah.

API untuk menggunakan tumpukan kueri adalah D3D12_QUERY_TYPE enum, dan metode BeginQuery dan EndQuery.

D3D12_QUERY_TYPE_TIMESTAMP adalah satu-satunya kueri yang hanya mendukung EndQuery . Semua jenis kueri lainnya memerlukan BeginQuery dan EndQuery.

Lapisan debug akan memvalidasi hal berikut:

  • Adalah ilegal untuk memulai kueri tanda waktu—Anda hanya dapat mengakhirinya
  • Adalah ilegal untuk memulai kueri dua kali tanpa mengakhirinya (untuk elemen tertentu). Untuk kueri yang memerlukan awal dan akhir, kueri tidak sah untuk mengakhiri kueri sebelum dimulai yang sesuai (untuk elemen tertentu).
  • Jenis kueri yang diteruskan ke BeginQuery harus cocok dengan jenis kueri yang diteruskan ke EndQuery.

Runtime inti akan memvalidasi hal berikut:

  • BeginQuery tidak dapat dipanggil pada kueri tanda waktu.

  • Untuk jenis kueri yang mendukung BeginQuery dan EndQuery (semua kecuali untuk tanda waktu), kueri untuk elemen tertentu tidak boleh mencakup batas daftar perintah.

  • ElementIndex harus berada dalam rentang.

  • Jenis kueri adalah anggota enum D3D12_QUERY_TYPE yang valid.

  • Jenis kueri harus kompatibel dengan timbunan kueri. Tabel berikut ini memperlihatkan jenis timbunan kueri yang diperlukan untuk setiap jenis kueri:

    Jenis Kueri Jenis Timbunan Kueri
    D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS

     

  • Jenis kueri didukung oleh jenis daftar perintah. Tabel berikut ini memperlihatkan kueri mana yang didukung di tipe daftar perintah mana.

    Jenis Kueri Tipe Daftar Perintah yang Didukung
    D3D12_QUERY_TYPE_OCCLUSION Langsung
    D3D12_QUERY_TYPE_BINARY_OCCLUSION Langsung
    D3D12_QUERY_TYPE_TIMESTAMP Langsung, Komputasi, dan Secara opsional Salin
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS Langsung
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Langsung
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Langsung
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Langsung
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Langsung

     

Mengekstrak data dari kueri

Cara mengekstrak data dari kueri adalah dengan menggunakan metode ResolveQueryData . ResolveQueryData berfungsi dengan semua jenis memori (baik itu memori sistem atau memori lokal perangkat), tetapi mengharuskan sumber daya tujuan berada di D3D12_RESOURCE_STATE_COPY_DEST.