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:
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.
VkPipelineCachekullan — derlenmiş pipeline’ları çalıştırmalar arasında kalıcılaştır (vkGetPipelineCacheData→ dosya →pInitialData).- Türet:
basePipelineHandletek 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 ileVkPipelineRenderingCreateInfoformatları. 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.
maxViewportDimensionsvs viewport sayısı: multi-viewportviewportCount> 1 ve birden çoksetViewportister — 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;
VkComputePipelineCreateInfosadece modül + layout. Grafik boilerplate’i kopyalama.