Tenho um código parecido com este:
vkQueueSubmit(queue, 1, &infoB, fenceB); // ~130 ms to complete
while(1) {
vkWaitForFences(device, 1, &fenceA, true, UINT64_MAX);
vkResetFences(device, 1, &fenceA);
if (vkGetFenceStatus(device, fenceB) == VK_SUCCESS) {
vkResetFences(device, 1, &fenceB);
// do stuff
}
vkQueueSubmit(queue, 1, &infoA, fenceA); // ~1 ms to complete
}
e por algum motivo, depois que fenceA é redefinido, na próxima iteração ele aguarda o trabalho enviado fora do loop.
O que está acontecendo aqui?
Você está enviando para uma única fila. Os estágios do pipeline podem se sobrepor, mas o problema no head do pipe provavelmente será ~serial, mesmo que você não tenha barreiras.
No final da primeira iteração, sua fila se parece com:
Sua primeira iteração ignora a espera pela Cerca B, mas a segunda iteração esperará pela Cerca A e o trabalho para a Informação A provavelmente ficará preso na fila esperando o envio da Informação B ser concluído primeiro.
Se você quiser que as coisas progridam em paralelo para tornar o trabalho lento, precisará usar duas filas, mas mesmo assim poderá ter travamentos, dependendo de quantas filas o hardware pode realmente executar em paralelo.