Khronos Vulkan

VK_LAYER_KHRONOS_validation

Vulkan is an Explicit API, enabling direct control over how GPUs actually work. By design, minimal error checking is done inside a Vulkan driver - applications have full control and responsibility for correct operation. Any errors in Vulkan usage can result in unexpected behavior or even a crash. The VK_LAYER_KHRONOS_validation layer can be used to to assist developers in isolating incorrect usage, and in verifying that applications correctly use the API.

Note:

  • Most Khronos Validation layer features can be used simultaneously. However, this could result in noticeable performance degradation. The best practice is to run Core validation, GPU-Assisted validation, Synchronization Validation and Best practices validation features individually.

  • Debug Printf functionality and GPU-Assisted validation cannot be run at the same time.

Configuring the Validation Layer

For an overview of how to configure layers, refer to the Layers Overview and Configuration document.

The Validation Layer settings are documented in detail in the VK_LAYER_KHRONOS_validation document.

The Validation Layer can also be enabled and configured using vkconfig. See the vkconfig documentation for more information.

Layer Controls

Layer behavior is controlled through either a layer settings file or an extension. The layer settings file allows a user to control various layer features and behaviors by providing easily modifiable settings. The Vulkan Validation Features extension provides layer controls, while the Vulkan Debug Utils extension provides methods of accessing and controlling feedback from the layers:

ExtensionDescription
VK_EXT_validation_featuresallows application control of various layer features
VK_EXT_debug_utilsallows application control and capture of debug reporting information

See the Layers Overview and Configuration document for more detailed information on configuring Vulkan layers.

VK_EXT_validation_features

The preferred method for an application to programmatically control validation layer features is through the VK_EXT_validation_features extension. Using this extension allows an application to enable or disable specific Khronos validation features. Note that this extension provides low-level control to an application, and that some combinations of enable/disable settings may produce undefined behavior.

The VK_EXT_validation_features flags can be used to disable validation corresponding to the following deprecated layers:

Setting this VK_EXT_validation_features disable flagCorresponds to not loading this deprecated layer
VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXTVK_LAYER_GOOGLE_threading
VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXTVK_LAYER_LUNARG_parameter_validation
VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXTVK_LAYER_LUNARG_object_tracker
VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXTVK_LAYER_LUNARG_core_validation
VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXTVK_LAYER_GOOGLE_unique_objects

Refer to VK_EXT_validation_features in the Vulkan specification for details on this extension.

VK_EXT_debug_utils

The preferred method for an app to control layer logging is via the VK_EXT_debug_utils extension. Using the VK_EXT_debug_utils extension allows an application to register multiple messengers with the layers. Each messenger can trigger a message callback when a log message occurs. Some messenger callbacks may log the information to a file, others may cause a debug break point or other-application defined behavior. An application can create a messenger even when no layers are enabled, but they will only be called for loader and, if implemented, driver events. Each message is identified by both a severity level and a message type. Severity levels indicate the severity of the message that should be logged including: error, warning, etc. Message types indicate the specific type of message including: validation, performance, etc. Some layers return a unique message ID string per message as well. Using the severity, type, and message ID, an application can easily filter the messages received by their messenger callback.

When reporting an error, the KHRONOS validation layer returns relevant specification information and a link to that information in the official Vulkan specification. Layers included in a Vulkan SDK will link to a version of the Vulkan specification annotated with valid usage identifiers.

Message Types As Reported By VK_EXT_debug_utils flags:

TypeDebug Utils SeverityDebug Utils Type
ErrorVK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXTVK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT
WarnVK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXTVK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT
Perf WarnVK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXTVK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT
InfoVK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXTVK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT or VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT

By default, if an app uses the VK_EXT_debug_utils extension and registers a messenger, the validation layer default messenger log callback will not execute, as it is considered to be handled by the app. However, using the validation layer callback can be very useful, as it provides a unified log that can be easily parsed. On Android, the validation layer default callback can be forced to always execute, and log its contents to logcat, using the following system property:

adb shell setprop debug.vvl.forcelayerlog 1

The debug.vvl namespace signifies validation layers, and setting this property forces the validation layer callback to always execute, even if the app registers a messenger callback itself. This is especially useful for automation tasks, ensuring that errors can be read in a parseable format.

Refer to VK_EXT_debug_utils in the Vulkan Specification for details on this feature.

Layer Options

The options for this layer are specified in VkLayer_khronos_validation.json. The option details are in khronos_validation_layer.html.