# Vulkan Validation Layers

## The Khronos Validation Layer

The Vulkan SDK provides the Khronos Validation Layer:

Layer Name | Layer Type | Description
--- | --- | ---
VK_LAYER_KHRONOS_validation | validation | The main, comprehensive Khronos validation layer. 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 how Vulkan is used can result in a crash. The Khronos Valiation Layer can be enabled to assist development by enabling developers to verify their applications correctly use the Vulkan API.

See the Layers Overview and Configuration document for more information on how to configure 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 `VK_EXT_validation_features` 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 flag | Corresponds to not loading this deprecated layer
--- | ---
`VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT` | `VK_LAYER_GOOGLE_threading`
`VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT` | `VK_LAYER_LUNARG_parameter_validation`
`VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT` | `VK_LAYER_LUNARG_object_tracker`
`VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT` | `VK_LAYER_LUNARG_core_validation`
`VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT` | `VK_LAYER_GOOGLE_unqiue_objects`

**Refer to the Validation Features extension section of the Vulkan specification for details.

## Layer Controls

Most layers support one or both of the available methods for controlling layer behavior: through 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. Various Vulkan extensions also provide layer controls:

Extension | Description
--- | ---
VK_EXT_debug_utils | allows applications control and capture of expanded debug reporting information
VK_EXT_validation_features | allows applications expanded control of various layer features

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

#### Message Types As Reported By VK_EXT_debug_utils flags:

Type | Debug Utils Severity | Debug Utils Type
--- | --- | ---
Error | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT`
Warn | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT`
Perf Warn | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT`
Info | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT` or `VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT`

**Refer to the Validation Features section of the Vulkan Specification for details on this feature.

### VK_EXT_validation_flags [DEPRECATED]

One method for an app to control validation layer features is through the `VK_EXT_validation_flags` extension. This extension has been deprecated and should not be used for new applications.

Refer to the Validation Flags extension section of the Vulkan Specification for additional details.