Buffer and image objects are created with a sharing mode controlling how they can be accessed from queues. The supported sharing modes are:
typedef enum VkSharingMode { VK_SHARING_MODE_EXCLUSIVE = 0, VK_SHARING_MODE_CONCURRENT = 1, } VkSharingMode;
VK_SHARING_MODE_EXCLUSIVE
specifies that access to any range or
image subresource of the object will be exclusive to a single queue
family at a time.
VK_SHARING_MODE_CONCURRENT
specifies that concurrent access to any
range or image subresource of the object from multiple queue families is
supported.
![]() | Note |
---|---|
|
Ranges of buffers and image subresources of image objects created using
VK_SHARING_MODE_EXCLUSIVE
must only be accessed by queues in the same
queue family at any given time.
In order for a different queue family to be able to interpret the memory
contents of a range or image subresource, the application must transfer
exclusive ownership of the range or image subresource between the source and
destination queue families with the following sequence of operations:
To release exclusive ownership of a range of a buffer or image subresource
of an image object, the application must execute a buffer or image memory
barrier, respectively (see VkBufferMemoryBarrier
and
VkImageMemoryBarrier
) on a queue from the source queue family.
The srcQueueFamilyIndex
parameter of the barrier must be set to the
source queue family index, and the dstQueueFamilyIndex
parameter to
the destination queue family index.
To acquire exclusive ownership, the application must execute the same
buffer or image memory barrier (i.e. an identically defined instance of the
VkBufferMemoryBarrier
or VkImageMemoryBarrier
structure that was
used for the exclusive ownership release) on a queue from the destination
queue family.
Upon creation, resources using VK_SHARING_MODE_EXCLUSIVE
are not owned
by any queue family.
A buffer or image memory barrier is not required to acquire ownership when
no queue family owns the resource - it is implicitly acquired upon first use
within a queue.
However, images still require a layout transition from VK_IMAGE_LAYOUT_UNDEFINED
or
VK_IMAGE_LAYOUT_PREINITIALIZED
before being used on the first queue.
This layout transition can either be accomplished by an image memory
barrier or by use in a render pass instance.
Once a queue family has used a range or image subresource of an
VK_SHARING_MODE_EXCLUSIVE
resource, its contents are undefined to
other queue families unless ownership is transferred.
The contents may also become undefined for other reasons, e.g. as a result
of writes to an image subresource that aliases the same memory.
A queue family can take ownership of a range or image subresource without
an ownership transfer in the same way as for a resource that was just
created, however doing so means any contents written by other queue families
or via incompatible aliases are undefined.
Ranges of buffers and image subresources of image objects created using
VK_SHARING_MODE_CONCURRENT
must only be accessed by queues from the
queue families specified through the queueFamilyIndexCount
and
pQueueFamilyIndices
members of the corresponding create info
structures.