装好了commandbuffer之后,就是每一帧提交。
但是提交这个就牵扯到同步了,在这之前....先修改renderpass
renderpass的subpass要加一个dependency进行指定
dst要比src大,VK_SUBPASS_EXTERNAL应该是最终绘制到哪
首先是present的内容可能还在vertexShader好像就可以读了,所以要设置一个等画完了才能把内容拿来present
然后就是CPU如果提交比GPU处理的快了,就需要同步一下,不然一直堆积任务,会GG。
这里用了fence和semaphore这两个东西来做这个事情,区别就是前者可以自己手动操作,后者没给你接口。
一个等可用,一个等绘制结束
然后还有双缓冲的时候,那么就需要2个imagevailable和2个renderfinish的
这里解释draw那里教程最后实现的代码,然后dependency代码加在了创建renderpass里。
第一行,等currframe解锁,说明GPU这一次跑完了,然后可以往下了,
然后获取image的index,然后index对应的fence有可能还没解锁,也就是这个图可能还在被使用,再等待,然后拿到这个图了,标记他,给currframe的fence记录在imageinflight里
然后填semaphore,这里用colorattachment作为标识,是用来确保片元着色器都走完了,内容可用了,然后开始写进Image
然后还有一个记录渲染结束的semaphore,用来标识graphicqueue做完事情了,保证image写完成了,能用来present。
然后标记了fence,提交了commandbuffer给graphic queue,然后构建显示部分VkPresentInfoKHR,给他的等待信号就是标记渲染结束那个semaphore,然后传入swapchain,index
执行显示vkQueuePresentKHR(presentQueue, &presentInfo);
然后currframe+1 %缓冲数