| // Copyright (c) 2020 Khronos Group. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_KHR_synchronization2.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2020-12-03 |
| *Interactions and External Dependencies*:: |
| - Interacts with `apiext:VK_KHR_create_renderpass2` |
| *Contributors*:: |
| - Tobias Hector |
| |
| |
| === Description |
| |
| This extension modifies the original core synchronization APIs to simplify |
| the interface and improve usability of these APIs. |
| It also adds new pipeline stage and access flag types that extend into the |
| 64-bit range, as we have run out within the 32-bit range. |
| The new flags are identical to the old values within the 32-bit range, with |
| new stages and bits beyond that. |
| |
| Pipeline stages and access flags are now specified together in memory |
| barrier structures, making the connection between the two more obvious. |
| Additionally, scoping the pipeline stages into the barrier structs allows |
| the use of the etext:MEMORY_READ and etext:MEMORY_WRITE flags without |
| sacrificing precision. |
| The per-stage access flags should be used to disambiguate specific accesses |
| in a given stage or set of stages - for instance, between uniform reads and |
| sampling operations. |
| |
| Layout transitions have been simplified as well; rather than requiring a |
| different set of layouts for depth/stencil/color attachments, there are |
| generic ename:VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR and |
| ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR layouts which are contextually |
| applied based on the image format. |
| For example, for a depth format image, |
| ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR is equivalent to |
| ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR. |
| ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR also functionally replaces |
| ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. |
| |
| Events are now more efficient, because they include memory dependency |
| information when you set them on the device. |
| Previously, this information was only known when waiting on an event, so the |
| dependencies could not be satisfied until the wait occurred. |
| That sometimes meant stalling the pipeline when the wait occurred. |
| The new API provides enough information for implementations to satisfy these |
| dependencies in parallel with other tasks. |
| |
| Queue submission has been changed to wrap command buffers and semaphores in |
| extensible structures, which incorporate changes from Vulkan 1.1, |
| `apiext:VK_KHR_device_group`, and `apiext:VK_KHR_timeline_semaphore`. |
| This also adds a pipeline stage to the semaphore signal operation, mirroring |
| the existing pipeline stage specification for wait operations. |
| |
| Other miscellaneous changes include: |
| |
| * Events can now be specified as interacting only with the device, |
| allowing more efficient access to the underlying object. |
| * Image memory barriers that do not perform an image layout transition can |
| be specified by setting pname:oldLayout equal to pname:newLayout. |
| ** E.g. the old and new layout can both be set to |
| ename:VK_IMAGE_LAYOUT_UNDEFINED, without discarding data in the image. |
| * Queue family ownership transfer parameters are simplified in some cases. |
| * Where two synchronization commands need to be matched up (queue transfer |
| operations, events), the dependency information specified in each place |
| must now match completely for consistency. |
| * Extensions with commands or functions with a tlink:VkPipelineStageFlags |
| or elink:VkPipelineStageFlagBits parameter have had those APIs replaced |
| with equivalents using tlink:VkPipelineStageFlags2KHR. |
| * The new event and barrier interfaces are now more extensible for future |
| changes. |
| * Relevant pipeline stage masks can now be specified as empty with the new |
| ename:VK_PIPELINE_STAGE_NONE_KHR and ename:VK_PIPELINE_STAGE_2_NONE_KHR |
| values. |
| ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[] |
| * slink:VkMemoryBarrier2KHR can be chained to slink:VkSubpassDependency2, |
| overriding the original 32-bit stage and access masks. |
| endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[] |
| |
| include::{generated}/interfaces/VK_KHR_synchronization2.txt[] |
| |
| === Examples |
| |
| See |
| https://github.com/KhronosGroup/Vulkan-Docs/wiki/Synchronization-Examples |
| |
| |
| === Version History |
| |
| * Revision 1, 2020-12-03 (Tobias Hector) |
| - Internal revisions |