// Copyright 2018-2021 The Khronos Group, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

[open,refpage='VkValidationFeaturesEXT',desc='Specify validation features to enable or disable for a Vulkan instance',type='structs']
--
When creating a Vulkan instance for which you wish to enable or disable
specific validation features, add a slink:VkValidationFeaturesEXT structure
to the pname:pNext chain of the slink:VkInstanceCreateInfo structure,
specifying the features to be enabled or disabled.

include::{generated}/api/structs/VkValidationFeaturesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:enabledValidationFeatureCount is the number of features to enable.
  * pname:pEnabledValidationFeatures is a pointer to an array of
    elink:VkValidationFeatureEnableEXT values specifying the validation
    features to be enabled.
  * pname:disabledValidationFeatureCount is the number of features to
    disable.
  * pname:pDisabledValidationFeatures is a pointer to an array of
    elink:VkValidationFeatureDisableEXT values specifying the validation
    features to be disabled.

.Valid Usage
****
  * [[VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02967]]
    If the pname:pEnabledValidationFeatures array contains
    ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,
    then it must: also contain
    ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT
  * [[VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02968]]
    If the pname:pEnabledValidationFeatures array contains
    ename:VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT, then it must: not
    contain ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT
****

include::{generated}/validity/structs/VkValidationFeaturesEXT.txt[]
--

[open,refpage='VkValidationFeatureEnableEXT',desc='Specify validation features to enable',type='enums']
--
Possible values of elements of the
slink:VkValidationFeaturesEXT::pname:pEnabledValidationFeatures array,
specifying validation features to be enabled, are:

include::{generated}/api/enums/VkValidationFeatureEnableEXT.txt[]

  * ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT specifies that
    GPU-assisted validation is enabled.
    Activating this feature instruments shader programs to generate
    additional diagnostic data.
    This feature is disabled by default.
  * ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT
    specifies that the validation layers reserve a descriptor set binding
    slot for their own use.
    The layer reports a value for
    slink:VkPhysicalDeviceLimits::pname:maxBoundDescriptorSets that is one
    less than the value reported by the device.
    If the device supports the binding of only one descriptor set, the
    validation layer does not perform GPU-assisted validation.
    This feature is disabled by default.
  * ename:VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT specifies that
    Vulkan best-practices validation is enabled.
    Activating this feature enables the output of warnings related to common
    misuse of the API, but which are not explicitly prohibited by the
    specification.
    This feature is disabled by default.
  * ename:VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT specifies that the
    layers will process code:debugPrintfEXT operations in shaders and send
    the resulting output to the debug callback.
    This feature is disabled by default.
  * ename:VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT
    specifies that Vulkan synchronization validation is enabled.
    This feature reports resource access conflicts due to missing or
    incorrect synchronization operations between actions (Draw, Copy,
    Dispatch, Blit) reading or writing the same regions of memory.
    This feature is disabled by default.
--

[open,refpage='VkValidationFeatureDisableEXT',desc='Specify validation features to disable',type='enums']
--
Possible values of elements of the
slink:VkValidationFeaturesEXT::pname:pDisabledValidationFeatures array,
specifying validation features to be disabled, are:

include::{generated}/api/enums/VkValidationFeatureDisableEXT.txt[]

  * ename:VK_VALIDATION_FEATURE_DISABLE_ALL_EXT specifies that all
    validation checks are disabled.
  * ename:VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT specifies that shader
    validation is disabled.
    This feature is enabled by default.
  * ename:VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT specifies that
    thread safety validation is disabled.
    This feature is enabled by default.
  * ename:VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT specifies that
    stateless parameter validation is disabled.
    This feature is enabled by default.
  * ename:VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT specifies that
    object lifetime validation is disabled.
    This feature is enabled by default.
  * ename:VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT specifies that core
    validation checks are disabled.
    This feature is enabled by default.
    If this feature is disabled, the shader validation and GPU-assisted
    validation features are also disabled.
  * ename:VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT specifies that
    protection against duplicate non-dispatchable object handles is
    disabled.
    This feature is enabled by default.
  * ename:VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT
    specifies that there will be no caching of shader validation results and
    every shader will be validated on every application execution.
    Shader validation caching is enabled by default.
--

[NOTE]
.Note
====
Disabling checks such as parameter validation and object lifetime validation
prevents the reporting of error conditions that can cause other validation
checks to behave incorrectly or crash.
Some validation checks assume that their inputs are already valid and do not
always revalidate them.
====

[NOTE]
.Note
====
The `apiext:VK_EXT_validation_features` extension subsumes all the
functionality provided in the `apiext:VK_EXT_validation_flags` extension.
====
