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

= Contributing

Contributions to the Vulkan-Docs repository are welcome.

Contributions may be in the form of Issues proposing a change, or Pull
Requests containing fixes for, or additions to:

  * Specification text and other documentation
  * XML API Registry
  * Specification scripting / build toolchains and related infrastructure

Please keep contributions focused on solving a single issue or bug.

== Copyright Notice and License Template

If you are adding a new file, it must be under one of the following
licenses:

  * Creative Commons Attribution 4.0 International, for specification text
    (for example, link:vkspec.txt[`vkspec.txt`])
  * Apache 2.0, for all other changes (for example,
    link:scripts/reg.py[`reg.py`])
  * Apache 2.0 OR MIT, for source-like files that may need to used in GPL
    projects (for example, link:xml/vk.xml[`vk.xml`])

We use a short license in each file consisting of just the copyright
statement and the SPDX license identifier of the license applying to that
file, and link to the full license text from link:LICENSE.adoc.

== Contributor License Agreement

When you propose a pull request on Vulkan-Docs you must execute the Khronos
Mixed Repository Contributor License Agreement, to confirm you own your work
and are granting Khronos the necessary permissions to redistribute it under
our licenses.
