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 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.