2016-02-22 17 views
7

Vulkan ile gelen API-Samples'da, vkQueueSubmit numaralı çağrıdan sonra veya execute_queue_command_buffer (util_init.hpp) aracılığıyla her zaman vkWaitForFences numaralı telefona bir çağrı geldiği görülmektedir. vkWaitForFences numaralı çağrı, GPU önceki vkQueueSubmit'daki tüm işleri tamamlayana kadar CPU yürütmeyi engeller. Bu, aynı anda (teoride) performansı önemli ölçüde sınırlayan birden fazla çerçevenin aynı anda oluşturulmasına izin vermez.Vulkan örnekleri: vkQueueSubmit her zaman vkWaitForFences tarafından takip ediliyor mu?

Bu çağrılar gerekli mi, eğer öyleyse, yeni bir çerçeve oluşturmadan önce GPU'nun boşta kalması için başka bir yol var mı?

+0

örnek kodu da tek kare ve bekle desen yaptı erken D3D12 numunelerine benzer rolü Var olduğunu. –

+0

Evet, ironik olarak, API'leri tanıtmanın temel amaçlarından biri, daha yüksek bir paralellik elde etmekti ve sonra örnekler, nasıl yapıldığını * göstermiyordu). – MuertoExcobito

cevap

4

Uçuşta birden çok kareye ulaşma şeklimiz, sahip olduğunuz her bir swapchain framebuffer için bir çite sahip olmaktır. Sonra hala vkWaitForFences kullanın ama ((n+1)%num_fences) çit için bekleyin.

burada https://imgtec.com/tools/powervr-early-access-program/

uint32_t current_buffer = num_swaps_ % swapchain_fences.size(); 
vkQueueSubmit(graphics_queue, 1, &submit_info, swapchain_fences[current_buffer]); 
// Wait for a queuesubmit to finish so we can continue rendering if we are n-2 frames behind 
if(num_swaps_ > swapchain_fences.size() - 1) 
{ 
    uint32_t fence_to_wait_for = (num_swaps_ + 1) % swapchain_fences.size(); 
    vkWaitForFences(device, 1, &swapchain_fences[fence_to_wait_for], true, UINT64_MAX); 
    vkResetFences(device, 1, &swapchain_fences[current_buffer]); 
} 
+1

Ancak bunu kodlamak biraz zordur çünkü uçuşta hala çerçeveler tarafından kullanılmakta olan arabellekleri değiştiremezsiniz. –

+0

Evet, biraz daha karmaşık :) GPU'nun kullandığı verileri yazmamak için çok arabalı UBO'lara ihtiyaç duyacaksınız. Ayrıca, boru hattı engelleri hakkında endişelenmeniz gerekir, böylece bir önbellek size eski verileri vermez. Bu bağlantıda her ikisine de örnekler var. – ashleysmithgpu

İlgili konular