커멘드 버퍼
- Vulkan에서는 직접적인 함수 호출로 명령을 실행할 수 없음.
- 대신에 커맨드 버퍼에 record 한 후 device queue에 제출 해야함.
- 이는 OpenGl 같은 방식과 다르며, 다음과 같은 장점이 있음.
- 명령을 한 번 기록한 후, 여러 프레임에 재사용 가능
- OpenGL에서는 매 프레임마다 동일한 드로우 명령을 다시 호출해야 하지만, vulkan에서는 record 된 커맨드 버퍼를 재활용 가능
커맨드 버퍼 사용 방식
- 옵션 1 : 프로그램 초기화 시 커맨드 버퍼를 한번만 기록하고 재사용
- 옵션 2 : 매 프레임마다 커맨드 버퍼를 재기록
- ex) frame buffer가 매번 변경될 때
커맨드 버퍼의 라이프 사이클

- 커맨드 버퍼가 디바이스 큐에 제출되면 Pending 상태로 들어감
- Pending 상태에서는 해당 커맨드 버퍼를 다시 제출할 수 없음
- GPU가 작업을 완료하여 커맨드 버퍼가 Complete 상태로 전환되기 전까지 기다려야함.
- 일반적으로, 디바이스의 Graphics Queue 및 Swap Chain 설정에 따라 한번에 제출 가능한 버퍼의 수가 제한됨.
- double buffering 또는 triple buffering.
구현
allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
allocInfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
PRIMARY 는 직접 큐에 제출 가능 하지만 다른 커멘드 버퍼에서 호출될 수 없음
SECONDARY는 직접 큐에 제출 불가능 하지만 다른 커맨드 버퍼에서 호출될 수 있음
