Vulkan: Pipeline nesnesi nedir ve neden monolitik (dynamic state açıklandı)

Bir VkPipeline, neredeyse tüm GPU sabit-fonksiyon state’inin derlenmiş, değişmez toplamıdır: shader modülleri, vertex input layout, topology, rasterizasyon, depth/stencil, blending, multisampling — ve dynamic rendering ile attachment formatları da. Tek vkCreateGraphicsPipelines çağrısı onu pişirir; vkCmdBindPipeline tüm blob’u etkinleştirir.

Neden monolitik?

OpenGL draw call’lar arasında glDepthFunc‘i çevirmene izin veriyordu ve sürücüler altında sessizce shader’ları yeniden derliyordu. Vulkan’ın cevabı: her şeyi baştan söyle, bir kez derle (shader → SPIR-V → native ISA + state birleştirme) ve state değişikliklerini öngörülebilir ucuz ya da kasıtlı açık yap. Bedeli: pipeline oluşturma pahalı (µs–ms), yani başlangıç/ yükleme maliyetidir, asla frame başına değil.

Kaçış kapağı: dynamic state

VkPipelineDynamicStateCreateInfo‘da bildirilen her şey command buffer başına değişken kalır — setViewport/setScissor evrensel çift:

example.cpp
dyn.setDynamicStates({eViewport, eScissor});
// sonra, frame / pass başına:
c.setViewport(0, {0,0,w,h,0,1});
c.setScissor(0, {{0,0}, ext});

VK_EXT_extended_dynamic_state/dynamic_state3 blend sabitleri, cull mode, depth bias, hatta topology’yi dynamic state’e iter — biraz sürücü optimizasyonu bedeliyle.

Nasıl kullanılır

  • Pipeline’ları başlangıçta inşa et (ya da bir compile thread’in arkasında) — ve gerçek state kombinasyonlarınla anahtarlanmış bir map’te tut.
  • VkPipelineCache kullan — derlenmiş pipeline’ları çalıştırmalar arasında kalıcılaştır (vkGetPipelineCacheData → dosya → pInitialData).
  • Türet: basePipelineHandle tek farklı ayar için derlenmiş bir kardeşi klonlar — nispeten ucuz varyantlar.
  • Graphics pipeline’ları bir “render bağlamı” ister: klasik render pass’lerle uyumlu bir VkRenderPass; dynamic rendering ile VkPipelineRenderingCreateInfo formatları. Uyuşmazlık = draw hiçbir şey yapmaz (bkz. post 2).

NASIL KULLANMAMALI

  • Frame başına pipeline oluşturma — profile ile kaldıramayacağın ilk takılma, render döngüsü içindeki tembel bir vkCreateGraphicsPipelines‘tır. Önceden derle veya cache’le.
  • Draw başına veriyi gömme — blend sabit değişiklikleri, viewport boyutları, line width’ler dynamic state veya push constant’lara aittir, N pipeline klonuna değil.
  • maxViewportDimensions vs viewport sayısı: multi-viewport viewportCount > 1 ve birden çok setViewport ister — yarı kullanılan dizi sessizce viewport 0’a render eder.
  • Sample sayısı attachment ile eşleşmeli — e1 pipeline’ı 4× MSAA render’a (ya da tersi) klasik “MSAA çalışmıyor” bug’ıdır (bkz. post 14).
  • Compute pipeline’ları açıkça farklıdır — tek stage (compute), rasterizasyon state’i yok; VkComputePipelineCreateInfo sadece modül + layout. Grafik boilerplate’i kopyalama.

Check out similar posts by category: C++ Vulkan