void Renderer::WaitForPreviousFrame() {
// 1) directFenceValue를 값 N으로 Signal
directQueue->Signal(directFence.Get(), directFenceValue);
// 2) 바로 N+1로 증가
directFenceValue++;
// 3) GetCompletedValue() < N+1 인지 검사 -> N+1을 기다림
if (directFence->GetCompletedValue() < directFenceValue) {
// 여기서도 N+1에 대해 이벤트 설정
directFence->SetEventOnCompletion(directFenceValue, directFenceEvent);
WaitForSingleObject(directFenceEvent, INFINITE);
}
}
Signal()
에 넘긴 값은 N 인데,
곧바로 directFenceValue++
로 N+1 이 되어 버려서,
이후의 GetCompletedValue() < directFenceValue
와
SetEventOnCompletion(directFenceValue, …)
에 N+1 을 사용하게 되었다.
즉, GPU에게는 “작업이 끝나면 N으로 Signal 을 보내달라” 한다음, CPU는 N+1 이 되기를 기다리는 셈이 되어서 DeadLock (Infinite Blocking) 이 된 것이다.
const UINT64 fenceToWait = directFenceValue;
directQueue->Signal(directFence.Get(), fenceToWait);
if (directFence->GetCompletedValue() < fenceToWait) {
directFence->SetEventOnCompletion(fenceToWait, directFenceEvent);
WaitForSingleObject(directFenceEvent, INFINITE);
}
directFenceValue++;