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