天天看点

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