목차

     

     


     


    인프런 삼각형님의 '삼각형의 실전! Vulkan 중급' 강의를 참고하였습니다. 

    😎 [삼각형의 실전! Vulkan 중급] 강의 들으러 가기!

     

     

     

     

    Vulkan Image Layer


    Vulkan Image Layer을 배우는 주된 목적 중 하나는 Validation Error 해결 때문이다.


     

     

    에러 메시지

     

    에러 메시지

    VUID-vkCmdClearColorImage-imageLayout-01394: imageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,

    VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or

    VK_IMAGE_LAYOUT_GENERAL

     

     

    해결 방안

    Image Layout을 이들 중 하나로 변경한 후에 vkCmdClearColorImage를 호출해야 한다.


     

     

    Layout이란?

     

    Layout의 사전적 의미는 책, 정원, 건물 등의 배치다. 객체들을 공간에 배치하는 방식을 의미한다.

     


     

     

    Vulkan Image layout이란?

     

    Vulkan Image를 효율적으로 처리하기 위해 데이터 메모리 배치하는 방식을 의미한다.

     

    Vulkan Pipeline barrier를 통해 Vulkan Image layout을 변경할 수 있다

     

     

     

    Delta Color Compression(DCC)는 데이터를 저장할 때 색상 변환을 기반으로 데이터를 압축하는 기술이다. DCC를 사용하면 유사한 색상 값을 가진 인접 Pixel들의 데이터를 간결하게 표현함으로써 저장 공간을 절약하고 메모리 대역폭을 줄일 수 있다.

     

    위의 이미지처럼 최적화를 위해서 이미지 데이터를 메모리 배치하는 것을 Image Layout 이라고 한다.

     

     


     Image Layout 을 통해 대역폭줄일 수 있기 때문에 성능 향상을 기대할 수 있다.

     

    용량이 33.5MB인 4K 텍스처가 있다고 가정하자. 이 크기는 GPU의 On-Chip 메모리에 저장하기 너무 크다. 4K 텍스처는 메모리가 너무 크기 때문에 GDR 같은외부 메모리에 저장된다. 해당 텍스처를 사용하여 작업을 처리하려면 GDDR에서 On-Chip 메모리로 복사를 해야 한다. 우측 이미지를 참고하자.

     

    On-Chip 메모리와 Off-Chip 메모리 간의 속도 차이는 최대 100배가 난다. 그렇기 때문에 Off-Chip 메모리로 텍스처로 읽어오는 동안 대기해야 하는 경우가 발생할 수 있다. 이는 메모리 병목 현상으로 이어질 수 있다.

     

    하지만 만약 Delta Color Compression(DCC)로 이미지 데이터가 압축되어 있다면 이러한 대기 시간을 상당히 줄일 수 있다. 결과적으로 메모리 병목 현상을 완화하고 성능을 향상 시킬 수 있다. 

     

     

     

    접근 가능, 접근 불가

     

    특정 하드웨어 구성 요소는 DCC로 압축된 이미지 데이터를 직접 읽을 수 있지만, 다른 구성 요소는 그렇지 못할 수 있다. 

     

    예를 들어, Render Buffer(RB)와 같은 하드웨어는 DCC로 압축된 데이터를 바로 읽을 수 있는 반면,  DMA는 압축된 이미지를 읽을 수 없고 압축되지 않은 이미지 데이터만 처리할수 있다. (해당 예시의 하드웨어 능력은 제조사에 따라 다를 수 있다.)

     

    따라서 각 하드웨어 구성 요소의 요구사항에 맞춰 적절한 Image Layout 으로 전환을 해야 작업의 정확성이 보장 된다. 


     

     

    VkImageLayout 열거형

     

    typedef enum VkImageLayout {
         VK_IMAGE_LAYOUT_UNDEFINED = 0,
         VK_IMAGE_LAYOUT_GENERAL = 1,
         VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,
         VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,
         VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,
         VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,
         VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6,
         VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7,
         VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
         VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000,
         VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001,
         VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000,
         VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001,
         VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002,
         VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003,
         VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
         VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
         VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = 1000164003,
         VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
    } VkImageLayout;

     

       
    VK_IMAGE_LAYOUT_UNDEFINED   데이터를 유지할 필요가 없을 때 사용
      Vulkan Image 생성하면 가지고 있는 Vulkan Image layout다.
    VK_IMAGE_LAYOUT_GENERAL   Vulkan Image가 다양한 용도로 사용될 때 사용
      최적화 되지 않는다. (= DCC와 같은 압축 기법이 적용되지 않은 상태 )
    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL   Vulkan Image가 렌더링 타겟으로 사용될 때 사용.
     VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL   Vulkan Image가 쉐이더에서 읽기 전용으로 사용될 때 사용
    VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL   Vulkan Image가 데이터 전송 소스로 사용될 때 사용
    VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL   Vulkan Image가 데이터 전송 타겟으로 사용될 때 사용

     

     


     

     

    '⭐ Vulkan & CMake > Vulkan' 카테고리의 다른 글

    [Vulkan] Color Animation, Vulkan Semaphore  (0) 2024.08.14
    [Vulkan] Vulkan Pipeline barrier  (0) 2024.08.08
    [Vulkan] Vulkan Fence  (0) 2024.08.07
    [Vulkan] 화면에 색 출력하기  (0) 2024.08.07
    [Vulkan] Command buffer  (0) 2024.08.06