Daftar perintah pendukung

Bagian ini hanya berlaku untuk Windows 7 dan yang lebih baru, dan Windows Server 2008 R2 dan versi Windows yang lebih baru.

Runtime Direct3D menggunakan DDI Direct3D 11 berikut untuk daftar perintah:

Semantik untuk fungsi CommandListExecute driver, CalcPrivateCommandListSize, CreateCommandList, dan DestroyCommandList sebagian besar merupakan penjelasan mandiri, berdasarkan fungsi DDI serupa lainnya dan dokumentasi API untuk DDI yang sesuai.

Setelah runtime Direct3D berhasil memanggil fungsi CreateCommandList atau RecycleCreateCommandList driver pada konteks yang ditangguhkan yang ditentukan dalam anggota hDeferredContext dari struktur D3D11DDIARG_CREATECOMMANDLIST yang ditunjuk oleh parameter pCreateCommandList , runtime Direct3D melakukan urutan penghancuran berikut pada konteks yang ditangguhkan:

  1. Runtime Direct3D "menutup" semua handel objek yang ditangguhkan terbuka. Perhatikan bahwa handel ini mungkin masih tampak terikat pada konteks yang ditangguhkan.

  2. Runtime menghancurkan konteks yang ditangguhkan.

Selama panggilan ke CreateCommandList atau RecycleCreateCommandList, setiap panggilan yang dilakukan driver ke fungsi panggilan balik DDI refresh status terus menyamarkan status konteks yang ditangguhkan saat ini. Namun, selama "penutupan" dan penghancuran konteks yang ditangguhkan, setiap panggilan ke DDI refresh status mencerminkan bahwa tidak ada yang terikat (yaitu, segera setelah panggilan ke CreateCommandList atau RecycleCreateCommandList, semuanya secara implisit tidak terikat).

Konteks yang ditangguhkan juga dapat ditinggalkan baik secara eksplisit oleh aplikasi atau karena kondisi kesalahan oleh API atau driver. Untuk kasus seperti itu, runtime Direct3D melakukan urutan berikut:

  1. Runtime Direct3D memanggil fungsi AbandonCommandList driver.

  2. Runtime tidak mengikat menangani dari konteks yang ditangguhkan satu per satu.

  3. Runtime "menutup" semua handel objek yang ditangguhkan terbuka.

  4. Runtime mendaur ulang atau menghancurkan konteks yang ditangguhkan.

Urutan sebelumnya mirip dengan urutan penghancuran konteks langsung. Panggilan ke fungsi AbandonCommandList driver memberikan kesempatan bagi driver untuk menerapkan status ke apa pun yang disukai driver.

Selama panggilan ke fungsi CommandListExecute driver, driver harus mentransisikan status konteks yang ditangguhkan agar setara dengan status ketika perangkat dibuat. Operasi ini juga dikenal sebagai operasi status yang jelas. Selama panggilan ke fungsi CommandListExecute driver, setiap panggilan yang dilakukan driver ke fungsi panggilan balik DDI refresh status masih mencerminkan status apa yang terikat selama panggilan DDI terakhir ke fungsi driver. Selama panggilan DDI berikutnya ke fungsi driver, setiap panggilan yang dilakukan driver ke fungsi panggilan balik DDI refresh status menunjukkan status saat ini benar-benar kosong, yang mencerminkan transisi status implisit dari CommandListExecute. Fakta ini sedikit berbeda dari semantik dan perilaku khas fungsi panggilan balik DDI yang di-refresh status. Jika driver telah memanggil fungsi panggilan balik DDI refresh status selama panggilan ke salah satu fungsi SetShader driver, fungsi panggilan balik DDI refresh status akan ditampilkan sebagai sudah terikat shader baru yang sedang terikat. Divergensi perilaku panggilan balik DDI refresh status ini memberikan lebih banyak fleksibilitas kepada driver untuk mencerminkan status lama selama CommandListExecute.

API Direct3D versi 11 memastikan bahwa tidak ada kueri yang telah dimanipulasi (yaitu, meminta QueryBegin atau QueryEnd memanggilnya) oleh daftar perintah dan hanya "dimulai" oleh konteks yang mencoba menjalankan daftar perintah. API juga memastikan bahwa tidak ada daftar perintah yang merekam peta sumber daya dinamis yang dijalankan pada konteks yang memiliki sumber daya yang sama yang saat ini dipetakan. Sebelum aplikasi memanggil fungsi FinishCommandList , runtime Direct3D memanggil fungsi DDI QueryEnd dan ResourceUnmap driver pada kueri atau sumber daya dinamis apa pun yang masih menyimpan kueri yang dimulai atau sumber daya yang dipetakan terbuka karena FinishCommandList secara implisit menghentikan rentang kueri dan membatalkan peta sumber daya yang dipetakan.

Pengoptimalan untuk Daftar Perintah Kecil

Pengoptimalan daur ulang memori untuk daftar perintah jumlah memori kecil dapat menjadi penting untuk mengurangi ketidakcocokan di antara panggilan fungsi DDI daftar perintah dan untuk mengurangi overhead pemrosesan panggilan yang diperlukan untuk daftar perintah. Overhead pemrosesan yang inherant di setiap daftar perintah signifikan. Pengoptimalan ini dimaksudkan untuk daftar perintah di mana overhead pemrosesan yang diperlukan untuk daftar perintah mendominasi waktu CPU dan ruang memori yang diperlukan untuk daftar perintah. Daftar perintah jumlah memori kecil adalah, misalnya, satu perintah grafis, seperti CopyResource. Jumlah memori yang diperlukan untuk CopyResource adalah dua pointer. Namun, CopyResource masih memerlukan jumlah pemrosesan panggilan daftar perintah yang sama dengan daftar perintah jumlah memori besar. Ketika daftar perintah jumlah memori kecil dihasilkan pada frekuensi tinggi, overhead pemrosesan yang diperlukan untuk runtime untuk memanggil fungsi CreateCommandList, DestroyCommandList, CreateDeferredContext, dan DestroyDevice (D3D10) driver (untuk konteks yang ditangguhkan) menjadi semakin penting. Memori yang dimaksud di sini adalah memori sistem yang menyimpan struktur data driver, yang mencakup memori untuk handel DDI.

Fungsi RecycleCommandList driver harus memberi tahu driver ketika handel driver tidak digunakan (tetapi belum dihapus), dan ketika handel driver yang sebelumnya tidak digunakan digunakan kembali. Pemberitahuan ini berlaku untuk handel command-list dan deferred-context. Satu-satunya memori yang harus didaur ulang driver adalah memori yang dituju oleh DDI. Sementara tujuan dari RecycleCommandList adalah untuk mendaur ulang memori yang terkait dengan handel, untuk efisiensi driver memiliki fleksibilitas penuh untuk memilih dan memilih memori mana yang akan didaur ulang. Driver tidak dapat mengubah ukuran wilayah memori tempat daftar perintah konteks langsung menangani titik. Ukuran ini adalah nilai pengembalian CalcPrivateCommandListSize. Driver juga tidak dapat mengubah ukuran wilayah memori tempat perintah konteks mencantumkan titik handel lokal. Ukuran ini adalah nilai yang dikembalikan dari CalcDeferredContextHandleSize.

Fungsi DDI RecycleCreateCommandList dan RecycleCreateDeferredContext driver harus mengembalikan kode kesalahan kehabisan memori sebagai nilai E_OUTOFMEMORY HRESULT. Fungsi-fungsi ini tidak menyediakan kode kesalahan tersebut melalui panggilan ke fungsi pfnSetErrorCb . Persyaratan driver ini mencegah runtime dari keharusan menggunakan sinkronisasi di seluruh perangkat untuk watch untuk kesalahan konteks segera dari fungsi driver jenis buat ini. Menonton kesalahan ini akan menjadi sumber ketidakcocokan bencana untuk daftar perintah jumlah memori kecil.

Perbedaan di antara fungsi RecycleDestroyCommandList, RecycleCommandList, dan RecycleCreateCommandList driver penting. Fitur-fiturnya meliputi yang berikut ini.

RecycleDestroyCommandList

Runtime memanggil fungsi RecycleDestroyCommandList driver untuk memberi tahu driver bahwa penghancuran ringan diperlukan. Artinya, driver belum boleh membatalkan alokasi memori untuk handel daftar perintah DDI. Fungsi RecycleDestroyCommandList driver berutas bebas seperti fungsi DestroyCommandList driver.

RecycleCommandList

Fungsi RecycleCommandList driver memberi tahu driver bahwa runtime mengintegrasikan handel daftar perintah kembali ke cache konteks yang ditangguhkan. Fungsi ini kemudian memberi driver kesempatan untuk mengintegrasikan memori yang terkait dengan daftar perintah kembali ke cache konteks yang ditangguhkan. Runtime memanggil fungsi RecycleCommandList driver dari utas konteks yang ditangguhkan. Fungsi DDI RecycleCommandList mengurangi kebutuhan driver untuk melakukan sinkronisasi sendiri.

RecycleCreateCommandList

Runtime memanggil fungsi RecycleCreateCommandList driver untuk membuat handel DDI yang sebelumnya tidak digunakan sepenuhnya valid lagi.

Fungsi DDI daur ulang ini memberikan peluang pengoptimalan untuk membantu mendaur ulang sumber daya untuk daftar perintah dalam jumlah memori kecil. Pseudocode berikut menunjukkan implementasi runtime melalui alur panggilan fungsi dari API ke DDI :

::FinishCommandList()
{
  // Empty InterlockedSList, integrating into the cache
  Loop { DC::pfnRecycleCommandList }

  If (Previously Destroyed CommandList Available)
 { IC::pfnRecycleCreateCommandList }
 else
  {
    IC::pfnCalcPrivateCommandListSize
    IC::pfnCreateCommandList
    IC::pfnCalcDeferredContextHandleSize(D3D11DDI_HT_COMMANDLIST)
  }

  Loop { DC::pfnDestroy* (context-local handle destroy) }

  IC::pfnRecycleCreateDeferredContext
}
...
Sporadic: DC::pfnCreate* (context-local open during first-bind per CommandList)

CommandList::Destroy()
{
  // If DC still alive, almost always recycle:
  If (DC still alive)
 { IC::pfnRecycleDestroyCommandList }
  Else
 { IC::pfnDestroyCommandList }
  // Add to InterlockedSList
}

Diagram status berikut menunjukkan validitas handel daftar perintah DDI konteks langsung. Status hijau mewakili handel yang dapat digunakan dengan CommandListExecute.

Diagram yang mengilustrasikan status validitas handel daftar perintah DDI konteks langsung.