Vulkan is intended to be the API that developers wanted. Modern high-performance games need explicit control over their memory usage so that content can be streamed in and out of memory; Vulkan gives the application control over memory allocation strategies and knowledge of when the memory is still needed for rendering. To avoid inconsistent frame rates, applications need control over when a driver will perform costly operations such as compilation or format conversions; in Vulkan, operations that may be costly are explicit in the API, so the application author can schedule them.
Critically, older APIs such as OpenGL are designed such that, for the most part, rendering happens on a single application thread. Since modern computers and cell phones typically have many CPU cores, the ability to do useful graphics work on multiple computational threads can give a large performance win. This is particularly important for work that is performed by the driver: compilation and state management can take a significant CPU load in conventional APIs, and in Vulkan these operations can be performed on separate threads, away from the critical rendering path. Vulkan allows graphics work to be performed in advance and reused, reducing the total amount of work and giving flexibility of scheduling.
In addition, Vulkan has a more explicit model for the tile-based GPUs that are common in cell phones. These architectures are designed to work within the limited bandwidth constraints of mobile systems. Vulkan make the order of operations in deferred rendering more explicit, and allows portable support for efficient frame buffer reuse, making techniques such as deferred shading more flexible.
Vulkan’s use of SPIR-V provides a better environment for shader distribution, removing many inconsistencies of vendor high-level shader compilation and simplifying the conversion of shaders between different platforms.
On top of all this, Vulkan offers the same environment for desktop and mobile GPUs, with the ability to validate an application against the capabilities of different types of hardware – making the task of writing portable software much easier. Debug and validation layers can be disabled in shipping applications, ensuring that end-users do not suffer the overhead of reporting the diagnostics that are important to application developers.
Finally, the programming model of Vulkan is similar to other modern graphics APIs. While a single-threaded application that is authored for an OpenGL-style API may not be able to take full advantage of Vulkan’s performance benefits, highly-parallel, multi-threaded designs can be retargeted to support Vulkan and other modern APIs with relatively little cost.