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 NULLpAllocator 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 必须: 大于 0

    • 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 0

  • 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_HANDLEbufferView must be a valid VkBufferView handle

  • If pAllocator is not NULLpAllocator 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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值