https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation#page_Semaphores


여기서 이 코드 보고 생긴 의문인데,

제 생각에는 코드에 문제가 있을 것 같습니다.


present queue가 만약 graphic queue 보다 느리게 처리 된다면 처리가 안되는 아이템이 큐에 쌓이게 될 것 같습니다. 


그림으로 설명하는 다음과 같습니다.


mainloop가 첫 iteration을 끝냈을때 queue의 상황이 다음과 같다고 칩시다. 첫 루프에서 graphic queue, present queue에 각각 아이템 하나씩 넣은 상태이고, 각 queue는 아직 아무것도 처리 안한 상태입니다.



그리고 queue에서 아무것도 처리 안된 상태에서 2번째 iteration으로 넘어가면, fence 때문에 블락된 상태로 mainloop는 멈춥니다.  아래처럼 변한게 없죠.




이떄 graphic queue에 있던 submit info가 처리되면, main loop의 블락이 풀립니다. 그리고 queue에는 각각 아이템이 하나씩 또 추가되죠.

근데, Present queue가 느려서 아직도 아무 아이템도 처리하지 않았다고 칩시다. 그럼 아래와 같은 구조가 됩니다.




Render semaphore가 시그널 된 상태라서, 이제 Present 큐는 아이템 하나를 처리할 수 있습니다.

근데 만약 Queue가 뭘 처리하기 전에, Graphics 큐가 더 빨리 Submit info 2를 처리한다면?


Render semaphore는 이미 시그널이 된 상태인데, 또 시그널을 받습니다. 




그리고 Present Queue는 위와 같은 상태가 됩니다. 

여기서 present info1을 처리한다면, Render Semaphore는 unsingaled 상태가 되겠죠.

present info 2는 처리되지 않습니다. 


이게 반복해서 일어날 수 있고, 그러면 Present Queue에는 처리되지 않은 아이템이 쌓이게 됩니다.


튜토리얼 코드에서 이것을 막기 위해 뭘하는지 찾을 수 없었는데, 혹시 제가 모르는 뭔가가 있어서 위와 같은 문제는 안 일어나게 됩니까?

아니면 제가 그냥 튜토리얼 코드에 있는 문제점 하나를 찾은건가요?