# Vulkan Validation Layers (VVL)

## Introduction

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. This project provides Vulkan validation layers that can be enabled
to assist development by enabling developers to verify their applications correct use of the Vulkan API.

## Getting Binaries

For those who don't want to build from source, there are few ways to get working binaries to use
- The [Vulkan SDK](https://vulkan.lunarg.com/sdk/home) will have the most well tested versions of the layer
- For Android, each SDK tag will have binaries to download (example: [vulkan-sdk-1.3.280.0 tag](https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/tag/vulkan-sdk-1.3.280.0))
- Every change applied to the main branch runs through GitHub action and will [produce artifacts](https://github.com/KhronosGroup/Vulkan-ValidationLayers/actions?query=branch%3Amain) of the latest commit.

## Ways to enable the layer

* Use [*Vulkan Configurator*](https://www.lunarg.com/introducing-the-new-vulkan-configurator-vkconfig/)
* Set environment variables
     * Windows `set VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation`
     * Linux `export VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation`
     * [Android](https://developer.android.com/ndk/guides/graphics/validation-layer)
* [More information](https://vulkan.lunarg.com/doc/view/latest/windows/layer_configuration.html)

## Adjusting Settings

See [documentation](./docs/khronos_validation_layer.md#configuring-the-validation-layer).

## Building From Source

* [BUILD.md](BUILD.md) - Instructions for building the Validation Layers
* [CONTRIBUTING.md](CONTRIBUTING.md) - Information needed to make a contribution.
    * [./docs](./docs/) - Details of the Validation Layer source code. **For those wanting to make contributions**
    * [./tests](./tests) - Information about testing the Validation Layers.
    * [GOVERNANCE.md](GOVERNANCE.md) - Repository management details.

### Internals

The Validation Layers are broken up as many smaller internal "Validation Objects" each tasked with their own job.
[Core Checks](./docs/core_checks.md) is what is enabled by default, but there are other validation objects that can be additionally enabled, such as [Synchronization Validation](./docs/syncval_design.md), [GPU Assisted Validation](./docs/gpu_validation.md), and [more](./docs/README.md).
There are also a few [limitations](./docs/limitations.md) stemming from the Validation layers being a Vulkan layer.

## Community Assistance

Before submitting an issue to the validation layers or reaching out to the developers it may be prudent to reach out to the community first.
These resources can be helpful to refine your issue, work out an application/driver bug, etc.

- Discord: https://discord.com/invite/vulkan
- Reddit: https://www.reddit.com/r/vulkan
- Stackoverflow: https://stackoverflow.com/questions/tagged/vulkan
- Slack: https://khr.io/slack

## Contact Information
* @KhronosGroup/VVL-CODEOWNERS
* VVL-CODEOWNERS can also be found on aforementioned Slack channel for direct contact.

## Version Tagging Scheme

Updates to this repository which correspond to a new Vulkan specification release are tagged using the following format: `v<`_`version`_`>` (e.g., `v1.3.266`).

**Note**: Marked version releases have undergone thorough testing but do not imply the same quality level as SDK tags. SDK tags follow the `vulkan-sdk-<`_`version`_`>.<`_`patch`_`>` format (e.g., `vulkan-sdk-1.3.266.0`).

This scheme was adopted following the `1.3.266` Vulkan specification release.

Weekly automated (and untested) tags are generated with the following format: `snapshot-<year>wk<week-number>`, eg. `snapshot-2024wk06`.

## License
This work is released as open source under a Apache-style license from Khronos including a Khronos copyright.

See [LICENSE.txt](LICENSE.txt) for a full list of licenses used in this repository.

## Acknowledgements
While this project has been developed primarily by LunarG, Inc., there are many other
companies and individuals making this possible: Valve Corporation, funding
project development; Google providing significant contributions to the validation layers;
Khronos providing oversight and hosting of the project.
