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
-
控制CPU端内存分配,如 内存分配 一章详述。pAllocator
-
指向一个pView
handle,它就是生成并被返回的缓冲区视图对象。VkBufferView
Valid Usage (Implicit)
-
must be a validdevice
handleVkDevice
-
must be a pointer to a validpCreateInfo
structureVkBufferViewCreateInfo
- If
is notpAllocator
,NULL
must be a pointer to a validpAllocator
structureVkAllocationCallbacks
-
must be a pointer to apView
handleVkBufferView
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
flag所指定,该flag在VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
返回的vkGetPhysicalDeviceFormatProperties
::VkFormatProperties
中。bufferFeatures
- 若创建
时,buffer
包含usage
,VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
必须: 受统一纹素缓冲区所支持,如被format
flag 所指定,该flag在VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
返回的vkGetPhysicalDeviceFormatProperties
::VkFormatProperties
中。bufferFeatures
- 若
是非稀疏的,那么它 必须: 被完全且连续的绑定到单个buffer
对象。VkDeviceMemory
Valid Usage (Implicit)
-
must besType
VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO
-
must bepNext
NULL
-
must beflags
-
must be a validbuffer
handleVkBuffer
-
must be a validformat
valueVkFormat
可调用如下函数以销毁缓冲区视图:
void vkDestroyBufferView(
VkDevice device,
VkBufferView bufferView,
const VkAllocationCallbacks* pAllocator);
-
是销毁缓冲区视图的逻辑设备。device
-
需要被销毁的缓冲区视图。bufferView
-
控制CPU端内存分配,如 内存分配 一章详述。pAllocator
Valid Usage
- 所有涉及到name:bufferView的被提交的命令,必须: 已经完成执行。
- 若创建
时,提供了bufferView
,那么此处必须提供兼容的 callbacks 。VkAllocationCallbacks
- 若创建
时,没有提供bufferView
,那么VkAllocationCallbacks
必须: 为pAllocator
。NULL
Valid Usage (Implicit)
-
must be a validdevice
handleVkDevice
- If
is notbufferView
,VK_NULL_HANDLE
must be a validbufferView
handleVkBufferView
- If
is notpAllocator
,NULL
must be a pointer to a validpAllocator
structureVkAllocationCallbacks
- If
is a valid handle, it must have been created, allocated, or retrieved frombufferView
device
Host Synchronization
- Host access to
must be externally synchronizedbufferView