vkCmdBindVertexBuffers2
Alternatively, to bind vertex buffers, along with their sizes and strides, to a command buffer for use in subsequent drawing commands, call:
void vkCmdBindVertexBuffers2EXT(
VkCommandBuffer commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
const VkBuffer* pBuffers,
const VkDeviceSize* pOffsets,
const VkDeviceSize* pSizes,
const VkDeviceSize* pStrides);
commandBuffer
is the command buffer into which the command is recorded.firstBinding
is the index of the first vertex input binding whose state is updated by the command.bindingCount
is the number of vertex input bindings whose state is updated by the command.pBuffers
is a pointer to an array of buffer handles.pOffsets
is a pointer to an array of buffer offsets.pSizes
isNULL
or a pointer to an array of the size in bytes of vertex data bound frompBuffers
.pStrides
isNULL
or a pointer to an array of buffer strides.
The values taken from elements i of pBuffers
and pOffsets
replace the current state for the vertex input binding
firstBinding
+ i, for i in [0,
bindingCount
).
The vertex input binding is updated to start at the offset indicated by
pOffsets
[i] from the start of the buffer pBuffers
[i].
If pSizes
is not NULL
then pSizes
[i] specifies the bound size
of the vertex buffer starting from the corresponding elements of
pBuffers
[i] plus pOffsets
[i].
If pSizes
[i] is VK_WHOLE_SIZE
then the bound size is from
pBuffers
[i] plus pOffsets
[i] to the end of the buffer
pBuffers
[i].
All vertex input attributes that use each of these bindings will use these
updated addresses in their address calculations for subsequent drawing
commands.
If the nullDescriptor
feature is enabled,
elements of pBuffers
can be VK_NULL_HANDLE, and can be used by
the vertex shader.
If a vertex input attribute is bound to a vertex input binding that is
VK_NULL_HANDLE, the values taken from memory are considered to be
zero, and missing G, B, or A components are
filled with (0,0,1).
This command also dynamically sets the byte
strides between consecutive elements within buffer pBuffers
[i] to the
corresponding pStrides
[i] value
when drawing using shader objects, or
when the graphics pipeline is created with
VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE
set in
VkPipelineDynamicStateCreateInfo::pDynamicStates
.
Otherwise, strides are specified by the
VkVertexInputBindingDescription::stride
values used to create
the currently active pipeline.
If
drawing using shader objects
or if
the bound pipeline state object was also created with the
VK_DYNAMIC_STATE_VERTEX_INPUT_EXT
dynamic state enabled
then vkCmdSetVertexInputEXT can be used instead of
vkCmdBindVertexBuffers2
to set the stride.
Unlike the static state to set the same, pStrides
must be between 0
and the maximum extent of the attributes in the binding.
vkCmdSetVertexInputEXT does not have this restriction so can be used
if other stride values are desired.
Valid Usage
VUID-vkCmdBindVertexBuffers2-firstBinding-03355
firstBinding
must be less than
VkPhysicalDeviceLimits
::maxVertexInputBindings
VUID-vkCmdBindVertexBuffers2-firstBinding-03356
The sum of firstBinding
and bindingCount
must be less than
or equal to VkPhysicalDeviceLimits
::maxVertexInputBindings
VUID-vkCmdBindVertexBuffers2-pOffsets-03357
If pSizes
is not NULL
, all elements of pOffsets
must be
less than the size of the corresponding element in pBuffers
VUID-vkCmdBindVertexBuffers2-pSizes-03358
If pSizes
is not NULL
, all elements of pOffsets
plus
pSizes
, where pSizes
is not VK_WHOLE_SIZE
,
must be less than or equal to the size of the corresponding element in
pBuffers
VUID-vkCmdBindVertexBuffers2-pBuffers-03359
All elements of pBuffers
must have been created with the
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
flag
VUID-vkCmdBindVertexBuffers2-pBuffers-03360
Each element of pBuffers
that is non-sparse must be bound
completely and contiguously to a single VkDeviceMemory
object
VUID-vkCmdBindVertexBuffers2-pBuffers-04111
If the nullDescriptor
feature is not
enabled, all elements of pBuffers
must not be
VK_NULL_HANDLE
VUID-vkCmdBindVertexBuffers2-pBuffers-04112
If an element of pBuffers
is VK_NULL_HANDLE, then the
corresponding element of pOffsets
must be zero
VUID-vkCmdBindVertexBuffers2-pStrides-03362
If pStrides
is not NULL
each element of pStrides
must be
less than or equal to
VkPhysicalDeviceLimits
::maxVertexInputBindingStride
VUID-vkCmdBindVertexBuffers2-pStrides-06209
If pStrides
is not NULL
each element of pStrides
must be
either 0 or greater than or equal to the maximum extent of all vertex
input attributes fetched from the corresponding binding, where the
extent is calculated as the
VkVertexInputAttributeDescription::offset
plus
VkVertexInputAttributeDescription::format
size
Valid Usage (Implicit)
VUID-vkCmdBindVertexBuffers2-commandBuffer-parameter
commandBuffer
must be a valid VkCommandBuffer handle
VUID-vkCmdBindVertexBuffers2-pBuffers-parameter
pBuffers
must be a valid pointer to an array of bindingCount
valid or VK_NULL_HANDLE VkBuffer handles
VUID-vkCmdBindVertexBuffers2-pOffsets-parameter
pOffsets
must be a valid pointer to an array of bindingCount
VkDeviceSize values
VUID-vkCmdBindVertexBuffers2-pSizes-parameter
If pSizes
is not NULL
, pSizes
must be a valid pointer to an array of bindingCount
VkDeviceSize values
VUID-vkCmdBindVertexBuffers2-pStrides-parameter
If pStrides
is not NULL
, pStrides
must be a valid pointer to an array of bindingCount
VkDeviceSize values
VUID-vkCmdBindVertexBuffers2-commandBuffer-recording
commandBuffer
must be in the recording state
VUID-vkCmdBindVertexBuffers2-commandBuffer-cmdpool
The VkCommandPool
that commandBuffer
was allocated from must support graphics operations
VUID-vkCmdBindVertexBuffers2-videocoding
This command must only be called outside of a video coding scope
VUID-vkCmdBindVertexBuffers2-bindingCount-arraylength
If any of pSizes
, or pStrides
are not NULL
, bindingCount
must be greater than 0
VUID-vkCmdBindVertexBuffers2-commonparent
Both of commandBuffer
, and the elements of pBuffers
that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice
Host Synchronization
- Host access to
commandBuffer
must be externally synchronized - Host access to the
VkCommandPool
thatcommandBuffer
was allocated from must be externally synchronized ::