| // Copyright 2019-2021 The Khronos Group Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_EXT_pipeline_creation_cache_control.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2020-03-23 |
| *IP Status*:: |
| No known IP claims. |
| *Contributors*:: |
| - Gregory Grebe, AMD |
| - Tobias Hector, AMD |
| - Matthaeus Chajdas, AMD |
| - Mitch Singer, AMD |
| - Spencer Fricke, Samsung Electronics |
| - Stuart Smith, Imagination Technologies |
| - Jeff Bolz, NVIDIA Corporation |
| - Daniel Koch, NVIDIA Corporation |
| - Dan Ginsburg, Valve Corporation |
| - Jeff Leger, QUALCOMM |
| - Michal Pietrasiuk, Intel |
| - Jan-Harald Fredriksen, Arm Limited |
| |
| === Description |
| |
| This extension adds flags to stext:Vk*PipelineCreateInfo and |
| slink:VkPipelineCacheCreateInfo structures with the aim of improving the |
| predictability of pipeline creation cost. |
| The goal is to provide information about potentially expensive hazards |
| within the client driver during pipeline creation to the application before |
| carrying them out rather than after. |
| |
| === Background |
| |
| Pipeline creation is a costly operation, and the explicit nature of the |
| Vulkan design means that cost is not hidden from the developer. |
| Applications are also expected to schedule, prioritize, and load balance all |
| calls for pipeline creation. |
| It is strongly advised that applications create pipelines sufficiently ahead |
| of their usage. |
| Failure to do so will result in an unresponsive application, intermittent |
| stuttering, or other poor user experiences. |
| Proper usage of pipeline caches and/or derivative pipelines help mitigate |
| this but is not assured to eliminate disruption in all cases. |
| In the event that an ahead-of-time creation is not possible, considerations |
| should be taken to ensure that the current execution context is suitable for |
| the workload of pipeline creation including possible shader compilation. |
| |
| Applications making API calls to create a pipeline must be prepared for any |
| of the following to occur: |
| |
| * OS/kernel calls to be made by the ICD |
| * Internal memory allocation not tracked by the pname:pAllocator passed to |
| ftext:vkCreate*Pipelines |
| * Internal thread synchronization or yielding of the current thread's core |
| * Extremely long (multi-millisecond+), blocking, compilation times |
| * Arbitrary call stacks depths and stack memory usage |
| |
| The job or task based game engines that are being developed to take |
| advantage of explicit graphics APIs like Vulkan may behave exceptionally |
| poorly if any of the above scenarios occur. |
| However, most game engines are already built to "`stream`" in assets |
| dynamically as the user plays the game. |
| By adding control by way of tlink:VkPipelineCreateFlags, we can require an |
| ICD to report back a failure in critical execution paths rather than forcing |
| an unexpected wait. |
| |
| Applications can prevent unexpected compilation by setting |
| ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT on |
| stext:Vk*PipelineCreateInfo::pname:flags. |
| When set, an ICD must not attempt pipeline or shader compilation to create |
| the pipeline object. |
| The ICD will return the result ename:VK_PIPELINE_COMPILE_REQUIRED_EXT. |
| An ICD may still return a valid sname:VkPipeline object by either re-using |
| existing pre-compiled objects such as those from a pipeline cache, or |
| derivative pipelines. |
| |
| By default ftext:vkCreate*Pipelines calls must attempt to create all |
| pipelines before returning. |
| Setting ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT on |
| stext:Vk*PipelineCreateInfo::pname:flags can be used as an escape hatch for |
| batched pipeline creates. |
| |
| Hidden locks also add to the unpredictability of the cost of pipeline |
| creation. |
| The most common case of locks inside the stext:vkCreate*Pipelines is |
| internal synchronization of the slink:VkPipelineCache object. |
| ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT can be set |
| when calling flink:vkCreatePipelineCache to state the cache is |
| <<fundamentals-threadingbehavior,externally synchronized>>. |
| |
| The hope is that armed with this information application and engine |
| developers can leverage existing asset streaming systems to recover from |
| "just-in-time" pipeline creation stalls. |
| |
| include::{generated}/interfaces/VK_EXT_pipeline_creation_cache_control.txt[] |
| |
| === Version History |
| |
| * Revision 1, 2019-11-01 (Gregory Grebe) |
| - Initial revision |
| * Revision 2, 2020-02-24 (Gregory Grebe) |
| - Initial public revision |
| * Revision 3, 2020-03-23 (Tobias Hector) |
| - Changed ename:VK_PIPELINE_COMPILE_REQUIRED_EXT to a success code, |
| adding an alias for the original |
| ename:VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT. |
| Also updated the xml to include these codes as return values. |