RenderDoc ile Vulkan frame'inde hata ayıklama: yakalama, inceleme, piksel geçmişi

Doğrulama bir frame’in yanlış olduğunu söyler; RenderDoc neden gösterir. Bir frame’i yakalar — her command buffer, her descriptor, her pipeline durumu — ve tam incelemeyle adım adım replay eder. “Bu karo siyah çiziliyor” için, semptomdan suçlu vkCmdDraw‘a en hızlı yoldur.

Yakalama

capture.sh
# renderdoc altında başlat — capture katmanını otomatik enjekte eder:
renderdoccmd capture ./vulkanocam -c test.ini
# veya UI'dan: qrenderdoc → Launch Application → binary seç

# kod-içi tetik (renderdoc.h API):
RENDERDOC_API_1_4_2* rdoc;
dlopen("librenderdoc.so"); // veya env'den al
rdoc->TriggerCapture();    // SONRAKİ frame'i yakala
// sonra .rdc dosyası çalışma dizinine düşer

Sırayla bakılacaklar

workflow.txt
1. Event browser — kötü pikseli üreten draw/dispatch'i bul
2. Pipeline state — shader, descriptor set'ler, render target formatları
3. Texture viewer — girdiler; kaynak doku zaten mi yanlış?
4. Mesh viewer — vertex/attribute düzeni; normal'ler, UV'ler, instance'lar
5. Shader debugger — fragment'ta adım at, register'ları izle
6. Pixel history — bu piksele dokunan her draw, sırayla

Katil özellik: piksel geçmişi

Texture viewer’da bir piksele sağ tıkla → History — RenderDoc, o pikseli gölgelendiren veya discard eden her draw’u primitive ID, draw çağrısı ve öncesi/sonrası değerlerle listeler. “Akış MJPEG iken bu karo yeşil” için, piksel geçmişi yanlış rengin draw’dan mı yoksa sampler’a bağlı eski dokudan mı geldiğini gösterir.

Shader hata ayıklama

Event browser’da draw’u seç → shader sekmesindeki Debug düğmesi — SPIR-V içinde kaynak seviyesi bir stepper alırsınız: değişkenlerin üzerine gelin, dallara girin, UAV/doku okumalarını izleyin. -g ile derlediyseniz orijinal GLSL’inize geri eşler.

Saat kazandıran numaralar

  • Nesnelere isim verin — vkSetDebugUtilsObjectNameEXT, buffer_0x7f…‘yi slot3_y_plane yapar; pipeline’lar ve image’lar event browser’da isimleriyle görünür (debug-utils yazısına bakın).
  • Koddan tetikleyin — interaktif olmayan uygulamalar için ilk N’inci frame’de TriggerCapture(), F12’yi elle zamanlamaktan kurtarır.
  • Yakalama ağır — tüm GPU işini serileştirir, canlıda 8 ms süren frame yakalamada 500 ms sürebilir; zamanlama sonuçları çıkarmayın.
  • Dokuları karşılaştırın — viewer’daki “lock this texture” pini, event’leri kaydırırken aynı kaynağı açık tutar — dokunun ne zaman değiştiğini görmenin hızlı yolu.
  • Erken kaydedin — .rdc dosyaları kendini içerir; bir hata raporuna eklerseniz sürücü mühendisi tam frame’inizi replay edebilir.
checklist.txt
siyah/yanlış renk? → girdide texture viewer + piksel geçmişi
eksik geometri?    → mesh viewer (yanlış vertex stride? discard edildi?)
rastgele çöp?      → pipeline state (başlatılmamış descriptor? yanlış
                     layout?), sonra shader debug
device lost?       → renderdoc'un işi DEĞİL — VK_EXT_device_fault +
                     breadcrumb (DEVICE_LOST yazısına bakın)

Pratik kurallar

  • Headless/offscreen’de de çalışır — renderdoccmd, capture katmanını yükleyen her Vulkan uygulamasını yakalar.
  • Katman otomatik enjekte edilir; VK_LAYER_RENDERDOC_Capture‘ı kendiniz etkinleştirmezsiniz — sadece renderdoccmd altında başlatın.
  • GPU-AV sorunlarında aynı frame’i ikisinde de yakalayın — RenderDoc ne olduğunu gösterir, GPU-AV ihlal eden descriptor’ı adlandırır.

Check out similar posts by category: Vulkan Tools