Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan cara menggunakan Lapisan Debug Direct3D 12 dengan semaksi daya terbaik. Validasi berbasis GPU (GBV) memungkinkan skenario validasi pada garis waktu GPU yang tidak dimungkinkan selama panggilan API pada CPU. GBV tersedia dimulai dengan Alat Grafis untuk Pembaruan Ulang Tahun Windows 10.
Tujuan validasi berbasis GPU
Validasi berbasis GPU membantu mengidentifikasi kesalahan berikut:
- Penggunaan deskriptor yang tidak diinisialisasi atau tidak kompatibel dalam shader.
- Penggunaan deskriptor yang mereferensikan Sumber Daya yang dihapus dalam shader.
- Validasi status sumber daya yang dipromosikan dan pembusukan status sumber daya.
- Pengindeksan di luar akhir tumpukan deskriptor dalam shader.
- Akses shader sumber daya dalam keadaan tidak kompatibel.
- Penggunaan Sampler yang tidak diinisialisasi atau tidak kompatibel dalam shader.
GBV bekerja dengan membuat shader bertambal yang memiliki validasi ditambahkan langsung ke shader. Shader yang di-patch memeriksa argumen akar dan sumber daya yang diakses selama eksekusi shader dan melaporkan kesalahan ke buffer log. GBV juga menyuntikkan operasi tambahan dan Mengirimkan panggilan ke dalam daftar perintah aplikasi untuk memvalidasi dan melacak perubahan pada status sumber daya yang diberlakukan oleh daftar perintah pada garis waktu GPU.
Karena GBV memerlukan kemampuan untuk menjalankan shader, daftar perintah COPY ditiru oleh daftar perintah COMPUTE. Ini mungkin berpotensi mengubah bagaimana perangkat keras melakukan salinan meskipun hasil akhir tidak boleh diubah. Aplikasi masih akan melihat ini adalah daftar perintah COPY dan lapisan debug akan memvalidasinya.
Mengaktifkan validasi berbasis GPU
GBV dapat dipaksa menggunakan Panel Kontrol DirectX (DXCPL) dengan memaksa pada Lapisan Debug Direct3D 12 dan juga memaksa validasi berbasis GPU (tab baru di panel kontrol). Setelah diaktifkan, GBV akan tetap diaktifkan hingga perangkat Direct3D 12 dirilis. Atau, GBV dapat diaktifkan secara terprogram sebelum membuat Perangkat Direct3D 12:
void EnableShaderBasedValidation()
{
CComPtr<ID3D12Debug> spDebugController0;
CComPtr<ID3D12Debug1> spDebugController1;
VERIFY(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0)));
VERIFY(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1)));
spDebugController1->SetEnableGPUBasedValidation(true);
}
Penggunaan yang disarankan
Umumnya, Anda harus menjalankan kode Anda dengan lapisan debug yang diaktifkan sebagian besar waktu. Namun, GBV dapat memperlambat banyak hal. Pengembang dapat mempertimbangkan untuk mengaktifkan GBV dengan himpunan data yang lebih kecil (misalnya, demo mesin atau tingkat permainan kecil dengan lebih sedikit PSO dan sumber daya) atau selama aplikasi awal memunculkan untuk mengurangi masalah performa. Dengan konten yang lebih besar, pertimbangkan untuk mengaktifkan GBV pada satu atau dua mesin uji dalam lulus uji malam.
Output debug
GBV menghasilkan output debug setelah panggilan ke ExecuteCommandLists menyelesaikan eksekusi pada GPU. Karena ini ada di garis waktu GPU, output debug mungkin asinkron dengan validasi garis waktu CPU lainnya. Pengembang aplikasi mungkin ingin menyuntikkan wait-after-execute mereka sendiri untuk menyinkronkan output debug.
Output GBV mengidentifikasi di mana dalam shader terjadi kesalahan, bersama dengan jumlah gambar/pengiriman saat ini dan identitas objek terkait (misalnya daftar perintah, antrean, PSO, dll).
Contoh pesan debug
Pesan kesalahan berikut menunjukkan bahwa sumber daya bernama "Buffer Warna Utama" diakses dalam shader sebagai sumber daya shader tetapi berada dalam status akses yang tidak diurutkan ketika shader berjalan pada GPU. Informasi tambahan, seperti lokasi di sumber shader, nama daftar perintah dan jumlah Gambar (Gambar Indeks), dan nama objek antarmuka D3D terkait juga disediakan.
D3D12 ERROR: Incompatible resource state: Resource: 0x0000016F61A6EA80:'Main Color Buffer',
Subresource Index: [0],
Descriptor heap index: [0],
Binding Type In Descriptor: SRV,
Resource State: D3D12_RESOURCE_STATE_UNORDERED_ACCESS(0x8),
Shader Stage: PIXEL,
Root Parameter Index: [0],
Draw Index: [0],
Shader Code: E:\FileShare\MiniEngine_GitHub_160128\MiniEngine_GitHub\Core\Shaders\SharpeningUpsamplePS.hlsl(37,2-59),
Asm Instruction Range: [0x138-0x16b],
Asm Operand Index: [3],
Command List: 0x0000016F6F75F740:'CommandList', SRV/UAV/CBV Descriptor Heap: 0x0000016F6F76F280:'Unnamed ID3D12DescriptorHeap Object',
Sampler Descriptor Heap: <not set>,
Pipeline State: 0x0000016F572C89F0:'Unnamed ID3D12PipelineState Object',
[ EXECUTION ERROR #942: GPU_BASED_VALIDATION_INCOMPATIBLE_RESOURCE_STATE]
API Lapisan Debug
Untuk mengaktifkan lapisan debug, panggil EnableDebugLayer.
Untuk mengaktifkan validasi berbasis GPU, panggil SetEnableGPUBasedValidation, dan lihat metode antarmuka berikut:
- ID3D12Debug1
- ID3D12DebugCommandList1
- ID3D12DebugDevice1
Lihat enumerasi dan struktur berikut:
- D3D12_DEBUG_COMMAND_LIST_PARAMETER_TYPE
- D3D12_DEBUG_DEVICE_PARAMETER_TYPE
- D3D12_GPU_BASED_VALIDATION_PIPELINE_STATE_CREATE_FLAGS
- D3D12_GPU_BASED_VALIDATION_SHADER_PATCH_MODE
- D3D12_DEBUG_COMMAND_LIST_GPU_BASED_VALIDATION_SETTINGS
- D3D12_DEBUG_DEVICE_GPU_BASED_VALIDATION_SETTINGS
Topik terkait
- Memahami Lapisan Debug Direct3D 12