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

= COPYING file for the KhronosGroup/Vulkan-Docs project

== Licenses

The Vulkan-Docs project uses several licenses.

* The source files (in asciidoctor and other formats) for the Vulkan
  Specification, reference pages, and supporting documentation are licensed
  under the Creative Commons Attribution 4.0 International License (SPDX
  license identifier "`CC-BY-4.0`").
* Header files, scripts, programs, XML files, and other tooling used or
  generated as part of the build process are typically licensed under the
  Apache License, Version 2.0 (SPDX license identifier "`Apache-2.0`").
* For compatibility with external developers working in GPLed projects who
  have requested it, link:xml/vk.xml[`vk.xml`] is licensed under a dual
  (SPDX license identifier "`Apache-2.0 OR MIT`" License).
* Fonts derived from the M+ Font Project, found in
  link:config/fonts/[`config/fonts/`] are licensed under the M+ Font License
  (SPDX license identifier "`LicenseRef-MPLUS`"). This is an open source
  license but is not OSI-approved, and is found at
  https://osdn.net/softwaremap/trove_list.php?form_cat=370
* Code which converts the single-file HTML specification to a chunked
  HTML document, kept in
  link:scripts/asciidoctor-chunker[`scripts/asciidoctor-chunker`], is
  licensed under the MIT license. The home of the
  link:https://github.com/wshito/asciidoctor-chunker[chunker project] is
  found on github.
* There are a few remaining files adopted from other open source projects,
  such as a copy of the KaTeX distribution. Such files continue under their
  original MIT licenses, or in a few cases, like
  link:scripts/htmldiff/htmldiff[`scripts/htmldiff/htmldiff`], had no
  license statement. We have not added SPDX license identifiers to such
  externally originated files.
* Some generated, transient files produced during the course of building the
  specification, headers, or other targets may not have copyrights. These
  are typically very short asciidoc fragments describing parts of the Vulkan
  API, and are incorporated by reference into specification or reference
  page builds.

Users outside Khronos who create and post Vulkan Specifications, whether
modified or not, should use the CC-BY-4.0 license on the *output* documents
(HTML, PDF, etc.) they generate. This is the default when building the
Specification.


== Frequently Asked Questions

Q: Why are the HTML and PDF Specifications posted on Khronos' website under
a license which is neither CC-BY nor Apache-2.0?

A: The Specifications posted by Khronos in the Vulkan Registry are licensed
under the proprietary Khronos Specification License. Only these
Specifications are Ratified by the Khronos Board of Promoters, and therefore
they are the only Specifications covered by the Khronos Intellectual
Property Rights Policy.


Q: Does Khronos allow the creation and distribution of modified versions of
the Vulkan Specification, such as translations to other languages?

A: Yes. Such modified Specifications, since they are not created by Khronos,
should be placed under the CC-BY license. If you believe your modifications
are of general interest, consider contributing them back by making a pull
request (PR) on the Vulkan-Docs project.


Q: Can I contribute changes to the Vulkan Specification?

A: Yes, by opening an Issue or Pull Request (PR) on the
link:https://github.com/KhronosGroup/Vulkan-Docs/[Vulkan-Docs] Github
project.
You must execute a click-through Contributor License Agreement, which brings
your changes under the umbrella of the Khronos IP policy.


Q: Can you change the license on your files so they're compatible with my
license?

A: We are using a dual license license on `vk.xml`, to make it compatible
with GPL-licensed projects such as externally-generated language bindings.
This replaces an earlier Apache 2.0 + "Exception Clause" license on the file
with a more standard methodology, and allows use of the SPDX license
identifier "`Apache-2.0 OR MIT`" to denote the license.

If you *require* GPL compatibility for use of other Apache-2.0 licensed
files in our repository, please raise an issue identifying the files and we
will consider changing those specific files to the dual license as well.

