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 validVkDevice
handle -
pCreateInfo
must be a pointer to a validVkBufferViewCreateInfo
structure -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
pView
must be a pointer to aVkBufferView
handle
Return Codes
-
VK_SUCCESS
-
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 beVK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO
-
pNext
must beNULL
-
flags
must be0
-
buffer
must be a validVkBuffer
handle -
format
must be a validVkFormat
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 validVkDevice
handle -
If
bufferView
is notVK_NULL_HANDLE
,bufferView
must be a validVkBufferView
handle -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
If
bufferView
is a valid handle, it must have been created, allocated, or retrieved fromdevice
Host Synchronization
-
Host access to
bufferView
must be externally synchronized