天天看點

Vulkan Specification(Vulkan規範):第十一章 11.2. 緩沖區視圖

11.2. 緩沖區視圖

一個 緩沖區視圖 代表 連續範圍的一個緩沖區和用來解釋資料的特定格式。 緩沖區視圖被用來讓着色器能通路按照某種格式解釋的緩沖區内容。 為了建立一個有效的緩沖區視圖,緩沖區必須已經被建立好了,且帶有下面的至少一個使用方式标志位:

  • VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT

  • VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT

緩沖區視圖通過 

VkBufferView

 類型handle表示:

VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView)
           

可調用下列指令來建立緩沖區視圖:

VkResult vkCreateBufferView(
    VkDevice                                    device,
    const VkBufferViewCreateInfo*               pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkBufferView*                               pView);
           
  • device

     是建立給緩沖區視圖的邏輯裝置。
  • pCreateInfo

     是一個指向 

    VkBufferViewCreateInfo

    類型執行個體的指針,包含用來建立緩沖區對象的參數。
  • pAllocator

     控制CPU端記憶體配置設定,如 記憶體配置設定 一章詳述。
  • pView

     指向一個 

    VkBufferView

     handle,它就是生成并被傳回的緩沖區視圖對象。

Valid Usage (Implicit)

  • device

     must be a valid 

    VkDevice

     handle
  • pCreateInfo

     must be a pointer to a valid 

    VkBufferViewCreateInfo

     structure
  • If 

    pAllocator

     is not 

    NULL

    pAllocator

     must be a pointer to a valid 

    VkAllocationCallbacks

     structure
  • pView

     must be a pointer to a 

    VkBufferView

     handle

Return Codes

Success

  • VK_SUCCESS

Failure

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkBufferViewCreateInfo

 類型定義如下:

typedef struct VkBufferViewCreateInfo {
    VkStructureType            sType;
    const void*                pNext;
    VkBufferViewCreateFlags    flags;
    VkBuffer                   buffer;
    VkFormat                   format;
    VkDeviceSize               offset;
    VkDeviceSize               range;
} VkBufferViewCreateInfo;
           
  • sType

     是資料結構的類型。
  • pNext

     是 

    NULL

     或者一個指向 拓展特定的資料結構的指針。
  • flags

     被保留使用。
  • buffer

     是視圖建立所在的 

    VkBuffer

  • format

     是一個 

    VkFormat

    ,描述了緩沖區中資料元素的格式。
  • offset

     是一個偏移值,位元組機關,從緩沖區的基礎位址開始。着色器中通路緩沖區視圖的位址都是對于起始偏移值的相對值。
  • range

     是緩沖區視圖的位元組大小。 若 

    range

     等于 

    VK_WHOLE_SIZE

    , 從  

    offset

     開始到緩沖區結束的區間就被使用。 若 

    VK_WHOLE_SIZE

     被使用,且緩沖區剩餘的大小并不是 

    format

    格式的元素的大小的倍數, 那麼就會使用最接近的較小的倍數。

Valid Usage

  • offset

     必須: 小于 

    buffer

    的大小
  • offset

     必須: 是 

    VkPhysicalDeviceLimits

    ::

    minTexelBufferOffsetAlignment

    的倍數。
  • 若 

    range

     不等于 

    VK_WHOLE_SIZE

    :
    • range

       必須: 大于 
    • range

       必須: 是  

      format

      格式元素大小的整數倍。
    • range

       除以 

      format

      格式元素的大小, 必須小于等于 

      VkPhysicalDeviceLimits

      ::

      maxTexelBufferElements

    • offset

       與 

      range

       之和,必須: 小于等于 

      buffer

      的大小
  • buffer

     必須: 在被建立時 

    usage

     值包含至少一個  

    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT

     或者

    VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT

  • 若建立 

    buffer

     時 

    usage

     包含 

    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT

    , 

    format

     必須: 被統一紋素緩沖區所支援, 如被 

    VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT

     flag所指定,該flag在

    vkGetPhysicalDeviceFormatProperties

    傳回的

    VkFormatProperties

    ::

    bufferFeatures

    中。
  • 若建立 

    buffer

    時,

    usage

     包含 

    VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT

    , 

    format

     必須: 受統一紋素緩沖區所支援,如被 

    VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT

     flag 所指定,該flag在

    vkGetPhysicalDeviceFormatProperties

    傳回的

    VkFormatProperties

    ::

    bufferFeatures

     中。
  • 若 

    buffer

     是非稀疏的,那麼它 必須: 被完全且連續的綁定到單個

    VkDeviceMemory

     對象。

Valid Usage (Implicit)

  • sType

     must be 

    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO

  • pNext

     must be 

    NULL

  • flags

     must be 
  • buffer

     must be a valid 

    VkBuffer

     handle
  • format

     must be a valid 

    VkFormat

     value

可調用如下函數以銷毀緩沖區視圖:

void vkDestroyBufferView(
    VkDevice                                    device,
    VkBufferView                                bufferView,
    const VkAllocationCallbacks*                pAllocator);
           
  • device

     是銷毀緩沖區視圖的邏輯裝置。
  • bufferView

     需要被銷毀的緩沖區視圖。
  • pAllocator

     控制CPU端記憶體配置設定,如 記憶體配置設定 一章詳述。

Valid Usage

  • 所有涉及到name:bufferView的被送出的指令,必須: 已經完成執行。
  • 若建立

    bufferView

     時,提供了 

    VkAllocationCallbacks

    ,那麼此處必須提供相容的 callbacks 。
  • 若建立

    bufferView

     時,沒有提供 

    VkAllocationCallbacks

    ,那麼 

    pAllocator

     必須: 為 

    NULL

Valid Usage (Implicit)

  • device

     must be a valid 

    VkDevice

     handle
  • If 

    bufferView

     is not 

    VK_NULL_HANDLE

    bufferView

     must be a valid 

    VkBufferView

     handle
  • If 

    pAllocator

     is not 

    NULL

    pAllocator

     must be a pointer to a valid 

    VkAllocationCallbacks

     structure
  • If 

    bufferView

     is a valid handle, it must have been created, allocated, or retrieved from 

    device

Host Synchronization

  • Host access to 

    bufferView

     must be externally synchronized