주의 : 이 문서는 초심자 튜토리얼이 아닙니다. 기본 개념 정도는 안다고 가정합니다. 초심자는 [ Vulkan Tutorial ] 이나 [ Vulkan Samples Tutorial ] 을 보면서 같이 보시기 바랍니다.

주의 : 완전히 이해하고 작성한 글이 아니므로 잘못된 내용이 포함되어 있을 수 있습니다.

주의 : 이상하면 참고자료를 확인하세요.

정보 : 본문의 소스 코드는 Vulkan C++ exmaples and demos 를 기반으로 하고 있습니다. 



지난 번에는 메모리 관리의 기본에 대해서 살펴 봤는데, 이 번에는 각 메모리 타입의 용례에 대해서 좀 깊게 살펴 보도록 할 계획입니다.


DEVICE_LOCAL


의심할 바 없는 가장 빠른 메모리를 의미합니다. 디바이스 내에서만 접근할 수 있습니다. 렌더타깃이나 매우 자주 접근해야 하는 리소스들을 위해서 사용됩니다.


[ 2 ] 에 의하면, DEVICE_LOCAL 할당에 실패했을 경우에는 HOST_VISIBLE | HOST_COHERENT 를 통해서 생성하라고 합니다. 이 때 HOST_CACHE 를 사용하지 말라고 하는군요. 그리고 물리 디바이스 메모리 단편화 때문에 할당이 실패하는 것을  막기 위해서는, 게임 내에서 해상도 변경과 같은 이유로 재할당될 때, 전체를 지우고 재할당하는 것을 추천한다고 합니다.


샘플에서 이를 사용하는 경우는 다음과 같았습니다( 아래에서 비트 연산자를 사용한 것은 Buffer Usage 를 표현하기 위함입니다 ).


  • Image.
  • VERTEX | STORAGE | TRANSFER_DST Buffer.
  • VERTEX | TRANSFER_DST Buffer.
  • INDEX | TRANSFER_DST Buffer.
  • INDIRECT | STORAGE | TRANSFER_DST Buffer.
  • STORAGE | TRANSFER_SRC | TRANSER_DST Buffer.


HOST_VISIBLE | HOST_COHERENT


호스트에서 접근할 수 있고, 그 접근이 메모리 일관성을 보장합니다. [ 2 ] 에 의하면 CPU 에서 GPU 로 데이터를 보낼 때 적절하다고 합니다.


샘플에서 이 조합을 사용하는 경우는 다음과 같았습니다( TRANSFER_SRC 버퍼는 일명 "Staging Buffer" 입니다 ).


  • TRANSFER_SRC Buffer.
  • UNIFORM Buffer.
  • STORAGE | TRANSFER_SRC Buffer.
  • VERTEX Buffer.
  • INDEX Buffer.
  • CONDITIONAL_RENDERING Buffer.


버퍼 중 대부분은 이런 조합을 사용합니다. 


예전에는 스키닝 결과에 기반해 파티클을 뿌리기 위해서 CPU 스키닝을 했는데, 이걸 잘 이용하면 이제는 GPU 스키닝의 결과를 받아 올 수 있을 것 같습니다.


HOST_VISIBLE | HOST_CACHED


[ 2 ] 에 의하면, GPU 에서 CPU 로 데이터를 보내는 경우에 이러한 조합을 사용한다고 합니다. 스크린샷을 찍거나 Hierarchical Z-Buffer occlusion 을 위한 피드백을 제공하는 경우에 좋다고 합니다.


샘플에서는 사용하는 경우가 없더군요.


HOST_VISIBLE


특이하게 HOST_VISIBLE 만 사용하는 경우가 있습니다. 명세에 의하면 HOST_CACHED 가 지정되지 않으면 기본적으로 HOST_COHERENT 하다고 이야기하고 있는데( however uncached memory is always host coherent ), 이건 HOST_VISIBLE | HOST_CACHED 와 동급으로 생각해야 하는 것인지 의문이 듭니다.


일단 샘플에서 이 플래그만 사용한 경우는 다음과 같습니다.


  • UINFORM Buffer.
  • TRANSFER_SRC Buffer.
  • VERTEX Buffer.
  • INDEX Buffer.



참고 자료


[ 1 ] Vulkan 1.1 Specification, Khronos.


[ 2 ] Vulkan Device Memory, gpuopen.

+ Recent posts