Validasi berbasis GPU dan Lapisan Debug Direct3D 12
Topik ini menjelaskan cara memanfaatkan Lapisan Debug Direct3D 12 dengan semaksimum. 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 Windows 10 Pembaruan Hari Jadi.
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 yang di-patch 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 akhirnya 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 DirectX Panel Kontrol (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 direkomendasikan
Umumnya, Anda harus menjalankan kode Anda dengan lapisan debug 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 game 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:
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