참고블로그 : https://emacser.tistory.com/84
https://github.com/microsoft/DirectX-Graphics-Samples/blob/master/Samples/Desktop/D3D12Multithreading/src/D3D12Multithreading.cpp

위의 블로그에서의 이미지
- 다만 위의 블로그 설명만으로는 이해하기가 힘들어서 직접샘플코드를 찾아봐야만 했다. 샘플코드에서도 API를 직접사용하는게 아니라 개념을 추상화하였기에 추상화된 개념을 어느정도 이해해야만 한다..
최종적으로 내가 샘플코드를 보고 이해한 과정
- 메인스레드가 잠들어있던 WorkerThread를
SetEvent
로 깨워서 Shadow Pass 관련 CommandList를 병렬로 작성하게 한다.
- 메인스레드는 모든 WorkerThread 들이 Shadow Pass Command를 작성할 때까지 기다린다.
- WorkerThread 들이 모두
SetEvent
로 메인 스레드에게 작업이 끝났음을 알리면 메인스레드가 Pre → Mid → ShadowPass Command 순으로 명령어를 제출한다.
- 그동안 WorkerThread들은 병렬로 Scene을 BackBuffer에 그리기위한 Command 작성을 수행한다.
- 메인 스레드가 만약 Shadow Pass CommandList 까지 제출을 끝냈다면, 동기화를 위해 모든 WorkerThread들이 Scene Render 관련 Command 작성을 다 마칠때까지 기다린다.
- WorkerThread 들이 모두
SetEvent
로 메인 스레드에게 작업이 끝났음을 알리면 메인스레드가 ScenePass → Post Command 순으로 명령어를 제출한다.