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에는 처리되지 않은 아이템이 쌓이게 됩니다.
튜토리얼 코드에서 이것을 막기 위해 뭘하는지 찾을 수 없었는데, 혹시 제가 모르는 뭔가가 있어서 위와 같은 문제는 안 일어나게 됩니까?
아니면 제가 그냥 튜토리얼 코드에 있는 문제점 하나를 찾은건가요?
스왑체인에서 3개의 이미지 사용하고 그 개수에 맞게 세마포어와 펜스도 생성하는 걸로 알고 있어요
https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Frames_in_flight
에 나오네요 바로 다음 장의 createSyncObjects
그 다음 장도 딱히 위에 제시한 문제를 설명하고 있지 않은데요. 아무래도 본문을 잘 읽지 않은것 같습니다. Present queue가 graphic queue보다 느릴경우 renderingImageSemaphore에 시그널을 여러번 보내는 문제를 해결하고 있지 않아요.
아 제가 질문을 잘못 이해했네요 죄송해요
저렇게 큐를 나누는 게 미련하다고 생각함. 그냥 렌더링용과 프레젠트용 큐를 나눌 필요가 없지. 그리고 D3D12에 입각해서 보자면 스왑체인 만들 때 스왑을 어떻게 하는 지 설정해둔 거에 따라서 처리됨. 불칸 보니까 메일박스라던지 Fifo같은 설정이 있던데.
그래서 프레젠트 중에 렌더링이 일어나서 생기는 게 티어링 현상임
오프스크린 렌더링을 위해서 나눈거 아닌가요?
다시 생각하니까 제대로 알 지 못 하는데 지껄인 것같다. 무시하면 된다
다시 대강 알아봤는데.. 각 iteration 마다 이미지를 vkAcquireNextImageKHR 함수로 presentable image를 얻어요. present되지 않으면 graphics queue에 아이템을 넣을 수 없으니 여러번 보내는 문제가 없는것 아닐까요?
vKAcquireNextImage로 스왑체인 이미지 인덱스를 가져오면 해당 인덱스의 이미지가 presentqueue에서 처리지되기 전까지 vKAcquireNextImage에서 해당 인덱스를 다시 가져오지 않게되는것인가요? 그리고 더이상 가져올 인덱스가 없으면 blocking되고?
찾아보니 말씀하신게 맞는것 같습니다. vkAcquireNextImageKHR로 가져온 이미지의 인덱스가 PresentQueue에서 처리되지 않으면 vkAcquireNextImageKHR에서 블락이 일어나거나, 혹은 vkAcquireNextImageKHR가 받은 시마포에 시그널이 가지 않아서 렌더링이 진행되지 않게 되는듯합니다. 그래서 Present Queue에는 처리 안된는 아이템이 계속 늘어날 수 없고 최대 스왑 이미지의 갯수만큼만 쌓이게 될것 같네요.